El rastreo para Amazon API Gateway está en vista previa

Esta función está en vista previa.

Datadog APM puede crear tramos inferidos para las solicitudes que pasan por Amazon API Gateway a servicios alojados en contenedores o EC2. Los tramos potencian las trazas (traces) de extremo a extremo, los mapas de servicios y el muestreo basado en la propia puerta de enlace.

Si tu API Gateway se integra con AWS Lambda, no sigas las instrucciones de esta página. Las capas Datadog Lambda ya emiten tramos (spans) inferidos de API Gateway. Al añadir las cabeceras de proxy descritas aquí se pueden crear trazas duplicadas o conflictivas.

Requisitos previos

  • Amazon API Gateway se despliega como una API REST (v1) o una API HTTP (v2).

    Nota: Si se utiliza la API HTTP (v2), context.requestTimeEpoch proporciona una especificidad de segundo nivel, a diferencia de las API REST (v1) que proporcionan una precisión de milisegundos. Esto significa que la duración del tramo es aproximada.

  • DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED está configurado en el contenedor de la aplicación:

      export DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED=true
      

    Alternativamente, puedes habilitarlo a través del constructo CDK de ECS Fargate en Datadog:

      new DatadogECSFargate(this, 'Datadog', {
        apm: { isEnabled: true, traceInferredProxyServices: true },
      });
      
    

    O puedes habilitarlo a través del módulo Terraform de ECS Fargate en Datadog:

      module "ecs_fargate_task" { 
        dd_apm = {
          enabled = true,
          trace_inferred_proxy_services = true
        }
      }
      
    

  • Tu aplicación subyacente está ejecutando un marco web compatible.

  • Tu rastreador de aplicaciones cumple la versión mínima.

Versiones y marcos web compatibles

Tiempo de ejecuciónRastreador DatadogVersión del rastreadorFrameworks
Node.jsdd-trace-jsv4.50.0 o posterior o v5.26.0 o posteriorexpress, fastify, hapi, koa, microgateway-core, next, paperplane, restify, router, apollo
Godd-trace-gov1.72.1 o posteriorchi, httptreemux, echo, go-restful, fiber, gin, gorilla mux, httprouter, fasthttp, goji
Pythondd-trace-pyv3.1.0 o posterioraiohttp, asgi, bottle, cherrypy, django, djangorestframework, falcon, fastapi, flask, molten, pyramid, sanic, starlette, tornado, wsgi
PHPdd-trace-phpv1.8.0 o posteriorCakePHP, CodeIgniter, Drupal, FuelPHP, Laminas, Laravel, Lumen, Magento, Neos Flow, Phalcon, Roadrunner, Slim, Symfony, WordPress, Zend Framework
.NETdd-trace-dotnetv3.15.0 o posteriorASP.NET, ASP.NET Core
Javadd-trace-javav1.56.0 o posteriorakka-http, axway-api, azure-functions, finatra, grizzly, jetty, liberty, micronaut, netty, pekko-http, play, ratpack, restlet, servlet, spring-web, spray, synapse, tomcat, undertow, vertx

Instalación

Para crear tramos inferidos, API Gateway debe pasar las siguientes cabeceras a tus servicios backend:

CabeceraValor
x-dd-proxy'aws-apigateway'

Nota: Deben incluirse comillas simples.
x-dd-proxy-request-time-mscontext.requestTimeEpoch
x-dd-proxy-domain-namecontext.domainName
x-dd-proxy-httpmethodcontext.httpMethod
x-dd-proxy-pathcontext.path
x-dd-proxy-stagecontext.stage

Para introducir las cabeceras necesarias, puedes utilizar el CDK AWS o la consola AWS:

Añade las cabeceras en requestParameters y utiliza las variables $context:

import { DatadogAPIGatewayRequestParameters } from "datadog-cdk-constructs-v2";

// Datadog integration definition
const ddIntegration = new apigateway.Integration({
  type: apigateway.IntegrationType.HTTP_PROXY,
  integrationHttpMethod: "ANY",
  options: {
    connectionType: apigateway.ConnectionType.INTERNET,
    requestParameters: DatadogAPIGatewayRequestParameters,
  },
  uri: `http://${loadBalancer.loadBalancerDnsName}`,
});

const api = new apigateway.RestApi(this, "MyApi", {
  restApiName: "my-api-gateway",
  deployOptions: { stageName: "prod" },
  defaultIntegration: ddIntegration, // Datadog instrumentation applied here
});
  1. En la consola de AWS Management, ve a API Gateway y luego a la página Recursos de tu API.

  2. Ve a Integration request (Solicitud de integración) y haz clic en Editar (Edit).

  3. En Edit integration request (Editar solicitud de integración), ve a URL request headers parameters (Parámetros de cabecera de solicitud URL). Haz clic en Add request header parameter (Añadir parámetro de cabecera de solicitud).

Tus cabeceras HTTP de tu API en API Gateway luego de añadir los seis parámetros de cabecera.

Para crear tramos inferidos, API Gateway debe pasar las siguientes cabeceras a tus servicios backend:

CabeceraValor
x-dd-proxyaws-apigateway
x-dd-proxy-request-time-ms${context.requestTimeEpoch}000
x-dd-proxy-domain-name$context.domainName
x-dd-proxy-httpmethod$context.httpMethod
x-dd-proxy-path$context.path
x-dd-proxy-stage$context.stage

Nota: context.requestTimeEpoch devuelve una marca de tiempo en segundos en las API v2. Datadog espera milisegundos, por lo que debes multiplicar por 1000 añadiendo 000.

Adjunta la asignación de parámetros que inyecta las cabeceras:

   import { DatadogAPIGatewayV2ParameterMapping }
     from 'datadog-cdk-constructs-v2';

   const ddIntegration = new apigatewayv2_integrations.HttpUrlIntegration(
     'HttpUrlIntegration',
     'https://example.com',
     { parameterMapping: DatadogAPIGatewayV2ParameterMapping },
   );

   new apigatewayv2.HttpApi(this, 'HttpApi', {
     apiName: 'my-http-api',
     routes: [{
       path: '/{proxy+}',
       methods: [apigatewayv2.HttpMethod.ANY],
       integration: ddIntegration,
     }],
   });

Actualizar las normas de muestreo

El muestreo basado en cabeceras se sigue aplicando cuando se utiliza el rastreo de API Gateway. Debido a que el tramo inferido se convierte en la raíz de la nueva traza, actualiza tus reglas para que el valor de servicio coincida con el nombre de servicio de API Gateway que se muestra en Datadog.

Por ejemplo, si la regla de muestreo original es:

# antes: servicio ascendente muestreado
DD_TRACE_SAMPLING_RULES='[{"service":"pythonapp","sample_rate":0.5}]'

Actualiza la regla de una de las siguientes maneras:

  1. Cambia el valor de service para que coincida con el nombre de tu API Gateway, tal y como aparece en Datadog:

       # opción 1: muestrear el tramo raíz de la puerta de enlace
       DD_TRACE_SAMPLING_RULES='[{"service":"my-api-gateway","sample_rate":0.5}]'
       
  2. Elimina la clave service para aplicar la regla a todos los tramos raíz:

       # opción 2: aplicar a todas las raíces
       DD_TRACE_SAMPLING_RULES='[{"sample_rate":0.5}]'
       

Referencias adicionales