Instrumentación de aplicaciones serverless de Java mediante el Datadog Forwarder
Algunas versiones más antiguas de
datadog-lambda-java
importan
log4j <=2.14.0
como una dependencia de transición. A continuación se incluyen las
instrucciones de actualización.
Requisitos previos
Se necesita la función de Lambda del Datadog Forwarder para ingerir las trazas (traces), las métricas mejoradas, las métricas personalizadas y los logs de AWS Lambda.
Para completar la instrumentación de tu aplicación serverless con el rastreo distribuido, debes tener tus funciones de Lambda de Java con los tiempos de ejecución Java 8 Corretto (java8.al2
), Java 11 (java11
) o Java 17 (java17
).
Configuración
Instalar
Instala la biblioteca Lambda de Datadog localmente mediante la adición de uno de los siguientes bloques de código en el archivo pom.xml
(Maven) o build.gradle
(Gradle). Reemplaza el parámetro VERSION
de abajo con la última versión (sin anteponer la v
):
Incluye la siguiente dependencia en tu archivo pom.xml
:
<dependency>
<groupId>com.datadoghq</groupId>
<artifactId>datadog-lambda-java</artifactId>
<version>VERSION</version>
</dependency>
Incluye lo siguiente en tu archivo build.gradle
:
dependencies {
implementation 'com.datadoghq:datadog-lambda-java:VERSION'
}
Instrumentar
Instala la capa de Lambda de Datadog en tu función. La última VERSION
es 15
.
arn:aws:lambda:<AWS_REGION>:464622532012:layer:dd-trace-java:<VERSION>
Configura las siguientes variables de entorno en tu función:
JAVA_TOOL_OPTIONS: -javaagent:"/opt/java/lib/dd-java-agent.jar" -XX:+TieredCompilation -XX:TieredStopAtLevel=1
DD_LOGS_INJECTION: true
DD_JMXFETCH_ENABLED: false
DD_TRACE_ENABLED: true
Envuelve tu función de controlador de Lambda con la envoltura de la biblioteca Lambda de Datadog.
public class Handler implements RequestHandler<APIGatewayV2ProxyRequestEvent, APIGatewayV2ProxyResponseEvent> {
public Integer handleRequest(APIGatewayV2ProxyRequestEvent request, Context context){
DDLambda ddl = new DDLambda(request, context); //Required to initialize the trace
do_some_stuff();
make_some_http_requests();
ddl.finish(); //Required to finish the active span.
return new ApiGatewayResponse();
}
}
Subscribir
Suscribe la función de Lambda del Datadog Forwarder a cada uno de los grupos de logs de tu función. Esto te permite enviar métricas, trazas y logs a Datadog.
- Instala el Datadog Forwarder si todavía no lo hiciste.
- Suscribe el Datadog Forwarder a los grupos de logs de tu función.
Monitorizar los arranques en frío de las funciones de Lambda de Java
Los arranques en frío se producen cuando las aplicaciones serverless reciben aumentos repentinos de tráfico, y pueden ocurrir si una función estaba previamente inactiva o si recibía un número relativamente constante de solicitudes. Los usuarios pueden notar los arranques en frío como tiempos de respuesta lentos o latencia. Datadog recomienda configurar un monitor de arranques en frío en las funciones de Lambda de Java y utilizar Datadog Serverless Insights para mantener los arranques en frío al mínimo.
Para crear un monitor de Datadog de arranques en frío en las funciones de Lambda de Java, sigue los pasos para crear un monitor con estos criterios:
- Nombre de la métrica:
aws.lambda.enhanced.invocations
- Origen:
runtime:java*
y cold_start:true
- Agrupación de alertas: múltiples alertas, activa una alerta distinta para cada
function_arn
Etiquetar
Aunque es opcional, Datadog recomienda etiquetar las aplicaciones serverless con las etiquetas reservadas env
, service
y version
. Para obtener más información sobre las etiquetas reservadas, consulta la documentación del etiquetado de servicios unificado.
Explorar
Una vez que tienes tu función configurada según los pasos anteriores, puedes consultar tus métricas, logs y trazas en la página de inicio de Serverless.
Monitorizar la lógica de negocio personalizada
Para enviar una métrica personalizada, consulta el siguiente código de ejemplo:
public class Handler implements RequestHandler<APIGatewayV2ProxyRequestEvent, APIGatewayV2ProxyResponseEvent> {
public Integer handleRequest(APIGatewayV2ProxyRequestEvent request, Context context){
DDLambda ddl = new DDLambda(request, context);
Map<String,Object> myTags = new HashMap<String, Object>();
myTags.put("product", "latte");
myTags.put("order","online");
// Envía una métrica personalizada
ddl.metric(
"coffee_house.order_value", // Nombre de la métrica
12.45, // Valor de la métrica
myTags); // Etiquetas asociadas
URL url = new URL("https://example.com");
HttpURLConnection hc = (HttpURLConnection)url.openConnection();
hc.connect();
ddl.finish();
}
}
Consulta la documentación sobre las métricas personalizadas para obtener más información sobre el envío de métricas personalizadas.
Conectar logs y trazas
Para conectar automáticamente logs y trazas de las funciones de Lambda de Java, consulta las instrucciones en Conexión de logs y trazas de Java.
Si no se usa el tiempo de ejecución de Java correcto, se pueden producir errores. Por ejemplo: Error opening zip file or JAR manifest missing : /opt/java/lib/dd-java-agent.jar
. Asegúrate de usar java8.al2
o java11
como el tiempo de ejecución, tal como se escribe arriba.
Actualización
La Apache Foundation ha anunciado que log4j, una biblioteca popular para la generación de logs en Java, es vulnerable a la ejecución de código remoto.
Algunas versiones de datadog-lambda-java
incluyen una dependencia de transición en log4j que puede ser vulnerable. Las versiones vulnerables son las siguientes:
La última versión de datadog-lambda-java
es . Usa esta versión (sin anteponer la v
) cuando sigas las instrucciones de actualización que se incluyen abajo.
Si no quieres actualizar a las versiones de 1.4.x
, las versiones de 0.3.x
también se actualizan con los parches de seguridad más recientes de log4j.
La última versión de 0.3.x
está disponible en el repositorio datadog-lambda-java
.
La versión de la dependencia de datadog-lambda-java
en tu función de Lambda está configurada en el archivo pom.xml
(Maven) o build.gradle
(Gradle).
Tu archivo pom.xml
contiene una sección similar a la siguiente:
<dependency>
<groupId>com.datadoghq</groupId>
<artifactId>datadog-lambda-java</artifactId>
<version>VERSION</version>
</dependency>
Reemplaza VERSION
con la última versión de datadog-lambda-java
(disponible más arriba).
Luego, vuelve a desplegar tu función de Lambda.
Tu archivo build.gradle
contiene una sección similar a la siguiente:
dependencies {
implementation 'com.datadoghq:datadog-lambda-java:VERSION'
}
Reemplaza VERSION
con la última versión de datadog-lambda-java
(disponible más arriba).
Luego, vuelve a desplegar tu función de Lambda.
Si vas a actualizar de 0.3.x a 1.4.x y quieres utilizar el rastreador dd-trace-java
, busca la referencia a la capa de Lambda dd-trace-java
y cámbiala por lo siguiente:
arn:aws:lambda:<AWS_REGION>:464622532012:layer:dd-trace-java:4