kubernetes `irate(container_cpu_usage_seconds_total{...}[{duration}s])`在Prometheus中没有返回数据

xuo3flqw  于 2023-04-11  发布在  Kubernetes
关注(0)|答案(2)|浏览(152)

我在我的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设置中是否有任何错误?

izj3ouym

izj3ouym1#

Prometheus要求在方括号中指定的lookbehind窗口上至少有两个原始样本来计算irate()。否则它返回一个空结果。
P.S.建议使用rate()而不是irate(),因为irate()不会捕获尖峰。有关详细信息,请参阅this article

mqxuamgl

mqxuamgl2#

我将duration更改为1m,效果很好。

相关问题