【问题标题】:Timelion series from cumulative sum of array length来自数组长度的累积总和的 Timelion 系列
【发布时间】:2017-07-25 03:30:34
【问题描述】:

我有文件,如下所示:

{
    dateTime: /* My time field */,
    message: {
        users: ['1', '2']
    },
    messageType: 'test'
}

我想构建一个 timelion 系列图表,显示数组 message.users 的计数的累积总和。我的第一个想法是创建一个脚本:

if(doc.containsKey('message.users')) {
    return doc['message.users'].length;
} else {
    return 0;
}

据我所知,doc.containsKey('message.users') 总是错误的,这告诉我它可能没有被正确索引。我尝试了无数次Timelion,都无济于事:

.es(index=logstash-*,timefield='dateTime',q='messageType:UserList').label('Users Online')

我通过 c# NEST api 像这样索引我的文档:

elasticClient.Index(
    new
    {
        DateTime = DateTime.Now,
        Message = evt.EventArgs.Message,
    },
    idx => idx.Index($"logstash-{evt.MessageCode}"));

【问题讨论】:

  • 你能分享你的message.users字段的映射吗?
  • 另一个好的做法是在索引时简单地创建另一个名为 userCount 的字段,其中包含 message.users 数组中的用户数。
  • @Val,很抱歉刚接触弹性搜索。我刚刚使用了 C# Nest API,并更新了我如何索引文档的答案。

标签: elasticsearch kibana kibana-5 timelion


【解决方案1】:

我建议在您的文档中添加另一个名为 userCount 的字段,这样您就不必乱写脚本了(+ 它会更高效)。

所以你的文件应该是这样的:

{
    dateTime: /* My time field */,
    message: {
        users: ['1', '2']
    },
    userCount: 2,                  <--- add this field
    messageType: 'test'
}

解决方案 1:

您需要将代码稍作更改:

elasticClient.Index(
    new
    {
        DateTime = DateTime.Now,
        Message = evt.EventArgs.Message,
        UserCount = evt.EventArgs.Message.Users.Length
    },
    idx => idx.Index($"logstash-{evt.MessageCode}"));

解决方案 2:

如果您使用的是 ES 5,则可以利用 Ingest API 创建一个管道,该管道会自动为您添加 userCount 字段。您无需更改代码中的任何内容。

PUT _ingest/pipeline/user-count-pipeline
{
  "description" : "Creates a new userCount field",
  "processors" : [
    {
      "script": {
        "lang": "painless",
        "inline": "ctx.userCount = ctx.message?.users?.size() ?: 0"
      }
    }
  ]
}

然后,在 Timelion 中,使用 metric='sum:userCount'userCount 值求和并使用 cusum() 函数来获得 userCount 随时间的累积总和,将非常容易绘制图表。整个表达式如下所示:

.es(index=logstash-*,timefield='dateTime',q='messageType:UserList',metric='sum:userCount').label('Users Online').cusum()

使用一些示例文档,时间序列看起来像这样,这似乎就是您要寻找的。​​p>

【讨论】:

  • 是否可以在不创建附加字段UserCount的情况下做到这一点?
  • 如果可以在 Kibana 中定义一个脚本化字段(例如return params['_source'].message.users.size())然后在 Timelion 中使用它会很酷,但不幸的是it is not supported yet
  • 如何索引用户数组,并使用函数获取用户数组的大小?
  • 如果您使用的是 ES 5,我还有另一个解决方案。请参阅我的更新答案。
猜你喜欢
  • 2016-03-28
  • 2022-06-10
  • 1970-01-01
  • 2015-09-11
  • 2018-07-02
  • 2018-12-26
  • 2020-10-17
  • 2017-01-05
  • 1970-01-01
相关资源
最近更新 更多