概要
最近OpenTelemetryというものを知りました。ここではOpenTelemetryについて調べた内容と、ECSのメトリクスをprometheusへ送信してみた際の設定内容を記載します。
OpenTelemetryとは
OpenTelemetryはベンダーに依存しないテレメトリーデータの取り扱いを可能にしてくれます。これまでテレメトリーデータはPrometheusやDatadog、CloudWatchなど、かくプロダクトによって独自に扱われていたため、移植性などに課題がありました。OpenTelemetryではテレメトリーデータを統一的に扱う方法を提供することで、この課題を解決しようとしています。詳しい説明はこちらで。
OpenTelemetry Collector
OpenTelemetryが開発しているOpentelemetryCollectorは、テレメトリーデータを取得、変換、送信を行います。例えばprometheus exporterで取得したデータをdatadogとprometheusへ送信する、といった使い方ができます。データ取得部分がreceiver, 変換部分がprocesser,送信部分がexporterと呼ばれています。様々なreceiver, exporterが開発されており、柔軟にデータの取得送信ができそうです。残念ながら現時点でDatadog Agentのreceiverは実装されていない様です。PullRequestが作られていましたが、閉じられてしまっています。
AWS ECS Container Metrics Receiver
AWS ECS Container Metrics Receiverは、ECSのメトリクスを取得するためのreceiverです。ECSのメタデータエンドポイントからタスクのメトリクスを取得してくれます。
AWS Prometheus Remote Write Exporter
AWS Prometheus Remote Write Exporterは、Amazon Managed Service for Prometheusに対してメトリクスを送信してくれます。内部でPrometheus Remote Write Exporterを使っていて、AWSの認証などの処理を追加している様です。
設定ファイル
OpenTelemetry Collectorの設定はコード以下の様にしました。
receivers:
awsecscontainermetrics:
processors:
resource:
attributes:
- key: aws.ecs.service.name
value: "${ECS_SERVICE_NAME}"
action: upsert
exporters:
awsprometheusremotewrite:
endpoint: https://aps-workspaces.ap-northeast-1.amazonaws.com/workspaces/{workspace_id}/api/v1/remote_write
resource_to_telemetry_conversion:
enabled: true
service:
pipelines:
metrics:
receivers: [awsecscontainermetrics]
processors: [resource]
exporters: [awsprometheusremotewrite]
FROM debian
RUN apt-get update
RUN apt-get install -y wget
RUN wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.42.0/otelcol-contrib_0.42.0_linux_amd64.deb
RUN dpkg -i otelcol-contrib_0.42.0_linux_amd64.deb
COPY config.yaml /etc/otelcol-contrib/config.yaml
CMD ["otelcol-contrib","--config=/etc/otelcol-contrib/config.yaml"]
config.yamlのexporter.awsprometheusremotewrite.resource_to_telemetry_conversion
の設定は必須です。どうやらprometheus exporterはjob, instance以外のラベルを全て捨ててしまうようです。この設定を入れないとtask名などの情報が全て抜け落ちてしまいます。
グラフ化
データが取得できたことの確認のために、grafanaで可視化しました。
いい感じです。ここからdatadogへのexporterを追加してみたり、cloudwatchに転送してみたりと色々試していきたいです。
opentelemetry collectorを間に挟むことで、datadogを使っていたけれどprometheus+grafanaを試してみる、とかそういうことが今までよりも簡単にできるようになるかもしれないです。