我不能将原始请求数据推送到Prometheus吗?

时间:2019-02-01 18:17:45

标签: prometheus

我需要计算按某些标头分组的API调用。例如,我想找出有headerX=valueY个API调用。

为此,我想发布一个这样的指标(请忽略命名约定),以便以后查询。

http_request{HeaderX=valueR, HeaderY=valueM, etc...}

如果这可能与普罗米修斯有关,请帮助我。

1 个答案:

答案 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上也是如此。)