OpenTelemetry Collectorの役割の整理

# はじめに
OpenTelemetry導入時にOpenTelemetry Collectorも導入したので、ここに記録します。


## OpenTelemetryとは
OpenTelemetry とは、ログ、トレース、メトリクスなどのテレメトリーデータを作成・管理するためのツールです。  
ベンダーに依存しない設計になっており、各種言語向けのライブラリが豊富に揃っているのが特徴です。

## OpenTelemetry Collectorとは
テレメトリーデータを集約し、バックエンドに転送するためのツールです。  
OpenTelemetry から直接バックエンドに送る方法もありますが、Collector を使うことでバックエンドの変更やラベルの追加などを容易に行えるようになります。

以下の図は構成の一例です。
アプリケーションサーバーから Collector にデータを送信しています。図の通り、アプリケーションサーバーから Collector にデータを送れば、その先は Collector 側で制御できる状態を作れます。
![スクリーンショット 2025-02-28 19.34.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3185427/3db88f5f-f434-41f5-bca8-b9cfb6109456.png)


# OpenTelemetry Collectorの構成要素
実際にOpenTelemetry Collectorのの中身はどのような設定で動いているか見ていきましょう

構成要素としては主に以下のようながあります
- Receivers (データの受信)
- Processors　(データの変換)
- Exporters (データの送信)
- Extensions (拡張機能)
- Pipelines (データの一連の流れ)

それぞれどんな役割があるか説明していきます


## Receivers
テレメトリデータを収集するための設定を行います

httpのリクエストを全て許可する場合は以下のように設定します
※デフォルトの値がv0.104.0以降でlocalhostになっているので注意してください
明示的にIPアドレス等を設定していない場合にデータの受付を拒否してしまします。
https://github.com/open-telemetry/opentelemetry-collector/releases/tag/v0.104.0
```
receivers:
  otlp:
    protocols:
      http:
        endpoint: "0.0.0.0:4318"
```

主な設定項目
- IPアドレスの許可
- ポートの許可
- プロトコルの許可
など

## Processors
Receiversで受け取ったデータをExportersに送るまでのデータ処理を行う部分



- 受け取ったデータから特定の文字が含まれているデータを除外
- データの変換
- 送信するデータの制御
など

自動計装をしている時に受け取ったspanのうち`health-check`だけ除外する設定の例です
Receiversから受け取ったデータを様々な形式に変換ができます。

```
processors:
  batch:
  filter:
    spans:
      include:
        match_type: regexp
        services: [".*"]
      exclude:
        match_type: regexp
        attributes:
          - key: url.path
            value: "health-check.*"
```

以上の設定は一例ですがProcessors で受け取ったデータを様々な形式に変換したり、特定の条件で除外することが可能です。

## Exporters
Receiversで受け取り、Processorsで編集したデータをどこに送るかを設定するものです
例えば、zipkinとtempoに送りたい場合は以下のようになります

```
exporters:
  zipkin:
    endpoint: "http://{zipkin_endpoint}:9411/api/v2/spans"
    format: proto
  otlp:
    endpoint: "http://{tempo_endpoint}:4317"
    tls:
      insecure: true
```

どの宛先に対してどんな仕様でデータを送信するか設定できます。
詳しく知りたい方はこちらのリンクにexporterの詳細情報がありますので参照してください
https://github.com/open-telemetry/opentelemetry-collector/tree/main/exporter

## Extensions
拡張機能を使う場合に設定する項目です

機能の例
- ヘルスチェック
- 認証機能
など


colecctor自身にhealth_checkのエンドポイントを用意したい場合、以下のように設定します
```
extensions:
  health_check:
```

拡張機能に関してはこちらのリンクあたりが使えるものになります
https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension

## Pipelines
コレクター内のデータのルートを定義するもの。
これまで設定したReceivers、Processors、Exporters、Extensionsを繋げるために必要な項目です。

以下の設定がpipelineの例です。
それぞれ設定したextensions、receivers、processors、exportersをservice:内のpipelines内に記述することで一連のデータの流れを定義できます。

```
extensions:
  health_check:

receivers:
  otlp:
    protocols:
      grpc:
      http:

processors:
  batch:
  　send_batch_size: 100

exporters:
  zipkin:
    endpoint: "http://zipkin:9411/api/v2/spans"
    format: proto

service:
  extensions: [health_check]
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [zipkin]
```

# おわりに
以上が OpenTelemetry Collector の主な構成要素と設定例になります。
実際に運用していると、監視ツールの変更などに柔軟に対応できるメリットを感じています。
OpenTelemetry を導入するときは、Collector を活用してみてください。