From 2e6b227ceb5fe7115a687ce06003698875d2d12c Mon Sep 17 00:00:00 2001 From: Nina Rei Date: Wed, 4 Nov 2026 16:00:26 -0500 Subject: [PATCH] fix: forward the loaded java runtime to Compat metadata --- README.md | 8 ++++++++ .../java/com/datadog/ServerlessCompatAgent.java | 14 ++++++++++++-- .../com/datadog/ServerlessCompatAgentTest.java | 13 +++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c9442b4..cc056a9 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,14 @@ Datadog library for Java to enable tracing and custom metric submission from [Azure Functions](https://azure.microsoft.com/en-us/products/functions) and [Google Cloud Run Functions (1st gen)](https://cloud.google.com/functions/1stgendocs/concepts/overview). +## Inventory version metadata + +With `DD_SERVERLESS_COMPAT_METADATA_ENABLED=true`, inventory reports the wrapper package as +`serverless_compat_runtime_version`, the embedded binary release as +`serverless_compat_binary_version`, and the language engine in `runtime`. +`DD_SERVERLESS_COMPAT_PATH` selects a custom binary but does not change the wrapper package version. +The binary must supply its own embedded version; an unversioned binary must not inherit the wrapper version. + # Getting Started - [Install Serverless Monitoring for Azure Functions](https://docs.datadoghq.com/serverless/azure_functions/?code-lang=java) diff --git a/src/main/java/com/datadog/ServerlessCompatAgent.java b/src/main/java/com/datadog/ServerlessCompatAgent.java index 97abbae..12e5be6 100644 --- a/src/main/java/com/datadog/ServerlessCompatAgent.java +++ b/src/main/java/com/datadog/ServerlessCompatAgent.java @@ -169,12 +169,22 @@ public static void premain(String agentArgs, Instrumentation instrumentation) { String packageVersion = getPackageVersion(); log.debug("Found package version {}", packageVersion); - ProcessBuilder processBuilder = new ProcessBuilder(executableFile.getAbsolutePath()); - processBuilder.environment().put("DD_SERVERLESS_COMPAT_VERSION", packageVersion); + ProcessBuilder processBuilder = createProcessBuilder(executableFile, packageVersion, environment); processBuilder.inheritIO(); processBuilder.start(); } catch (Exception e) { log.error("Exception when starting {}", fileName, e); } } + + static ProcessBuilder createProcessBuilder(File executable, String packageVersion, CloudEnvironment environment) { + ProcessBuilder processBuilder = new ProcessBuilder(executable.getAbsolutePath()); + Map childEnvironment = processBuilder.environment(); + childEnvironment.put("DD_SERVERLESS_COMPAT_VERSION", packageVersion); + childEnvironment.put("JAVA_VERSION", System.getProperty("java.version")); + if (environment == CloudEnvironment.AZURE_FUNCTION) { + childEnvironment.put("FUNCTIONS_WORKER_RUNTIME_VERSION", System.getProperty("java.version")); + } + return processBuilder; + } } diff --git a/src/test/java/com/datadog/ServerlessCompatAgentTest.java b/src/test/java/com/datadog/ServerlessCompatAgentTest.java index 8f20a84..8d71fe4 100644 --- a/src/test/java/com/datadog/ServerlessCompatAgentTest.java +++ b/src/test/java/com/datadog/ServerlessCompatAgentTest.java @@ -1,6 +1,7 @@ package com.datadog; import java.lang.reflect.Method; +import java.io.File; import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.Test; @@ -13,6 +14,18 @@ class ServerlessCompatAgentTest { + @Test + void childReceivesWrapperAndEngineVersionsForCustomBinary() { + File executable = new File("/custom/compat"); + ProcessBuilder child = ServerlessCompatAgent.createProcessBuilder( + executable, "0.25.0", CloudEnvironment.AZURE_FUNCTION); + assertEquals(executable.getAbsolutePath(), child.command().get(0)); + assertEquals("0.25.0", child.environment().get("DD_SERVERLESS_COMPAT_VERSION")); + assertEquals(System.getProperty("java.version"), child.environment().get("JAVA_VERSION")); + assertEquals(System.getProperty("java.version"), child.environment().get("FUNCTIONS_WORKER_RUNTIME_VERSION")); + assertEquals(System.getenv("DD_SERVICE"), child.environment().get("DD_SERVICE")); + } + @ParameterizedTest @CsvSource({ "TRACE, TRACE",