【问题标题】:Can you calculate active users using time series你能用时间序列计算活跃用户吗
【发布时间】:2019-04-06 20:55:23
【问题描述】:

我的 atomist 客户端公开了正在运行的命令的指标。每个命令都是一个包含用户名元素和状态元素的指标。

几个月来我一直在抓取这些数据,但没有重置计数。

我的要求是显示一段时间内的活跃用户数。即 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(每个命令的格式都在上面)

提前致谢。

【问题讨论】:

    标签: grafana prometheus


    【解决方案1】:

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

    首先,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
    )
    

    【讨论】:

    • 据您所知,哪些工具更适合跟踪活跃用户?
    • 收集和分析日志的任何东西。例如。 ELK 堆栈。
    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 2015-02-25
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    相关资源
    最近更新 更多