elasticsearch - 来自数组长度累积和的Timelion系列

标签 elasticsearch kibana kibana-5 timelion

我有文件,看起来类似于下面:

{
    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') 始终为 false,这告诉我它可能没有被正确索引。我试过很多 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}"));

最佳答案

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

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

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

解决方案一:

您需要对此稍微更改您的代码:

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()

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

Users online

关于elasticsearch - 来自数组长度累积和的Timelion系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45293427/

相关文章:

c# - 在Elasticsearch 5中按聚合结果过滤

charts - Kibana可视化指标选项?

elasticsearch - Kibana发现未显示索引中的所有类型

sorting - elasticsearch:按匹配嵌套文档的值排序

elasticsearch - 我无法读取 Logstash 中的拆分字段

Elasticsearch 双引号不起作用

elasticsearch - Painless Scripting Kibana 6.4.2 不使用匹配器进行匹配,但使用条件表达式进行匹配

Elasticsearch 出现 "cluster_uuid": "_na_" and license in null 问题

elasticsearch - 有没有办法在 Kibana 仪表板中定义动态查询?

python-3.x - 如何使用elasticsearch python在现有字段上 append ?