From 75f312c933fb9c4da8e2d0b77f93fe5ba59ff7e3 Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Wed, 19 Nov 2025 15:47:45 -0500 Subject: [PATCH 1/5] include necessary services for slf4j --- pom.xml | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/pom.xml b/pom.xml index 08e3b89..a4d057a 100644 --- a/pom.xml +++ b/pom.xml @@ -147,20 +147,6 @@ org.apache.maven.plugins maven-shade-plugin 3.6.0 - - false - - - *:* - - module-info.class - META-INF/* - META-INF/versions/** - META-INF/services/** - - - - package @@ -168,6 +154,25 @@ shade + false + + + *:* + + + module-info.class + META-INF/* + META-INF/versions/** + META-INF/maven/org.slf4j/** + META-INF/maven/**/pom.xml + + + org.slf4j @@ -175,6 +180,8 @@ + From b9b8a91029d365262f4723ca0a342c2ec69564fe Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Wed, 19 Nov 2025 16:25:40 -0500 Subject: [PATCH 2/5] map DD_LOG_LEVEL to slf4j log level --- .../com/datadog/ServerlessCompatAgent.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/datadog/ServerlessCompatAgent.java b/src/main/java/com/datadog/ServerlessCompatAgent.java index 8d08959..34f3839 100644 --- a/src/main/java/com/datadog/ServerlessCompatAgent.java +++ b/src/main/java/com/datadog/ServerlessCompatAgent.java @@ -19,7 +19,27 @@ enum CloudEnvironment { } public class ServerlessCompatAgent { - private static final Logger log = LoggerFactory.getLogger(ServerlessCompatAgent.class); + private static String mapDdLogLevelToSlf4jLogLevel(String ddLogLevel) { + switch (ddLogLevel) { + case "CRITICAL": + return "ERROR"; + default: + return ddLogLevel; + } + } + + private static final Logger log; + + static { + String ddLogLevel = System.getenv().getOrDefault("DD_LOG_LEVEL", "INFO").toUpperCase(); + if (ddLogLevel.equals("OFF")) { + log = org.slf4j.helpers.NOPLogger.NOP_LOGGER; + } else { + System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", mapDdLogLevelToSlf4jLogLevel(ddLogLevel)); + log = LoggerFactory.getLogger(ServerlessCompatAgent.class); + } + } + private static final String os = System.getProperty("os.name").toLowerCase(); private static final String binaryPath = System.getenv("DD_SERVERLESS_COMPAT_PATH"); From 9ac732e10b9d7de80b6cfb3d26824467fc5416fb Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Wed, 19 Nov 2025 16:25:52 -0500 Subject: [PATCH 3/5] formatting --- src/main/java/com/datadog/ServerlessCompatAgent.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/datadog/ServerlessCompatAgent.java b/src/main/java/com/datadog/ServerlessCompatAgent.java index 34f3839..1038bd7 100644 --- a/src/main/java/com/datadog/ServerlessCompatAgent.java +++ b/src/main/java/com/datadog/ServerlessCompatAgent.java @@ -85,7 +85,8 @@ public static String getPackageVersion() { } public static boolean isAzureFlexWithoutDDAzureResourceGroup() { - return "FlexConsumption".equals(System.getenv("WEBSITE_SKU")) && System.getenv("DD_AZURE_RESOURCE_GROUP") == null; + return "FlexConsumption".equals(System.getenv("WEBSITE_SKU")) + && System.getenv("DD_AZURE_RESOURCE_GROUP") == null; } public static void premain(String agentArgs, Instrumentation instrumentation) { @@ -114,11 +115,13 @@ public static void premain(String agentArgs, Instrumentation instrumentation) { return; } - // Check for Azure Flex Consumption functions that don't have the DD_AZURE_RESOURCE_GROUP environment variable set + // Check for Azure Flex Consumption functions that don't have the + // DD_AZURE_RESOURCE_GROUP environment variable set if (environment == CloudEnvironment.AZURE_FUNCTION && isAzureFlexWithoutDDAzureResourceGroup()) { - log.error("Azure function detected on flex consumption plan without DD_AZURE_RESOURCE_GROUP set. Please set the DD_AZURE_RESOURCE_GROUP environment variable to your resource group name in Azure app settings. Shutting down Datadog Serverless Compatibility Layer."); + log.error( + "Azure function detected on flex consumption plan without DD_AZURE_RESOURCE_GROUP set. Please set the DD_AZURE_RESOURCE_GROUP environment variable to your resource group name in Azure app settings. Shutting down Datadog Serverless Compatibility Layer."); return; - } + } try (InputStream inputStream = ServerlessCompatAgent.class.getClassLoader() .getResourceAsStream(fileName)) { From a3c37c5fa268a1921a968cc0cbef633f1a7ab2e8 Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Wed, 26 Nov 2025 10:53:28 -0500 Subject: [PATCH 4/5] simplify mapDdLogLevelToSlf4jLogLevel --- src/main/java/com/datadog/ServerlessCompatAgent.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/com/datadog/ServerlessCompatAgent.java b/src/main/java/com/datadog/ServerlessCompatAgent.java index 1038bd7..0623116 100644 --- a/src/main/java/com/datadog/ServerlessCompatAgent.java +++ b/src/main/java/com/datadog/ServerlessCompatAgent.java @@ -20,12 +20,7 @@ enum CloudEnvironment { public class ServerlessCompatAgent { private static String mapDdLogLevelToSlf4jLogLevel(String ddLogLevel) { - switch (ddLogLevel) { - case "CRITICAL": - return "ERROR"; - default: - return ddLogLevel; - } + return "CRITICAL".equals(ddLogLevel) ? "ERROR" : ddLogLevel; } private static final Logger log; From 6609a5b77905516ab12869e0f2ad878b7f55208b Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Wed, 26 Nov 2025 11:32:25 -0500 Subject: [PATCH 5/5] make initLogger unit testable and add test --- pom.xml | 21 ++++++++++++ .../com/datadog/ServerlessCompatAgent.java | 23 +++++++------ src/test/java/test.java | 34 +++++++++++++++++++ 3 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 src/test/java/test.java diff --git a/pom.xml b/pom.xml index a4d057a..8d891bf 100644 --- a/pom.xml +++ b/pom.xml @@ -121,6 +121,20 @@ slf4j-simple 2.0.16 + + + org.junit.jupiter + junit-jupiter + 6.0.1 + test + + + + org.junit.jupiter + junit-jupiter-params + 6.0.1 + test + @@ -143,6 +157,7 @@ 1.8 + org.apache.maven.plugins maven-shade-plugin @@ -196,6 +211,12 @@ + + + org.apache.maven.plugins + maven-surefire-plugin + 3.5.4 + diff --git a/src/main/java/com/datadog/ServerlessCompatAgent.java b/src/main/java/com/datadog/ServerlessCompatAgent.java index 0623116..b3732f4 100644 --- a/src/main/java/com/datadog/ServerlessCompatAgent.java +++ b/src/main/java/com/datadog/ServerlessCompatAgent.java @@ -10,6 +10,7 @@ import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.slf4j.helpers.NOPLogger; enum CloudEnvironment { AZURE_FUNCTION, @@ -19,22 +20,24 @@ enum CloudEnvironment { } public class ServerlessCompatAgent { - private static String mapDdLogLevelToSlf4jLogLevel(String ddLogLevel) { - return "CRITICAL".equals(ddLogLevel) ? "ERROR" : ddLogLevel; - } + private static final String ddLogLevel = System.getenv().getOrDefault("DD_LOG_LEVEL", "INFO").toUpperCase(); - private static final Logger log; + private static final Logger log = initLogger(ddLogLevel); - static { - String ddLogLevel = System.getenv().getOrDefault("DD_LOG_LEVEL", "INFO").toUpperCase(); - if (ddLogLevel.equals("OFF")) { - log = org.slf4j.helpers.NOPLogger.NOP_LOGGER; + private static Logger initLogger(String logLevel) { + if ("OFF".equals(logLevel)) { + return NOPLogger.NOP_LOGGER; } else { - System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", mapDdLogLevelToSlf4jLogLevel(ddLogLevel)); - log = LoggerFactory.getLogger(ServerlessCompatAgent.class); + System.setProperty("org.slf4j.simpleLogger.defaultLogLevel", + mapDdLogLevelToSlf4jLogLevel(logLevel)); + return LoggerFactory.getLogger(ServerlessCompatAgent.class); } } + private static String mapDdLogLevelToSlf4jLogLevel(String ddLogLevel) { + return "CRITICAL".equals(ddLogLevel) ? "ERROR" : ddLogLevel; + } + private static final String os = System.getProperty("os.name").toLowerCase(); private static final String binaryPath = System.getenv("DD_SERVERLESS_COMPAT_PATH"); diff --git a/src/test/java/test.java b/src/test/java/test.java new file mode 100644 index 0000000..60078b5 --- /dev/null +++ b/src/test/java/test.java @@ -0,0 +1,34 @@ +import com.datadog.ServerlessCompatAgent; +import java.lang.reflect.Method; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.slf4j.Logger; +import org.slf4j.helpers.NOPLogger; + +import static org.junit.jupiter.api.Assertions.*; + +class ServerlessCompatAgentTest { + + @ParameterizedTest + @CsvSource({ + "TRACE, TRACE", + "DEBUG, DEBUG", + "INFO, INFO", + "WARN, WARN", + "ERROR, ERROR", + "CRITICAL, ERROR", + "OFF, null" + }) + void testInitLogger(String ddLogLevel, String expectedSlf4jLevel) throws Exception { + Method initLoggerMethod = ServerlessCompatAgent.class.getDeclaredMethod("initLogger", String.class); + initLoggerMethod.setAccessible(true); + Logger logger = (Logger) initLoggerMethod.invoke(null, ddLogLevel); + + if ("OFF".equals(ddLogLevel)) { + assertTrue(logger instanceof NOPLogger); + } else { + assertEquals(expectedSlf4jLevel, + System.getProperty("org.slf4j.simpleLogger.defaultLogLevel")); + } + } +}