Python调用Prometheus监控数据并计算

  • Post category:http

下面是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) 

解释一下这段代码的含义:

  1. 通过GET请求,我们请求Prometheus服务器的/query API,并指定了query参数。这个参数包含了PromQL查询表达式,用于获取CPU使用率。具体来说,查询语句用irate(node_cpu_seconds_total{mode=”idle”}[5m])获取 CPU空闲时间的变化率,再用100减去该比率,即可得到CPU使用率。
  2. response.json() 会解析HTTP response到一个Python字典中。我们从中找到了cpu_usage的值。
  3. 最后将数据打印出来。

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} 秒")

解释一下这个示例的含义:

  1. 我们用histogram_quantile(0.9, sum(rate(wtserver_http_response_time_bucket[1m])) by (le))查询了wtserver的Http请求响应时间。这个 expression 的含义是计算最近1分钟的wtserver所有请求中,90%的响应时间。
  2. 将Prometheus返回的数据转化成numpy的数组,进一步数据处理。
  3. 使用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]}")

解释一下这个示例的含义:

  1. 像之前一样通过PromQL查询 API 获取监控数据。
  2. 将数据转化成pandas的DataFrame对象,进一步处理。这里同样使用了cumsum(累计求和)函数和percentile(分位数)函数。
  3. 最后的输出得到了比前面简单易懂的结果。

3. 总结

Python和Prometheus是两个非常强大的工具。通过PromQL的查询语法,可以非常方便地获取监控数据。再通过numpy和pandas等数据处理库的支持,可以非常方便地进行数据的加工和处理,得到想要的结果。