问题描述
我有一个“配置文件”存储桶,包含一个“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",
对于这三行数据,因为_time
和pid
(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"]} ))