2015-05-26 36 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" 
    } 
}