Span Metrics Connector を使って任意のメトリクス名に変更させる

2024/09/21に公開

OpenTelemetry Collector(otel collector)の Span Metrics Connector を使ってメトリクス名を任意のものにしたい事情があったのでその対応をしたため記事に残しておきます。

Span Metrics Connector についてはわかりやすい記事があるのでそちらを参照ください。

https://zenn.dev/k6s4i53rx/articles/2023-advent-calender-otel

本記事は以前投稿した istio のトレーシングの記事を題材として作業を行います。
連携先も New Relic になります。
https://zenn.dev/joe/articles/c3d36f81a7c7be

さっそく作っていく

otel collector に対して以下の実装をしていきます。

apiVersion: v1
kind: ConfigMap
metadata:
  name: otel-conf
  namespace: observability
data:
  otel-collector-conf.yaml: |
    ~~~
    connectors:
      spanmetrics:
        histogram:
          explicit:
        metrics_flush_interval: 15s
    ~~~
    service:
    ~~~
      pipelines:
        traces:
          receivers: [otlp]
          processors: [batch, transform]
          exporters: [otlp, spanmetrics]
        metrics:
          receivers: [spanmetrics, otlp]
          processors: [batch]
          exporters: [otlp]
        logs:
          receivers: [otlp]
          processors: [batch]
          exporters: [otlp]

この設定をするだけで span の情報を metrics に変換させることができます。
これだけでも metrics としての情報を転送するという部分では完了するのですが New Relic で可視化する場合に問題がありました。

Span から生成されるメトリクスが duration という名前で生成されるようになっていて New Relic の画面で NRQL を利用すれば確認できるのですが Otel の UI で確認することが出来ませんでした。(ちなみに Otel の UI では Metricsで表示するのか Span で表示するのか選択できるので特に困ることはないですが Metrics のほうが保持期限が長いので Metrics があると尚更便利)

以下のような NRQL で表示をしているようです

SELECT average(convert(%.server%duration, unit OR 's', 'ms')) as 'Response time'
FROM Metric WHERE (entity.guid = '<guid>')
AND ((http.server.duration IS NOT NULL OR http.server.request.duration IS NOT NULL OR rpc.server.duration IS NOT NULL)) TIMESERIES

つまり http.server.duration っぽいフォーマットなら大丈夫そうに見えたのでこのフォーマットで作ります。

namespace の利用

色々メトリクス名を変換させる方法などはいくつか用意されているのですが今回は Span Metrics Connector に備わっている namespace を活用したいと思います。

以下のような機能をもっています。

namespace (default: traces.span.metrics): Defines the namespace of the generated metrics. If namespace provided, generated metric name will be added namespace. prefix.

この機能を利用してメトリクス名を http.server.duration としたいので http.server を prefix にするように設定をします。

    connectors:
      spanmetrics:
        histogram:
          explicit:
        namespace: http.server
        metrics_flush_interval: 15s

先程の設定を変更させたのでこの変更を反映させて UI 上で適切に転送されているか確認をしてみましょう。

UI 側でも同じ様に反映されているか確認をしてみます

問題なく表示されることが確認できたので実装としては以上となります。
他にも良い方法があるかなと思いますが今回は Span Metrics Connector を利用した方法を紹介しました。

Discussion