在influxdb2中,如何设计一个任务来计算一个字段的不同值的数量?

问题描述

我有一个配置文件”存储桶,包含一个“stack_stat”度量,该标签只有 pid,字段只有 stack,如下所示:

bucket: profile
------
stack_stat,pid="111" stack="main"    
stack_stat,pid="111" stack="main;foo" 
stack_stat,pid="111" stack="main;bar" 
stack_stat,pid="222" stack="main"     
stack_stat,pid="222" stack="main;foo" 
stack_stat,pid="222" stack="main;foo" 

请注意它们的 _time 值是不同的

我创建了一个任务来计算同一进程的不同堆栈的出现次数。对于上述数据,我期望得到以下结果(堆栈仍然是一个字段):

bucket:profile_downsample
------
stack_stat,pid="111" stack="main",count=2     
stack_stat,pid="111" stack="main;foo",count=1 
stack_stat,pid="111" stack="main;bar",pid="222" stack="main",count=1     
stack_stat,pid="222" stack="main;foo",count=2 

在使用聚合函数count时,我找不到保留 _time列的方法,而 _time值在聚合数据的_time值集中。>

我设计了一个任务。 但是不能达到预期,因为会丢失一些数据

option task = {name: "task2",every: 1d}

data = from(bucket: "profile")
    |> range(start: -task.every)
    |> filter(fn: (r) =>
        (r["_measurement"] == "stack_stat"))
    |> duplicate(as: "stack",column: "_value")
    |> group(columns: ["_measurement","_stop","pid","stack"])
    |> count(column: "_value")
    |> to(
        tagColumns: ["pid"],fieldFn: (r) =>
            ({"count": r._value,"stack": r.stack}),bucket: "profile_downsample",timeColumn: "_stop",

对于这三行数据,因为_timepid(tags)是一样的,所以只剩下一个数据:

stack_stat,count=1 

还有一个办法,把stack设置为tag,但是我觉得效率很低,因为stack字段的值很大。

因此,我正在寻找解决问题的方法,而“堆栈”仍然是该领域,并且我已经考虑了很长时间。如果我得到一些建议,我将不胜感激:smile:

我的英文不是很好,如有错误请指出,再次感谢!

解决方法

好的,我刚刚找到了一个可以解决问题的函数“reduce”,虽然效率可能很低。

option task = {name: "task2",every: 1d}

from(bucket: "profile")
|> range(start: -task.every)
|> filter(fn: (r) => r["_measurement"] == "stack_info")
|> pivot(columnKey: ["_field"],rowKey: ["_time"],valueColumn: "_value")
|> duplicate(as: "count",column: "stack")
|> group(columns: ["stack","_measurement"])
|> reduce(fn: (r,accumulator) => ({ count: 1 + accumulator.count,_time : r._time}),identity: {count:0,_time : now()})
|> to(bucket: "profile_downsample",tagColumns: ["id"],fieldFn: (r) => ({"count": r["count"],"stack": r["stack"]} ))