如何在elasticsearch中对时间戳执行减号操作?

rta7y2nd  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(2)|浏览(547)

我把一些服务器日志倒进了elasticsearch。日志包含如下条目 'action_id':'AU11nP1mYXS3pt6INMtU','action':'start','time':'March 31st 2015, 19:42:07.121' 以及 'action_id':'AU11nP1mYXS3pt6INMtU','action':'complete','time':'March 31st 2015, 23:06:00.271' . 相同的action\u id指的是单个操作,我感兴趣的是完成一个操作需要多长时间。
我真的不知道如何用ElasticSearch方法来构建我的问题,但我会尽我最大的努力:如何根据自定义度量(由时间跨度定义)对“action\u id”进行聚合 'action':'start''action':'complete' ?
我在用 kibana 如果有帮助的话。

hwamh0ep

hwamh0ep1#

看起来elasticsearch并不是为了直接计算持续时间而设计的。elasticsearch似乎使用logstash来执行这些任务。
https://www.elastic.co/guide/en/logstash/current/plugins-filters-elasticsearch.html

if [action] == "complete" {
   elasticsearch {
      hosts => ["es-server"]
      query => "action:start AND action_id:%{[action_id]}"
      fields => ["time", "started"]
   }

  date {
     match => ["[started]", "ISO8601"]
     target => "[started]"
  }

  ruby {
     code => "event['duration_hrs'] = (event['@timestamp'] - event['started']) / 3600 rescue nil"   
  }
}
uelo1irk

uelo1irk2#

我查看了为脚本度量聚合提供的示例,并针对此问题对其进行了修改:

{
   "aggs": {
      "actions": {
         "terms": {
            "field": "action_id"
         },
         "aggs": {
            "duration": {
               "scripted_metric": {
                  "init_script": "_agg['delta'] = 0",
                  "map_script": "if (doc['action'].value == \"complete\"){ _agg.delta += doc['time'].value } else {_agg.delta -= doc['time'].value}",
                  "combine_script": "return _agg.delta",
                  "reduce_script": "duration = 0; for (d in _aggs) { duration += d }; return duration"
               }
            }
         }
      }
   }
}

首先,它用聚合术语为每个action\u id创建bucket。
然后为每个bucket计算一个脚本度量。
map 步骤它将每个shard的“complete”时间戳作为正值,其他时间戳(即“start”时间戳)作为负值。接着 combine 第二步,它只是返回它们。继续 reduce 步骤它将一个动作在所有碎片上的持续时间相加(因为“开始”和“完成”事件可能在不同的碎片上),得到实际的持续时间。
我不确定这个聚合的性能,但是你可以在你的数据集上试试。请注意,它还被标记为实验功能。

相关问题