Trace エクスポータから OTLP エンドポイントに移行する

このドキュメントでは、OpenTelemetry SDK によるトレースデータの Google Cloud プロジェクトへのプロセス内エクスポートを構成する方法について説明します。Java、Go、Python、Node.js の例では、手動計測を使用するときにトレースデータを Telemetry(OTLP)API に送信するように SDK を構成する方法を示します。各言語について、このページでは、OTLP エクスポータを使用してサポートされているエクスポート プロトコルでトレースデータを送信する方法について説明します。

このページで説明する計測は、トレースデータにのみ適用されます。ログデータや指標データは Google Cloud プロジェクトに送信されません。

アプリケーションが OpenTelemetry Collector を使用してトレースデータを Google Cloud プロジェクトに送信している場合、このドキュメントは適用されません。

移行が必要な理由

OpenTelemetry SDK は、OpenTelemetry OTLP プロトコルで定義された proto ファイルと概ね一致する形式で、ログ、指標、トレースデータを生成します。ただし、フィールドは保存前に OpenTelemetry 固有のデータ型から JSON データ型に変換されることがあります。

アプリケーションが Google Cloud エクスポータを使用してそのデータを Google Cloud プロジェクトにエクスポートすると、エクスポータは次の手順を実行します。

  1. 記録されたデータを OTLP 形式から、Cloud Logging API、Cloud Monitoring API、または Cloud Trace API で定義された独自の形式に変換します。
  2. 変換されたデータを適切な API に送信し、 Google Cloud プロジェクトに保存します。

トレースデータの場合は、データ変換を必要としない Telemetry(OTLP)API を使用してデータをエクスポートするようにアプリケーションを移行することをおすすめします。データ変換により、一部のデータが失われる可能性があります。たとえば、独自形式では特定のフィールドの制限が低い場合や、一部の OTLP フィールドが独自形式のフィールドにマッピングされない場合があります。

利用可能なサンプル

このページで参照されているサンプル アプリケーションは GitHub で入手できます。ほとんどのアプリケーションは、gRPC を使用してトレースデータをエクスポートするように構成されています。つまり、HTTP/2 接続で gRPC ワイヤー形式を使用して protobuf エンコードされたデータを使用します。HTTP 接続を介してトレースデータを protobuf エンコードされたデータとしてエクスポートするように構成されたアプリケーションのコード例も提供されています。

  • Java アプリケーション

    サンプル アプリケーションは、HTTP 接続を介してトレースを protobuf エンコード データとしてエクスポートするように構成されています。gRPC を使用する場合は、このサンプルの計測が適用されます。ただし、自動構成モジュールが使用するシステム プロパティを変更する必要があります。サンプル アプリケーションは http/protobuf エクスポータを指定します。gRPC を使用するには、この設定を grpc に変更します。

    サンプル アプリケーションなどの Java アプリケーションでは、OpenTelemetry SDK Autoconfigure モジュールを使用して SDK を構成することをおすすめします。

  • gRPC を使用する Go アプリケーションHTTP を使用する Go アプリケーション

    Go リポジトリは 2 つあります。1 つのリポジトリでは、サンプル アプリケーションは gRPC を使用します。別のリポジトリのサンプルでは、HTTP 接続で protobuf エンコード データを使用します。

  • Python アプリケーション

    このリポジトリには、gRPC 用のサンプルと、HTTP 接続で protobuf エンコード データを使用するサンプルの 2 つが含まれています。

  • Node.js アプリケーション

    このリポジトリには、gRPC 用と HTTP 接続で protobuf エンコード データを使用するものの 2 つのサンプルが含まれています。

始める前に

トレースデータを OTLP エンドポイントに送信するようにアプリケーションを移行する前に、Telemetry API を有効にして、必要な Identity and Access Management(IAM)ロールが付与されていることを確認します。サービス アカウントに IAM ロールを付与する必要がある場合もあります。

課金と Telemetry API を有効にする

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Telemetry, Cloud Logging, Cloud Monitoring, and Cloud Trace APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Telemetry, Cloud Logging, Cloud Monitoring, and Cloud Trace APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  8. 権限を構成する

    手動計測の移行ガイド

    このセクションでは、Telemetry API を使用して、トレースデータを Google Cloud プロジェクトに送信するようにアプリケーションを変更する方法について説明します。このエンドポイントに指標データやログデータを送信することはできません。

    依存関係を追加する

    最初のステップは、アプリケーションに OpenTelemetry の OTLP トレース エクスポータの依存関係を追加することです。アプリケーションとビルドシステムに適した依存関係のバージョンを選択します。

    Java

    Java アプリケーションの場合は、build.gradle スクリプトに次の依存関係を追加します。

    // use the latest versions
    implementation("io.opentelemetry:opentelemetry-exporter-otlp:1.56.0")
    implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.56.0")
    

    Go

    このセクションでは、エクスポートに gRPC を使用する場合に依存関係に対して行う必要のある変更について説明します。エクスポートに HTTP 接続経由で protobuf エンコードされたデータを使用する場合は、otlptracehttp パッケージを依存関係として含めます。詳細については、HTTP を使用する Go アプリケーションをご覧ください。

    エクスポートに gRPC を使用する Go アプリケーションの場合は、go.mod ファイルを更新して次の依存関係を含めます。

    // go.mod file
    require(
      // OTLP exporter that uses grpc protocol for export
      go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0
    )
    

    Python

    このセクションでは、エクスポートに gRPC を使用する場合に依存関係に対して行う必要のある変更について説明します。エクスポートに HTTP 接続経由で protobuf エンコードされたデータを使用する場合は、opentelemetry-exporter-otlp-proto-http パッケージを要件として含めます。詳細については、Python アプリケーションをご覧ください。

    エクスポートに gRPC を使用する Python アプリケーションの場合は、次の依存関係をインストールするか、requirements.txt ファイルを更新します。

    # Requirements.txt - use appropriate versions
    #
    # OTLP exporter that uses grcp protocol for export
    opentelemetry-exporter-otlp-proto-grpc==1.39.0
    grpcio==1.76.0
    

    Node.js

    このセクションでは、エクスポートに gRPC を使用する場合に依存関係に対して行う必要のある変更について説明します。エクスポートに HTTP 接続経由で protobuf エンコードされたデータを使用する場合は、@opentelemetry/exporter-trace-otlp-proto パッケージを依存関係として含めます。詳細については、Node.js アプリケーションをご覧ください。

    gRPC を使用してエクスポートする Node.js アプリケーションの場合は、次の依存関係を追加します。

    "@opentelemetry/exporter-trace-otlp-grpc": "0.203.0",
    "@grpc/grpc-js": "1.13.4",
    

    Google Cloud エクスポータの使用を OTLP エクスポータに置き換える

    アプリケーション コードを更新して、 Google Cloud トレース エクスポータではなく OpenTelemetry OTLP エクスポータを使用するように OpenTelemetry SDK を構成します。必要な変更は言語によって異なります。

    Java

    Java アプリケーションの場合は、次の操作を行います。

    1. 次の import ステートメントを追加します。

      import io.opentelemetry.sdk.OpenTelemetrySdk;
      import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
      
    2. OpenTelemetry SDK Autoconfigure モジュールを使用して SDK を構成するようにアプリケーション コードを更新します。

      public static void main(String[] args) {
          // Configure the OpenTelemetry pipeline with Auto configuration
          openTelemetrySdk = AutoConfiguredOpenTelemetrySdk.initialize().getOpenTelemetrySdk();
          ...
      }
      
    3. 自動構成モジュールが実行時に使用するシステム プロパティを構成します。このモジュールは、これらのプロパティを使用して SDK をブートストラップします。システム プロパティの代わりに環境変数を使用することもできます。詳細については、環境変数とシステム プロパティをご覧ください。

      サンプル アプリケーションでは、build.gradle スクリプトでシステム プロパティを定義しています。

      // You can switch the desired protocol here by changing `otel.exporter.otlp.protocol`.
      def autoconf_config = [
        '-Dotel.exporter.otlp.endpoint=https://telemetry.googleapis.com',
        '-Dotel.traces.exporter=otlp',
        '-Dotel.logs.exporter=none',
        '-Dotel.metrics.exporter=none',
        '-Dotel.service.name=my-service',
        '-Dotel.exporter.otlp.protocol=http/protobuf',
        '-Dotel.java.global-autoconfigure.enabled=true',
        // ID of your Google Cloud Project, required by the auth extension
        '-Dgoogle.cloud.project=PROJECT_ID',
      ]
      
      // Now pass the config as JVM arguments to your java application:
      application {
              // Replace with the fully qualified name of your Main class.
        mainClassName = 'com.example.Main'
        applicationDefaultJvmArgs = autoconf_config
      }
      

      gRPC を使用してトレースデータをエクスポートする場合は、OTLP プロトコルを http/protobuf に設定するのではなく、grpc に設定します。

    Go

    このセクションでは、エクスポートに gRPC を使用する場合に必要な変更について説明します。エクスポートに HTTP 接続で protobuf エンコード データを使用する場合は、otlptracehttp パッケージをインポートし、対応するオプションでエクスポータを構成する必要があります。詳細については、HTTP を使用する Go アプリケーションをご覧ください。

    エクスポートに gRPC を使用する Go アプリケーションの場合は、次の import ステートメントを追加します。

    import (
        "context"
        "go.opentelemetry.io/otel"
        "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
        sdktrace "go.opentelemetry.io/otel/sdk/trace"
        // other dependencies
    )
    

    また、初期化コードを更新して、gRPC エクスポータで TraceProvider を構成します。

    
    // Initializes OpenTelemetry with OTLP exporters
    ctx := context.Background()
    
    // creds: configure Application Default Credentials
    
    // Initialize the OTLP gRPC exporter
    exporter, err := otlptracegrpc.New(ctx)
    if err != nil {
      panic(err)
    }
    
    // set OTEL_RESOURCE_ATTRIBUTES="gcp.project_id=<project_id>"
    // set endpoint with OTEL_EXPORTER_OTLP_ENDPOINT=https://<endpoint>
    // set OTEL_EXPORTER_OTLP_HEADERS="x-goog-user-project=<project_id>"
    exporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithDialOption(grpc.WithPerRPCCredentials(creds)))
    if err != nil {
      panic(err)
    }
    
    tp := sdktrace.NewTracerProvider(
      // For this example code we use sdktrace.AlwaysSample sampler to sample all traces.
      // In a production application, use sdktrace.TraceIDRatioBased with a desired probability.
      sdktrace.WithSampler(sdktrace.AlwaysSample()),
      sdktrace.WithBatcher(exporter))
    
    otel.SetTracerProvider(tp)
    

    Python

    このセクションでは、エクスポートに gRPC を使用する場合に必要な変更について説明します。エクスポートに HTTP 接続で protobuf エンコード データを使用する場合は、opentelemetry.exporter.otlp.proto.http パッケージからインポートし、対応するオプションでエクスポータを構成する必要があります。詳細については、Python アプリケーションをご覧ください。

    エクスポートに gRPC を使用する Python アプリケーションの場合は、次のインポートを追加します。

    from opentelemetry import trace
    from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
        OTLPSpanExporter,
    )
    from opentelemetry.sdk.resources import SERVICE_NAME, Resource
    

    また、初期化コードを更新して、gRPC エクスポータで TraceProvider を構成します。

    # Initialize OpenTelemetry with OTLP exporters
    
    # channel_creds: configure Application Default Credentials
    
    trace_provider = TracerProvider(resource=resource)
    processor = BatchSpanProcessor(
        OTLPSpanExporter(
            credentials=channel_creds,
            endpoint="https://telemetry.googleapis.com:443/v1/traces",
        )
    )
    trace_provider.add_span_processor(processor)
    trace.set_tracer_provider(trace_provider)
    tracer = trace.get_tracer("my.tracer.name")
    

    Node.js

    このセクションでは、エクスポートに gRPC を使用する場合に必要な変更について説明します。エクスポートに HTTP 接続経由で protobuf エンコード データを使用する場合は、@opentelemetry/exporter-trace-otlp-proto パッケージをインポートします。詳細については、Node.js アプリケーションをご覧ください。

    エクスポートに gRPC を使用する Node.js アプリケーションの場合は、次のインポートを追加します。

    import {OTLPTraceExporter} from '@opentelemetry/exporter-trace-otlp-grpc';
    

    また、初期化コードを更新して、gRPC エクスポータで TraceProvider を構成します。

    
    // Express App that exports traces via gRPC with protobuf
    async function main() {
      // authenticatedClient: configure Application Default Credentials
    
      // Configure the TraceExporter
      const sdk = new NodeSDK({
        traceExporter: new OTLPTraceExporter({
          credentials: credentials.combineChannelCredentials(
            credentials.createSsl(),
            credentials.createFromGoogleCredential(authenticatedClient),
          ),
        }),
      });
      sdk.start();
    }
    

    認証を構成する

    OpenTelemetry SDK 構成に対する前回の変更により、アプリケーションは gRPC または HTTP を使用して OpenTelemetry OTLP エクスポータでトレースをエクスポートするように構成されています。次に、これらのトレースを Google Cloud プロジェクトに送信するようにエクスポータを構成する必要があります。

    認証を構成するには、次の操作を行います。

    1. エクスポート呼び出しの認証ヘッダーを構成する
    2. 必要な OpenTelemetry リソース属性と OTLP ヘッダーを構成する
    3. エクスポータ エンドポイントを構成する

    このセクションでは、これらの各ステップについて詳しく説明します。

    エクスポート呼び出しの認証ヘッダーを構成する

    Google Cloud アプリケーションのデフォルト認証情報(ADC)を使用してエクスポータを構成するために、言語固有の Google Auth ライブラリを追加します。

    Java

    Trace への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

    OpenTelemetry SDK Autoconfigure モジュールを使用する Java アプリケーションの場合は、Google Cloud 認証拡張機能も使用することをおすすめします。

    // build.gradle
    implementation("io.opentelemetry.contrib:opentelemetry-gcp-auth-extension:1.52.0-alpha")
    

    Go

    Trace への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

    エクスポートに gRPC を使用する Go アプリケーションの場合は、go.mod ファイルを更新して次の依存関係を含めます。

    // go.mod file
    require (
        // When using gRPC based OTLP exporter, auth is built-in
        google.golang.org/grpc v1.75.1
    )
    

    エクスポートに HTTP を使用する Go アプリケーションの場合は、go.mod ファイルを更新して次の依存関係を含めます。

    // go.mod file
    require (
        // When using http based OTLP exported, use explicit auth library
      golang.org/x/oauth2 v0.31.0
    )
    

    Python

    Trace への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

    Python アプリケーションの場合は、次のインポートを追加します。

    # requirements.txt
    # Google Auth Library
    google-auth==2.38.0
    

    Node.js

    Trace への認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証の設定をご覧ください。

    Node.js アプリケーションの場合は、次の依存関係を追加します。

    "google-auth-library": "9.15.1",
    

    次に、ライブラリから取得した認可トークンをヘッダーに追加するように OTLP スパン エクスポータを構築するアプリケーション コードを更新します。このステップは言語固有ですが、実装はすべての言語で類似しています。

    Java

    OpenTelemetry SDK Autoconfigure モジュールGoogle Cloud 認証拡張機能を使用する Java アプリケーションがある場合、アプリケーションの初期化時に特別な手順を実行する必要はありません。自動構成モジュールは、ADC の構成に必要な手順を自動的に実行します。

    Go

    このセクションでは、エクスポートに gRPC を使用する場合に必要な変更について説明します。エクスポートに HTTP 接続経由で protobuf エンコードされたデータを使用する場合は、otlptracehttp パッケージをインポートし、エクスポータが otlptracehttp オブジェクトになるように構成する必要があります。詳細については、HTTP を使用する Go アプリケーションをご覧ください。

    エクスポートに gRPC を使用する Go アプリケーションの場合は、次の import ステートメントを追加します。

    import (
        "context"
        "go.opentelemetry.io/otel"
        "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
        sdktrace "go.opentelemetry.io/otel/sdk/trace"
        // other dependencies
        "google.golang.org/grpc"
        "google.golang.org/grpc/credentials/oauth"
    )
    

    また、初期化コードを更新して、gRPC エクスポータをインスタンス化する前に ADC を構成します。

    // Initializes OpenTelemetry with OTLP exporters
    ctx := context.Background()
    
    // Retrieve and store Google application-default credentials
    creds, err := oauth.NewApplicationDefault(ctx)
    if err != nil {
      panic(err)
    }
    
    // set OTEL_RESOURCE_ATTRIBUTES="gcp.project_id=<project_id>"
    // set endpoint with OTEL_EXPORTER_OTLP_ENDPOINT=https://<endpoint>
    // set OTEL_EXPORTER_OTLP_HEADERS="x-goog-user-project=<project_id>"
    exporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithDialOption(grpc.WithPerRPCCredentials(creds)))
    if err != nil {
      panic(err)
    }
    
    // Other OpenTelemetry configuration remains unaffected.
    

    Python

    このセクションでは、エクスポートに gRPC を使用する場合に必要な変更について説明します。エクスポートに HTTP 接続で protobuf エンコード データを使用する場合は、デフォルトの認証情報を使用します。BatchSpanProcessor をインスタンス化するときに、これらの認証情報を渡す必要もあります。詳細については、Python アプリケーションをご覧ください。

    エクスポートに gRPC を使用する Python アプリケーションの場合は、次のインポートを追加します。

    from opentelemetry import trace
    from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
        OTLPSpanExporter,
    )
    from opentelemetry.sdk.resources import SERVICE_NAME, Resource
    
    import google.auth
    import google.auth.transport.grpc
    import google.auth.transport.requests
    import grpc
    from google.auth.transport.grpc import AuthMetadataPlugin
    

    また、初期化コードを更新して、gRPC エクスポータをインスタンス化する前に ADC を構成します。

    credentials, _ = google.auth.default()
    request = google.auth.transport.requests.Request()
    resource = Resource.create(attributes={SERVICE_NAME: "otlp-gcp-grpc-sample"})
    
    auth_metadata_plugin = AuthMetadataPlugin(credentials=credentials, request=request)
    channel_creds = grpc.composite_channel_credentials(
        grpc.ssl_channel_credentials(),
        grpc.metadata_call_credentials(auth_metadata_plugin),
    )
    
    # Configure the TraceProvider
    

    Node.js

    このセクションでは、エクスポートに gRPC を使用する場合に必要な変更について説明します。エクスポートに HTTP 接続を介して protobuf エンコードされたデータを使用する場合は、ここで説明する変更とは若干異なります。詳細については、Node.js アプリケーションに含まれている app-http-proto-export.ts ファイルをご覧ください。

    エクスポートに gRPC を使用する Node.js アプリケーションの場合は、次のインポートを追加します。

    import {AuthClient, GoogleAuth} from 'google-auth-library';
    import {credentials} from '@grpc/grpc-js';
    

    また、初期化コードを更新して、gRPC エクスポータをインスタンス化する前に ADC を構成します。

    async function getAuthenticatedClient(): Promise<AuthClient> {
      const auth: GoogleAuth = new GoogleAuth({
        scopes: 'https://www.googleapis.com/auth/cloud-platform',
      });
      return await auth.getClient();
    }
    
    // Express App that exports traces via gRPC with protobuf
    async function main() {
      const authenticatedClient: AuthClient = await getAuthenticatedClient();
    
      // Configure the TraceExporter
    }
    

    必要な OpenTelemetry リソース属性を構成する

    プロジェクトを指定する Key-Value ペアを OTEL_RESOURCE_ATTRIBUTES 環境変数に追加します。キーには gcp.project_id を使用します。値には、 Google Cloud プロジェクトの ID を使用します。

    例:

    export OTEL_RESOURCE_ATTRIBUTES="gcp.project_id=PROJECT_ID"
    

    Java を使用し、サンプル Java アプリケーションのように Google Cloud 認証拡張機能を使用するようにアプリケーションを構成する場合は、OpenTelemetry リソース属性の一部としてプロジェクト ID を設定する必要はありません。ただし、この属性を設定しても問題はありません。

    OpenTelemetry 環境変数の詳細については、一般的な SDK 構成をご覧ください。

    割り当てプロジェクト ID を設定する

    割り当てプロジェクトは、API リクエストの使用状況を追跡する Google Cloud プロジェクトです。Telemetry API はクライアント ベースの API であるため、認証方法によって割り当てプロジェクトが自動的に識別されるかどうかが決まります。たとえば、認証にサービス アカウントを使用する場合は、割り当てプロジェクトを指定する必要はありません。ただし、認証にユーザー認証情報を使用する場合は、割り当てプロジェクトを指定する必要があります。

    環境変数を使用して割り当てプロジェクトを設定できます。プログラミング言語に設定する環境変数を特定するには、環境変数を使用して割り当てプロジェクトを設定するをご覧ください。

    たとえば、Go の場合は、次のように割り当てプロジェクトを設定できます。

    export GOOGLE_CLOUD_QUOTA_PROJECT="QUOTA_PROJECT_ID"
    

    認証エラーを解決する方法については、ユーザー認証情報が機能しないをご覧ください。

    エクスポータ エンドポイントを構成する

    OTEL_EXPORTER_OTLP_ENDPOINT 環境変数の値を Google Cloudの OTLP エンドポイントに設定します。

    例:

    export OTEL_EXPORTER_OTLP_ENDPOINT=https://telemetry.googleapis.com
    

    Java と自動構成モジュールを使用している場合は、サンプル Java アプリケーションのように、システム プロパティを使用してエクスポーター エンドポイントを設定できます。この構成では、エクスポータの環境変数を設定する必要はありません。

    OpenTelemetry 環境変数の詳細については、一般的な SDK 構成をご覧ください。