Migrar del exportador de trazas al endpoint OTLP

En este documento se describe cómo migrar una aplicación que se ha instrumentado con OpenTelemetry y que usa exportadores a los exportadores OTLP de OpenTelemetry. Google Cloud Ambas configuraciones envían telemetría a tu proyecto de Google Cloud . Los pasos de este documento corresponden a la exportación en proceso que realiza el SDK de OpenTelemetry.

En este documento se describe cómo exportar datos de traza cuando se usa la instrumentación manual. Estas directrices, que se proporcionan para Java, Go y Python, no se aplican al envío de datos de registro o métricas a tu Google Cloud proyecto.

Por qué deberías migrar

Los SDKs de OpenTelemetry generan datos de registro, métricas y trazas en formato OTLP. Cuando una aplicación exporta esos datos a un proyecto mediante un exportador, este realiza los siguientes pasos:Google Cloud Google Cloud

  1. Transforma los datos registrados del formato OTLP a un formato propietario definido por la API de Cloud Logging, la API de Cloud Monitoring o la API de Cloud Trace.
  2. Envía los datos transformados a la API correspondiente, que se almacenan en tu Google Cloud proyecto.

En el caso de los datos de traza, te recomendamos que migres tu aplicación para usar la API Telemetry (OTLP) para exportar datos, ya que esta exportación no requiere una transformación de datos. La transformación de datos puede provocar la pérdida de algunos datos. Por ejemplo, el formato propietario puede tener límites inferiores para determinados campos o puede que algunos campos de OTLP no se correspondan con ningún campo del formato propietario.

mediante este endpoint.

Antes de empezar

Antes de migrar tu aplicación para enviar datos de traza al endpoint de OTLP, habilita la API Telemetry y asegúrate de que se te han concedido los roles de Gestión de Identidades y Accesos (IAM) necesarios. También es posible que tengas que conceder roles de gestión de identidades y accesos a una cuenta de servicio.

Habilitar la facturación y la 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.

    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.

    Enable the APIs

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

    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.

    Enable the APIs

  8. Configurar permisos

    Guía de migración para la instrumentación manual

    En esta sección se describe cómo modificar tu aplicación para que envíe los datos de la traza a tu proyecto de Google Cloud mediante la API Telemetry. No puedes enviar datos de métricas ni de registros a este endpoint.

    Añadir dependencias

    El primer paso es añadir dependencias para el exportador de seguimiento OTLP de OpenTelemetry en tu aplicación. Selecciona las versiones de las dependencias adecuadas para tu aplicación y tu sistema de compilación.

    Java

    En el caso de una aplicación Java que utilice el sistema de compilación Gradle, sigue estos pasos:

    // build.gradle
    implementation("io.opentelemetry:opentelemetry-exporter-otlp:1.47.0")
    

    Go

    En el caso de una aplicación de Golang, asegúrate de que el archivo go.mod tenga las siguientes dependencias:

    // go.mod file
    require(
      // OTLP exporter that uses grpc protocol for export
      go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0
      // Alternatively, for export using http/protobuf protocol, use:
      go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0
    )
    

    Python

    En el caso de una aplicación de Python, instala las siguientes dependencias o actualiza el archivo requirements.txt:

    # Requirements.txt - use appropriate versions
    #
    # OTLP exporter that uses grcp protocol for export
    opentelemetry-exporter-otlp-proto-grpc==1.30.0
    grpcio==1.70.0
    # Alternatively, for export using http/protobuf protocol, use:
    opentelemetry-exporter-otlp-proto-http==1.30.0
    

    Sustituir el uso de exportadores de Google Cloud por exportadores de OTLP

    Actualice el código de su aplicación para que el SDK de OpenTelemetry se configure de forma que utilice los exportadores OTLP de OpenTelemetry en lugar del exportador de seguimiento Google Cloud . Los cambios necesarios dependen del idioma.

    Java

    import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
    import io.opentelemetry.sdk.trace.SdkTracerProvider;
    import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
    import io.opentelemetry.sdk.trace.export.SpanExporter;
    import io.opentelemetry.sdk.trace.samplers.Sampler;
    
    // Initialize OpenTelemetry SDK with OTLP exporters
    public static OpenTelemetry initOpenTelemetry() {
        // Initialize the OTLP gRPC exporter
        SpanExporter otlpGrpcSpanExporter =
            OtlpGrpcSpanExporter.builder()
                .setTimeout(2, TimeUnit.SECONDS)
                .build();
    
        // Initialize OpenTelemetry tracer provider
        SdkTracerProvider tracerProvider = SdkTracerProvider.builder()
            .setResource(resource)
            .setSampler(Sampler.traceIdRatioBased(0.02))
            .addSpanProcessor(
                BatchSpanProcessor.builder(otlpGrpcSpanExporter)
                    .setScheduleDelay(100, TimeUnit.MILLISECONDS)
                    .build());
    
        // Configure OpenTelemetry SDK instacne to use the tracer provider
        // configured with OTLP exporter
        OpenTelemetrySdk openTelemetrySdk =
            OpenTelemetrySdk.builder()
                .setTracerProvider(tracerProvider)
                .build();
    }
    

    Go

    import (
        "context"
        "go.opentelemetry.io/otel"
        "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
        sdktrace "go.opentelemetry.io/otel/sdk/trace"
        // other dependencies
    )
    
    // Initializes OpenTelemetry with OTLP exporters
    func init() {
        ctx := context.Background()
    
        // Initialize the OTLP gRPC exporter
        exporter, err := otlptracegrpc.New(ctx)
        if err != nil {
            panic(err)
        }
        // initialize OpenTelemetry tracer provdier
        tp := sdktrace.NewTracerProvider(
            sdktrace.WithSampler(sdktrace.TraceIDRatioBased(0.02)),
            sdktrace.WithBatcher(exporter)
        )
    
        // configure OpenTelemetry SDK instance to use the tracer provider
        // configured with OTLP exporter
        otel.SetTracerProvider(tp)
    }
    

    Python

    from opentelemetry import trace
    from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import (
        OTLPSpanExporter,
    )
    from opentelemetry.sdk.resources import SERVICE_NAME, Resource
    
    # Initialize OpenTelemetry with OTLP exporters
    def init():
        # Initialize the OTLP gRPC or http exporter
        otlp_grpc_exporter = OTLPSpanExporter()
    
        # Initialize OpenTelemetry TracerProvider
        trace_provider = TracerProvider(resource=resource).add_span_processor(
        BatchSpanProcessor(otlp_grpc_exporter)
        )
    
        # Configure OpenTelemetry tracing API with the initialized tracer provider
        trace.set_tracer_provider(trace_provider)
    

    Configurar la autenticación

    Con los cambios anteriores en la configuración del SDK de OpenTelemetry, tu aplicación está configurada para exportar trazas mediante los exportadores OTLP de OpenTelemetry con gRPC o HTTP. A continuación, debe configurar los exportadores para que envíen esas trazas a su proyecto de Google Cloud .

    Para configurar la autenticación, haz lo siguiente:

    1. Configura los encabezados de autenticación de las llamadas de exportación.
    2. Configura los atributos de recursos de OpenTelemetry y los encabezados de OTLP necesarios.
    3. Configura el endpoint del exportador.

    En esta sección se detallan cada uno de estos pasos.

    Configurar los encabezados de autenticación de las llamadas de exportación

    Para configurar el exportador con tus Google Cloud credenciales predeterminadas de la aplicación (ADC), añade una biblioteca de autenticación de Google específica del lenguaje.

    Java

    Para autenticarte en Trace, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

    // build.gradle
    // Google Auth Library
    implementation("com.google.auth:google-auth-library-oauth2-http:1.32.1")
    

    Go

    Para autenticarte en Trace, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

    // go.mod file
    require (
        // When using gRPC based OTLP exporter, auth is built-in
        google.golang.org/grpc v1.70.0
        // When using http based OTLP exported, use explicit auth library
        golang.org/x/oauth2 v0.26.0
    )
    

    Python

    Para autenticarte en Trace, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.

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

    A continuación, actualiza el código de la aplicación que crea el exportador de intervalos de OTLP para que añada los tokens de autorización obtenidos de la biblioteca a los encabezados. Este paso es específico de cada idioma, pero la implementación es similar en todos los idiomas.

    Java

    Te recomendamos que uses la extensión de autenticación de Google Cloud cuando utilices el módulo de configuración automática del SDK de OpenTelemetry. Para ver un ejemplo completo que utilice esta extensión, consulta OTLP Trace with Google Auth Example (Ejemplo de seguimiento de OTLP con autenticación de Google).

    import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
    import io.opentelemetry.sdk.trace.SdkTracerProvider;
    import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
    import io.opentelemetry.sdk.trace.export.SpanExporter;
    import io.opentelemetry.sdk.trace.samplers.Sampler;
    
    import com.google.auth.oauth2.GoogleCredentials;
    
    // Initialize OpenTelemetry SDK with OTLP exporters
    public static OpenTelemetry initOpenTelemetry() {
        // Retrieve and store application-default credentials
        GoogleCredentials credentials;
        try {
           credentials = GoogleCredentials.getApplicationDefault();
        } catch (IOException e) {
          // Handle authentication error
          throw new RuntimeException(e);
        }
    
        // Update gRPC span exporter to add the authorization headers
        // If you are using the Autoconfigure module, we recommend using
        // Google Cloud Authentication Extension.
        // See https://github.com/open-telemetry/opentelemetry-java-contrib/tree/main/gcp-auth-extension
        SpanExporter otlpGrpcSpanExporter =
            OtlpGrpcSpanExporter.builder()
                .setHeaders(
                    () -> {
                      Map<String, List<String>> gcpHeaders;
                      try {
                        credentials.refreshIfExpired();
                        gcpHeaders = credentials.getRequestMetadata();
                      } catch (IOException e) {
                        // Handle authentication error
                        throw new RuntimeException(e);
                      }
                      Map<String, String> flattenedHeaders =
                          gcpHeaders.entrySet().stream()
                              .collect(
                                  Collectors.toMap(
                                      Map.Entry::getKey,
                                      entry ->
                                          entry.getValue().stream()
                                              .filter(Objects::nonNull)
                                              .filter(s -> !s.isEmpty())
                                              .collect(Collectors.joining(",")),
                                      (v1, v2) -> v2));
                      return flattenedHeaders;
                    })
                .setTimeout(2, TimeUnit.SECONDS)
                .build();
    
      // Other OpenTelemetry configuration remains unaffected
    }
    

    Go

    import (
        "context"
        "go.opentelemetry.io/otel"
        "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
        sdktrace "go.opentelemetry.io/otel/sdk/trace"
    
        "google.golang.org/grpc"
        "google.golang.org/grpc/credentials/oauth"
    )
    
    // Initializes OpenTelemetry with OTLP exporters
    func init() {
        ctx := context.Background()
    
        // Retrieve and store Google application-default credentials
        creds, err := oauth.NewApplicationDefault(ctx)
        if err != nil {
            panic(err)
        }
    
        // Update the previously created OTLP gRPC span exporter to
        // add authorization headers
        exporter, err := otlptracegrpc.New(
            ctx,
            otlptracegrpc.WithDialOption(grpc.WithPerRPCCredentials(creds))
        )
    
        // Other OpenTelemetry configuration remains unaffected.
    }
    

    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
    
    # Initialize OpenTelemetry with OTLP exporters
    def init():
        # Retrieve and store Google application-default credentials
        credentials, project_id = google.auth.default()
        # Request used to refresh credentials upon expiry
        request = google.auth.transport.requests.Request()
    
        # Supply the request and credentials to AuthMetadataPlugin
        # AuthMeatadataPlugin inserts credentials into each request
        auth_metadata_plugin = AuthMetadataPlugin(
            credentials=credentials, request=request
        )
    
        # Initialize gRPC channel credentials using the AuthMetadataPlugin
        channel_creds = grpc.composite_channel_credentials(
            grpc.ssl_channel_credentials(),
            grpc.metadata_call_credentials(auth_metadata_plugin),
        )
    
        # Update the previously created OTLP gRPC span exporter to add authorization
        # credentials
        otlp_grpc_exporter = OTLPSpanExporter(credentials=channel_creds)
    
        # Other OpenTelementry configuration remains unaffected
    

    Configurar los atributos de recursos de OpenTelemetry necesarios

    Añade a la variable de entorno OTEL_RESOURCE_ATTRIBUTES el par clave-valor que especifica tu proyecto. Para la clave, usa gcp.project_id. En el valor, usa el ID de tu proyecto de Google Cloud .

    Ejemplo:

    export OTEL_RESOURCE_ATTRIBUTES="gcp.project_id=PROJECT_ID"
    

    Para obtener más información sobre las variables de entorno de OpenTelemetry, consulta Configuración general del SDK.

    Definir el ID de proyecto de cuota

    El proyecto de cuota es el Google Cloud proyecto que registra el uso que haces de las solicitudes a la API. Como la API Telemetry es una API basada en el cliente, la forma en que te autentiques determinará si el proyecto de cuota se identifica automáticamente. Por ejemplo, no es necesario que especifiques el proyecto de cuota cuando usas una cuenta de servicio para la autenticación. Sin embargo, debes especificar el proyecto de cuota cuando se usen credenciales de usuario para la autenticación.

    Puedes definir un proyecto de cuota mediante una variable de entorno. Para determinar qué variable de entorno debes definir para tu lenguaje de programación, consulta Definir el proyecto de cuota mediante una variable de entorno.

    Por ejemplo, en Go, puedes definir el proyecto de cuota de la siguiente manera:

    export GOOGLE_CLOUD_QUOTA_PROJECT="QUOTA_PROJECT_ID"
    

    Para obtener información sobre cómo resolver errores de autenticación, consulta el artículo Las credenciales de usuario no funcionan.

    Configurar el endpoint del exportador

    Define el valor de la variable de entorno OTEL_EXPORTER_OTLP_ENDPOINT en el endpoint de OTLP de Google Cloud.

    Ejemplo:

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

    Para obtener más información sobre las variables de entorno de OpenTelemetry, consulta Configuración general del SDK.