作为一位优秀的技术人员,往往能通过对数据的最大化利用来产生更多价值。而 Prometheus 的监控数据则是可以为我们所用的重要数据,它并不只能用于日常的监控和告警使用,也可以用于数据分析、成本管理等企业需求。
在这种场景下,需要我们从 Prometheus 去获取相关的数据,并对其进行处理加工。关于数据的获取方法,通常会使用 Prometheus 提供的 API 来操作,本文将会对此进行讲解介绍。
1. API格式
目前,Prometheus API 的稳定版本为V1,针对该 API 的访问路径为
。API支持的请求模式有 GET 和 POST 两种,当正常响应时,会返回2xx的状态码。
/api/v1
400 Bad Request 参数丢失或不正确时出现。422 Unprocessable Entity 当表达无法被执行时。503 Service Unavailiable 查询超时或中止时。
{
"status": "success" | "error",
"data": <data>,
// Only set if status is "error". The data field may still hold
// additional data.
"errorType": "<string>",
"error": "<string>",
// Only if there were warnings while executing the request.
// There will still be data in the data field.
"warnings": ["<string>"]
}
2. API调用
下面,我们将以两个样例来演示关于API的调用,方便大家理解掌握。
1. 即时查询
说明:该接口属于表达式查询,将根据表达式返回单个时间点的数据。
GET /api/v1/queryPOST /api/v1/query
- query= :Prometheus 表达式查询字符串。
- time= :评估时间戳,可选参数。
- timeout= : 查询超时设置,可选参数,默认将使用-query.timeout的全局参数。
示例:
获取实例”192.168.214.108”的node_load5值。
请求的参数如下:
curl {instance="192.168.214.108:9100"}
{ "status": "success", "data": { "resultType": "vector", "result": [ { "metric": { "__name__": "node_load5", "instance": "192.168.214.108:9100", "job": "node" }, "value": [ 1666865246.993, # 时间戳 "0.04" # 数据值 ] } ] }}
2. 范围查询
说明:接口将根据表达式,返回指定时间范围内的数据。
GET /api/v1/query_rangePOST /api/v1/query_range
该接口支持如下参数查询:
- query= :Prometheus 表达式查询字符串。
- start= :开始时间戳。
- end= :结束时间戳。
- step= :查询分辨率步长。
- timeout= :查询超时设置,可选参数,默认将使用-query.timeout的全局参数。
示例:
获取实例”192.168.214.108”在某段时间内node_load5的所有值。
请求的参数如下 :
curl {instance="192.168.214.108:9100"}&start=2022-10-28T02:10:10.000Z&end=2022-10-28T02:13:00.000Z&step=60s
返回数据 :
以下示例为3分钟范围内的表达式返回值,查询分辨率为60秒,故返回三次值。
{ "status": "success", "data": { "resultType": "matrix", "result": [ { "metric": { "__name__": "node_load5", "instance": "192.168.214.108:9100", "job": "node" }, "values": [ [ 1666923010, "0.04" ], [ 1666923070, "0.04" ], [ 1666923130, "0.03" ] ] } ] }}
3. 获取数据
$ pip install requests
编写python脚本
。
test_api.py
# -*- coding: utf-8 -*-
import requests
# 定义参数
url = 'http://192.168.214.108:9090'
query_api = '/api/v1/query'
params = 'query=node_load5{instance="192.168.214.108:9100"}'
# 访问 prometheus API 获取数据
res = requests. get(url + query_api, params)
metrics = res.json(). get( "data"). get( "result")
# 判断结果是否为空
if metrics:
value = metrics[ 0]. get( 'value')[ 1]
print( '服务器 192.168.214.108的node_load5值为 %s' % value)
else:
print( '无法获取有效数据')
脚本运行结果:
$ python test_api.py 服务器 192.168.214.108的node_load5值为 0.01
结语