OBI のメトリクスとトレースの属性を設定する

計装された Kubernetes Pod のインスタンス ID デコレーションとメタデータを含む、報告される属性を制御するメトリクスとトレースの属性コンポーネントを設定します。

The content of this page may be outdated and some links may be invalid. A newer version of this page exists in English.

More information ...

To see the changes to the English page since this page was last updated: visit GitHub compare fc509b75..56d68177 and search for content/en/docs/zero-code/obi/configure/metrics-traces-attributes.md.

OBI がメトリクスとトレースの属性をどのように装飾するかを設定できます。 属性の設定や有効化には、トップレベルの YAML セクション attributes を使用します。

OBI でエクスポートされるメトリクス のドキュメントには、各メトリクスで報告できる属性が一覧化されています。 OBI はデフォルトで一部の属性を報告し、カーディナリティを制御するために他の属性を非表示にします。

各メトリクスに対して、select サブセクションでどの属性を表示するかを制御できます。 これは、各キーが OpenTelemetry または Prometheus ポートにおけるメトリクスの名前であるマップで、各メトリクスは includeexclude の 2 つのサブプロパティを持ちます。

  • include は報告する属性のリストです。各属性は名前またはワイルドカード(たとえば、k8s.dst で始まるすべての属性を含めるための k8s.dst.*)にできます。include リストを指定しない場合、OBI はデフォルトの属性セットを報告します。特定のメトリクスのデフォルト属性に関する詳細は OBI でエクスポートされるメトリクス を参照してください
  • exclude は、include リストまたはデフォルトの属性セットから削除する属性名またはワイルドカードのリストです

例:

attributes:
  select:
    obi_network_flow_bytes:
      # OTEL_EBPF_network_flow_bytes の属性を以下の 3 つだけに限定します
      include:
        - obi.ip
        - src.name
        - dst.port
    sql_client_duration:
      # db_statement を除くすべての可能な属性を報告します
      include: ['*']
      exclude: ['db_statement']
    http_client_request_duration:
      # デフォルトの属性セットを報告しますが、Kubernetes Pod 情報は除外します
      exclude: ['k8s.pod.*']

さらに、メトリクス名としてワイルドカードを使用して、同じ名前のメトリクスグループに対して属性を追加・除外することもできます。 たとえば次のとおりです。

attributes:
  select:
    http_*:
      include: ['*']
      exclude: ['http_path', 'http_route']
    http_client_*:
      # http_* の除外設定を上書きします
      include: ['http_path']
    http_server_*:
      # http_* の除外設定を上書きします
      include: ['http_route']

前述の例では、名前が http_ または http. で始まるすべてのメトリクスについて、http_pathhttp_route または http.path/http.route を除くすべての可能な属性が含まれます。 http_client_*http_server_* のセクションは基本設定を上書きし、HTTP クライアントメトリクスでは http_path 属性を、HTTP サーバーメトリクスでは http_route 属性を有効化します。

メトリクス名がワイルドカードを使用する複数の定義にマッチする場合、完全一致がワイルドカードマッチよりも優先されます。

トレースの選択

エクスポートされる OpenTelemetry トレースについては、attributes.select 配下で(メトリクス名ではなく)traces キーを使用します。 これは、db.query.texturl.query、GenAI ペイロード属性、db.response.error など、オプションのトレース装飾を制御します。

attributes:
  select:
    traces:
      include:
        - db.query.text
        - db.response.error

db.response.error

db.response.error は OpenTelemetry セマンティック規約の一部ではありません。 OBI はこの文字列を attributes.select.traces 配下の設定フラグとしてのみ使用します。

条件動作
含まれない(デフォルト)データベース関連の失敗したスパン(SQL、Redis、MongoDB、Couchbase、Memcached、HTTP 経由の SQL++)では、span.status.message は空のままになります。これは、他のオプション属性(たとえば db.query.text)の挙動と一貫しています — 選択されない場合、それらは省略されます。
含まれるこれらの同じスパンで、span.status.message がプロトコルレスポンスから解析された実際のエラー説明に設定されます。

db.response.error は OTLP トレースのスパン属性として添付されることはありません。 エクスポート時、OBI はゲートされた値をデータベーススパンの span.status.message を構築するためにのみ使用し、その後この属性をエクスポートされるスパンから削除します。 このオプションを有効にすると、スパン上の独立した db.response.error フィールドではなく、ステータスの説明が変更されます。

このオプトインは、エラー文字列に機密情報や高カーディナリティの詳細(スキーマ名、クエリの断片、データ値)が含まれる可能性があるために存在します。

分散トレースとコンテキスト伝搬

YAML セクション: ebpf

このコンポーネントは、YAML 設定ファイルの ebpf セクション、または環境変数を使用して設定できます。

YAML
環境変数
説明デフォルト
context_propagation
OTEL_EBPF_BPF_CONTEXT_PROPAGATION
トレースコンテキスト伝搬方式を制御します。受け付ける値: allheaderstcpheaders,tcpdisabled。詳細は コンテキスト伝搬セクション を参照してください。stringdisabled
track_request_headers
OTEL_EBPF_BPF_TRACK_REQUEST_HEADERS
トレーススパンの受信 Traceparent ヘッダーを追跡します。詳細は リクエストヘッダーの追跡セクション を参照してください。booleanfalse

コンテキスト伝搬

OBI は送信される HTTP リクエストに対して Traceparent ヘッダー値を注入するため、受信したコンテキストを下流のサービスへ伝搬できます。 このコンテキスト伝搬は、任意のプログラミング言語で機能します。

TLS 暗号化された HTTP リクエスト(HTTPS)の場合、OBI は Traceparent ヘッダー値を TCP/IP パケットレベルでエンコードします。 通信の両側に OBI が存在している必要があります。

TCP/IP パケットレベルのエンコーディングには Linux Traffic Control (TC) を使用します。 TC も使用する eBPF プログラムは、OBI と正しくチェーンする必要があります。 プログラムのチェーンに関する詳細は Cilium 互換性ドキュメント を参照してください。

context_propagation="headers" を設定することで、TCP レベルの伝搬と Linux Traffic Control プログラムを無効にできます。 このモードは、任意の OpenTelemetry 分散トレーシングライブラリと完全に互換性があります。

コンテキスト伝搬の値:

  • all: HTTP ヘッダーと TCP コンテキスト伝搬の両方を有効化
  • headers: HTTP ヘッダーを介したコンテキスト伝搬のみを有効化
  • tcp: TCP パケットパスを介したコンテキスト伝搬のみを有効化
  • headers,tcp: 両方の方式を明示的に有効化
  • disabled: トレースコンテキスト伝搬を無効化

httpheaders のエイリアスとして受け付けられますが、例と設定では headers という名前が推奨されます。

このオプションをコンテナ環境(Kubernetes および Docker)で使用するには、次のことが必要です。

  • OBI を DaemonSet として、ホストネットワークアクセス hostNetwork: true でデプロイする
  • ホストの /sys/fs/cgroup パスをローカルの /sys/fs/cgroup パスとしてボリュームマウントする
  • OBI コンテナに CAP_NET_ADMIN 機能を付与する

このネットワークレベルモードでは、gRPC と HTTP/2 はサポートされていません。

Kubernetes での分散トレースの設定例については、OBI による分散トレース ガイドを参照してください。

リクエストヘッダーの追跡

このオプションは、受信した Traceparent ヘッダー値を OBI が処理できるようにします。 有効にすると、OBI は Traceparent ヘッダー値を持つサーバーリクエストを受信した際、提供された「トレース ID」を使用して独自のトレーススパンを作成します。

このオプションは Go アプリケーションには影響しません。 Go アプリケーションでは、Traceparent フィールドが常に処理されます。

このオプションを有効にすると、リクエスト量の多いシナリオでパフォーマンスのオーバーヘッドが増加する可能性があります。 このオプションは OBI のトレースを生成するときにのみ有用で、メトリクスには影響しません。

その他の属性

YAML オプション
環境変数
説明デフォルト
heuristic_sql_detect
OTEL_EBPF_HEURISTIC_SQL_DETECT
ヒューリスティックな SQL クライアント検出を有効化します。詳細は以下を参照してください。boolean(false)

heuristic sql detect オプションを使用すると、プロトコルが直接サポートされていなくても、OBI はクエリ文を検査することで SQL クライアントリクエストを検出できます。 デフォルトでは、OBI はバイナリプロトコル形式によって SQL クライアントリクエストを検出します。 OBI が直接サポートしていないデータベース技術を使用している場合、このオプションを有効にしてデータベースクライアントのテレメトリーを取得できます。 このオプションはデフォルトでは有効になっていません。 たとえばアプリケーションが TCP 接続を介してログ出力のために SQL テキストを送信する場合のように、誤検出を生じる可能性があるためです。 現在、OBI は PostgreSQL、MySQL、MSSQL のバイナリプロトコルをネイティブにサポートしています。

スパン向けの HTTP ヘッダー・ボディエンリッチメント

OBI は、ebpf.payload_extraction.http.enrichment 設定セクションを通じて、選択した HTTP ヘッダーや選択した HTTP ボディフィールドをスパンに添付できます。 これは、アプリケーションを手動で計装することなく、ビジネスやルーティング関連のヘッダーをトレースに持ち込みたい場合に有用です。

エンリッチメントエンジンはルールベースです。

  • HTTP ヘッダーとボディのエンリッチメントを有効化するには enabled: true を設定します。
  • YAML で policy.default_action.headerspolicy.default_action.body を使用して、マッチしないヘッダーやボディコンテンツを含めるか除外するかを定義します。両方のデフォルトは exclude です。
  • スパンに添付される前に、機密性のあるヘッダー値や JSON ボディフィールドを秘匿化するために obfuscate ルールを使用します。
  • ルールは順番に評価されます。

たとえば次のとおりです。

ebpf:
  buffer_sizes:
    http: 8192
  payload_extraction:
    http:
      enrichment:
        enabled: true
        policy:
          default_action:
            headers: exclude
            body: exclude
          obfuscation_string: '***'
        rules:
          - action: obfuscate
            type: headers
            scope: all
            match:
              patterns:
                - Authorization
              case_sensitive: false
          - action: include
            type: headers
            scope: all
            match:
              patterns:
                - Content-Type
                - X-Custom-*
                - X-Dice-Roll
              case_sensitive: false
          - action: include
            type: body
            scope: request
            match:
              methods: [POST]
              url_path_patterns:
                - /v1/chat/completions
          - action: obfuscate
            type: body
            scope: request
            match:
              methods: [POST]
              url_path_patterns:
                - /v1/chat/completions
              obfuscation_json_paths:
                - $.messages[*].content

次の環境変数がエンリッチメントのグローバルな動作を制御します。

  • OTEL_EBPF_HTTP_ENRICHMENT_ENABLED
  • OTEL_EBPF_HTTP_ENRICHMENT_OBFUSCATION_STRING

policy.default_action.headerspolicy.default_action.body の設定は YAML でのみ設定できます。 これらのデフォルト値に対応する環境変数はありません。

ルール自体は YAML で設定します。 ヘッダールールは match.patterns とオプションの case_sensitive を使用します。 ボディルールは match.url_path_patternsmatch.methodsmatch.obfuscation_json_paths を使用します。

ボディの抽出には HTTP ペイロードキャプチャが必要です。 OBI がエンリッチしたいリクエストまたはレスポンスのバイトをキャプチャできるように、ebpf.buffer_sizes.http を増やしてください。 この上限はリクエストとレスポンスに対して独立して適用されます。

インスタンス ID デコレーション

YAML セクション: attributes.instance_id

OBI は、計装された各アプリケーションを識別する一意のインスタンス ID 文字列でメトリクスとトレースを装飾します。 デフォルトでは、OBI は OBI を実行しているホスト名(コンテナ名または Pod 名にもなり得る)に、計装対象のプロセスの PID を続けて使用します。 インスタンス ID の構成方法は、attributes トップレベルセクション配下の instance_id YAML サブセクションで上書きできます。

たとえば次のとおりです。

attributes:
  instance_id:
    dns: false
YAML
環境変数
説明デフォルト
dns
OTEL_EBPF_HOSTNAME_DNS_RESOLUTION
true の場合、OBI はローカルホスト名をネットワーク DNS に対して解決しようとします。false の場合、ローカル名を使用します。詳細は DNS セクション を参照してください。booleantrue
override_hostname
OTEL_EBPF_HOSTNAME
設定されている場合、OBI は指定された文字列をインスタンス ID のホスト部分として使用します。DNS 解決を上書きします。詳細は ホスト名の上書きセクション を参照してください。string(unset)

DNS

true の場合、OBI はローカルホスト名をネットワーク DNS に対して解決しようとします。 false の場合、ローカルホスト名を使用します。

ホスト名の上書き

設定されている場合、OBI はホスト名の解決を試みるかわりに、指定された文字列をインスタンス ID のホスト部分として使用します。 このオプションは dns よりも優先されます。

Kubernetes デコレーター

YAML セクション: attributes.kubernetes

このコンポーネントは、YAML 設定ファイルの attributes.kubernetes セクション、または環境変数を使用して設定できます。

この機能を有効化するには、OBI Pod に追加の権限を付与する必要があります。 「Kubernetes で OBI を実行する」ページの「Kubernetes メタデータ装飾の設定」セクション を参照してください。

このオプションを true に設定すると、OBI は Kubernetes メタデータでメトリクスとトレースを装飾します。 false に設定すると、OBI は Kubernetes メタデータデコレーターを無効化します。 autodetect に設定すると、OBI は Kubernetes 内で実行されているかどうかを検出しようとし、そうであればメタデータ装飾を有効化します。

たとえば次のとおりです。

attributes:
  kubernetes:
    enable: true
YAML
環境変数
説明デフォルト
enable
OTEL_EBPF_KUBE_METADATA_ENABLE
Kubernetes メタデータ装飾を有効化または無効化します。Kubernetes 内で実行されている場合に有効化するには autodetect を設定します。詳細は Kubernetes の有効化セクション を参照してください。boolean/stringfalse
kubeconfig_path
KUBECONFIG
Kubernetes 設定ファイルへのパス。詳細は Kubernetes 設定パスセクション を参照してください。string~/.kube/config
disable_informers
OTEL_EBPF_KUBE_DISABLE_INFORMERS
無効化する Informer のリスト(nodeservice)。詳細は Informer の無効化セクション を参照してください。string(empty)
meta_restrict_local_node
OTEL_EBPF_KUBE_META_RESTRICT_LOCAL_NODE
メタデータをローカルノードのみに制限します。詳細は メタデータをローカルノードに制限するセクション を参照してください。booleanfalse
informers_sync_timeout
OTEL_EBPF_KUBE_INFORMERS_SYNC_TIMEOUT
開始前に Kubernetes メタデータを待機する最大時間。詳細は Informer 同期タイムアウトセクション を参照してください。Duration30s
reconnect_initial_interval
OTEL_EBPF_KUBE_RECONNECT_INITIAL_INTERVAL
接続喪失後に Kubernetes API に再接続するまでの初期遅延。詳細は 再接続初期間隔セクション を参照してください。Duration5s
informers_resync_period
OTEL_EBPF_KUBE_INFORMERS_RESYNC_PERIOD
すべての Kubernetes メタデータを定期的に再同期します。詳細は Informer 再同期周期セクション を参照してください。Duration30m
meta_cache_address
OTEL_EBPF_KUBE_META_CACHE_ADDRESS
Kubernetes メタデータを取得する外部 k8s-cache サービスのアドレス。詳細は メタデータキャッシュアドレスセクション を参照してください。string(empty)
service_name_template
OTEL_EBPF_SERVICE_NAME_TEMPLATE
サービス名のための Go テンプレート。詳細は サービス名テンプレートセクション を参照してください。string(empty)

Kubernetes の有効化

Kubernetes 環境で OBI を実行している場合、標準の OpenTelemetry ラベルでトレースとメトリクスを装飾するように設定できます。

  • k8s.namespace.name
  • k8s.deployment.name
  • k8s.statefulset.name
  • k8s.replicaset.name
  • k8s.daemonset.name
  • k8s.node.name
  • k8s.pod.name
  • k8s.container.name
  • k8s.pod.uid
  • k8s.pod.start_time
  • k8s.cluster.name
  • k8s.owner.name

Kubernetes 設定パス

これは標準の Kubernetes 設定環境変数です。 これを使用して、Kubernetes クラスターと通信するための Kubernetes 設定を OBI がどこで見つけるかを伝えます。 通常、この値を変更する必要はありません。

Informer の無効化

受け付ける値は nodeservice を含む可能性のあるリストです。

このオプションを使用すると、ネットワークメトリクスやアプリケーションのメトリクスとトレースを装飾するために必要なメタデータを取得するために Kubernetes API を継続的にリッスンする一部の Kubernetes Informer を選択的に無効化できます。

非常に大規模なクラスターで OBI を DaemonSet としてデプロイする場合、すべての OBI インスタンスが複数の Informer を作成すると、Kubernetes API に過剰な負荷がかかる可能性があります。

一部の Informer を無効化すると報告されるメタデータが不完全になりますが、Kubernetes API への負荷は軽減されます。

Pod の Informer は無効化できません。 それを行うには、Kubernetes メタデータ装飾全体を無効化してください。

メタデータをローカルノードに制限する

true の場合、OBI は OBI インスタンスが実行されているノードからのみ Pod とノードのメタデータを保存します。

このオプションはメタデータを保存するためのメモリ使用量を減らしますが、ネットワークバイト数やサービスグラフメトリクスなどの一部のメトリクスは、異なるノード上の宛先 Pod からのメタデータを含まなくなります。

Informer 同期タイムアウト

これは、メトリクスとトレースの装飾を開始する前に、OBI がすべての Kubernetes メタデータを取得するために待機する最大時間です。 このタイムアウトに達すると、OBI は通常通り開始しますが、すべての Kubernetes メタデータがバックグラウンドで更新されるまで、メタデータ属性が不完全になる可能性があります。

再接続初期間隔

OBI が Kubernetes API への接続を失った場合、この値が接続を再試行するまでの初期遅延を制御します。

不安定または過負荷の API サーバーに対する再接続の負荷を軽減するには、この値を大きくしてください。 一時的な API 障害後により速く回復したい場合は、小さくしてください。

Informer 再同期周期

OBI はリソースのメタデータに対する更新を即座に受信します。 それに加えて、OBI はこのプロパティで指定する頻度ですべての Kubernetes メタデータを定期的に再同期します。 値を大きくすると Kubernetes API サービスへの負荷が軽減されます。

メタデータキャッシュアドレス

設定すると、OBI は Kubernetes API サーバーに対して独自の Informer を実行するかわりに、外部の k8s-cache サービスから gRPC 経由で Kubernetes メタデータを取得します。 これは Kubernetes API への過負荷を避けるため、大規模クラスターおよび DaemonSet デプロイメントで推奨されます。

サービス名テンプレート

Go テンプレートを使用してサービス名をテンプレート化できます。 これにより、条件付きまたは拡張されたサービス名を作成できます。

次のコンテキストがテンプレートで利用可能です。

Meta: (*informer.ObjectMeta)
  Name: (string)
  Namespace: (string)
  Labels:
    label1: lv1
    label2: lv2
  Annotations:
    Anno1: av1
    Anno2: av2
  Pod: (*PodInfo)
  ...

ContainerName: (string)

完全なオブジェクトと構造は kubecache informer.pb.go ソースファイルにあります。

サービス名テンプレートの例:

{{- .Meta.Namespace }}/{{ index .Meta.Labels "app.kubernetes.io/name" }}/{{ index .Meta.Labels "app.kubernetes.io/component" -}}{{ if .ContainerName }}/{{ .ContainerName -}}{{ end -}}

または

{{- .Meta.Namespace }}/{{ index .Meta.Labels "app.kubernetes.io/name" }}/{{ index .Meta.Labels "app.kubernetes.io/component" -}}

この例では、サービス名内の空白を防ぐために、最初の行のみが使用されトリミングされます。

追加のグループ属性

OBI を使用すると、extra_group_attributes 設定を使用してカスタム属性でメトリクスを拡張できます。 これにより、標準セット以外の追加のメタデータをメトリクスに含める柔軟性が得られます。

この機能を使用するには、グループ名とそのグループに含めたい属性のリストを指定します。

現在、k8s_app_meta グループのみがサポートされています。 このグループには、Pod 名、名前空間、コンテナ名、Pod UID などの Kubernetes 固有のメタデータが含まれます。

設定例:

attributes:
  kubernetes:
    enable: true
  extra_group_attributes:
    k8s_app_meta: ['k8s.app.version']

この例では:

  • extra_group_attributes > k8s_app_meta ブロックに k8s.app.version を追加すると、k8s.app.version ラベルがメトリクスに表示されるようになります。
  • Kubernetes マニフェストで接頭辞 resource.opentelemetry.io/ および接尾辞 k8s.app.version を持つアノテーションを定義することもできます。これらのアノテーションは自動的にメトリクスに含まれます。

次の表はデフォルトのグループ属性を示しています。

グループラベル
k8s_app_metak8s.namespace.name
k8s_app_metak8s.pod.name
k8s_app_metak8s.container.name
k8s_app_metak8s.deployment.name
k8s_app_metak8s.replicaset.name
k8s_app_metak8s.daemonset.name
k8s_app_metak8s.statefulset.name
k8s_app_metak8s.node.name
k8s_app_metak8s.pod.uid
k8s_app_metak8s.pod.start_time
k8s_app_metak8s.cluster.name
k8s_app_metak8s.owner.name

そして、次の表はメトリクスとそれらに関連付けられたグループを示しています。

グループOTel MetricProm Metric
k8s_app_metaprocess.cpu.utilizationprocess_cpu_utilization_ratio
k8s_app_metaprocess.cpu.timeprocess_cpu_time_seconds_total
k8s_app_metaprocess.memory.usageprocess_memory_usage_bytes
k8s_app_metaprocess.memory.virtualprocess_memory_virtual_bytes
k8s_app_metaprocess.disk.ioprocess_disk_io_bytes_total
k8s_app_metamessaging.publish.durationmessaging_publish_duration_seconds
k8s_app_metamessaging.process.durationmessaging_process_duration_seconds
k8s_app_metahttp.server.request.durationhttp_server_request_duration_seconds
k8s_app_metahttp.server.request.body.sizehttp_server_request_body_size_bytes
k8s_app_metahttp.server.response.body.sizehttp_server_response_body_size_bytes
k8s_app_metahttp.client.request.durationhttp_client_request_duration_seconds
k8s_app_metahttp.client.request.body.sizehttp_client_request_body_size_bytes
k8s_app_metahttp.client.response.body.sizehttp_client_response_body_size_bytes
k8s_app_metarpc.client.durationrpc_client_duration_seconds
k8s_app_metarpc.server.durationrpc_server_duration_seconds
k8s_app_metadb.client.operation.durationdb_client_operation_duration_seconds
k8s_app_metagpu.kernel.launch.callsgpu_kernel_launch_calls_total
k8s_app_metagpu.kernel.grid.sizegpu_kernel_grid_size_total
k8s_app_metagpu.kernel.block.sizegpu_kernel_block_size_total
k8s_app_metagpu.memory.allocationsgpu_memory_allocations_bytes_total