

# OpenTelemetry を使用してメトリクスを送信する
<a name="metrics-otel-send"></a>

OpenTelemetry Protocol (OTLP) を使用して、カスタムメトリクスを CloudWatch に発行できます。OTel SDK (Java、Python、Go、.NET、Node.js)、OTel Collector、または OTLP 互換クライアントを使用できます。

## CloudWatch OTLP エンドポイント
<a name="metrics-otel-send-endpoint"></a>

リージョンの CloudWatch OTLP エンドポイントにメトリクスを送信します。

```
https://monitoring.{{region}}.amazonaws.com/v1/metrics
```

認証には、標準の AWS SigV4 署名が使用されます。サービス名は `monitoring` です。エンドポイント、認証オプション、および制限事項の詳細については、「[OTLP エンドポイント](CloudWatch-OTLPEndpoint.md)」を参照してください。

## クイックスタート: 最初のメトリクスを発行する
<a name="metrics-otel-send-quickstart"></a>

### オプション 1: OTel Collector (本番環境での使用を推奨)
<a name="metrics-otel-send-collector"></a>

OTLP HTTP エクスポーターと SigV4 認証を使用して OTel Collector を設定します。

```
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch:
    send_batch_size: 200
    timeout: 10s

exporters:
  otlphttp:
    tls:
      insecure: false
    metrics_endpoint: "https://monitoring.{{us-east-1}}.amazonaws.com/v1/metrics"
    auth:
      authenticator: sigv4auth

extensions:
  sigv4auth:
    service: "monitoring"
    region: "{{us-east-1}}"

service:
  extensions: [sigv4auth]
  pipelines:
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlphttp]
```

詳細なセットアップ手順については、「[開始方法](CloudWatch-OTLPGettingStarted.md)」を参照してください。

### オプション 2: OTel SDK (Python の例)
<a name="metrics-otel-send-python"></a>

```
from opentelemetry import metrics
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter

# Point at the CloudWatch OTLP endpoint
exporter = OTLPMetricExporter(
    endpoint="https://monitoring.{{us-east-1}}.amazonaws.com:443/v1/metrics"
)
reader = PeriodicExportingMetricReader(exporter, export_interval_millis=60000)
provider = MeterProvider(metric_readers=[reader])
metrics.set_meter_provider(provider)

# Create and record a metric
meter = metrics.get_meter("my-app")
counter = meter.create_counter("http_requests_total", description="Total HTTP requests")
counter.add(1, {"method": "GET", "path": "/api/users", "status": "200"})
```

### オプション 3: OTel SDK (Java の例)
<a name="metrics-otel-send-java"></a>

```
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.api.metrics.LongCounter;

Meter meter = GlobalOpenTelemetry.getMeter("my-app");
LongCounter counter = meter.counterBuilder("http_requests_total")
    .setDescription("Total HTTP requests")
    .build();

counter.add(1, Attributes.of(
    AttributeKey.stringKey("method"), "GET",
    AttributeKey.stringKey("path"), "/api/users",
    AttributeKey.stringKey("status"), "200"
));
```

## 必要な IAM アクセス許可
<a name="metrics-otel-send-iam"></a>

メトリクスを送信する ID には `cloudwatch:PutMetricData` アクセス許可が必要です。SigV4 認証の場合は、次のポリシーをアタッチします。

```
{
  "Effect": "Allow",
  "Action": [
    "cloudwatch:PutMetricData"
  ],
  "Resource": "*"
}
```

ベアラートークン認証については、「[メトリクスのベアラートークン認証の設定](CloudWatch-OTLP-MetricsBearerTokenAuth.md)」を参照してください。

## メトリクスが到着していることを確認する
<a name="metrics-otel-send-verify"></a>

CloudWatch コンソールを開き、**[Query Studio]** に移動して、以下を実行します。

```
http_requests_total
```

メトリクスは通常、最初のデータポイントが送信されてから 1～2 分以内に表示されます。

## サポートされているメトリクスタイプ
<a name="metrics-otel-send-types"></a>

次の表は、CloudWatch がサポートする OTel メトリクスタイプと、それらに対して PromQL でクエリを実行する方法を示しています。


| OTel メトリクスタイプ | PromQL の動作 | 
| --- | --- | 
| Counter | rate() または increase() を使用してクエリを実行する | 
| ゲージ | 直接クエリを実行する (現在の値) | 
| ヒストグラム | パーセンタイルに histogram\_quantile() を使用する | 

## ベストプラクティス
<a name="metrics-otel-send-best-practices"></a>

OTLP 経由でメトリクスを送信するときは、以下の推奨事項に従ってください。
+ **意味のあるメトリクス名を使用する** – OTel 命名規則 (例: `http.server.request.duration` や `http_request_duration_seconds`) に従います。
+ **ラベルのカーディナリティを適切に保つ** – リクエスト ID　または UUID をラベル値として使用することは避けてください。
+ **適切なエクスポート間隔を設定する** – 60 秒が標準設定です。間隔を短くするほどコストが増加します。
+ **リソース属性を使用する** – データポイントごとのラベルではなく、リソース属性を使用して静的メタデータ (サービス名、バージョン、環境) を指定します。