|
| 1 | +--- |
| 2 | +title: "API" |
| 3 | +description: "本文介绍使用 API 调用夜莺监控 Nightingale 的接口,主要是两类接口,一类是页面操作类,另一类是数据推送类" |
| 4 | +date: 2025-06-13T17:52:38+08:00 |
| 5 | +lastmod: 2025-06-13T17:52:38+08:00 |
| 6 | +draft: false |
| 7 | +images: [] |
| 8 | +menu: |
| 9 | + docs: |
| 10 | + parent: "usecase" |
| 11 | +weight: 20000 |
| 12 | +toc: true |
| 13 | +--- |
| 14 | + |
| 15 | +本文介绍如何使用 API 调用夜莺监控(Nightingale)的接口,主要是两类接口,一类是页面操作类,就是使用 API 模仿用户在页面上的操作,另一类是数据推送类,比如自己的程序采集了监控数据,想要推送给夜莺。 |
| 16 | + |
| 17 | +## 页面操作类 |
| 18 | + |
| 19 | +页面操作类的 API 主要是模拟用户在页面上的操作,比如创建告警规则、修改机器标签、修改机器备注、调整机器归属的业务组等。所有用户在页面上的操作,都可以使用 API 完成,您可以通过这些接口来实现自动化操作。 |
| 20 | + |
| 21 | +显然,要调用 API 需要有两个前提: |
| 22 | + |
| 23 | +- 搞定认证 |
| 24 | +- 了解有哪些接口,各个接口有哪些参数 |
| 25 | + |
| 26 | +### 搞定认证 |
| 27 | + |
| 28 | +这里直接讲解 `v8.0.0-beta.5` 以上版本的认证方式,即个人中心 token 方式,这是最简单的方式。 |
| 29 | + |
| 30 | +#### 1. 修改配置文件 |
| 31 | + |
| 32 | +修改夜莺的配置文件 `etc/config.toml`,确保配置了 `HTTP.TokenAuth`,并且设置了 `Enable = true`,如下所示: |
| 33 | + |
| 34 | +```toml |
| 35 | +... |
| 36 | +[HTTP.RSA] |
| 37 | +OpenRSA = false |
| 38 | + |
| 39 | +[HTTP.TokenAuth] |
| 40 | +Enable = true |
| 41 | + |
| 42 | +[DB] |
| 43 | +... |
| 44 | +``` |
| 45 | + |
| 46 | +#### 2. 获取 Token |
| 47 | + |
| 48 | +登录夜莺监控,进入右上角头像,进入个人信息页面,点击 “Token 管理” 那个 Tab,然后点击“创建 Token”,随便起个名字,就可以得到一个 Token。 |
| 49 | + |
| 50 | +<img src="/img/usecase/api/01.png" alt="create api token"/> |
| 51 | + |
| 52 | +#### 3. 使用 Token |
| 53 | + |
| 54 | +在调用 API 的时候,需要在 HTTP 请求的 Header 中添加 `X-User-Token` 字段,值为你刚才创建的 Token。用 cURL 命令调用 API 的示例: |
| 55 | + |
| 56 | +```bash |
| 57 | +curl -s -X GET "http://<NIGHTINGALE_HOST><API_URL_PATH>" \ |
| 58 | +-H "X-User-Token: <YOUR_TOKEN>" \ |
| 59 | +-H "Content-Type: application/json" |
| 60 | +``` |
| 61 | + |
| 62 | +我们测试一下获取个人信息的接口: |
| 63 | + |
| 64 | +```bash |
| 65 | +curl -s -H "X-User-Token: e6897d32-c237-4d27-a0fc-786345b682ea" -H "Content-Type: application/json" 'http://10.99.1.106:8003/api/n9e/self/profile' | python3 -m json.tool |
| 66 | +{ |
| 67 | + "dat": { |
| 68 | + "id": 1, |
| 69 | + "username": "root", |
| 70 | + "nickname": "Root", |
| 71 | + "phone": "", |
| 72 | + "email": "qinxiaohui@flashcat.cloud", |
| 73 | + "portrait": "/image/avatar1.png", |
| 74 | + "roles": [ |
| 75 | + "Admin" |
| 76 | + ], |
| 77 | + "contacts": { |
| 78 | + "wecomid": "qinxiaohui" |
| 79 | + }, |
| 80 | + "maintainer": 0, |
| 81 | + "create_at": 1733229739, |
| 82 | + "create_by": "system", |
| 83 | + "update_at": 1749811268, |
| 84 | + "update_by": "root", |
| 85 | + "belong": "", |
| 86 | + "admin": true, |
| 87 | + "user_groups": null, |
| 88 | + "busi_groups": null, |
| 89 | + "last_active_time": 1749811088 |
| 90 | + }, |
| 91 | + "err": "" |
| 92 | +} |
| 93 | +``` |
| 94 | + |
| 95 | +如上,正常返回了内容,表示成功。如果你要写程序调用 API,需要校验: |
| 96 | + |
| 97 | +- 夜莺返回的 HTTP 状态码是否为 200,如果状态码不是 200,表示请求失败,此时可以把 Response Body 打印出来,查看具体的错误信息。 |
| 98 | +- 如果状态码是 200,Response Body 肯定是 JSON,此时还要校验 JSON 数据中 `err` 字段是否为空,如果不为空就是有问题的。 |
| 99 | + |
| 100 | +### 了解有哪些接口 |
| 101 | + |
| 102 | +直接使用 Chrome 打开夜莺的页面,按 F12 打开开发者工具,切换到 Network 标签页,然后在页面上操作,比如创建一个告警规则,或者修改机器标签等。你会看到 Network 中有很多 API 请求,这些就是夜莺的 API 接口。比如: |
| 103 | + |
| 104 | +<img src="/img/usecase/api/02.png" alt="Chrome Network"/> |
| 105 | + |
| 106 | +- Headers 下面可以看到 Request Method 和 URL |
| 107 | +- Response 下面可以看到返回的内容 |
| 108 | + |
| 109 | +上面的接口没有任何 Query string 参数,如果有 Query string 参数,通常会在 URL 中显示。另外,如果是 POST 请求,就需要研究 Request Body 的格式了,届时会出现一个 Payload 的 Tab,在 Payload 下面可以看到 Request Body 的内容格式。 |
| 110 | + |
| 111 | +这种方式比接口文档要好多了,接口文档经常忘记更新,而且不同版本的差异经常忘记说明,而通过查看 Chrome 的这种方式,那信息绝对是 100% 准确的,有哪些接口,有哪些参数,一目了然,每个运维、后端研发都应该懂得这种方式。 |
| 112 | + |
| 113 | +## 数据推送类 |
| 114 | + |
| 115 | +自己的程序暴露监控数据,通常有两个手段,一个是埋入 Prometheus SDK,暴露 `/metrics` 接口,然后用 Prometheus 或 Categraf 来抓取(称为 PULL 模式),另一个是直接调用夜莺的 API 接口,推送监控数据(称为 PUSH 模式),夜莺支持多种数据接收的接口,包括 OpenTSDB、Open-Falcon、PrometheusRemoteWrite、Datadog 等协议。 |
| 116 | + |
| 117 | +### 推送样例 |
| 118 | + |
| 119 | +以 OpenTSDB 协议为例,夜莺接口路径是 `/opentsdb/put`,HTTP Method 是 POST,Request Body 里放置你要上报的监控数据,格式样例如下: |
| 120 | + |
| 121 | +```json |
| 122 | +[ |
| 123 | + { |
| 124 | + "metric": "cpu_usage_idle", |
| 125 | + "timestamp": 1637732157, |
| 126 | + "tags": { |
| 127 | + "cpu": "cpu-total", |
| 128 | + "ident": "c3-ceph01.bj" |
| 129 | + }, |
| 130 | + "value": 30.5 |
| 131 | + }, |
| 132 | + { |
| 133 | + "metric": "cpu_usage_util", |
| 134 | + "timestamp": 1637732157, |
| 135 | + "tags": { |
| 136 | + "cpu": "cpu-total", |
| 137 | + "ident": "c3-ceph01.bj" |
| 138 | + }, |
| 139 | + "value": 69.5 |
| 140 | + } |
| 141 | +] |
| 142 | +``` |
| 143 | + |
| 144 | +显然,JSON 最外层是个数组,如果只上报一条监控数据,也可以不要外面的中括号,直接把对象结构上报: |
| 145 | + |
| 146 | +```json |
| 147 | +{ |
| 148 | + "metric": "cpu_usage_idle", |
| 149 | + "timestamp": 1637732157, |
| 150 | + "tags": { |
| 151 | + "cpu": "cpu-total", |
| 152 | + "ident": "c3-ceph01.bj" |
| 153 | + }, |
| 154 | + "value": 30.5 |
| 155 | +} |
| 156 | +``` |
| 157 | + |
| 158 | +服务端会看第一个字符是否是 `[`,来判断上报的是数组,还是单个对象,自动做相应的 Decode。如果觉得上报的内容太过占用带宽,也可以在你的程序里对 Request Body 做 gzip 压缩,同时在 HTTP Header 里带上 `Content-Encoding: gzip` 的 Header。 |
| 159 | + |
| 160 | +各个字段的含义可以 Google 一下或者询问 GPT,关键字是 “OpenTSDB 数据格式里各个字段的含义”。这里我稍作说明: |
| 161 | + |
| 162 | +- metric: 监控指标的名称,通常是一个英文单词,多个单词用下划线连接,比如 `cpu_usage_idle` |
| 163 | +- timestamp: 时间戳,单位是秒,表示监控数据的采集时间 |
| 164 | +- tags: 标签,通常是一个 map 结构,key 是标签名,value 是标签值,用于描述指标的各类维度信息或元信息 |
| 165 | +- value: 监控数据的值,通常是一个数字,表示指标的数值 |
| 166 | + |
| 167 | +> 🟢 注意 ident 这个标签,ident 是 identity 的缩写,表示设备的唯一标识,如果标签中有 ident 标签,n9e 就认为这个监控数据是来自某个机器的,会自动获取 ident 的 value,注册到夜莺的机器列表里。 |
| 168 | +
|
| 169 | +其他常用的接口路径: |
| 170 | + |
| 171 | +- `/openfalcon/push`: Open-Falcon 数据接收接口 |
| 172 | +- `/prometheus/v1/write`: Prometheus Remote Write 数据接收接口 |
| 173 | + |
| 174 | +### 如何认证 |
| 175 | + |
| 176 | +如果你的夜莺暴露在公网,那所有人都可以推监控数据给你,这显然是不安全的。所以我们建议: |
| 177 | + |
| 178 | +- 不要把夜莺暴露在公网 |
| 179 | +- 如果实在要暴露在公网,要用 HTTPS 协议,同时开启 Basic Auth 认证 |
| 180 | + |
| 181 | +如何开启 Basic Auth 认证呢?在 `etc/config.toml` 中配置: |
| 182 | + |
| 183 | +```toml |
| 184 | +[HTTP.APIForAgent] |
| 185 | +Enable = true |
| 186 | +[HTTP.APIForAgent.BasicAuth] |
| 187 | +user001 = "Pa55word01" |
| 188 | +user002 = "Pa55word02" |
| 189 | +``` |
| 190 | + |
| 191 | +你自己的程序调用夜莺的接口上报监控数据,此时你的程序就相当于一个 agent 的角色,所以就是跟 `HTTP.APIForAgent` 这块的配置相关。 |
| 192 | + |
| 193 | +- `HTTP.APIForAgent` 下面的 Enable 首先要设置为 true,才会启用相关接口,否则你调用那些上报数据的接口都会报 404 Not Found 错误。 |
| 194 | +- `HTTP.APIForAgent.BasicAuth` 下面的配置是用户名和密码,格式是 `username = "password"`,你可以设置多个用户,这些用户的认证方式是 Basic Auth。如果 `HTTP.APIForAgent.BasicAuth` 下面一个用户也没有配置,那么就表示不需要认证,任何人都可以推送数据。 |
| 195 | + |
| 196 | +> 🔴 注意:跟 `HTTP.APIForAgent` 紧挨着的还有一个 `HTTP.APIForService` 配置段,用于提供一些接口给 n9e-edge 使用,即夜莺的边缘机房部署模式,如果你没有用到 n9e-edge,一定要把 `HTTP.APIForService` 给 Disable 掉,即 `HTTP.APIForService` 下面的 Enable 设置为 false,避免安全风险。 |
| 197 | +
|
0 commit comments