查询 API
概述monitor监控服务unifiedmonitor的查询接口,以及一些额外注意事项。
查询请求
目前监控服务的后端对接的 influxdb ,发送的查询请求会转换成 influxdb 的 query 请求,然后返回转换相关 metrics 。
- 方法: POST
- 路径: /api/v1/unifiedmonitors/query/
- Body: 内容参考下面的例子
查询举例
下面的查询请求会转换成 influxdb 的 query 请求:
- 查询虚拟机 CPU 使用率
{
"metric_query": [
{
"model": {
"measurement": "vm_cpu", // 对应 influxdb 里面的 measurement
"select": [ // 对应 SELECT
[
{
"type": "field",
"params": [
"usage_active" // 查询的指标字段
]
},
{
"type": "mean", // 取平均值,其他支持的类型请参考:https://github.com/yunionio/cloudpods/blob/v3.10.0-rc2/pkg/monitor/tsdb/driver/influxdb/query_part.go#L36-L116
"params": []
},
{
"type": "alias", // 设置别名
"params": [
"CPU使用率"
]
}
]
],
"tags": [ // 对应 WHERE
{
"key": "vm_id",
"value": "49d1f759-138e-4495-8e35-94c2128374f1",
"operator": "="
},
{
"condition": "OR", // 可设置 OR 和 AND
"key": "hostname",
"value": "vm1",
"operator": "="
}
],
"group_by": [ // 对应 GROUP BY
{
"type": "tag",
"params": [
"vm_id"
]
}
]
}
}
],
"scope": "system", // 查询资源作用域,system 代表全局作用域,domain 代表域作用域,project 代表项目作用域
"from": "1h", // 查询过去 1h 的指标
"to": "now", // 到现在,非必需,默认就是从 from 到现在
"interval": "1m", // 指标间隔
"skip_check_series": false, // 是否跳过去云平台进行资源检查,补充缺失的 tag
"signature": "3be888cf6e45cb72cc1103ec0fd789572e2f3dc93566a8fe86694518e83625e8" // 根据以上字段计算出来的签名
}
转换后的 influxdb 请求为:
SELECT mean("usage_active") AS "CPU使用率" FROM "vm_cpu"
WHERE ("vm_id" = '49d1f759-138e-4495-8e35-94c2128374f1' OR "hostname" = 'vm1') and time > now() - 1h
GROUP BY "vm_id", time(1m) fill(none)
更多支持的查询举例:
# 下面的请求 body 对应 influxdb sql 为:"SELECT mean(\"free\") / mean(\"total\") FROM \"disk\" WHERE (\"path\" = '/') AND time > now() - 1h GROUP BY *, time(2m) fill(none)"
{
"database": "telegraf",
"measurement": "disk",
"select": [
[
{
"type": "field",
"params": [
"free"
]
},
{
"type": "mean"
},
{
"type": "math",
"params": [
"/ mean(\"total\")"
]
}
]
],
"tags": [
{
"key": "path",
"value": "/",
"operator": "="
}
]
}
- 自定义查询时间段
通过设置 from 和 to 两个参数,可以定义查询时间段,influxdb 里面的指标会默认保留 30 天。
其中 from 和 to 需要转换为 unix epoch 的格式,比如:
{
"metric_query": [...],
"from": "1474973725473", // 2016年9月27日星期二晚上6点55分 GMT+08:00
"to": "1474975757930", // 2016年9月27日星期二晚上7点29分 GMT+08:00
}
SDK
可以使用下面的 SDK 以方便的方式构造监控查询请求:
-
Go:
- 构造查询请求:MetricQueryInput
- 发起请求:PerformQuery
- 用法举例:
-
Java:
- 构造查询请求:MetricQueryInput
- 发起请求:PerformQuery
- 用法举例:参考这个PR
签名
signature 签名的作用是防止查询条件被篡改,如果不需要该功能,可以配置 monitor 服务关闭。
关闭签名
使用下面的方式关闭签名校验:
# 修改 monitor 服务 configmap 配置
$ kubectl edit configmap -n onecloud default-monitor
...
# 将该配置改为 true
disable_query_signature_check: true
...
# 重启 monitor 服务
$ kubectl rollout restart deployment -n onecloud default-monitor
计算方法
如果需要使用签名校验的功能,可以参考下面的方式计算 signature:
signature 的计算方法可以参考这里前端 javascript 代码:https://github.com/yunionio/dashboard/blob/v3.10.0-rc2/src/utils/crypto.js#L11-L18
命令行工具
使用 climc monitor-unifiedmonitor-query 命令可以查询平台监控数据。
# 查询 vm_cpu measurement 里面的 usage_active 指标
$ climc --debug monitor-unifiedmonitor-query vm_cpu usage_active
# 设置指标间隔为 1m ,另外使用 --tags 过滤
$ climc --debug monitor-unifiedmonitor-query --interval 1m --tags vm_id=e0d3c5ce-ec65-42ad-89d9-0b75953f841e --tags zone=YunionHQ vm_cpu usage_active
# 查询时间段内数据
$ climc --debug monitor-unifiedmonitor-query --from 2023-12-07T23:54:42.123Z --to 2023-12-08T13:54:42.123Z vm_cpu usage_active