# メトリクスAPIのNo-Op実装

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


**ステータス**: [Stable](../../document-status/)

OpenTelemetryの利用者には、実際にはいかなる操作も実行しないようにAPIを無効化する手段が必要です。No-Op OpenTelemetry API実装（以下No-Opと呼びます）は、この機能を利用者に提供します。No-OpはOpenTelemetry APIを実装し、テレメトリーが生成されず、計算リソースの使用が最小化されるようにします。

OpenTelemetryのすべての言語実装は、No-Opを提供しなければなりません（MUST）。

## MeterProvider

No-Opは、複数のMeterProviderの作成を許可しなければなりません（MUST）。

No-Opによって作成されるMeterProviderは、メモリのフットプリントを可能な限り小さく保つ必要があります。したがって、作成されるすべてのMeterProviderは、設定や動作状態を保持してはなりません（MUST NOT）。

すべてのMeterProviderが同じ空の状態を保持するため、No-Opはすべての作成リクエストに対して同じMeterProviderのインスタンスを提供してもよい（MAY）。

No-Opは、OpenTelemetryの利用者がOpenTelemetryの計算オーバーヘッドを無効化し、OpenTelemetry関連の出力を排除するために使われます。このため、MeterProviderは、実行するいかなる操作についても、空でないエラーを返したりメッセージをログに記録したりしてはなりません（MUST NOT）。

MeterProviderが提供するすべての操作は、並行して実行しても安全でなければなりません（MUST）。

### Meterの作成

[新しいMeterインスタンスは、常にMeterProviderから作成されます](../api/#meterprovider)。したがって、MeterProviderはMeterの作成を許可しなければなりません（MUST）。作成されるすべてのMeterは、[No-Op Meter](#meter)のインスタンスでなければなりません（MUST）。

すべてのMeterが同じ空の状態を保持するため、MeterProviderはすべての作成リクエストに対して同じMeterのインスタンスを返してもよい（MAY）。

[このAPIは、作成操作が受け付けるべき複数のパラメータを規定しています](../api/#meterprovider)。MeterProviderはこれらのパラメータを受け付けなければなりません（MUST）。ただし、MeterProviderは受け取った引数を検証してはなりません（MUST NOT）。

## Meter

No-Opによって作成されるMeterは、メモリのフットプリントを可能な限り小さく保つ必要があります。したがって、作成されるすべてのMeterは、設定や動作状態を保持してはなりません（MUST NOT）。

Meterは、実行するいかなる操作についても、空でないエラーを返したりメッセージをログに記録したりしてはなりません（MUST NOT）。

Meterが提供するすべての操作は、並行して実行しても安全でなければなりません（MUST）。

### Counter作成

No-Opのメーターは、[Counter Instrument](#counter)の作成を許可しなければなりません（MUST）。

すべてのCounterが同じ空の状態を保持するため、Meterはすべての作成リクエストに対して同じCounterのインスタンスを返してもよい（MAY）。

[このAPIは、作成操作が受け付けるべき複数のパラメータを規定しています](../api/#同期instrument-api)。Meterはこれらのパラメータを受け付けなければなりません（MUST）。ただし、Meterは受け取った引数を検証してはなりません（MUST NOT）。

### UpDownCounter作成

No-Opのメーターは、[UpDownCounter Instrument](#updowncounter)の作成を許可しなければなりません（MUST）。

すべてのUpDownCounterが同じ空の状態を保持するため、Meterはすべての作成リクエストに対して同じUpDownCounterのインスタンスを返してもよい（MAY）。

[このAPIは、作成操作が受け付けるべき複数のパラメータを規定しています](../api/#同期instrument-api)。Meterはこれらのパラメータを受け付けなければなりません（MUST）。ただし、Meterは受け取った引数を検証してはなりません（MUST NOT）。

### Histogram作成

No-Opのメーターは、[Histogram Instrument](#histogram)の作成を許可しなければなりません（MUST）。

すべてのHistogramが同じ空の状態を保持するため、Meterはすべての作成リクエストに対して同じHistogramのインスタンスを返してもよい（MAY）。

[このAPIは、作成操作が受け付けるべき複数のパラメータを規定しています](../api/#同期instrument-api)。Meterはこれらのパラメータを受け付けなければなりません（MUST）。ただし、Meterは受け取った引数を検証してはなりません（MUST NOT）。

### 非同期Counter作成

No-Opのメーターは、[非同期Counter Instrument](#非同期counter)の作成を許可しなければなりません（MUST）。

すべての非同期Counterが同じ空の状態を保持するため、Meterはすべての作成リクエストに対して同じ非同期Counterのインスタンスを返してもよい（MAY）。

[このAPIは、作成操作が受け付けるべき複数のパラメータを規定しています](../api/#非同期instrument-api)。Meterはこれらのパラメータを受け付けなければなりません（MUST）。ただし、Meterは受け取った引数を検証してはならず（MUST NOT）、渡されたコールバックへの参照を保持してはなりません（MUST NOT）。

### 非同期UpDownCounter作成

No-Opのメーターは、[非同期UpDownCounter Instrument](#非同期updowncounter)の作成を許可しなければなりません（MUST）。

すべての非同期UpDownCounterが同じ空の状態を保持するため、Meterはすべての作成リクエストに対して同じ非同期UpDownCounterのインスタンスを返してもよい（MAY）。

[このAPIは、作成操作が受け付けるべき複数のパラメータを規定しています](../api/#非同期instrument-api)。Meterはこれらのパラメータを受け付けなければなりません（MUST）。ただし、Meterは受け取った引数を検証してはならず（MUST NOT）、渡されたコールバックへの参照を保持してはなりません（MUST NOT）。

### 非同期Gauge作成

No-Opのメーターは、[非同期Gauge Instrument](#非同期gauge)の作成を許可しなければなりません（MUST）。

すべての非同期Gaugeが同じ空の状態を保持するため、Meterはすべての作成リクエストに対して同じ非同期UpDownCounterのインスタンスを返してもよい（MAY）。

[このAPIは、作成操作が受け付けるべき複数のパラメータを規定しています](../api/#非同期instrument-api)。Meterはこれらのパラメータを受け付けなければなりません（MUST）。ただし、Meterは受け取った引数を検証してはならず（MUST NOT）、渡されたコールバックへの参照を保持してはなりません（MUST NOT）。

## Instruments

Instrumentは、システムに関する測定を行い、テレメトリーを報告するために使われます。しかし、No-Opはこのテレメトリーの生成を無効化するために使われます。このため、No-Opが提供するすべてのInstrumentは、テレメトリーの集約を含む設定や動作状態を保持してはなりません（MUST NOT）。

### Counter

Counterは、実行するいかなる操作についても、空でないエラーを返したりメッセージをログに記録したりしてはなりません（MUST NOT）。

Counterが提供するすべての操作は、並行して実行しても安全でなければなりません（MUST）。

#### Counter Add

No-OpのCounterは、[API](../api/#add)を実装したAddインターフェースを利用者に提供しなければなりません（MUST）。受け取った引数について、検証も状態の保持も行ってはなりません（MUST NOT）。

### UpDownCounter

UpDownCounterは、実行するいかなる操作についても、空でないエラーを返したりメッセージをログに記録したりしてはなりません（MUST NOT）。

UpDownCounterが提供するすべての操作は、並行して実行しても安全でなければなりません（MUST）。

#### UpDownCounter Add

No-OpのUpDownCounterは、[API](../api/#add-1)を実装したAddインターフェースを利用者に提供しなければなりません（MUST）。受け取った引数について、検証も状態の保持も行ってはなりません（MUST NOT）。

### Histogram

Histogramは、実行するいかなる操作についても、空でないエラーを返したりメッセージをログに記録したりしてはなりません（MUST NOT）。

Histogramが提供するすべての操作は、並行して実行しても安全でなければなりません（MUST）。

#### Histogram Record

No-OpのHistogramは、[API](../api/#record)を実装したRecordインターフェースを利用者に提供しなければなりません（MUST）。受け取った引数について、検証も状態の保持も行ってはなりません（MUST NOT）。

### 非同期Counter

非同期Counterは、実行するいかなる操作についても、空でないエラーを返したりメッセージをログに記録したりしてはなりません（MUST NOT）。

非同期Counterが提供するすべての操作は、並行して実行しても安全でなければなりません（MUST）。

### 非同期Counter Observations

No-Opの非同期Counterは、そのInstrumentのために行われた観測について、検証も状態の保持も行ってはなりません（MUST NOT）。

### 非同期UpDownCounter

非同期UpDownCounterは、実行するいかなる操作についても、空でないエラーを返したりメッセージをログに記録したりしてはなりません（MUST NOT）。

非同期UpDownCounterが提供するすべての操作は、並行して実行しても安全でなければなりません（MUST）。

### 非同期UpDownCounter Observations

No-Opの非同期UpDownCounterは、そのInstrumentのために行われた観測について、検証も状態の保持も行ってはなりません（MUST NOT）。

### 非同期Gauge

非同期Gaugeは、実行するいかなる操作についても、空でないエラーを返したりメッセージをログに記録したりしてはなりません（MUST NOT）。

非同期Gaugeが提供するすべての操作は、並行して実行しても安全でなければなりません（MUST）。

### 非同期Gauge Observations

No-Opの非同期Gaugeは、そのInstrumentのために行われた観測について、検証も状態の保持も行ってはなりません（MUST NOT）。

## 参考文献

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

