下面是Python调用Prometheus监控数据并计算的完整攻略。
1. Prometheus数据获取
首先需要从Prometheus服务器中获取监控数据。Prometheus提供了RESTful API,我们可以通过API将数据获取下来,具体的API接口可以在Prometheus documentation中找到。Python可以通过requests库来进行HTTP请求,从而获取数据。
以下是一个获取CPU使用率的示例:
import requests
response = requests.get('http://<prometheus_host>:<port>/api/v1/query',
params={
'query': '100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)',
})
data = response.json()
cpu_usage = data['data']['result'][0]['value'][1]
print('CPU usage:', cpu_usage)
解释一下这段代码的含义:
- 通过GET请求,我们请求Prometheus服务器的/query API,并指定了query参数。这个参数包含了PromQL查询表达式,用于获取CPU使用率。具体来说,查询语句用irate(node_cpu_seconds_total{mode=”idle”}[5m])获取 CPU空闲时间的变化率,再用100减去该比率,即可得到CPU使用率。
response.json()
会解析HTTP response到一个Python字典中。我们从中找到了cpu_usage的值。- 最后将数据打印出来。
2. Prometheus数据计算
一旦我们获取了监控数据,就可以使用Python进行数据计算。除原始数据的加减乘除外,我们还可以使用包括numpy、pandas等高度优化的数据处理库进行计算,使代码更加简洁和高效。
以下是一个计算服务器响应时间的示例:
2.1 numpy计算
import requests
import numpy as np
response = requests.get('http://<prometheus_host>:<port>/api/v1/query',
params={
'query': 'histogram_quantile(0.9, sum(rate(wtserver_http_response_time_bucket[1m])) by (le))',
})
data = response.json()
buckets = data['data']['result'][0]['values']
histogram = np.array(buckets).astype(np.float)
bins = histogram[:, 0] # 统计时间区间
values = histogram[:, 1] # 每个时间区间的请求数量统计
res_time = np.diff(np.insert(np.percentile(values, 90), 0, 0, axis=0)) / 1000 # 计算90%请求的响应时间
print(f"90%的请求响应时间为:{res_time:.3f} 秒")
解释一下这个示例的含义:
- 我们用
histogram_quantile(0.9, sum(rate(wtserver_http_response_time_bucket[1m])) by (le))
查询了wtserver的Http请求响应时间。这个 expression 的含义是计算最近1分钟的wtserver所有请求中,90%的响应时间。 - 将Prometheus返回的数据转化成numpy的数组,进一步数据处理。
- 使用numpy的diff函数来计算每个统计时间窗口内的请求数量、分位数值,并计算响应时间。
2.2 pandas计算
import requests
import pandas as pd
response = requests.get('http://<prometheus_host>:<port>/api/v1/query',
params={
'query': 'sum(rate(wtserver_http_response_time_bucket[1m])) by (le)',
})
data = response.json()
buckets = data['data']['result'][0]['values']
df = pd.DataFrame(buckets, columns=["time", "value"])
df["time"] = pd.to_datetime(df["time"], unit='s').dt.time
df["value"] = df["value"].astype(float)
df['cumsum'] = df['value'].cumsum()
total = df['value'].sum()
df['cumsum_pct'] = df['cumsum'] / total * 100
df['pct'] = df['cumsum_pct'].diff()
p = df[df['cumsum_pct'] >= 90][:1]
print(f"90%的请求响应时间为:{p['time'].iloc[0]}")
解释一下这个示例的含义:
- 像之前一样通过PromQL查询 API 获取监控数据。
- 将数据转化成pandas的DataFrame对象,进一步处理。这里同样使用了cumsum(累计求和)函数和percentile(分位数)函数。
- 最后的输出得到了比前面简单易懂的结果。
3. 总结
Python和Prometheus是两个非常强大的工具。通过PromQL的查询语法,可以非常方便地获取监控数据。再通过numpy和pandas等数据处理库的支持,可以非常方便地进行数据的加工和处理,得到想要的结果。