# OpenTelemetry Profiles

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


**ステータス**: [アルファ（Alpha）](/works/otel-specs-ja/spec/document-status/)

## 概要

**プロファイル**とは、実行中のプログラムから収集された、リソース消費量とコード実行を表す値と関連付けられたスタックトレースの集合です。プロファイリングとは、通常は一定間隔でプログラムの状態をサンプリングすることで、このようなプロファイルを収集する処理を指します。

OpenTelemetryのプロファイリングの一般的な紹介と、他のオブザーバビリティシグナルをどのように補完するかについては、[プロファイルのコンセプト](https://opentelemetry.io/docs/concepts/signals/profiles/)を参照してください。

## 設計目標

プロファイルシグナルは、以下の目標を念頭に設計されています。

- **低オーバーヘッド**: プロファイリングエージェントが、アプリケーションの性能に大きな影響を与えることなく、本番環境で継続的に動作できるようにする。
- **効率的な表現**: ディクショナリテーブルを用いてサンプル間で繰り返される情報を重複排除することで、格納・転送するデータ量を削減する。
- **既存フォーマットとの互換性**: このデータフォーマットは[pprof](https://github.com/google/pprof)などの既存のプロファイリングフォーマットのスーパーセットであり、多くの場合これらのフォーマットとの間で無損失の変換をサポートする。それが不可能な場合（カスタム拡張がある場合など）は、`original_payload_format`フィールドを使って、将来の無損失なエクスポートや再解釈のために元の情報を伝送できる。
- **他シグナルとの相関**: プロファイルは、共有されるリソースコンテキストを通じて、また該当する場合は直接的なトレース・スパン参照を通じて、ログ・メトリクス・トレースとリンク可能でなければなりません（MUST）。

## データフォーマット

OpenTelemetryプロファイルのデータフォーマットは[こちら](/works/otel-specs-ja/spec/profiles/data-format/)にあります。これは[pprof protobufフォーマット](https://github.com/google/pprof/tree/main/proto)を基盤とし、以下の点で拡張しています。

- **リソースとスコープのコンテキスト**: プロファイルの各バッチは、ログ・メトリクス・トレースと同様に[Resource](/works/otel-specs-ja/spec/resource/)と[InstrumentationScope](/works/otel-specs-ja/spec/common/instrumentation-scope/)に関連付けられる。
- **汎用化されたディクショナリ**: 文字列だけでなく、重複が生じる他のメッセージも重複排除する。
- **汎用化された属性**: ほとんどのメッセージは、他のシグナルと同じ規約に従う属性を持つことができ、Unit情報（`KeyValueAndUnit`）で拡張されている。
- **スパンコンテキスト参照**: サンプルは`Link`（スパンIDとトレースID）を含んでもよく（MAY）、これによりプロファイルサンプルと、それが取得されたトレース・スパンとの直接的なリンクが可能になる。

`Mapping`メッセージの必須属性とビルドID生成のためのカスタムハッシュ方式の詳細については、[Mappings](/works/otel-specs-ja/spec/profiles/mappings/)を参照してください。

[pprof](https://github.com/google/pprof)との互換性の詳細については、[pprof](/works/otel-specs-ja/spec/profiles/pprof/)を参照してください。

## 既知の値

[OpenTelemetryセマンティック規約](https://opentelemetry.io/docs/specs/semconv/)は、プロファイルが他のOpenTelemetryシグナルと相関し、トレース・メトリクス・ログ・プロファイルを統一的に分析してシステム全体を把握できるようにするために重要です。

既存のプロファイリングツールとの互換性を高めるため、既知の値が利用されます。

| プロファイルのフィールド | 既知の値 |
| ------------- | ------------ |
| original_payload_format | [pprof](https://github.com/google/pprof/tree/main/proto)、[jfr](https://en.wikipedia.org/wiki/JDK_Flight_Recorder)、または[linux_perf](https://perfwiki.github.io/) |

## 仕様

* [プロファイルデータフォーマット](/works/otel-specs-ja/spec/profiles/data-format/)
* [プロファイルMappings属性](/works/otel-specs-ja/spec/profiles/mappings/)
* [プロファイルとpprofの互換性](/works/otel-specs-ja/spec/profiles/pprof/)

## 参考資料

- [プロファイルのコンセプト](https://opentelemetry.io/docs/concepts/signals/profiles/)
- [プロファイルセマンティック規約](/works/otel-specs-ja/semconv/general/profiles/)
- [OTEP0212 OpenTelemetryプロファイルのビジョン](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.60.0/oteps/profiles/0212-profiling-vision.md)

- [Mappings](/works/otel-specs-ja/spec/profiles/mappings/)
- [Pprof](/works/otel-specs-ja/spec/profiles/pprof/)
- [プロファイルデータフォーマット](/works/otel-specs-ja/spec/profiles/data-format/)
