NGINX 向けに、 OpenTelemetry と Instana を連携させる

OpenTelemetry を、 NGINX および IBM Instana Observabilityと組み合わせて使用することで、 NGINX Webサーバーに対して分散トレーシングとオブザーバビリティ機能を実現できます。

サポート対象のオペレーティング・システム

OpenTelemetry この統合機能は、 Linux オペレーティングシステムでのみサポートおよびテストされています。

前提条件

OpenTelemetry を Instana と連携させるには、以下のコンポーネントが必要です:

  • NGINX Webサーバー( 1.25.3 以降のバージョンを推奨します。それ以前のバージョンでは、ソースから NGINX OpenTelemetry モジュールをビルドする必要があります)
  • OpenTelemetry NGINX モジュールまたは計測
  • 有効な IBM の Instana Observabilityアカウント

OpenTelemetry の NGINX モジュールのインストール

NGINX の公式モジュール「 OpenTelemetry 」ngx_otel_moduleは、動的モジュールとして利用可能です。 このモジュールに関する詳細については、 NGINX OpenTelemetry のモジュールドキュメントを参照してください。

  1. 「 NGINX 」モジュール( OpenTelemetry )をインストールします。

    ほとんどの Linux ディストリビューションでは、 NGINX リポジトリからこのモジュールをインストールできます:

    # For Ubuntu or Debian
    sudo apt-get install nginx-module-otel
    
    # For RHEL or CentOS
    sudo yum install nginx-module-otel

    あるいは、ソースコードから OpenTelemetry モジュールを使用して NGINX をビルドすることもできます。 ビルドの手順については、『 NGINX 』のドキュメントを参照してください。

  2. NGINX を設定して、 OpenTelemetry モジュールを読み込むようにするには、ファイル nginx.conf の先頭に次の行を追加します:

    load_module modules/ngx_otel_module.so;

NGINX と OpenTelemetry の設定

「 OpenTelemetry 」 NGINX モジュールをインストールした後、 NGINX サーバーを設定して、 OpenTelemetry データを送信するようにします。 基本構成には、以下のディレクティブが含まれます:

表 1. NGINX OpenTelemetry 設定ディレクティブ
設定ディレクティブ 説明
otel_exporter トレースが送信される OTLP エンドポイントを定義します
otel_service_name インフラストラクチャの相関付け用の論理サービス名(詳細については、 「インフラストラクチャの相関付け」 を参照してください。)
otel_trace OpenTelemetry のトレースを有効または無効にします
otel_trace_context トレースコンテキストの伝播を設定します

トレース・コンテキスト伝達

ネイティブの NGINX モジュール( OpenTelemetry )は、分散トレーシングに W3C トレースコンテキスト標準を採用しています。 このモジュールは、以下の標準的な HTTP ヘッダーを使用してトレースコンテキストを伝播します:

  • traceparent - トレースID、親スパンID、およびトレースフラグが含まれています
  • tracestate - ベンダー固有のトレース情報を保持する

このモジュールは、トレース伝播のための Instana 固有のヘッダーをサポートしていません

  • X-Instana-T (トレースID)
  • X-Instana-S (Span ID)
  • X-Instana-L (サンプリングレベルまたは判定)

NGINX が「 W3C 」トレースコンテキストヘッダーを含むリクエストを受信すると、自動的にトレースを継続します。 NGINX がアップストリームへのリクエストを行う際、同じ W3C 標準ヘッダーを使用してトレースコンテキストを伝播します。

OpenTelemetry の連携設定

OpenTelemetry と Instana を連携させるには、以下のいずれかの方法をご利用いただけます:

オプション 1: Instana を使用した OpenTelemetry コレクターの配布

「 Instana 」ディストリビューションの「 OpenTelemetry Collector」( IDOT )は、「 OpenTelemetry Collector」の完全管理型かつ事前設定済みのバージョンであり、「 Instana 」オブザーバビリティ・プラットフォームとシームレスに統合されます。

NGINX サーバーからテレメトリデータを収集するには、以下の手順に従って IDOT を設定および構成してください:

  1. コレクターを取り付けます。 インフラストラクチャの要件に応じて、 OpenTelemetry Collectorの Instana ディストリビューションを、サイドカー、デーモン、またはゲートウェイとしてデプロイします。 IDOT コレクターの設定に関する詳細な手順については、 『 OpenTelemetry コレクターの Instana ディストリビューション』のドキュメントを参照してください。
  2. NGINX サーバーを設定し、 OpenTelemetry のデータを IDOT コレクターのエンドポイント(デフォルトポート24317)に送信するようにします:

    http {
        otel_exporter {
            endpoint localhost:24317;
        }
    
        otel_service_name nginx_service;
        otel_trace on;
    
        server {
            listen 80;
            server_name example.com;
    
            location / {
                otel_trace_context propagate;
                # Backend refers to the upstream application server(s) that NGINX forwards requests to
                proxy_pass http://backend;
            }
        }
    }

オプション 2: Instana OTLP のエンドポイントを使用する

「 OpenTelemetry 」と「 NGINX 」を連携させるには、「 OpenTelemetry Protocol 」( OTLP )エクスポーターを設定し、「 OpenTelemetry 」のトレースを「 Instana 」エージェントまたは「 Instana 」バックエンドに直接送信するようにします。

OTLP エンドポイントにデータを送信する

Instana エージェントは、 NGINX サーバーから直接 OpenTelemetry データを受信できる OTLP エンドポイントを提供します。

Instana エージェントの OTLP エンドポイントにデータを送信するには、 NGINX サーバーを次のように設定してください:

http {
    otel_exporter {
        endpoint localhost:4317;
    }

    otel_service_name your_service_name;
    otel_trace on;

    server {
        listen 80;
        location / {
            otel_trace_context propagate;
            proxy_pass http://backend;
        }
    }
}

バックエンドの OTLP エンドポイントへのデータ送信

Instana エージェントと直接通信できない環境では、 NGINX サーバーを設定して、 OpenTelemetry のデータを Instana バックエンドに直接送信するようにすることができます。

詳細については、 「 OpenTelemetry のデータを Instana に送信する」 を参照してください。

Instana バックエンドの OTLP エンドポイントにデータを送信するには、 NGINX サーバーを次のように設定してください:

http {
    otel_exporter {
        endpoint https://{instana-backend-otlp-acceptor-endpoint}:4317;
        headers x-instana-key={agent-key};
    }

    otel_service_name your_service_name;
    otel_trace on;

    server {
        listen 80;
        location / {
            otel_trace_context propagate;
            proxy_pass http://backend;
        }
    }
}

{instana-backend-otlp-acceptor-endpoint} を、ご自身の Instana バックエンドエンドポイントに、 {agent-key} を、ご自身の Instana エージェントキーに置き換えてください。

Kubernetes 上で、 OpenTelemetry を使用した NGINX Ingress Controller のデプロイ

Kubernetes 環境では、 Helm を使用して、 OpenTelemetry に対応した NGINX Ingress Controllerをデプロイできます。 このデプロイメントにより、すべてのインバウンドトラフィックに分散トレーシングを自動的に適用できるようになります。

重要: クラスターに Instana AutoTrace のWebhookがインストールされている場合は、ネイティブの OpenTelemetry モジュールとの競合を避けるため、ingress-nginx用にこれを無効にする必要があります。 Instana--set autotrace.ingress_nginx.enabled=false エージェントのインストールまたは更新時に設定を行うことで、ingress-nginxの AutoTrace を無効にすることができます。

Kubernetes の導入に必要な前提条件

以下の前提条件を満たしていることを確認してください。

  • Kubernetes クラスター(例:Minikube、EKS、 GKE、または AKS )
  • Helm 3.x インストール済み
  • kubectl クラスターにアクセスするように設定されています
  • Instana バックエンドの OTLP エンドポイントと API キー

OpenTelemetry を使用した ingress-nginx のインストール

  1. ingress-nginxの Helm リポジトリを追加します:

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
  2. OpenTelemetry の設定を含む Helm 値ファイル(例: ingress-nginx-values.yaml)を作成します:

    controller:
      config:
        http-snippet: |
          otel_exporter {
            endpoint https://{instana-backend-otlp-endpoint}:4317;
            header x-instana-key "{agent-key}";
          }
          otel_service_name "{your-service-name}";
          otel_resource_attr "service.namespace" "ingress-nginx";
          otel_resource_attr "k8s.cluster.name" "{your-cluster-name}";
        main-snippet: |
          load_module /etc/nginx/modules/ngx_otel_module.so;
        otel-span-attr: |
          http.request_id $request_id
          k8s.namespace $namespace
          k8s.ingress.name $ingress_name
          k8s.service.name $service_name
        otel-trace: "on"
        otel-trace-context: propagate
      image:
        digest: ""
        image: ingress-nginx-otel
        pullPolicy: Never
        registry: docker.io/library
        tag: "{version}"

    設定内の以下の値を置き換えてください:

    • {instana-backend-otlp-endpoint} - Instana のバックエンドにある OTLP エンドポイント(例: otlp-red-saas.instana.io )
    • {agent-key} - Instana のエージェントキー
    • {your-cluster-name} - Kubernetes クラスタ名
    • {your-service-name} - サービス名
    • {version} - OpenTelemetry に対応した ingress-nginx イメージのバージョン
    • イメージ設定 - レジストリおよびイメージの要件に合わせて設定してください
  3. ingress-nginx コントローラーを、以下のカスタム設定値でインストールします:

    helm install ingress-nginx ingress-nginx/ingress-nginx \
      --namespace ingress-nginx \
      --create-namespace \
      --values ingress-nginx-values.yaml
  4. インストールの検証

    kubectl get pods -n ingress-nginx
    kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx

構成オプション

Helm の値ファイルには、いくつかの重要な設定セクションが含まれています:

  • http-snippet : Instana エンドポイントや認証設定など、 OpenTelemetry の主要なエクスポーター設定が含まれています
  • main-snippet : モジュール「 OpenTelemetry 」を読み込みます NGINX
  • otel-span-attr : 各トレースに追加されるカスタム・スパン属性を定義します。これには、 Kubernetes 固有のメタデータも含まれます
  • otel-trace : OpenTelemetry のトレースを有効にします
  • otel-trace-context : 下流のサービスへのトレースコンテキストの伝播を設定します

カスタムspan属性

この設定には、 Instana で有用なコンテキストを提供する、 Kubernetes 固有の属性が含まれています:

表 2. Kubernetes span属性
属性 説明
http.request_id HTTP への各リクエストに対する一意の識別子
k8s.namespace Kubernetes サービスの名前空間
k8s.ingress.name イングリッス・リソース名
k8s.service.name Kubernetes サービスの名称

これらの属性により、 Instana のUI上でトレースを特定の Kubernetes リソースと関連付けることができます。

インフラストラクチャー相関

この otel_service_name ディレクティブは、インフラストラクチャの相関分析に使用されます。これにより、 NGINX のアプリケーショントレースを、 Instana によって監視されている基盤となるインフラストラクチャエンティティ(ホスト、コンテナ、 Kubernetes ポッド、およびプロセス)と関連付けることができます。

Instana では、このサービス名を設定すると otel_service_name、以下のタスクを実行します:

  • NGINX のトレースとインフラストラクチャのメトリクス(CPU、メモリ、ネットワーク)を関連付ける
  • マップサービスの依存関係と呼び出し関係
  • アプリケーションビューとインフラストラクチャビュー間の双方向ナビゲーションを有効にする
  • 根本原因分析のために、状況を完全に把握する

インフラストラクチャの相関分析および OpenTelemetry との統合に関する詳細については、以下のトピックを参照してください: