# メトリクス

> 実行時に取得された測定値

---

LLMS index: [llms.txt](/llms.txt)

---

**メトリクス**とは、実行時に取得されるサービスの**測定値**のことです。
測定値を取得した瞬間は**メトリクスイベント**として知られており、測定値そのものだけでなく、キャプチャした時刻と関連するメタデータから構成されます。

アプリケーションとリクエストのメトリクスは、可用性とパフォーマンスの重要な指標です。
カスタムメトリクスは、可用性指標がユーザー体験やビジネスにどのような影響を与えるかについての洞察を提供できます。
収集したデータを使用して、障害を警告したり、需要が高まったときにデプロイを自動的にスケールアップするスケジューリング決定をトリガーしたりできます。

OpenTelemetryのメトリクスがどのように機能するのかを理解するために、コードの計装の一部を担うコンポーネントのリストを見てみましょう。

## メータープロバイダー {#meter-provider}

メータープロバイダー（`MeterProvider` と呼ばれることもあります）は、`Meter`のファクトリーです。
ほとんどのアプリケーションでは、メータープロバイダーは一度だけ初期化され、そのライフサイクルはアプリケーションのライフサイクルと一致します。
メータープロバイダーの初期化には、リソースとエクスポーターの初期化も含まれます。
これは通常、OpenTelemetryを使った計測の最初のステップです。
いくつかの言語SDKでは、グローバルなメータープロバイダーがすでに初期化されています。

## メーター {#meter}

メーターは[メトリクス計装](#metric-instruments)を作成し、実行時にサービスに関する測定値を取得します。
メーターはメータープロバイダーから作成されます。

## メトリクスエクスポーター {#metric-exporter}

メトリクスエクスポーターはメトリクスデータをコンシューマーに送ります。
このコンシューマーは、開発中のデバッグのための標準出力、OpenTelemetryコレクター、あるいは、あなたが選んだオープンソースやベンダーのバックエンドです。

## メトリクス計装 {#metric-instruments}

OpenTelemetryでは、計測は **メトリクス計装** によって行われます。メトリクス計装は以下のように定義されます。

- 名前
- 種類
- 単位（オプション）
- 説明（オプション）

名前、単位、説明は、開発者が自分で定義するか、リクエストやプロセスメトリクスのような一般的なものについては、[セマンティック規約](/docs/specs/semconv/general/metrics/)を介して定義されます。

計装の種類は以下のいずれかです。

- **Counter（カウンター）**： 時間とともに蓄積される値。これは車のオドメーターのようなものだと考えられます。
- **Asynchronous Counter（非同期カウンター）**： **カウンター** と同じですが、各エクスポートに対して一度だけ収集されます。
  連続したインクリメントにアクセスできず、集約された値のみにアクセスできる場合に使用できます。
- **UpDownCounter（アップダウンカウンター）**: 時間の経過とともに蓄積されるけれども、減少することもある値。
  たとえば、キューの長さは、キュー内のワークアイテムの数によって増減します。
- **Asynchronous UpDownCounter（非同期アップダウンカウンター）**: **アップダウンカウンター**と同じですが、各エクスポートに対して一度だけ収集されます。
  連続的な変更にアクセスできず、集約された値（たとえば、現在のキューのサイズ）のみにアクセスできる場合に使用できます。
- **Gauge（ゲージ）**: 読み取った時点での現在の値を測定します。たとえば、自動車の燃料計など。ゲージは同期しています。
- **Asynchronous Gauge（非同期ゲージ）**: **ゲージ**と同じですが、各エクスポートに対して一度だけ収集されます。
  連続的な変更にアクセスできず、集約された値のみにアクセスできる場合に使用できます。
- **Histogram（ヒストグラム）**: リクエストのレイテンシーなどの値をクライアント側で集約したもの。
  値の統計に興味がある場合は、ヒストグラムが良いでしょう。
  たとえば、どれくらいのリクエストが1秒未満か、といった疑問に答えてくれます。

同期と非同期の計装、またどの種類の計装があなたのユースケースにもっとも適しているかについては、[補足ガイドライン](/docs/specs/otel/metrics/supplementary-guidelines/)を参照してください。

## 集約（アグリゲーション） {#aggregation}

メトリクス計装に加えて、**集約（アグリゲーション）**という概念も理解すべき重要なものです。
集約とは、多数の測定値を組み合わせて、ある時間ウィンドウの間に発生したメトリクスイベントに関する正確な統計値または推定統計値にする手法です。
OTLPプロトコルは、このような集約されたメトリクスを伝送します。
OpenTelemetry APIは、各計装に対してデフォルトの集約を提供します。これはビューを使ってオーバーライドできます。
OpenTelemetryプロジェクトは、ビジュアライザーやテレメトリーバックエンドでサポートされるデフォルトの集計を提供することを目指しています。

[リクエストトレース](../traces/)が、リクエストのライフサイクルを捕捉し、リクエストの個々の部分にコンテキストを提供することを意図しているのとは異なり、メトリクスは、集約された統計情報を提供することを意図しています。
メトリクスの使用例には、次のようなものがあります。

- プロトコルの種類ごとに、サービスによって読み取られた総バイト数を報告する。
- 読み込んだ総バイト数とリクエストごとのバイト数を報告する。
- システムコールの継続時間を報告する。
- 傾向を把握するためにリクエストサイズを報告する。
- プロセスのCPUまたはメモリ使用量を報告する。
- 口座の平均残高値を報告する。
- 現在処理中のアクティブなリクエストを報告する。

## ビュー {#views}

ビューは、SDKによって出力されるメトリクスをカスタマイズする柔軟性をSDKのユーザーに提供します。
どのメトリクス計装を処理するか、または無視するかをカスタマイズできます。
また、集約をカスタマイズしたり、メトリクスにどのような属性をレポートするかをカスタマイズすることもできます。

## 言語サポート {#language-support}

メトリクスはOpenTelemetry仕様の[stable](/docs/specs/otel/versioning-and-stability/#stable)シグナルです。
Metrics APIとSDKの各言語固有の実装については、ステータスは以下の通りです。


Language | Metrics |
| --- | --- |
| [C++](/docs/languages/cpp/) | Stable |
| [C#/.NET](/docs/languages/dotnet/) | Stable |
| [Erlang/Elixir](/docs/languages/erlang/) | Development |
| [Go](/docs/languages/go/) | Stable |
| [Java](/docs/languages/java/) | Stable |
| [JavaScript](/docs/languages/js/) | Stable |
| [PHP](/docs/languages/php/) | Stable |
| [Python](/docs/languages/python/) | Stable |
| [Ruby](/docs/languages/ruby/) | Development |
| [Rust](/docs/languages/rust/) | Beta |
| [Swift](/docs/languages/swift/) | Development |


## 仕様 {#specification}

OpenTelemetryのメトリクスの詳細については、[メトリクス仕様](/docs/specs/otel/overview/#metric-signal)を参照してください。
