查询 API

概述monitor监控服务unifiedmonitor的查询接口,以及一些额外注意事项。

查询请求

目前监控服务的后端对接的 influxdb ,发送的查询请求会转换成 influxdb 的 query 请求,然后返回转换相关 metrics 。

  • 方法: POST
  • 路径: /api/v1/unifiedmonitors/query/
  • Body: 内容参考下面的例子

查询举例

下面的查询请求会转换成 influxdb 的 query 请求:

  1. 查询虚拟机 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)

更多支持的查询举例:

可以参考:https://github.com/yunionio/cloudpods/blob/v3.10.0-rc2/pkg/monitor/tsdb/driver/influxdb/query_test.go

# 下面的请求 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": "="
		}
	]
}
  1. 自定义查询时间段

通过设置 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
}

签名

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

登陆 influxdb 直接查询数据

有些情况不确定查询的 API 数据是否准确,可以用下面的方法直接进入 influxdb 容器使用命令行查询指标:

$ kubectl exec -ti -n onecloud $(kubectl get pods -n onecloud | grep default-influxdb | awk '{print $1}') -- influx -host 127.0.0.1 -port 30086 -type influxql -ssl  -precision rfc3339 -unsafeSsl

# 使用 telegraf database
use telegraf

# 查看有哪些 measurements
show measurements