Prometheus ReceiverでOpenTelemetry Collectorを拡張


OpenTelemetry Advent Calendar 2022、22日目の記事です

https://qiita.com/advent-calendar/2022/opentelemetry

メトリクスは今までPrometheusで収集していたけどOpenTelemetry Collector（以下Otel）に置き換えたい、もしくはOtel使い始めたけど（今のところ）満たせない監視要件がある、という方向けです。


# Prometheus ExporterをOpenTelemetry CollectorでもScrapeできるよ、という話

Otelには様々な[Receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver)がありますが、Prometheusも歴史が長いだけあり更に幅広い[Prometheus Exporter](https://prometheus.io/docs/instrumenting/exporters/)があります。

今までPrometheus Exporterで実現してきた監視がOtelに置き替えることでできなくなるというケースがもしかしたらあるかもしれませんが、ご心配には及びません、Otelには[Prometheus Receiver](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/prometheusreceiver)というものがあり、これによりPrometheus ExporterをOtelでScrapeし（Pullで取り込み）、お好きなバックエンドに送ることができます。
※名称がすごくややこしいですが、Prometheus Exporter ≒ Otel Receiverで、Otel Receiverの一つにPrometheus Receiverがあります。

例えば、OtelにはICMP（Ping）やTCPによるポーリングテスト機能はないため（本記事作成時点）、Prometheusの[Blackbox exporter](https://github.com/prometheus/blackbox_exporter/blob/master/README.md)を使ってみます。
なお、以降の設定方法は他のExporterでも考え方は同じです。


# まずPrometheusでBlackbox exporterを試してみる

Prometheusを立て、Blackbox exporterもGithubのページ通りにセットアップします（詳細は割愛）。

https://github.com/prometheus/blackbox_exporter/blob/master/README.md

処理の流れはこうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/1cad675b-31bf-fac8-cb9c-3e19f78e6b03.png)


適当にいくつかのサイトにhttpテストをしてみます。

```yaml:prometheus.yaml
scrape_configs:
  - job_name: 'blackbox'
    metrics_path: /probe
    params:
      module: [http_2xx] 
    static_configs:
      - targets:
        - http://prometheus.io
        - https://prometheus.io
        - https://opentelemetry.io
        - https://qiita.com
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 127.0.0.1:9115
```

Prometheusで結果を確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/52ba6fef-5352-8640-95f8-2505c3a72287.png)


probe_success=1でサイトのUpを確認できました。
いいですね、とりあえず想定通りです。



# OtelでBlackbox exporterをScrapeしてみる

それではOtelでPrometheus receiverを使ってみましょう。

https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/prometheusreceiver


変更点は以下の通りです。

**OpenTelemetry Collector**：新規にインストールします
**Prometheus Exporter（今回はblackbox）**：何も変更しません
**Prometheus**：Otelが代わりにBlackbox exporterをScrapeしてくれますので不要になります

処理の流れはこうなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/648393ea-44be-621c-ace9-f3487eeb405f.png)


設定についてです。
PrometheusのScrape設定がOtelでも同じものをそのまま使える嬉しい仕様です。
これまでの資産が無駄にはなりませんね。
Otelコンフィグの以下にPrometheusの`scrape_configs`を移してあげます。

```yaml
receivers:
  prometheus:
    config:
      scrape_configs:
```

ScrapeしたメトリクスはSplunk Observability Cloudに送信、可視化してみます。
作成したOtelコンフィグは以下の通りです。
※Otelのインストール方法や設定ファイルの見方については[こちら](https://qiita.com/symmr/items/e63d7757780cf0be1bbe)
※本番では適宜、[適切なProcessor](https://qiita.com/symmr/items/4604c57da911e6c0cb4f)を追加してください

```yaml:config.yaml
receivers:
  prometheus:
    config:
      scrape_configs:
      - job_name: 'blackbox'
        metrics_path: /probe
        params:
          module: [http_2xx]
        static_configs:
          - targets:
            - http://prometheus.io
            - https://prometheus.io
            - https://opentelemetry.io
            - https://qiita.com
        relabel_configs:
          - source_labels: [__address__]
            target_label: __param_target
          - source_labels: [__param_target]
            target_label: instance
          - target_label: __address__
            replacement: 127.0.0.1:9115

exporters:
  signalfx:  # Splunk Observability Cloud
    access_token: "*****"
    realm: "*****"

service:
  pipelines:
    metrics:
      receivers: [prometheus]
      processors: []
      exporters: [signalfx]
```

Splunk Observability Cloudで見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1218403/739f5fd8-e1c7-2554-2c9f-f5feb00eb21f.png)

素晴らしい！


# つまり・・・？

これだけ見たら「結果は何も変わってないじゃん」と思われるかもしれません。

しかし、Otelの真の能力は、メトリクスだけではなく、アプリケーショントレース、ログも同じくコンテキストを付与しつつ取り込み、バックエンドで解析することでオブザーバビリティを簡単に実現できますよ、というものです。
Otelでテレメトリーデータ収集を標準化し、更にそこにPrometheus Exporterもお借りして監視範囲を広げることもできるということですね。


それでは良いOtelライフを！