Migrar do exportador de rastreamento para o endpoint OTLP

Neste documento, descrevemos como configurar a exportação no processo de dados de rastreamento pelo SDK do OpenTelemetry para seu projeto do Google Cloud . Os exemplos para Java, Go, Python e Node.js mostram como configurar o SDK para enviar dados de rastreamento à API Telemetry (OTLP) ao usar a instrumentação manual. Para cada linguagem, a página fornece informações sobre como usar exportadores OTLP para enviar dados de rastreamento usando os protocolos de exportação compatíveis.

A instrumentação descrita nesta página se aplica apenas a dados de rastreamento. Ele não envia dados de registros ou métricas para seu projeto Google Cloud .

Se o aplicativo depender de um coletor do OpenTelemetry para enviar dados de rastreamento ao seu projeto Google Cloud , este documento não se aplica:

Por que migrar

Os SDKs do OpenTelemetry geram dados de registros, métricas e rastreamentos em um formato geralmente consistente com os arquivos proto definidos pelo protocolo OTLP do OpenTelemetry. No entanto, os campos podem ser convertidos de um tipo de dados específico do OpenTelemetry para um tipo de dados JSON antes do armazenamento.

Quando um aplicativo exporta esses dados para um projeto Google Cloud usando um exportador Google Cloud , ele realiza as seguintes etapas:

  1. Transforma os dados gravados do formato OTLP em um formato proprietário definido pela API Cloud Logging, API Cloud Monitoring ou API Cloud Trace.
  2. Envia os dados transformados para a API apropriada, que é armazenada no seu projeto Google Cloud .

Para dados de rastreamento, recomendamos migrar seu aplicativo para usar a API Telemetry (OTLP) para exportar dados, porque essa exportação não exige uma transformação de dados. A transformação de dados pode causar a perda de algumas informações. Por exemplo, o formato proprietário pode ter limites mais baixos para determinados campos, ou alguns campos do OTLP podem não ser mapeados para um campo no formato proprietário.

Amostras disponíveis

Os aplicativos de exemplo mencionados nesta página estão disponíveis no GitHub. A maioria dos aplicativos é configurada para exportar dados de rastreamento usando gRPC, o que significa que eles usam dados codificados em protobuf usando o formato de fio gRPC em conexões HTTP/2. Também há um exemplo de código para aplicativos configurados para exportar dados de rastreamento como dados codificados em protobuf por conexões HTTP:

  • Aplicativo Java

    O aplicativo de exemplo está configurado para exportar rastreamentos como dados codificados em protobuf por conexões HTTP. Se você preferir usar o gRPC, a instrumentação neste exemplo será aplicável. No entanto, é necessário modificar as propriedades do sistema que o módulo de autoconfiguração consome. O aplicativo de exemplo especifica o exportador http/protobuf. Para usar o gRPC, mude essa configuração para grpc.

    Recomendamos que seus aplicativos Java, como o de exemplo, usem o módulo de autoconfiguração do SDK do OpenTelemetry para configurar o SDK.

  • Aplicativo Go que usa gRPC e Aplicativo Go que usa HTTP

    Há dois repositórios Go. Em um repositório, o aplicativo de exemplo usa gRPC. A amostra no outro repositório usa dados codificados em protobuf em conexões HTTP.

  • Aplicativo Python

    Esse repositório contém duas amostras, uma para gRPC e outra que usa dados codificados em protobuf por conexões HTTP.

  • Aplicativo Node.js

    Esse repositório contém duas amostras, uma para gRPC e outra que usa dados codificados em protobuf por conexões HTTP.

Antes de começar

Antes de migrar seu aplicativo para enviar dados de rastreamento ao endpoint OTLP, ative a API Telemetry e verifique se você recebeu os papéis necessários do Identity and Access Management (IAM). Talvez também seja necessário conceder papéis do IAM a uma conta de serviço.

Ativar o faturamento e a API Telemetry

  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. Configurar permissões

    Guia de migração para instrumentação manual

    Nesta seção, descrevemos como modificar seu aplicativo para que ele envie os dados de rastreamento ao projeto Google Cloud usando a API Telemetry. Não é possível enviar dados de métricas ou registros para esse endpoint.

    Adicionar dependências

    A primeira etapa é adicionar dependências para o exportador de rastreamento OTLP do OpenTelemetry no seu aplicativo. Selecione as versões de dependência adequadas para seu aplicativo e sistema de build.

    Java

    Para um aplicativo Java, adicione as seguintes dependências ao script 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

    Esta seção ilustra as mudanças que você precisa fazer nas suas dependências ao usar o gRPC para exportação. Se você usar dados codificados em protobuf em conexões HTTP para exportação, inclua o pacote otlptracehttp como uma dependência. Para mais informações, consulte Aplicativo Go que usa HTTP.

    Para um aplicativo Go que usa gRPC para exportação, atualize o arquivo go.mod para incluir a seguinte dependência:

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

    Python

    Esta seção ilustra as mudanças que você precisa fazer nas suas dependências ao usar o gRPC para exportação. Se você usar dados codificados em protobuf em conexões HTTP para exportação, inclua o pacote opentelemetry-exporter-otlp-proto-http como um requisito. Para mais informações, consulte Aplicativo Python.

    Para um aplicativo Python que usa gRPC para exportação, instale as seguintes dependências ou atualize o arquivo 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

    Esta seção ilustra as mudanças que você precisa fazer nas suas dependências ao usar o gRPC para exportação. Se você usar dados codificados em protobuf em conexões HTTP para exportação, inclua o pacote @opentelemetry/exporter-trace-otlp-proto como uma dependência. Para mais informações, consulte Aplicativo Node.js.

    Para um aplicativo Node.js que usa gRPC, adicione as seguintes dependências.

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

    Substituir o uso de exportadores Google Cloud por exportadores OTLP

    Atualize o código do aplicativo para que o SDK do OpenTelemetry seja configurado para usar os exportadores OTLP do OpenTelemetry em vez do exportador de rastreamento Google Cloud . As mudanças necessárias são específicas do idioma.

    Java

    Para um aplicativo Java, faça o seguinte:

    1. Adicione as seguintes declarações de importação:

      import io.opentelemetry.sdk.OpenTelemetrySdk;
      import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
      
    2. Atualize o código do aplicativo para usar o módulo de autoconfiguração do SDK do OpenTelemetry para configurar o SDK:

      public static void main(String[] args) {
          // Configure the OpenTelemetry pipeline with Auto configuration
          openTelemetrySdk = AutoConfiguredOpenTelemetrySdk.initialize().getOpenTelemetrySdk();
          ...
      }
      
    3. Configure as propriedades do sistema que o módulo de autoconfiguração consome durante a execução. Esse módulo usa essas propriedades para inicializar o SDK. Também é possível usar variáveis de ambiente em vez de propriedades do sistema. Para mais informações, consulte Variáveis de ambiente e propriedades do sistema.

      O aplicativo de exemplo define as propriedades do sistema no script 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
      }
      

      Se você preferir exportar dados de rastreamento usando gRPC, defina o protocolo OTLP como grpc em vez de http/protobuf.

    Go

    Esta seção ilustra as mudanças que você precisa fazer ao usar o gRPC para exportação. Se você usar dados codificados em protobuf em conexões HTTP para exportação, importe o pacote otlptracehttp e configure o exportador com as opções correspondentes. Para mais informações, consulte Aplicativo Go que usa HTTP.

    Para um aplicativo Go que usa gRPC para exportação, adicione as seguintes instruções de importação:

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

    Além disso, atualize o código de inicialização para configurar o TraceProvider com o exportador gRPC:

    
    // 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

    Esta seção ilustra as mudanças que você precisa fazer ao usar o gRPC para exportação. Se você usar dados codificados em protobuf em conexões HTTP para exportação, importe do pacote opentelemetry.exporter.otlp.proto.http e configure o exportador com as opções correspondentes. Para mais informações, consulte Aplicativo Python.

    Para um aplicativo Python que usa gRPC para exportação, adicione as seguintes importações:

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

    Além disso, atualize o código de inicialização para configurar o TraceProvider com o exportador gRPC:

    # 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

    Esta seção ilustra as mudanças que você precisa fazer ao usar o gRPC para exportação. Se você usa dados codificados em protobuf em conexões HTTP para exportação, importe o pacote @opentelemetry/exporter-trace-otlp-proto. Para mais informações, consulte Aplicativo Node.js.

    Para um aplicativo Node.js que usa o gRPC para exportação, adicione as seguintes importações:

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

    Além disso, atualize o código de inicialização para configurar o TraceProvider com o exportador gRPC:

    
    // 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();
    }
    

    Configurar a autenticação

    Com as mudanças anteriores na configuração do SDK do OpenTelemetry, seu aplicativo está configurado para exportar rastreamentos usando os exportadores OTLP do OpenTelemetry com gRPC ou HTTP. Em seguida, configure os exportadores para enviar esses rastreamentos ao seu projeto Google Cloud .

    Para configurar a autenticação, faça o seguinte:

    1. Configure cabeçalhos de autenticação para as chamadas de exportação.
    2. Configure os atributos de recursos do OpenTelemetry e os cabeçalhos OTLP necessários.
    3. Configure o endpoint do exportador.

    Esta seção detalha cada uma dessas etapas.

    Configurar cabeçalhos de autenticação para as chamadas de exportação

    Para configurar o exportador com suas Google Cloud Application Default Credentials (ADC), adicione uma biblioteca de autenticação do Google específica para uma linguagem.

    Java

    Para autenticar no Trace, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

    Para um aplicativo Java que usa o módulo de autoconfiguração do SDK do OpenTelemetry, recomendamos que você também use a Extensão de autenticação do Google Cloud.

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

    Go

    Para autenticar no Trace, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

    Para um aplicativo Go que usa gRPC para exportação, atualize o arquivo go.mod para incluir a seguinte dependência:

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

    Para um aplicativo Go que usa HTTP para exportação, atualize o arquivo go.mod para incluir a seguinte dependência:

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

    Python

    Para autenticar no Trace, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

    Para um aplicativo Python, adicione as seguintes importações:

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

    Node.js

    Para autenticar no Trace, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

    Para um aplicativo Node.js, adicione as seguintes dependências:

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

    Em seguida, atualize o código do aplicativo que cria o exportador de intervalos OTLP para que ele adicione os tokens de autorização recuperados da biblioteca aos cabeçalhos. Essa etapa é específica de cada linguagem, mas a implementação é semelhante para todas elas.

    Java

    Quando você tem um aplicativo Java que usa o módulo de autoconfiguração do SDK do OpenTelemetry e a extensão de autenticação do Google Cloud, não é necessário realizar etapas especiais durante a inicialização do aplicativo. O módulo de autoconfiguração executa automaticamente as etapas necessárias para configurar o ADC.

    Go

    Esta seção ilustra as mudanças que você precisa fazer ao usar o gRPC para exportação. Se você usar dados codificados em protobuf em conexões HTTP para exportação, importe o pacote otlptracehttp e configure o exportador para ser um objeto otlptracehttp. Para mais informações, consulte Aplicativo Go que usa HTTP.

    Para um aplicativo Go que usa gRPC para exportação, adicione as seguintes instruções de importação:

    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"
    )
    

    Além disso, atualize o código de inicialização para configurar o ADC antes de instanciar o exportador gRPC:

    // 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

    Esta seção ilustra as mudanças que você precisa fazer ao usar o gRPC para exportação. Se você usar dados codificados em protobuf em conexões HTTP para exportação, use as credenciais padrão. Você também precisa transmitir essas credenciais ao instanciar o BatchSpanProcessor. Para mais informações, consulte Aplicativo Python.

    Para um aplicativo Python que usa gRPC para exportação, adicione as seguintes importações:

    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
    

    Além disso, atualize o código de inicialização para configurar o ADC antes de instanciar o exportador gRPC:

    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

    Esta seção ilustra as mudanças que você precisa fazer ao usar o gRPC para exportação. Se você usa dados codificados em protobuf em conexões HTTP para exportação, as mudanças necessárias são um pouco diferentes das descritas aqui. Para saber mais, consulte o arquivo app-http-proto-export.ts incluído no aplicativo Node.js.

    Para um aplicativo Node.js que usa o gRPC para exportação, adicione as seguintes importações:

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

    Além disso, atualize o código de inicialização para configurar o ADC antes de instanciar o exportador gRPC:

    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
    }
    

    Configurar os atributos de recursos necessários do OpenTelemetry

    Adicione à variável de ambiente OTEL_RESOURCE_ATTRIBUTES o par de chave-valor que especifica seu projeto. Para a chave, use gcp.project_id. Para o valor, use o ID do seu projeto Google Cloud .

    Exemplo:

    export OTEL_RESOURCE_ATTRIBUTES="gcp.project_id=PROJECT_ID"
    

    Se você usar Java e configurar seu aplicativo para usar a extensão de autenticação do Google Cloud, como o aplicativo de amostra em Java faz, não é necessário definir o ID do projeto como parte dos atributos de recursos do OpenTelemetry. No entanto, definir esse atributo não é prejudicial.

    Para mais informações sobre variáveis de ambiente do OpenTelemetry, consulte Configuração geral do SDK.

    Definir o ID do projeto de cota

    O projeto de cota é o projeto Google Cloud que rastreia seu uso de solicitações de API. Como a API Telemetry é uma API baseada em cliente, a forma de autenticação determina se o projeto de cota é identificado automaticamente. Por exemplo, não é necessário especificar o projeto de cota ao usar uma conta de serviço para autenticação. No entanto, é necessário especificar o projeto de cota quando as credenciais do usuário são usadas para autenticação.

    É possível definir um projeto de cota usando uma variável de ambiente. Para determinar qual variável de ambiente definir para sua linguagem de programação, consulte Definir o projeto de cota usando uma variável de ambiente.

    Por exemplo, para Go, você pode definir o projeto de cota da seguinte maneira:

    export GOOGLE_CLOUD_QUOTA_PROJECT="QUOTA_PROJECT_ID"
    

    Para informações sobre como resolver erros de autenticação, consulte Credenciais do usuário que não funcionam.

    Configurar o endpoint do exportador

    Defina o valor da variável de ambiente OTEL_EXPORTER_OTLP_ENDPOINT como o endpoint do OTLP para Google Cloud.

    Exemplo:

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

    Se você usa Java e o módulo de configuração automática, é possível definir o endpoint do exportador usando propriedades do sistema, como faz o aplicativo de amostra em Java. Não é necessário definir a variável de ambiente do exportador para essa configuração.

    Para mais informações sobre variáveis de ambiente do OpenTelemetry, consulte Configuração geral do SDK.