OpenTelemetry Collector をセットアップする
概要
OpenTelemetry Collector を使用すると、アプリケーションからのテレメトリーデータをベンダーに依存しない方法で収集、処理、エクスポートできます。Datadog Exporter と Datadog Connector を設定すると、Datadog Agent を使用せずにトレース、ログ、およびメトリクスを Datadog に送信できます。
- Datadog Exporter: OpenTelemetry SDK が生成するトレース、メトリクス、ログデータを Datadog (Datadog Agent 不要) に転送する
- Datadog Connector: 収集したスパンデータからトレースメトリクスを計算する
このセットアップでサポートされる Datadog 機能を確認するには、
機能の互換性テーブルの
Full OTel を参照してください。
インストールと設定
1 - OpenTelemetry Collector をダウンロードする
OpenTelemetry Collector Contribute の最新リリースをプロジェクトのリポジトリからダウンロードします。
2 - Datadog Exporter と Connector を設定する
Datadog Exporter と Datadog Connector を使用するには、OpenTelemetry Collector の設定に組み込みます。
collector.yaml
という名前の設定ファイルを作成します。- 次のサンプルファイルを使用して始めることができます。
- Datadog の API キーを
DD_API_KEY
環境変数として設定してください。
The following examples use
0.0.0.0
as the endpoint address for convenience. This allows connections from any network interface. For enhanced security, especially in local deployments, consider using
localhost
instead.
For more information on secure endpoint configuration, see the
OpenTelemetry security documentation.
receivers:
otlp:
protocols:
http:
endpoint: 0.0.0.0:4318
grpc:
endpoint: 0.0.0.0:4317
# Datadogで正確なインフラストラクチャメトリクスを取得するには、hostmetrics レシーバーが必要です。
hostmetrics:
collection_interval: 10s
scrapers:
paging:
metrics:
system.paging.utilization:
enabled: true
cpu:
metrics:
system.cpu.utilization:
enabled: true
disk:
filesystem:
metrics:
system.filesystem.utilization:
enabled: true
load:
memory:
network:
processes:
# prometheus レシーバーは、OpenTelemetry Collector ダッシュボードに必要なメトリクスをスクレイプします。
prometheus:
config:
scrape_configs:
- job_name: 'otelcol'
scrape_interval: 10s
static_configs:
- targets: ['0.0.0.0:8888']
filelog:
include_file_path: true
poll_interval: 500ms
include:
- /var/log/**/*example*/*.log
processors:
batch:
send_batch_max_size: 100
send_batch_size: 10
timeout: 10s
connectors:
datadog/connector:
exporters:
datadog/exporter:
api:
site:
key: ${env:DD_API_KEY}
service:
pipelines:
metrics:
receivers: [hostmetrics, prometheus, otlp, datadog/connector]
processors: [batch]
exporters: [datadog/exporter]
traces:
receivers: [otlp]
processors: [batch]
exporters: [datadog/connector, datadog/exporter]
logs:
receivers: [otlp, filelog]
processors: [batch]
exporters: [datadog/exporter]
この基本的な設定では、HTTP および gRPC 経由で OTLP データを受信できるようになり、バッチプロセッサが設定されます。
Datadog Exporter の設定オプションの完全なリストについては、ドキュメント化されたサンプル設定ファイルを参照してください。デプロイ方法によっては、api::site
や host_metadata
といった追加オプションが必要になる場合があります。
バッチプロセッサの設定
本番環境 (開発環境以外) では、バッチプロセッサが必要です。具体的な設定はワークロードや扱うシグナルタイプによって異なります。
Datadog のインテーク上限に合わせてバッチプロセッサを設定してください:
バッチプロセッサでまとめるテレメトリーデータが多すぎる場合、413 - Request Entity Too Large
エラーが発生することがあります。
3 - アプリケーションを設定する
トレースのメタデータを充実させ、Datadog とのインテグレーションを円滑に行うには
リソース検出システムを使用する: 言語 SDK で提供されている場合、コンテナ情報をリソース属性としてアタッチします。例えば、Go の場合、WithContainer()
リソースオプションを使用します。
**統合サービスタグ付け**を適用する: 統合サービスタグ付けに適切なリソース属性をアプリケーションに構成していることを確認してください。これは、Datadog のテレメトリーを、サービス名、デプロイ環境、サービスバージョンなどのタグで結びつけます。アプリケーションはこれらのタグを OpenTelemetry のセマンティック規則 (service.name
、deployment.environment
、service.version
) を使用して設定する必要があります。
4 - アプリケーションのロガーを設定する
OpenTelemetry SDK のログ機能はまだ完全にはサポートされていません (詳細は OpenTelemetry のドキュメントでご利用の言語の項目を参照) 。Datadog では、アプリケーション用の標準的なロギングライブラリの使用を推奨しています。言語別のログ収集ドキュメントに従い、アプリケーションに適切なロガーを設定してください。Datadog では、カスタムパーシングルールを回避するため、ロギングライブラリを JSON 出力するように強く推奨しています。
filelog レシーバーの構成
演算子を使って、filelog レシーバーを構成します。例えば、checkoutservice
というサービスがあり、それが /var/log/pods/services/checkout/0.log
にログを書き込んでいるとしたら、ログのサンプルは以下のようになります。
{"level":"info","message":"order confirmation email sent to \"jack@example.com\"","service":"checkoutservice","span_id":"197492ff2b4e1c65","timestamp":"2022-10-10T22:17:14.841359661Z","trace_id":"e12c408e028299900d48a9dd29b0dc4c"}
filelog の構成例
filelog:
include:
- /var/log/pods/**/*checkout*/*.log
start_at: end
poll_interval: 500ms
operators:
- id: parse_log
type: json_parser
parse_from: body
- id: trace
type: trace_parser
trace_id:
parse_from: attributes.trace_id
span_id:
parse_from: attributes.span_id
attributes:
ddtags: env:staging
include
: レシーバーが追跡するファイルのリストstart_at: end
: 追記された新しいログを読み込む指定poll_internal
: ポーリングの頻度- 演算子:
json_parser
: JSON ログをパースします。デフォルトでは、filelog レシーバーは各ログ行をログレコードに変換し、それがログのデータモデルの body
となります。次に、json_parser
が JSON の本文をデータモデルの属性に変換します。trace_parser
: ログから trace_id
と span_id
を抽出し、Datadog 内でログとトレースを関連付ける。
OTel の service.name
属性をログの service
に再マップする
Datadog Exporter バージョン 0.83.0 以降では、OTel ログの service
フィールドは OTel のセマンティック規約である service.name
を参照しています。ただし service.name
は Datadog のログ前処理で使われるサービス属性のデフォルト項目には含まれていません。
ログの service
フィールドを正しく反映させるためには、log service remapper プロセッサを設定し、service.name
をログの service 取り込み元として指定することができます。
Kubernetes インフラクチャーに OpenTelemetry Collector と Datadog Exporter をデプロイする方法は複数存在します。filelog レシーバーを動作させるためには、Agent/DaemonSet のデプロイメントを推奨します。
コンテナ化された環境では、アプリケーションは通常 stdout
や stderr
にログを書き出し、Kubernetes がそれを標準的なパスに出力します。そのため、filelog レシーバーでそれらを取り込むには、ホストノード上のディレクトリを Collector にマウントする必要があります。下記はログ送信に必要なマウントを含む拡張設定例です。
apiVersion: apps/v1
metadata:
name: otel-agent
labels:
app: opentelemetry
component: otel-collector
spec:
template:
metadata:
labels:
app: opentelemetry
component: otel-collector
spec:
containers:
- name: collector
command:
- "/otelcol-contrib"
- "--config=/conf/otel-agent-config.yaml"
image: otel/opentelemetry-collector-contrib:0.71.0
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
# k8s.pod.ip は k8sattributes でポッドを関連付けるために使用されます
- name: OTEL_RESOURCE_ATTRIBUTES
value: "k8s.pod.ip=$(POD_IP)"
ports:
- containerPort: 4318 # OpenTelemetry HTTP レシーバーのデフォルトポート
hostPort: 4318
- containerPort: 4317 # OpenTelemetry gRPC レシーバーのデフォルトポート
hostPort: 4317
- containerPort: 8888 # メトリクス取得用のデフォルトエンドポイント
volumeMounts:
- name: otel-agent-config-vol
mountPath: /conf
- name: varlogpods
mountPath: /var/log/pods
readOnly: true
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: otel-agent-config-vol
configMap:
name: otel-agent-conf
items:
- key: otel-agent-config
path: otel-agent-config.yaml
# ノード上のログファイルディレクトリをマウント
- name: varlogpods
hostPath:
path: /var/log/pods
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
すぐに使える Datadog Exporter の構成
OpenTelemetry Collector Contrib プロジェクトの exporter/datadogexporter/examples
フォルダーには、Datadog Exporter の標準的な設定例が掲載されています。完全な設定例としては ootb-ec2.yaml
を参照してください。それぞれのコンポーネントを環境に合わせて設定してください。
参考資料