我需要计算按某些标头分组的API调用。例如,我想找出有headerX=valueY
个API调用。
为此,我想发布一个这样的指标(请忽略命名约定),以便以后查询。
http_request{HeaderX=valueR, HeaderY=valueM, etc...}
如果这可能与普罗米修斯有关,请帮助我。
答案 0 :(得分:1)
正如@tkausl观察到的那样,有可能,但不建议这样做。您不会说您使用的是哪个特定客户端(即Java,Go,Python等),因此这是一个Java示例”:
static final Counter httpRequests = Counter.build()
.name("http_requests_total")
.help("Total number of requests by path and header values.")
.labelNames("path", "content_type", "user_agent")
.register();
然后在您的请求处理程序/拦截器中:
httpRequests.labels(requestPath, contentType, userAgent).inc();
不建议这样做的原因是,如果您的标头可以具有无限数量的值(并且可以,因为您可以使用任意的标头值发出curl
请求),那么最终可以得到无限数量的时间序列。例如
http_requests_total{path="/",content_type="text/plain",user_agent="curl 1.0"} 5
http_requests_total{path="/",content_type="text/plain",user_agent="curl 1.0-whatever"} 1
http_requests_total{path="/",content_type="text/plain",user_agent="curl 1.0-the"} 1
http_requests_total{path="/",content_type="text/plain",user_agent="curl 1.0-client"} 1
http_requests_total{path="/",content_type="text/plain",user_agent="curl 1.0-wants"} 1
现在,对每个标签乘以该值(例如,您有10个API端点,10种不同的内容类型和100种不同的用户代理,那么您就有了1万个指标。
因此,如果您真的对几个可能的标头和几个可能的值(例如JSON,XML和text;以及Chrome,Firefox和IE)感兴趣,那么请记录这些特定的值(例如"application/json"
),或使用正则表达式匹配".*Chrome.*"
,然后将"Chrome"
记录为标签值。对于任何不匹配的标头值,您可以使用"other"
或所需的任何特定值。这样,您的客户就不会炸毁您的普罗米修斯。 (客户端库可能比Prometheus管理多个值的时间长得多,后者需要为每个值保持一个时间序列,即使它永远停留在1上也是如此。)