OpenTelemetry

このタスクを完了すると、アプリケーションの構築に使用する言語、フレームワーク、プラットフォームに関係なく、アプリケーションをOpenTelemetryを使用したトレーシングに参加させる方法を理解できます。

このタスクでは、サンプルアプリケーションとしてBookinfoサンプルを使用し、トレースのレシーバーとしてOpenTelemetry Collectorを使用します。

Istioがトレーシングをどのように処理するかを学ぶには、このタスクの概要をご覧ください。

OpenTelemetry Collectorのデプロイ

  • OpenTelemetry CollectorのNamespaceを作成する

    $ kubectl create namespace observability
    
  • OpenTelemetry Collector をデプロイします。この設定例を起点として使用できます: otel.yaml

    Zip
    $ kubectl apply -f @samples/open-telemetry/otel.yaml@ -n observability
    

インストール

すべてのトレースオプションは、MeshConfig を介してグローバルに構成できます。設定を簡素化するために、istioctl install -f コマンドに渡すことができる単一の YAML ファイルを作成することをお勧めします。

エクスポーターの選択

Istio は、gRPC または HTTP を介して OpenTelemetry Protocol (OTLP) トレースをエクスポートするように構成できます。一度に構成できるエクスポーターは 1 つだけです (gRPC または HTTP のいずれか)。

gRPC経由のエクスポート

この例では、トレースは OTLP/gRPC を介して OpenTelemetry Collector にエクスポートされます。この例では、環境リソース検出機能も有効にしています。環境検出機能は、環境変数 OTEL_RESOURCE_ATTRIBUTES から属性をエクスポートされた OpenTelemetry リソースに追加します。

$ cat <<EOF | istioctl install -y -f -
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    enableTracing: true
    extensionProviders:
    - name: otel-tracing
      opentelemetry:
        port: 4317
        service: opentelemetry-collector.observability.svc.cluster.local
        resource_detectors:
          environment: {}
EOF

HTTP経由のエクスポート

この例では、トレースは OTLP/HTTP を介して OpenTelemetry Collector にエクスポートされます。この例では、環境リソース検出機能も有効にしています。環境検出機能は、環境変数 OTEL_RESOURCE_ATTRIBUTES から属性をエクスポートされた OpenTelemetry リソースに追加します。

$ cat <<EOF | istioctl install -y -f -
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    enableTracing: true
    extensionProviders:
    - name: otel-tracing
      opentelemetry:
        port: 4318
        service: opentelemetry-collector.observability.svc.cluster.local
        http:
          path: "/v1/traces"
          timeout: 5s
          headers:
            - name: "custom-header"
              value: "custom value"
        resource_detectors:
          environment: {}
EOF

テレメトリーAPI経由でのメッシュのトレーシングの有効化

次の構成を適用して、トレースを有効にします。

$ kubectl apply -f - <<EOF
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: otel-demo
spec:
  tracing:
  - providers:
    - name: otel-tracing
    randomSamplingPercentage: 100
    customTags:
      "my-attribute":
        literal:
          value: "default-value"
EOF

Bookinfoアプリケーションのデプロイ

Bookinfo サンプルアプリケーションをデプロイします。

Bookinfoサンプルを使用したトレースの生成

  1. Bookinfo アプリケーションが起動して実行されたら、トレース情報を生成するために、http://$GATEWAY_URL/productpage に 1 回以上アクセスします。

    トレースデータを確認するには、サービスにリクエストを送信する必要があります。リクエストの数は Istio のサンプリングレートに依存し、Telemetry API を使用して構成できます。デフォルトのサンプリングレートである 1% では、最初のトレースが表示されるまでに少なくとも 100 回のリクエストを送信する必要があります。productpage サービスに 100 回のリクエストを送信するには、次のコマンドを使用します。

    $ for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done
        
  2. この例で使用されている OpenTelemetry Collector は、トレースをコンソールに出力するように構成されています。例の Collector 設定を使用した場合は、Collector のログを確認してトレースが到着していることを確認できます。次のような内容が含まれているはずです。

    Resource SchemaURL:
    Resource labels:
          -> service.name: STRING(productpage.default)
    ScopeSpans #0
    ScopeSpans SchemaURL:
    InstrumentationScope
    Span #0
        Trace ID       : 79fb7b59c1c3a518750a5d6dad7cd2d1
        Parent ID      : 0cf792b061f0ad51
        ID             : 2dff26f3b4d6d20f
        Name           : egress reviews:9080
        Kind           : SPAN_KIND_CLIENT
        Start time     : 2024-01-30 15:57:58.588041 +0000 UTC
        End time       : 2024-01-30 15:57:59.451116 +0000 UTC
        Status code    : STATUS_CODE_UNSET
        Status message :
    Attributes:
          -> node_id: STRING(sidecar~10.244.0.8~productpage-v1-564d4686f-t6s4m.default~default.svc.cluster.local)
          -> zone: STRING()
          -> guid:x-request-id: STRING(da543297-0dd6-998b-bd29-fdb184134c8c)
          -> http.url: STRING(http://reviews:9080/reviews/0)
          -> http.method: STRING(GET)
          -> downstream_cluster: STRING(-)
          -> user_agent: STRING(curl/7.74.0)
          -> http.protocol: STRING(HTTP/1.1)
          -> peer.address: STRING(10.244.0.8)
          -> request_size: STRING(0)
          -> response_size: STRING(441)
          -> component: STRING(proxy)
          -> upstream_cluster: STRING(outbound|9080||reviews.default.svc.cluster.local)
          -> upstream_cluster.name: STRING(outbound|9080||reviews.default.svc.cluster.local)
          -> http.status_code: STRING(200)
          -> response_flags: STRING(-)
          -> istio.namespace: STRING(default)
          -> istio.canonical_service: STRING(productpage)
          -> istio.mesh_id: STRING(cluster.local)
          -> istio.canonical_revision: STRING(v1)
          -> istio.cluster_id: STRING(Kubernetes)
          -> my-attribute: STRING(default-value)
    

クリーンアップ

  1. Telemetry リソースを削除します。

    $ kubectl delete telemetry otel-demo
    
  2. control-C を使用するか、次のコマンドを使用して、まだ実行中の istioctl プロセスを削除します。

    $ killall istioctl
    
  3. OpenTelemetry Collector をアンインストールします。

    Zip
    $ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n observability
    $ kubectl delete namespace observability
    
  4. 後続のタスクを実行する予定がない場合は、アプリケーションをシャットダウンするための Bookinfo クリーンアップの手順を参照してください。

この情報は役立ちましたか?
改善のための提案はありますか?

フィードバックありがとうございます!