我的原子客户端公开了运行的命令的度量标准。每个命令都是一个指标,包含一个username元素和一个status元素。
几个月来,我一直在丢弃这些数据,而没有重新设置计数。
我的要求是显示一段时间内的活跃用户数。即Grafana中的1h、1d、7d和30d。
最初的查询是:
count(count({Username=~".+"}) by (Username))这是一个问题,因为我没有清除指标,所以它从一开始就是一个计数。
然后我尝试了一下:
count(max_over_time(help_command{job=“Application
Name”,Username=~“.+“}[1w]) -
max_over_time(help_command{job=“Application name”,Username=~“.+“}[1w]
offset 1w) > 0)这是有效的,但仅对于一个命令,我有大约50个其他命令需要添加到该计数中。
我尝试了:
"{__name__=~".+_command",job="app name"}[1w] offset 1w"但这显然是非常昂贵的(浏览器中的超时),并且在集成不支持它的max_over_time时存在问题。
有什么帮助吗,我是不是用错了度量方法。有没有更好的方法来查询...我目前唯一的选择是count (上面的格式适用于每个命令)
提前谢谢。
发布于 2019-04-11 17:29:22
首先,我将指出您的方法中的一些问题。
首先,Prometheus文档建议不要对标签使用任意大的值集(就像您的用户名一样)。正如您所看到的(根据您对查询超时的经验),他们反对它并不是完全错误的。
其次,Prometheus可能不是正确的分析工具(例如活跃用户)。部分是由于上述原因,部分是因为它固有地受到采样指标的事实的限制(在您的情况下,这似乎不是问题,但可能最终会成为问题)。
第三,您收集每个命令的单独指标(即help_command、foo_command),而不是以命令名称作为标签的单个指标(即command_usage{commmand="help"}、command_usage{commmand="foo"})
不过,要返回到您的问题,您不需要max_over_time,您可以简单地将您的查询编写为:
count by(__name__)(
(
{__name__=~".+_command",job=“Application Name”}
-
{__name__=~".+_command",job=“Application name”} offset 1w
) > 0
)不过,这只会起作用,因为您说过,无论导出的是什么计数都不会重置它们。如果这仅仅是因为导出器从未重新启动,当它重新启动时计数将降为零,那么您将需要使用increase而不是减号,并且您将遇到与max_over_time完全相同的性能问题。
count by(__name__)(
increase({__name__=~".+_command",job=“Application Name”}[1w]) > 0
)https://stackoverflow.com/questions/55553402
复制相似问题