Skip to content

Commit 2d2364e

Browse files
committed
add api doc
1 parent 344d3b2 commit 2d2364e

3 files changed

Lines changed: 197 additions & 0 deletions

File tree

content/zh/docs/usecase/api.md

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
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+

static/img/usecase/api/01.png

79.1 KB
Loading

static/img/usecase/api/02.png

61.8 KB
Loading

0 commit comments

Comments
 (0)