您可以使用时间序列来计算活跃用户吗

时间:2019-04-06 20:55:23

标签: grafana prometheus

我的atomist客户端公开了运行命令的指标。每个命令都是带有用户名元素和状态元素的度量标准。

我几个月来一直在废弃这些数据,而没有重置计数。

我的要求是显示一段时间内的活动用户数。即1h1d7d30d在Grafana中。

原始查询是:

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(每个命令的格式都在上面)

谢谢。

1 个答案:

答案 0 :(得分:0)

首先,我将指出您的方法存在的一些问题。

首先,Prometheus文档建议不要对标签使用任意大的值集(因为您的用户名是)。如您所见(基于查询超时的经验),建议这样做并非完全错误。

第二,Prometheus可能不是正确的分析工具(例如活跃用户)。部分是由于上述原因,部分是因为它固有地受到以下事实的限制:它对指标进行采样(在您看来,这似乎不是问题,但可能会成为事实)。

第三,您为每个命令(即help_commandfoo_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而不是减号,并且会遇到与{{ 1}}。

max_over_time