# OpenTelemetryのメトリクス

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


## 概要

### 設計目標

今日、多くの確立されたメトリクスソリューションが存在することを踏まえると、OpenTelemetryのメトリクスへの取り組みの目標を理解することが重要です。

* **メトリクスを他のシグナルへ結び付けられるようにすること**。例えば、メトリクスとトレースは[エグゼンプラー](/works/otel-specs-ja/spec/metrics/data-model/#exemplars)を介して関連付けられ、メトリクスの属性は[バゲージ](/works/otel-specs-ja/spec/baggage/api/)や[コンテキスト](/works/otel-specs-ja/spec/context/)によってエンリッチされます。さらに、[リソース](/works/otel-specs-ja/spec/resource/sdk/)は、[ログ](../overview/#ログシグナル)、[メトリクス](../overview/#メトリックシグナル)、[トレース](../overview/#トレーシングシグナル)に一貫した形で適用できます。

* **[OpenCensus](https://opencensus.io/)のユーザーがOpenTelemetryへ移行するための道筋を提供すること**。これはOpenTelemetryの元々の目標であり、OpenCensusとOpenTracingを収束させることでした。私たちは、APIの1対1のマッピングを行うのではなく、セマンティクスと能力を提供することに焦点を当てます。

* **既存のメトリクス計装プロトコルや標準と連携すること**。ここでは最低限の目標を挙げます。
  * [Prometheus](https://prometheus.io/)を完全にサポートすること。ユーザーはOpenTelemetryのクライアントと[Collector](../overview/#collector)を使って、Prometheusネイティブのクライアントと同じ機能を実現しつつ、メトリクスを収集・エクスポートできるべきです。
  * [OpenTelemetry Collector](../overview/#collector)を使って[StatsD](https://github.com/statsd/statsd)のメトリクスを収集できるようにすること。

### 概念

#### API

**OpenTelemetry Metrics API**（以下「API」）は2つの目的を果たします。

* 生の測定値を効率的かつ同時に捕捉すること。
* 計装を[SDK](#sdk)から分離し、アプリケーションでSDKを指定・組み込めるようにすること。

アプリケーションに明示的な[SDK](#sdk)が組み込まれていない、あるいは有効化されていない場合、テレメトリーデータは収集されません。詳細は、全体的な[OpenTelemetry API](../overview/#api)の概念と、[APIと最小限の実装](/works/otel-specs-ja/spec/library-guidelines/#apiと最小実装)を参照してください。

#### SDK

**OpenTelemetry Metrics SDK**（以下「SDK」）はAPIを実装し、設定、集約、プロセッサー、エクスポーターなどの機能性と拡張性を提供します。

OpenTelemetryは[APIとSDKの分離](/works/otel-specs-ja/spec/library-guidelines/#要求事項)を要求しており、これにより異なるSDKを実行時に設定できます。詳細は、全体的な[OpenTelemetry SDK](../overview/#sdk)の概念を参照してください。

#### プログラミングモデル

```text
+------------------+
| MeterProvider    |                 +-----------------+             +--------------+
|   Meter A        | Measurements... |                 | Metrics...  |              |
|     Instrument X +-----------------> In-memory state +-------------> MetricReader |
|     Instrument Y |                 |                 |             |              |
|   Meter B        |                 +-----------------+             +--------------+
|     Instrument Z |
|     ...          |                 +-----------------+             +--------------+
|     ...          | Measurements... |                 | Metrics...  |              |
|     ...          +-----------------> In-memory state +-------------> MetricReader |
|     ...          |                 |                 |             |              |
|     ...          |                 +-----------------+             +--------------+
+------------------+
```

## 仕様

* [メトリクスAPI](./api/)
* [メトリクスSDK](/works/otel-specs-ja/spec/metrics/sdk/)
* [メトリクスのデータモデルとプロトコル](/works/otel-specs-ja/spec/metrics/data-model/)
* [メトリクスの要求レベル](/works/otel-specs-ja/spec/metrics/metric-requirement-level/)

## 参考文献

* メトリクスAPI/SDKプロトタイピングのシナリオ（[OTEP 146](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.60.0/oteps/metrics/0146-metrics-prototype-scenarios.md)）

- [エクスポーター](/works/otel-specs-ja/spec/metrics/sdk_exporters/)
- [メトリクスAPI](/works/otel-specs-ja/spec/metrics/api/)
- [メトリクスエクスポーター - インメモリ](/works/otel-specs-ja/spec/metrics/sdk_exporters/in-memory/)
- [メトリクスエクスポーター - OTLP](/works/otel-specs-ja/spec/metrics/sdk_exporters/otlp/)
- [メトリクスのデータモデル](/works/otel-specs-ja/spec/metrics/data-model/)
- [メトリクスSDK](/works/otel-specs-ja/spec/metrics/sdk/)
- [メトリクスエクスポーター - Prometheus](/works/otel-specs-ja/spec/metrics/sdk_exporters/prometheus/)
- [メトリクスエクスポーター - 標準出力](/works/otel-specs-ja/spec/metrics/sdk_exporters/stdout/)
- [セマンティック規約におけるメトリクス要求レベル](/works/otel-specs-ja/spec/metrics/metric-requirement-level/)
- [メトリクスAPIのNo-Op実装](/works/otel-specs-ja/spec/metrics/noop/)
- [メトリクスの補足ガイドライン](/works/otel-specs-ja/spec/metrics/supplementary-guidelines/)
