概要
正しいホスト名とホストタグを抽出するために、Datadog Exporter はリソース検出プロセッサーと Kubernetes 属性プロセッサーを使用します。これらのプロセッサーにより、ホストとコンテナからリソースセマンティック規則の形式で情報を抽出することが可能になります。これは、ホスト名、ホストタグ、コンテナタグを構築するために使用されます。これらのタグは、テレメトリーシグナル間の自動相関や、Datadog 内でテレメトリーデータをフィルタリングしたりグループ化するためのタグベースのナビゲーションを可能にします。
詳細については、リソース検出と Kubernetes 属性プロセッサーの OpenTelemetry プロジェクトのドキュメントを参照してください。
セットアップ
Collector の構成に以下の行を追加します。
processors:
resourcedetection:
# ベアメタル
detectors: [env, system]
system:
resource_attributes:
os.description:
enabled: true
host.arch:
enabled: true
host.cpu.vendor.id:
enabled: true
host.cpu.family:
enabled: true
host.cpu.model.id:
enabled: true
host.cpu.model.name:
enabled: true
host.cpu.stepping:
enabled: true
host.cpu.cache.l2.size:
enabled: true
# GCP
detectors: [env, gcp, system]
# AWS
detectors: [env, ecs, ec2, system]
# Azure
detectors: [env, azure, system]
timeout: 2s
override: false
以下の行を values.yaml
に追加します。
presets:
kubernetesAttributes:
enabled: true
Helm kubernetesAttributes
プリセットは、Kubernetes 属性プロセッサーがポッドからメタデータを抽出するために必要なサービスアカウントをセットアップします。必要なサービスアカウントの詳細については、Kubernetes で重要なコンポーネントを参照してください。
Collector 構成に以下を追加します。
processors:
k8sattributes:
passthrough: false
auth_type: "serviceAccount"
pod_association:
- sources:
- from: resource_attribute
name: k8s.pod.ip
extract:
metadata:
- k8s.pod.name
- k8s.pod.uid
- k8s.deployment.name
- k8s.node.name
- k8s.namespace.name
- k8s.pod.start_time
- k8s.replicaset.name
- k8s.replicaset.uid
- k8s.daemonset.name
- k8s.daemonset.uid
- k8s.job.name
- k8s.job.uid
- k8s.cronjob.name
- k8s.statefulset.name
- k8s.statefulset.uid
- container.image.name
- container.image.tag
- container.id
- k8s.container.name
- container.image.name
- container.image.tag
- container.id
labels:
- tag_name: kube_app_name
key: app.kubernetes.io/name
from: pod
- tag_name: kube_app_instance
key: app.kubernetes.io/instance
from: pod
- tag_name: kube_app_version
key: app.kubernetes.io/version
from: pod
- tag_name: kube_app_component
key: app.kubernetes.io/component
from: pod
- tag_name: kube_app_part_of
key: app.kubernetes.io/part-of
from: pod
- tag_name: kube_app_managed_by
key: app.kubernetes.io/managed-by
from: pod
resourcedetection:
# 使用しないものを削除
detectors: [env, eks, ec2, aks, azure, gke, gce, system]
timeout: 2s
override: false
以下の行を values.yaml
に追加します。
presets:
kubernetesAttributes:
enabled: true
Daemonset と Gateway の両方で Helm の k8sattributes
プリセットを使用して、k8sattributesprocessor
がポッドからメタデータを抽出するために必要なサービスアカウントをセットアップします。必要なサービスアカウントの詳細については、Kubernetes で重要なコンポーネントを参照してください。
DaemonSet:
processors:
k8sattributes:
passthrough: true
auth_type: "serviceAccount"
resourcedetection:
detectors: [env, <eks/ec2>, <aks/azure>, <gke/gce>, system]
timeout: 2s
override: false
プロセッサーは DaemonSet のパススルーモードであるため、ポッドの IP アドレスのみを追加します。これらのアドレスは、Kubernetes API コールを行い、メタデータを抽出するために Gateway プロセッサーによって使用されます。
Gateway:
processors:
k8sattributes:
passthrough: false
auth_type: "serviceAccount"
pod_association:
- sources:
- from: resource_attribute
name: k8s.pod.ip
extract:
metadata:
- k8s.pod.name
- k8s.pod.uid
- k8s.deployment.name
- k8s.node.name
- k8s.namespace.name
- k8s.pod.start_time
- k8s.replicaset.name
- k8s.replicaset.uid
- k8s.daemonset.name
- k8s.daemonset.uid
- k8s.job.name
- k8s.job.uid
- k8s.cronjob.name
- k8s.statefulset.name
- k8s.statefulset.uid
- container.image.name
- container.image.tag
- container.id
- k8s.container.name
- container.image.name
- container.image.tag
- container.id
labels:
- tag_name: kube_app_name
key: app.kubernetes.io/name
from: pod
- tag_name: kube_app_instance
key: app.kubernetes.io/instance
from: pod
- tag_name: kube_app_version
key: app.kubernetes.io/version
from: pod
- tag_name: kube_app_component
key: app.kubernetes.io/component
from: pod
- tag_name: kube_app_part_of
key: app.kubernetes.io/part-of
from: pod
- tag_name: kube_app_managed_by
key: app.kubernetes.io/managed-by
from: pod
以下の行を values.yaml
に追加します。
presets:
kubernetesAttributes:
enabled: true
Helm kubernetesAttributes
プリセットは、Kubernetes 属性プロセッサーがポッドからメタデータを抽出するために必要なサービスアカウントをセットアップします。必要なサービスアカウントの詳細については、Kubernetes で重要なコンポーネントを参照してください。
Collector 構成に以下を追加します。
processors:
k8sattributes:
passthrough: false
auth_type: "serviceAccount"
pod_association:
- sources:
- from: resource_attribute
name: k8s.pod.ip
extract:
metadata:
- k8s.pod.name
- k8s.pod.uid
- k8s.deployment.name
- k8s.node.name
- k8s.namespace.name
- k8s.pod.start_time
- k8s.replicaset.name
- k8s.replicaset.uid
- k8s.daemonset.name
- k8s.daemonset.uid
- k8s.job.name
- k8s.job.uid
- k8s.cronjob.name
- k8s.statefulset.name
- k8s.statefulset.uid
- container.image.name
- container.image.tag
- container.id
- k8s.container.name
- container.image.name
- container.image.tag
- container.id
labels:
- tag_name: kube_app_name
key: app.kubernetes.io/name
from: pod
- tag_name: kube_app_instance
key: app.kubernetes.io/instance
from: pod
- tag_name: kube_app_version
key: app.kubernetes.io/version
from: pod
- tag_name: kube_app_component
key: app.kubernetes.io/component
from: pod
- tag_name: kube_app_part_of
key: app.kubernetes.io/part-of
from: pod
- tag_name: kube_app_managed_by
key: app.kubernetes.io/managed-by
from: pod
resourcedetection:
detectors: [env, <eks/ec2>, <aks/azure>, <gke/gce>, system]
timeout: 2s
override: false
データ収集
OpenTelemetry 属性 | Datadog タグ | プロセッサー |
---|
host.arch | | resourcedetectionprocessor{system} |
host.name | | resourcedetectionprocessor{system,gcp,ec2,azure} |
host.id | | resourcedetectionprocessor{system,gcp,ec2,azure} |
host.cpu.vendor.id | | resourcedetectionprocessor{system} |
host.cpu.family | | resourcedetectionprocessor{system} |
host.cpu.model.id | | resourcedetectionprocessor{system} |
host.cpu.model.name | | resourcedetectionprocessor{system} |
host.cpu.stepping | | resourcedetectionprocessor{system} |
host.cpu.cache.l2.size | | resourcedetectionprocessor{system} |
os.description | | resourcedetectionprocessor{system} |
os.type | | resourcedetectionprocessor{system} |
cloud.provider | cloud_provider | resourcedetectionprocessor{gcp,ec2,ecs,eks,azure,aks} |
cloud.platform | | "resourcedetectionprocessor{gcp,ec2,ecs,eks,azure,aks}" |
cloud.account.id | | "resourcedetectionprocessor{gcp,ec2,ecs,azure}" |
cloud.region | region | resourcedetectionprocessor{gcp,ec2,ecs,azure} |
cloud.availability_zone | zone | resourcedetectionprocessor{gcp,ec2,ecs} |
host.type | | "resourcedetectionprocessor{gcp,ec2}" |
gcp.gce.instance.hostname | | resourcedetectionprocessor{gcp} |
gcp.gce.instance.name | | resourcedetectionprocessor{gcp} |
k8s.cluster.name | kube_cluster_name | resourcedetectionprocessor{gcp,eks} |
host.image.id | | resourcedetectionprocessor{ec2} |
aws.ecs.cluster.arn | ecs_cluster_name | k8sattributes |
aws.ecs.task.arn | task_arn | k8sattributes |
aws.ecs.task.family | task_family | k8sattributes |
aws.ecs.task.revision | task_version | k8sattributes |
aws.ecs.launchtype | | k8sattributes |
aws.log.group.names | | k8sattributes |
aws.log.group.arns | | k8sattributes |
aws.log.stream.names | | k8sattributes |
aws.log.stream.arns | | k8sattributes |
azure.vm.name | | k8sattributes |
azure.vm.size | | k8sattributes |
azure.vm.scaleset.name | | k8sattributes |
azure.resourcegroup.name | | k8sattributes |
k8s.cluster.uid | | k8sattributes |
k8s.namespace.name | kube_namespace | k8sattributes |
k8s.pod.name | pod_name | k8sattributes |
k8s.pod.uid | | k8sattributes |
k8s.pod.start_time | | k8sattributes |
k8s.deployment.name | kube_deployment | k8sattributes |
k8s.replicaset.name | kube_replica_set | k8sattributes |
k8s.replicaset.uid | | k8sattributes |
k8s.daemonset.name | kube_daemon_set | k8sattributes |
k8s.daemonset.uid | | k8sattributes |
k8s.statefulset.name | kube_stateful_set | k8sattributes |
k8s.statefulset.uid | | k8sattributes |
k8s.container.name | kube_container_name | k8sattributes |
k8s.job.name | kube_job | k8sattributes |
k8s.job.uid | | k8sattributes |
k8s.cronjob.name | kube_cronjob | k8sattributes |
k8s.node.name | | k8sattributes |
container.id | container_id | k8sattributes |
container.image.name | image_name | k8sattributes |
container.image.tag | image_tag | k8sattributes |
完全な構成例
Datadog Exporter を用いた実際に動作する構成の完全な例については、k8s-values.yaml
を参照してください。この例は Amazon EKS 用です。
ログ出力例
ResourceSpans #0
Resource SchemaURL: https://opentelemetry.io/schemas/1.6.1
Resource attributes:
-> container.id: Str(0cb82a1bf21466b4189414cf326683d653114c0f61994c73f78d1750b9fcdf06)
-> service.name: Str(cartservice)
-> service.instance.id: Str(5f35cd94-1b9c-47ff-bf45-50ac4a998a6b)
-> service.namespace: Str(opentelemetry-demo)
-> k8s.namespace.name: Str(otel-gateway)
-> k8s.node.name: Str(ip-192-168-61-208.ec2.internal)
-> k8s.pod.name: Str(opentelemetry-demo-cartservice-567765cd64-cbmwz)
-> deployment.environment: Str(otel-gateway)
-> k8s.pod.ip: Str(192.168.45.90)
-> telemetry.sdk.name: Str(opentelemetry)
-> telemetry.sdk.language: Str(dotnet)
-> telemetry.sdk.version: Str(1.5.1)
-> cloud.provider: Str(aws)
-> cloud.platform: Str(aws_ec2)
-> cloud.region: Str(us-east-1)
-> cloud.account.id: Str(XXXXXXXXXX)
-> cloud.availability_zone: Str(us-east-1c)
-> host.id: Str(i-09e82186d7d8d7c95)
-> host.image.id: Str(ami-06f28e19c3ba73ef7)
-> host.type: Str(m5.large)
-> host.name: Str(ip-192-168-50-0.ec2.internal)
-> os.type: Str(linux)
-> k8s.deployment.name: Str(opentelemetry-demo-cartservice)
-> kube_app_name: Str(opentelemetry-demo-cartservice)
-> k8s.replicaset.uid: Str(ddb3d058-6d6d-4423-aca9-0437c3688217)
-> k8s.replicaset.name: Str(opentelemetry-demo-cartservice-567765cd64)
-> kube_app_instance: Str(opentelemetry-demo)
-> kube_app_component: Str(cartservice)
-> k8s.pod.start_time: Str(2023-11-13T15:03:46Z)
-> k8s.pod.uid: Str(5f35cd94-1b9c-47ff-bf45-50ac4a998a6b)
-> k8s.container.name: Str(cartservice)
-> container.image.name: Str(XXXXXXXXX.dkr.ecr.us-east-1.amazonaws.com/otel-demo)
-> container.image.tag: Str(v4615c8d7-cartservice)
ScopeSpans #0
ScopeSpans SchemaURL:
InstrumentationScope Microsoft.AspNetCore
Span #0
Trace ID : fc6794b53df7e44bab9dced42bdfbf7b
Parent ID : 2d3ba75ad6a6b1a0
ID : f669b0fcd98365b9
Name : oteldemo.CartService/AddItem
Kind : Server
Start time : 2023-11-20 13:37:11.2060978 +0000 UTC
End time : 2023-11-20 13:37:11.2084166 +0000 UTC
Status code : Unset
Status message :
Attributes:
-> net.host.name: Str(opentelemetry-demo-cartservice)
-> net.host.port: Int(8080)
-> http.method: Str(POST)
-> http.scheme: Str(http)
-> http.target: Str(/oteldemo.CartService/AddItem)
-> http.url: Str(http://opentelemetry-demo-cartservice:8080/oteldemo.CartService/AddItem)
-> http.flavor: Str(2.0)
-> http.user_agent: Str(grpc-node-js/1.8.14)
-> app.user.id: Str(e8521c8c-87a9-11ee-b20a-4eaeb9e6ddbc)
-> app.product.id: Str(LS4PSXUNUM)
-> app.product.quantity: Int(3)
-> http.status_code: Int(200)
-> rpc.system: Str(grpc)
-> net.peer.ip: Str(::ffff:192.168.36.112)
-> net.peer.port: Int(36654)
-> rpc.service: Str(oteldemo.CartService)
-> rpc.method: Str(AddItem)
-> rpc.grpc.status_code: Int(0)
Custom tagging
In the Datadog exporter
Set custom hosts tags directly in the Datadog exporter:
## @param tags - list of strings - optional - default: empty list
## List of host tags to be sent as part of the host metadata.
## These tags will be attached to telemetry signals that have the host metadata hostname.
##
## To attach tags to telemetry signals regardless of the host, use a processor instead.
#
tags: ["team:infra", "<TAG_KEY>:<TAG_VALUE>"]
See all configurations options here.
As OTLP resource attributes
Custom host tags can also be set as resource attributes that start with the namespace datadog.host.tag
.
This can be set as an env var OTEL_RESOURCE_ATTRIBUTES=datadog.host.tag.<custom_tag_name>=<custom_tag_value>
in an OTel SDK.
Or this can be set in a processor:
processors:
resource:
attributes:
- key: datadog.host.tag.<custom_tag_name>
action: upsert
from_attribute: <custom_tag_name>
Note: This is only supported if you have opted-in as described here.
Same as for custom host tags, custom containers tags can be set by prefixing resource attributes by datadog.container.tag
in your OTEL instrumentation.
This can be set as an env var OTEL_RESOURCE_ATTRIBUTES=datadog.container.tag.<custom_tag_name>=<custom_tag_value>
in an OTel SDK.
Or this can be set in a processor:
processors:
resource:
attributes:
- key: datadog.container.tag.<custom_tag_name>
action: upsert
from_attribute: <custom_tag_name>