2015-05-26 34 views
3

我有一些服务器日志转储到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_id指的是单个动作,我对完成某个动作需要多长时间感兴趣。如何在elasticsearch中对时间戳进行减号操作?

我并不真正了解构建我的问题的elasticsearch方法,但我会尽我所能:如何基于从其花费的时间跨度定义的自定义度量标准在'action_id'上进行聚合'action':'start''action':'complete'

我使用kibana进行可视化,如果有帮助。

回答

0

我看着为scripted metric aggregation给出的例子并修改了它对于这个问题:

{ 
    "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_id创建桶。

然后为每个存储桶计算脚本度量。

map步骤中,它将'完整'时间戳记作为正值并将其他(即'开始')时间戳记作为每个分片的负数。然后在combine步骤它只是返回它们。并且在reduce步骤中,将所有分片的动作的持续时间累加(作为“开始”和“完成”事件可以在不同的分片上)以获得实际持续时间。

我不知道这个聚集的性能,但你可以尝试一下在你的数据集。请注意,它被标记为实验功能。

+0

你知道,如果它是可以做到与kibana 4脚本字段(或任何其他选项)一样吗? –

+0

这可能是正确的,但我不能让它特别是没有kibana工作,但它似乎很容易实现与logstash和重建索引。无论如何,我都没有问题重新编码,这对于elasticsearch来说是不可避免的。 – lingxiao

0

它看起来像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" 
    } 
}