OpenTelemetry Collector をセットアップする
概要
OpenTelemetry Collector は、ベンダーに依存しない方法でアプリケーションからテレメトリデータを収集、処理、エクスポートすることを可能にします。Datadog Exporter と Datadog Connector を使って構成すると、Datadog Agent を使用せずにトレース、ログ、メトリクスを Datadog に送信できます。
- Datadog Exporter: OpenTelemetry SDK が生成するトレース、メトリクス、ログデータを Datadog に (Datadog Agent なしで) 転送します
- Datadog Connector: 収集したスパンデータからトレースメトリクスを計算します
このセットアップでサポートされている Datadog 機能を確認するには、
フル OTel の下の
機能互換性テーブルを参照してください。
1 - OpenTelemetry Collector をダウンロードします
OpenTelemetry Collector Contrib ディストリビューションの最新リリースを プロジェクトのリポジトリ からダウンロードします。
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.
AWS EKS Fargate は、現時点では OpenTelemetry Collector をサポートする環境ではありません。EKS Fargate にコレクターをデプロイすると、インフラストラクチャー ホストの請求が不正確になります。
receivers:
otlp:
protocols:
http:
endpoint: 0.0.0.0:4318
grpc:
endpoint: 0.0.0.0:4317
# The hostmetrics receiver is required to get correct infrastructure metrics in Datadog.
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:
# The prometheus receiver scrapes metrics needed for the OpenTelemetry Collector Dashboard.
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 エクスポーターの構成オプションの完全なリストについては、完全にドキュメント化されたサンプル構成ファイル を参照してください。デプロイメントによっては、api::site や host_metadata の設定などの追加オプションが意味を持つ場合があります。
バッチプロセッサーの構成
バッチプロセッサーは、開発環境以外では必須です。正確な構成は、特定のワークロードと信号タイプに依存します。
Datadog のインテーク上限に合わせてバッチプロセッサーを構成してください。
バッチプロセッサーでテレメトリデータをまとめすぎると、413 - Request Entity Too Large エラーが発生することがあります。
トレースのメタデータを充実させ、Datadog とのインテグレーションを円滑に行うには
リソース検出システムを使用する: 言語 SDK によって提供されている場合、コンテナ情報をリソース属性としてアタッチします。たとえば、Go では、WithContainer() リソースオプションを使用します。
Unified Service Tagging を適用する: Unified Service Tagging のために、適切なリソース属性でアプリケーションを設定していることを確認してください。これにより、サービス名、デプロイ環境、サービスバージョンのタグと Datadog テレメトリが結び付きます。アプリケーションは、OpenTelemetry のセマンティック規約、service.name、deployment.environment、service.version を使用してこれらのタグを設定する必要があります。
OpenTelemetry SDK のロギング機能は完全にはサポートされていないため (詳細はご自分の言語の OpenTelemetry ドキュメント を参照)、Datadog はアプリケーションに標準のロギングライブラリを使用することを推奨します。言語固有の ログ収集ドキュメント に従って、アプリケーションに適切なロガーを設定してください。Datadog は、カスタムのパースルール の使用を避けるために、ログを JSON 形式で出力するようにロギングライブラリをセットアップすることを強くお勧めします。
operators を使用して 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: ポーリング頻度を設定- Operators:
json_parser: JSON ログを解析します。デフォルトでは、filelog レシーバーは各ログ行をログレコードに変換します。これはログの データモデル の body です。次に、json_parser は JSON ボディをデータモデルの属性に変換します。trace_parser: Datadog でログとトレースを相関させるために、ログから trace_id と span_id を抽出します。
OTel の service.name 属性をログの service にマップし直す
Datadog エクスポーターのバージョン 0.83.0 以降、OTel ログの service フィールドは OTel のセマンティック規約 である service.name に基づいて設定されます。ただし、service.name は Datadog のログ前処理におけるデフォルトの サービス属性 の 1 つではありません。
ログの service フィールドを正しく設定するため、log service remapper プロセッサー を設定して、service.name をログのサービスの取り込み元として指定することができます。
AWS EKS Fargate は、現時点では OpenTelemetry Collector をサポートする環境ではありません。EKS Fargate にコレクターをデプロイすると、インフラストラクチャー ホストの請求が不正確になります。
Kubernetes インフラストラクチャーに OpenTelemetry Collector と Datadog Exporter をデプロイする方法はいくつかあります。filelog レシーバーが機能するためには、Agent/DaemonSet としてデプロイする 方法が推奨されます。
コンテナ化された環境では、アプリケーションはログを stdout または stderr に書き込みます。Kubernetes はログを収集し、標準の場所に書き込みます。filelog レシーバーのために、ホストノードの場所をコレクターにマウントする必要があります。以下は、ログを送信するために必要なマウント設定を追加した 拡張例 です。
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
# The k8s.pod.ip is used to associate pods for k8sattributes
- name: OTEL_RESOURCE_ATTRIBUTES
value: "k8s.pod.ip=$(POD_IP)"
ports:
- containerPort: 4318 # default port for OpenTelemetry HTTP receiver.
hostPort: 4318
- containerPort: 4317 # default port for OpenTelemetry gRPC receiver.
hostPort: 4317
- containerPort: 8888 # Default endpoint for querying metrics.
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
# Mount nodes log file location.
- name: varlogpods
hostPath:
path: /var/log/pods
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
すぐに使える Datadog エクスポーターの構成
OpenTelemetry Collector の Contrib プロジェクトの exporter/datadogexporter/examples フォルダー に、Datadog エクスポーターのすぐに使える構成の実例があります。完全な構成例のファイル ootb-ec2.yaml を参照してください。注: この例は、EC2 ホスト上で直接実行されるアプリケーション用です。コンテナ化されたアプリケーションについては、デプロイメントのドキュメント を参照してください。
以下の各コンポーネントをニーズに合わせて構成してください。
Fleet Automation でコレクター設定を検証する
Datadog 拡張機能を有効にして、Fleet Automation で OpenTelemetry Collector 構成を検査およびトラブルシューティングします。
参考資料