- 重要な情報
- アプリ内
- インフラストラクチャー
- アプリケーションパフォーマンス
- 継続的インテグレーション
- ログ管理
- セキュリティ
- UX モニタリング
- 管理
OpenTelemetry (OTel) は、オープンソースの観測可能性フレームワークで、IT チームにテレメトリーデータを収集しルーティングするための標準化されたプロトコルとツールを提供します。Cloud Native Computing Foundation]2 (CNCF) によってインキュベータープロジェクトとして作成された OTel は、アプリケーションテレメトリーデータ (メトリクス、ログ、トレースなど) をインスツルメント、生成、収集、エクスポートし、分析および洞察するための監視プラットフォームに対して一貫したフォーマットを提供するものです。
OpenTelemetry Collector は、あらゆるベンダーに対応するエージェントプロセスで、さまざまなプロセスにより送信されたテレメトリデータを収集、エクスポートします。Datadog には、OpenTelemetry Collector で使える Exporter があり、OpenTelemetry から Datadog にトレース、メトリクス、ログデータを転送することができます。
ログを収集する場合、Datadog は Collector の filelog レシーバーの使用を推奨しています。filelog レシーバーは、指定したログファイルを追跡します。その後、Datadog Exporter (Collector で設定) がログデータを Datadog に送信します。
Collector の実行と Datadog Exporter の構成を参照してください。
Datadog Exporter を使って OpenTelemetry のトレースも Datadog に送る場合、trace_parser
演算子を使って各トレースから trace_id
を抽出し、それを関連するログに追加してください。Datadog は関連するログとトレースを自動的に関連付けます。詳細は OpenTelemetry のトレースとログの接続を参照してください。
OpenTelemetry SDK のロギング機能は完全にサポートされていないため (詳細は OpenTelemetry ドキュメントの各言語を参照)、Datadog ではアプリケーションに標準のロギングライブラリを使用することを推奨しています。言語固有のログ収集のドキュメントに従って、アプリケーションに適切なロガーをセットアップしてください。Datadog は、カスタムパースルールの必要性を避けるために、JSON でログを出力するようにロギングライブラリを設定することを強く推奨しています。
演算子を使って、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
: Datadog でログとトレースを関連付けるために、ログから trace_id
と span_id
を抽出します。Kubernetes インフラクチャーに OpenTelemetry Collector と Datadog Exporter をデプロイする方法は複数存在します。filelog レシーバーを動作させるためには、Agent/DaemonSet のデプロイメントを推奨します。
コンテナ環境では、アプリケーションはログを stdout
または stderr
に書き込みます。Kubernetes はログを収集し、標準的な場所に書き込みます。filelog レシーバーには、ホストノード上のロケーションを Collector にマウントする必要があります。以下は、ログを送信するために必要なマウントを持つ拡張機能例です。
apiVersion: apps/v1
kind: DaemonSet
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.61.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