我在我的minikube集群上部署了Prometheus,这个集群有5个节点。我还在集群上部署了一个微服务。Prometheus可以正常收集数据。
我使用wrk2
,这是一个工作负载生成器,它向我的微服务发送请求。Jaeger显示请求被正常处理。
下面是我比较困惑的地方,我测试了duration
秒的服务后,尝试使用sum(irate(container_cpu_usage_seconds_total{{{constraint}}}[{duration}s])) by (container, pod)
来获取Pod的CPU使用情况,但是绝大多数Pod的CPU使用情况为零,也就是说没有查询结果,我对此感到非常惊讶,因为在duration
秒的时间里,我增加了服务的负载(即,向它发送了很多请求),但与没有负载时相比,它并没有增加CPU使用率。
下面是我用来查询Prometheus的python函数:
# endtime=starttime+duration, starttime is the time when I start wrk2 to generate workload
def get_cpu_usage(self, starttime, endtime, duration, diaplay=False):
# Define Prometheus query to get CPU usage for each service
constraint = f'namespace="{self.namespace}", container!="POD", container!=""'
prometheus_query = (
f"sum(irate(container_cpu_usage_seconds_total{{{constraint}}}[{duration}s])) by (container, pod)"
+ " / " + f"(sum(container_spec_cpu_quota{{{constraint}}}/({duration}*1000)) by (container, pod)) * 100"
)
# Send query to Prometheus endpoint
sleep(1)
response = requests.get(self.prometheus_url + '/api/v1/query_range', params={
'query': prometheus_query,
'start': starttime,
'end': endtime,
'step': 1
})
# Parse response
usage = response.json()
cpu_result = pd.DataFrame(columns=["microservice", "pod", "usage"])
代码或Prometheus设置中是否有任何错误?
2条答案
按热度按时间izj3ouym1#
Prometheus要求在方括号中指定的lookbehind窗口上至少有两个原始样本来计算irate()。否则它返回一个空结果。
P.S.建议使用rate()而不是
irate()
,因为irate()
不会捕获尖峰。有关详细信息,请参阅this article。mqxuamgl2#
我将
duration
更改为1m
,效果很好。