Instrumenter des applications Java sans serveur avec le Forwarder Datadog
Présentation
Certaines anciennes versions de
datadog-lambda-java
importent
log4j <=2.14.0
en tant que dépendance transitive. Les
instructions de mise à niveau sont indiquées plus loin dans ce guide.
Prérequis
Pour ingérer des traces AWS Lambda, des métriques optimisées, des métriques custom et des logs, vous devez utiliser la fonction Lambda du Forwarder Datadog.
Pour instrumenter entièrement votre application sans serveur grâce au tracing distribué, vos fonctions Lambda Java doivent utiliser le runtime Java 8 Corretto (java8.al2
), Java 11 (java11
) ou Java 17 (java17
).
Configuration
Installation
Installez localement la bibliothèque Lambda Datadog en ajoutant l’un des blocs de code suivants dans pom.xml
(Maven) ou build.gradle
(Gradle). Remplacez VERSION
par le numéro de la dernière version (en ignorant le v
qui le précède) :
Ajoutez la dépendance suivante dans votre fichier pom.xml
:
<dependency>
<groupId>com.datadoghq</groupId>
<artifactId>datadog-lambda-java</artifactId>
<version>VERSION</version>
</dependency>
Ajoutez le bloc suivant dans votre build.gradle
:
dependencies {
implementation 'com.datadoghq:datadog-lambda-java:VERSION'
}
Instrumentation
Installez la couche Lambda Datadog sur votre fonction. La dernière VERSION
est 15
.
arn:aws:lambda:<AWS_REGION>:464622532012:layer:dd-trace-java:<VERSION>
Configurez les variables d’environnement suivantes sur votre fonction :
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
Incorporez la fonction Lambda de votre gestionnaire à l’aide du wrapper fourni par la bibliothèque Lambda 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();
}
}
Abonnement
Pour pouvoir envoyer des métriques, traces et logs à Datadog, abonnez la fonction Lambda du Forwarder Datadog à chaque groupe de logs de votre fonction.
- Si ce n’est pas déjà fait, installez le Forwarder Datadog.
- Abonnez le Forwarder Datadog aux groupes de logs de votre fonction.
Surveiller les démarrages à froid des fonctions Lambda Java
Des démarrages à froid se produisent lorsque vos applications sans serveur voient tout d’un coup leur trafic augmenter, notamment lorsque la fonction en question était inactive ou lorsqu’elle recevait un nombre relativement constant de requêtes. Aux yeux des utilisateurs, les démarrages à froid entraînent des ralentissements ou des délais de réponse plus importants. Dans le but de réduire au maximum les démarrages à froid, Datadog vous conseille de configurer un monitor sur la fonction Lambda Java concernée et d’utiliser les informations exploitables liées à vos applications sans serveur.
Pour créer un monitor Datadog sur les démarrages à froid d’une fonction Lambda Java, suivez les étapes de création d’un monitor et appliquez les paramètres suivants :
- Nom de la métrique :
aws.lambda.enhanced.invocations
- À partir de :
runtime:java*
et cold_start:true
- Groupe d’alertes : alertes multiples, avec le déclenchement d’une alerte distincte pour chaque
function_arn
Tag
Bien que cette opération soit facultative, Datadog vous recommande d’ajouter les tags réservés env
, service
et version
à vos applications sans serveur. Pour en savoir plus sur les tags réservés, consultez la section Tagging de service unifié.
Explorer les logs
Après avoir configuré votre fonction en suivant la procédure ci-dessus, visualisez vos métriques, logs et traces sur la page Serverless principale.
Surveiller une logique opérationnelle personnalisée
Pour envoyer une métrique custom, consultez l’exemple de code ci-dessous :
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");
// Envoyer une métrique custom
ddl.metric(
"coffee_house.order_value", // Nom de la métrique
12.45, // Valeur de la métrique
myTags); // Tags associés
URL url = new URL("https://example.com");
HttpURLConnection hc = (HttpURLConnection)url.openConnection();
hc.connect();
ddl.finish();
}
}
Pour en savoir plus sur l’envoi de métriques custom, consultez la documentation dédiée.
Associer vos logs à vos traces
Pour associer automatiquement vos logs de fonction Lambda Java à vos traces, consultez les instructions de la section Associer vos logs Java à vos traces.
Si vous n'utilisez pas le runtime Java approprié, des messages d'erreur, tels que Error opening zip file or JAR manifest missing : /opt/java/lib/dd-java-agent.jar
, peuvent s'afficher. Veillez à utiliser le runtime java8.al2
ou java11
, comme indiqué ci-dessus.
Mise à niveau
L’Apache Foundation a annoncé que log4j, une bibliothèque de journalisation Java couramment utilisée, est vulnérable à l’exécution de code à distance. Certaines versions de datadog-lambda-java
comportent une dépendance transitive sur log4j qui peut être impactée par cette vulnérabilité. Voici les versions concernées :
La dernière version de datadog-lambda-java
est . Utilisez cette version (en ignorant le v
qui la précède) durant la procédure de mise à jour indiquée ci-dessous.
Si vous ne souhaitez pas effectuer de mise à niveau vers 1.4.x
, la version 0.3.x
a également été mise à jour afin d’inclure les derniers patchs de sécurité relatifs à log4j.
La dernière version 0.3.x
est disponible dans le référentiel datadog-lambda-java
.
La version de la dépendance datadog-lambda-java
dans votre fonction Lambda est définie dans pom.xml
(Maven) ou build.gradle
(Gradle).
Votre fichier pom.xml
contient une section qui ressemble à ceci :
<dependency>
<groupId>com.datadoghq</groupId>
<artifactId>datadog-lambda-java</artifactId>
<version>VERSION</version>
</dependency>
Remplacez VERSION
par la dernière version de datadog-lambda-java
(disponible ci-dessus). Redéployez ensuite votre fonction Lambda.
Votre fichier build.gradle
contient une section qui ressemble à ceci :
dependencies {
implementation 'com.datadoghq:datadog-lambda-java:VERSION'
}
Remplacez VERSION
par la dernière version de datadog-lambda-java
(disponible ci-dessus). Redéployez ensuite votre fonction Lambda.
Si vous effectuez une mise à niveau depuis la version 0.3.x vers la version 1.4.x et que vous souhaitez utiliser le traceur dd-trace-java
, recherchez la référence à la couche Lambda dd-trace-java
et remplacez-la par ce qui suit :
arn:aws:lambda:<RÉGION_AWS>:464622532012:layer:dd-trace-java:4