# OpenTelemetry APIのパフォーマンスベンチマーク

> Source: https://www.ymotongpoo.com/works/otel-specs-ja/spec/performance-benchmark/


この文書は、OpenTelemetry SDKの性能を測定・報告する方法に関する、共通のパフォーマンスベンチマークガイドラインを説明します。

このベンチマークの目標は、対象のプラットフォーム上で、与えられたイベントのスループットに対するOpenTelemetry SDKの基本的な性能オーバーヘッドを得るためのツールを提供することです。

## ベンチマークの設定

### Spanの設定

- 親`Span`または親`SpanContext`を持たない。
- デフォルトのSpan[Kind](/works/otel-specs-ja/spec/trace/api/#spankind)と[Status](/works/otel-specs-ja/spec/trace/api/#set-status)。
- `service.name`、`service.version`という属性と、各属性に10文字の文字列値を持ち、さらに一意なUUIDを持つ`service.instance.id`という属性を伴う[リソース](/works/otel-specs-ja/spec/overview/#リソース)に関連付けられる。詳細は[Service](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/resource/README.md#service)を参照。
- 符号付き64ビット整数値を持つ[属性](/works/otel-specs-ja/spec/common/#attribute)を1つ持つ。
- 属性を持たない[イベント](/works/otel-specs-ja/spec/trace/api/#add-events)を1つ持つ。
- `AlwaysOn`サンプラーを有効にすべきである。
- 各`Span`は作成された直後に終了する。

### 測定の設定

JITコンパイルなど起動コストのある言語では、測定の前にウォームアップフェーズを設けることが推奨されます。このウォームアップフェーズは、同じSpanの[設定](#spanの設定)の下で実行します。

## スループットの測定

### Spanの作成

OTLPエクスポーターを通じて1秒間に作成・エクスポートできるSpanの数を、論理コア当たりおよびすべての論理コアにわたる平均で測定します。各Spanは10個の属性を持ち、各属性は属性名と値としてそれぞれ20文字の文字列を2つ持ちます。

## 計装のコスト

### CPU使用率の測定

ユーザーが指定したSpanのスループット数（ユーザーが数値を入力しない場合はデフォルトで1秒当たり10,000Span）に対して、デフォルト設定のシンプルなSpan ProcessorとバッチSpan Processorの両方について、OTLPエクスポーターと組み合わせたSDKのCPU使用率を測定・報告します。ベンチマークは、エクスポート先でリッスンするプロセス外のOTLPレシーバーを作成するか、既にプロセス外で動作している既存のOTLPエクスポーターを利用し、即座に成功ステータスを返してデータを破棄するようにします。Collectorは、測定に大きなCPUオーバーヘッドを加えるべきではありません。ベンチマークにはユーザーの処理ロジックが含まれないため、ベンチマークプログラム全体のCPU消費量は、SDKのCPU消費量の近似値と見なせます。

1回のテスト実行における合計実行時間は、少なくとも15秒であることが推奨されます。平均CPU使用率とピークCPU使用率を報告すべきです。

### メモリ使用量の測定

上記のCPU使用率の測定と同じシナリオで、15秒間のヒープなどの動的メモリ消費量を測定します。

## 報告

### 報告フォーマット

上記のすべての数値は、複数回（少なくとも10回を推奨）測定し、報告すべきです。

