3

SUM-Aggregation を使用して、サービス プロセスの期間を計算します。実行されたプロセスの各ステップは、呼び出し ID の下で Elasticsearch に保存されます。

これは私が監視するものです:

Duration of Request-Processing for ID #123 (calling service #1)

Duration of Server-Response for ID #123 (calling service #1)

**Complete Duration for ID #123**

Duration of Request-Processing for ID #124 (calling service #1)

Duration of Server-Response for ID #124 (calling service #1)

**Complete duration for ID #124**

フィルター:

{
"from" : 0, "size" :0,

    "query" : {
        "filtered" : {
            "query" : { "match_all" : {}},
            "filter" : {
                "term" : { 
                    "callingId" : "123",
                }
            }
        }
    },
    "aggs" : {
        "total_duration" : { "sum" : { "field" : "duration" } },
        "max_duration":{"max": {"field":"duration"}},   
        "min_duration":{"min":{"field":"duration"}}
        }
    }
    }

これは、プロセスの完全な期間を返し、プロセスのどの部分が最も速く、どの部分が最も遅かったかも教えてくれます。

次に、完了したすべてのプロセスの平均所要時間をserviceId 別に計算したいと思います。この場合、私は各サービスの合計期間のみを気にするので、それらを取得できます。

total_durations から平均、最小、最大を作成するにはどうすればよいですか?

編集: サンプル データをいくつか追加しました。

コール 1:

{
"callerId":"U1",
"operation":"Initialize",
"status":"INITIALIZED",
"duration":1,
"serviceId":"1"
}

{
"callerId":"U1",
"operation":"Calculate",
"status":"STARTED",
"duration":1,
"serviceId":"1"
}

{
"callerId":"U1",
"operation":"Finish",
"status":"FINISHED",
"duration":1200,
"serviceId":"1"
}

sum: 1202

コール 2:

{
"callerId":"U2",
"operation":"Initialize",
"status":"INITIALIZED",
"duration":2,
"serviceId":"1"
}

{
"callerId":"U2",
"operation":"Calculate",
"status":"STARTED",
"duration":1,
"serviceId":"1"
}

{
"callerId":"U2",
"operation":"Finish",
"status":"FINISHED",
"duration":1030,
"serviceId":"1"
}

sum: 1033

サービス ID #1 のすべてのサービス呼び出しの集計 これは私が計算したいものです:

Max: 1202
Min: 1033
AVG: 1116
4

2 に答える 2

3

もう少し複雑ですが、次のようになります (このタイプの集計のため、1.4 のみ):

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "serviceId": 1
        }
      }
    }
  },
  "aggs": {
    "executionTimes": {
      "scripted_metric": {
        "init_script": "_agg['values'] = new java.util.HashMap();",
        "map_script": "if (_agg.values[doc['callerId'].value]==null) {_agg.values[doc['callerId'].value]=doc['duration'].value;} else {_agg.values[doc['callerId'].value].add(doc['duration'].value);}",
        "combine_script":"someHashMap = new java.util.HashMap();for(x in _agg.values.keySet()) {value=_agg.values[x]; sum=0; for(y in value) {sum+=y}; someHashMap.put(x,sum)}; return someHashMap;",
        "reduce_script": "finalArray = []; finalMap = new java.util.HashMap(); for(map in _aggs){for(x in map.keySet()){if(finalMap.containsKey(x)){value=finalMap.get(x);finalMap.put(x,value+map.get(x));} else {finalMap.put(x,map.get(x))}}}; finalAvgValue=0; finalMaxValue=-1; finalMinValue=-1; for(key in finalMap.keySet()){currentValue=finalMap.get(key);finalAvgValue+=currentValue; if(finalMinValue<0){finalMinValue=currentValue} else if(finalMinValue>currentValue){finalMinValue=currentValue}; if(currentValue>finalMaxValue) {finalMaxValue=currentValue}}; finalArray.add(finalMaxValue); finalArray.add(finalMinValue); finalArray.add(finalAvgValue/finalMap.size()); return finalArray",
        "lang": "groovy"
      }
    }
  }
}

また、それが最良のアプローチだと言っているわけではありませんが、私が見つけたのは1つだけです。また、解決策が最善の形であると言っているわけではありません。おそらく、それはクリーンアップされて改善されるかもしれません。しかし、それが可能であることを示したかったのです。ただし、1.4 で使用できることに注意してください。

このアプローチの基本的な考え方は、スクリプトを使用して、必要な情報を保持するデータ構造を構築し、スクリプト化されたメトリック集計に従ってさまざまな手順で計算することです。また、集計は 1 つのみに対して実行されserviceIdます。すべての serviceIds に対してこれを行いたい場合は、スクリプトのデータ構造を少し考え直す必要があると思います。

上記のクエリと、提供した正確なデータの出力は次のとおりです。

{
   "took": 3,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 6,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "executionTimes": {
         "value": [
            1202,
            1033,
            "1117.5"
         ]
      }
   }
}

のスクリプトに従って、配列内の値の順序valueは [最大、最小、平均]reduce_scriptです。

于 2014-11-19T07:55:18.900 に答える
2

次期バージョン 2.0.0 には、「Reducers」と呼ばれる新機能が追加される予定です。レデューサーを使用すると、集計よりも集計を計算できます。

関連記事: https://github.com/elasticsearch/elasticsearch/issues/8110

于 2014-11-19T15:08:07.860 に答える