パーセンタイルランクの集約

集約されたドキュメントから抽出された数値に対して1つ以上のパーセンタイルランクを計算する multi-value メトリクス集約です。これらの値は、ドキュメント内の特定の数値または ヒストグラムフィールド から抽出できます。

パーセンタイルランクの集約に関する近似、パフォーマンス、およびメモリ使用に関するアドバイスについては、パーセンタイルは(通常)近似です圧縮、および実行ヒントを参照してください。

パーセンタイルランクは、特定の値未満の観測値の割合を示します。たとえば、ある値が観測された値の95%以上である場合、それは95パーセンタイルランクにあると言います。

データがウェブサイトの読み込み時間で構成されていると仮定します。ページの95%の読み込みが500ms以内に完了し、99%の読み込みが600ms以内に完了するというサービス契約があるかもしれません。

読み込み時間を表す一連のパーセンタイルを見てみましょう:

Python

  1. resp = client.search(
  2. index="latency",
  3. size=0,
  4. aggs={
  5. "load_time_ranks": {
  6. "percentile_ranks": {
  7. "field": "load_time",
  8. "values": [
  9. 500,
  10. 600
  11. ]
  12. }
  13. }
  14. },
  15. )
  16. print(resp)

Ruby

  1. response = client.search(
  2. index: 'latency',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. load_time_ranks: {
  7. percentile_ranks: {
  8. field: 'load_time',
  9. values: [
  10. 500,
  11. 600
  12. ]
  13. }
  14. }
  15. }
  16. }
  17. )
  18. puts response

Js

  1. const response = await client.search({
  2. index: "latency",
  3. size: 0,
  4. aggs: {
  5. load_time_ranks: {
  6. percentile_ranks: {
  7. field: "load_time",
  8. values: [500, 600],
  9. },
  10. },
  11. },
  12. });
  13. console.log(response);

コンソール

  1. GET latency/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "load_time_ranks": {
  6. "percentile_ranks": {
  7. "field": "load_time",
  8. "values": [ 500, 600 ]
  9. }
  10. }
  11. }
  12. }
フィールド load_time は数値フィールドでなければなりません

レスポンスは次のようになります:

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "load_time_ranks": {
  5. "values": {
  6. "500.0": 55.0,
  7. "600.0": 64.0
  8. }
  9. }
  10. }
  11. }

この情報から、99%の読み込み時間の目標には達しているが、95%の読み込み時間の目標には達していないことがわかります。

キー付きレスポンス

デフォルトでは、keyed フラグは true に設定されており、各バケットに一意の文字列キーを関連付け、範囲を配列ではなくハッシュとして返します。 keyed フラグを false に設定すると、この動作が無効になります:

Python

  1. resp = client.search(
  2. index="latency",
  3. size=0,
  4. aggs={
  5. "load_time_ranks": {
  6. "percentile_ranks": {
  7. "field": "load_time",
  8. "values": [
  9. 500,
  10. 600
  11. ],
  12. "keyed": False
  13. }
  14. }
  15. },
  16. )
  17. print(resp)

Ruby

  1. response = client.search(
  2. index: 'latency',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. load_time_ranks: {
  7. percentile_ranks: {
  8. field: 'load_time',
  9. values: [
  10. 500,
  11. 600
  12. ],
  13. keyed: false
  14. }
  15. }
  16. }
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.search({
  2. index: "latency",
  3. size: 0,
  4. aggs: {
  5. load_time_ranks: {
  6. percentile_ranks: {
  7. field: "load_time",
  8. values: [500, 600],
  9. keyed: false,
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);

コンソール

  1. GET latency/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "load_time_ranks": {
  6. "percentile_ranks": {
  7. "field": "load_time",
  8. "values": [ 500, 600 ],
  9. "keyed": false
  10. }
  11. }
  12. }
  13. }

レスポンス:

コンソール-結果

  1. {
  2. ...
  3. "aggregations": {
  4. "load_time_ranks": {
  5. "values": [
  6. {
  7. "key": 500.0,
  8. "value": 55.0
  9. },
  10. {
  11. "key": 600.0,
  12. "value": 64.0
  13. }
  14. ]
  15. }
  16. }
  17. }

スクリプト

インデックスされていない値に対して集約を実行する必要がある場合は、ランタイムフィールドを使用してください。たとえば、読み込み時間がミリ秒単位であるが、パーセンタイルを秒単位で計算したい場合:

Python

  1. resp = client.search(
  2. index="latency",
  3. size=0,
  4. runtime_mappings={
  5. "load_time.seconds": {
  6. "type": "long",
  7. "script": {
  8. "source": "emit(doc['load_time'].value / params.timeUnit)",
  9. "params": {
  10. "timeUnit": 1000
  11. }
  12. }
  13. }
  14. },
  15. aggs={
  16. "load_time_ranks": {
  17. "percentile_ranks": {
  18. "values": [
  19. 500,
  20. 600
  21. ],
  22. "field": "load_time.seconds"
  23. }
  24. }
  25. },
  26. )
  27. print(resp)

Ruby

  1. response = client.search(
  2. index: 'latency',
  3. body: {
  4. size: 0,
  5. runtime_mappings: {
  6. 'load_time.seconds' => {
  7. type: 'long',
  8. script: {
  9. source: "emit(doc['load_time'].value / params.timeUnit)",
  10. params: {
  11. "timeUnit": 1000
  12. }
  13. }
  14. }
  15. },
  16. aggregations: {
  17. load_time_ranks: {
  18. percentile_ranks: {
  19. values: [
  20. 500,
  21. 600
  22. ],
  23. field: 'load_time.seconds'
  24. }
  25. }
  26. }
  27. }
  28. )
  29. puts response

Js

  1. const response = await client.search({
  2. index: "latency",
  3. size: 0,
  4. runtime_mappings: {
  5. "load_time.seconds": {
  6. type: "long",
  7. script: {
  8. source: "emit(doc['load_time'].value / params.timeUnit)",
  9. params: {
  10. timeUnit: 1000,
  11. },
  12. },
  13. },
  14. },
  15. aggs: {
  16. load_time_ranks: {
  17. percentile_ranks: {
  18. values: [500, 600],
  19. field: "load_time.seconds",
  20. },
  21. },
  22. },
  23. });
  24. console.log(response);

コンソール

  1. GET latency/_search
  2. {
  3. "size": 0,
  4. "runtime_mappings": {
  5. "load_time.seconds": {
  6. "type": "long",
  7. "script": {
  8. "source": "emit(doc['load_time'].value / params.timeUnit)",
  9. "params": {
  10. "timeUnit": 1000
  11. }
  12. }
  13. }
  14. },
  15. "aggs": {
  16. "load_time_ranks": {
  17. "percentile_ranks": {
  18. "values": [ 500, 600 ],
  19. "field": "load_time.seconds"
  20. }
  21. }
  22. }
  23. }

HDRヒストグラム

HDRヒストグラム(高ダイナミックレンジヒストグラム)は、レイテンシ測定のパーセンタイルランクを計算する際に便利な代替実装であり、t-digest実装よりも高速である可能性がありますが、より大きなメモリフットプリントのトレードオフがあります。この実装は、固定の最悪ケースのパーセンテージ誤差(指定された有効数字の数)を維持します。これは、データが1マイクロ秒から1時間(3,600,000,000マイクロ秒)の値で記録され、ヒストグラムが3桁の有効数字に設定されている場合、1ミリ秒までの値に対して1マイクロ秒の値解像度を維持し、最大追跡値(1時間)に対して3.6秒(またはそれ以上)を維持することを意味します。

HDRヒストグラムは、リクエスト内で hdr オブジェクトを指定することによって使用できます:

Python

  1. resp = client.search(
  2. index="latency",
  3. size=0,
  4. aggs={
  5. "load_time_ranks": {
  6. "percentile_ranks": {
  7. "field": "load_time",
  8. "values": [
  9. 500,
  10. 600
  11. ],
  12. "hdr": {
  13. "number_of_significant_value_digits": 3
  14. }
  15. }
  16. }
  17. },
  18. )
  19. print(resp)

Ruby

  1. response = client.search(
  2. index: 'latency',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. load_time_ranks: {
  7. percentile_ranks: {
  8. field: 'load_time',
  9. values: [
  10. 500,
  11. 600
  12. ],
  13. hdr: {
  14. number_of_significant_value_digits: 3
  15. }
  16. }
  17. }
  18. }
  19. }
  20. )
  21. puts response

Js

  1. const response = await client.search({
  2. index: "latency",
  3. size: 0,
  4. aggs: {
  5. load_time_ranks: {
  6. percentile_ranks: {
  7. field: "load_time",
  8. values: [500, 600],
  9. hdr: {
  10. number_of_significant_value_digits: 3,
  11. },
  12. },
  13. },
  14. },
  15. });
  16. console.log(response);

コンソール

  1. GET latency/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "load_time_ranks": {
  6. "percentile_ranks": {
  7. "field": "load_time",
  8. "values": [ 500, 600 ],
  9. "hdr": {
  10. "number_of_significant_value_digits": 3
  11. }
  12. }
  13. }
  14. }
  15. }
hdr オブジェクトは、HDRヒストグラムを使用してパーセンタイルを計算する必要があることを示し、このアルゴリズムの特定の設定をオブジェクト内で指定できます
number_of_significant_value_digits は、ヒストグラムの値の解像度を有効数字の数で指定します

HDRヒストグラムは正の値のみをサポートし、負の値が渡されるとエラーが発生します。また、値の範囲が不明な場合にHDRヒストグラムを使用することはお勧めできません。これは高いメモリ使用量につながる可能性があります。

欠損値

missing パラメータは、値が欠落しているドキュメントがどのように扱われるべきかを定義します。デフォルトでは無視されますが、値があるかのように扱うことも可能です。

Python

  1. resp = client.search(
  2. index="latency",
  3. size=0,
  4. aggs={
  5. "load_time_ranks": {
  6. "percentile_ranks": {
  7. "field": "load_time",
  8. "values": [
  9. 500,
  10. 600
  11. ],
  12. "missing": 10
  13. }
  14. }
  15. },
  16. )
  17. print(resp)

Ruby

  1. response = client.search(
  2. index: 'latency',
  3. body: {
  4. size: 0,
  5. aggregations: {
  6. load_time_ranks: {
  7. percentile_ranks: {
  8. field: 'load_time',
  9. values: [
  10. 500,
  11. 600
  12. ],
  13. missing: 10
  14. }
  15. }
  16. }
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.search({
  2. index: "latency",
  3. size: 0,
  4. aggs: {
  5. load_time_ranks: {
  6. percentile_ranks: {
  7. field: "load_time",
  8. values: [500, 600],
  9. missing: 10,
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);

コンソール

  1. GET latency/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "load_time_ranks": {
  6. "percentile_ranks": {
  7. "field": "load_time",
  8. "values": [ 500, 600 ],
  9. "missing": 10
  10. }
  11. }
  12. }
  13. }
load_time フィールドに値がないドキュメントは、値 10 を持つドキュメントと同じバケットに入ります。