Prometheus Can';我不能将原始请求数据推送到普罗米修斯吗?

Prometheus Can';我不能将原始请求数据推送到普罗米修斯吗?,prometheus,Prometheus,我需要计算按特定头分组的API调用数。例如,我想知道有多少API调用具有headerX=valueY 为此,我想发布这样一个度量(请忽略命名约定),以便稍后查询 http_请求{HeaderX=valueR,HeaderY=valueM等} 如果这与普罗米修斯有关,请帮助我 正如@tkausl观察到的,这是可能的,但不推荐。您没有说您正在使用哪个特定的客户机(即Java、Go、Python等),因此这里有一个Java示例: 然后在您的请求处理程序/拦截器中: httpRequests.label

我需要计算按特定头分组的API调用数。例如,我想知道有多少API调用具有
headerX=valueY

为此,我想发布这样一个度量(请忽略命名约定),以便稍后查询

http_请求{HeaderX=valueR,HeaderY=valueM等}


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

正如@tkausl观察到的,这是可能的,但不推荐。您没有说您正在使用哪个特定的客户机(即Java、Go、Python等),因此这里有一个Java示例:

然后在您的请求处理程序/拦截器中:

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种不同的用户代理,那么您就有了10万个指标


因此,如果您真的对一些可能的标题和一些可能的值感兴趣(比如JSON、XML和文本;以及Chrome、Firefox和IE),那么请记录这些特定的值(比如
“application/JSON”
),或者使用正则表达式匹配
“*Chrome.*
,然后记录
”Chrome“
作为标签值。对于任何不匹配的标题值,您可以使用
“其他”
或任何您想要的特定值。这样您的客户就不会炸毁您的普罗米修斯。(客户端库管理多个值的时间可能比普罗米修斯长得多,普罗米修斯需要为每个值保留一个时间序列,即使它永远停留在1。)

这是可能的,但可能会创建许多附加序列,具体取决于HeaderX和HeaderY的可能值数量。
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