Skip to content

Commit 4ae1e2a

Browse files
fix: surface logs and map datadog log level (#32)
* include necessary services for slf4j * map DD_LOG_LEVEL to slf4j log level * formatting * simplify mapDdLogLevelToSlf4jLogLevel * make initLogger unit testable and add test
1 parent 70ef1ce commit 4ae1e2a

3 files changed

Lines changed: 102 additions & 19 deletions

File tree

pom.xml

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,20 @@
121121
<artifactId>slf4j-simple</artifactId>
122122
<version>2.0.16</version>
123123
</dependency>
124+
125+
<dependency>
126+
<groupId>org.junit.jupiter</groupId>
127+
<artifactId>junit-jupiter</artifactId>
128+
<version>6.0.1</version>
129+
<scope>test</scope>
130+
</dependency>
131+
132+
<dependency>
133+
<groupId>org.junit.jupiter</groupId>
134+
<artifactId>junit-jupiter-params</artifactId>
135+
<version>6.0.1</version>
136+
<scope>test</scope>
137+
</dependency>
124138
</dependencies>
125139

126140
<build>
@@ -143,38 +157,46 @@
143157
<target>1.8</target>
144158
</configuration>
145159
</plugin>
160+
146161
<plugin>
147162
<groupId>org.apache.maven.plugins</groupId>
148163
<artifactId>maven-shade-plugin</artifactId>
149164
<version>3.6.0</version>
150-
<configuration>
151-
<createDependencyReducedPom>false</createDependencyReducedPom>
152-
<filters>
153-
<filter>
154-
<artifact>*:*</artifact>
155-
<excludes>
156-
<exclude>module-info.class</exclude>
157-
<exclude>META-INF/*</exclude>
158-
<exclude>META-INF/versions/**</exclude>
159-
<exclude>META-INF/services/**</exclude>
160-
</excludes>
161-
</filter>
162-
</filters>
163-
</configuration>
164165
<executions>
165166
<execution>
166167
<phase>package</phase>
167168
<goals>
168169
<goal>shade</goal>
169170
</goals>
170171
<configuration>
172+
<createDependencyReducedPom>false</createDependencyReducedPom>
173+
<filters>
174+
<filter>
175+
<artifact>*:*</artifact>
176+
<!--
177+
Remove some cruft from the final jar.
178+
These patterns should NOT include **/META-INF/maven/**/pom.properties, which is
179+
used to report our own dependencies, but we should remove the top-level metadata
180+
of vendored packages because those could trigger unwanted framework checks.
181+
-->
182+
<excludes>
183+
<exclude>module-info.class</exclude>
184+
<exclude>META-INF/*</exclude>
185+
<exclude>META-INF/versions/**</exclude>
186+
<exclude>META-INF/maven/org.slf4j/**</exclude>
187+
<exclude>META-INF/maven/**/pom.xml</exclude>
188+
</excludes>
189+
</filter>
190+
</filters>
171191
<relocations>
172192
<relocation>
173193
<pattern>org.slf4j</pattern>
174194
<shadedPattern>datadogserverless.slf4j</shadedPattern>
175195
</relocation>
176196
</relocations>
177197
<transformers>
198+
<transformer
199+
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
178200
<transformer
179201
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
180202
<manifestEntries>
@@ -189,6 +211,12 @@
189211
</execution>
190212
</executions>
191213
</plugin>
214+
215+
<plugin>
216+
<groupId>org.apache.maven.plugins</groupId>
217+
<artifactId>maven-surefire-plugin</artifactId>
218+
<version>3.5.4</version>
219+
</plugin>
192220
</plugins>
193221
</build>
194222
</project>

src/main/java/com/datadog/ServerlessCompatAgent.java

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.util.Map;
1111
import org.slf4j.Logger;
1212
import org.slf4j.LoggerFactory;
13+
import org.slf4j.helpers.NOPLogger;
1314

1415
enum CloudEnvironment {
1516
AZURE_FUNCTION,
@@ -19,7 +20,24 @@ enum CloudEnvironment {
1920
}
2021

2122
public class ServerlessCompatAgent {
22-
private static final Logger log = LoggerFactory.getLogger(ServerlessCompatAgent.class);
23+
private static final String ddLogLevel = System.getenv().getOrDefault("DD_LOG_LEVEL", "INFO").toUpperCase();
24+
25+
private static final Logger log = initLogger(ddLogLevel);
26+
27+
private static Logger initLogger(String logLevel) {
28+
if ("OFF".equals(logLevel)) {
29+
return NOPLogger.NOP_LOGGER;
30+
} else {
31+
System.setProperty("org.slf4j.simpleLogger.defaultLogLevel",
32+
mapDdLogLevelToSlf4jLogLevel(logLevel));
33+
return LoggerFactory.getLogger(ServerlessCompatAgent.class);
34+
}
35+
}
36+
37+
private static String mapDdLogLevelToSlf4jLogLevel(String ddLogLevel) {
38+
return "CRITICAL".equals(ddLogLevel) ? "ERROR" : ddLogLevel;
39+
}
40+
2341
private static final String os = System.getProperty("os.name").toLowerCase();
2442
private static final String binaryPath = System.getenv("DD_SERVERLESS_COMPAT_PATH");
2543

@@ -65,7 +83,8 @@ public static String getPackageVersion() {
6583
}
6684

6785
public static boolean isAzureFlexWithoutDDAzureResourceGroup() {
68-
return "FlexConsumption".equals(System.getenv("WEBSITE_SKU")) && System.getenv("DD_AZURE_RESOURCE_GROUP") == null;
86+
return "FlexConsumption".equals(System.getenv("WEBSITE_SKU"))
87+
&& System.getenv("DD_AZURE_RESOURCE_GROUP") == null;
6988
}
7089

7190
public static void premain(String agentArgs, Instrumentation instrumentation) {
@@ -94,11 +113,13 @@ public static void premain(String agentArgs, Instrumentation instrumentation) {
94113
return;
95114
}
96115

97-
// Check for Azure Flex Consumption functions that don't have the DD_AZURE_RESOURCE_GROUP environment variable set
116+
// Check for Azure Flex Consumption functions that don't have the
117+
// DD_AZURE_RESOURCE_GROUP environment variable set
98118
if (environment == CloudEnvironment.AZURE_FUNCTION && isAzureFlexWithoutDDAzureResourceGroup()) {
99-
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.");
119+
log.error(
120+
"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.");
100121
return;
101-
}
122+
}
102123

103124
try (InputStream inputStream = ServerlessCompatAgent.class.getClassLoader()
104125
.getResourceAsStream(fileName)) {

src/test/java/test.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import com.datadog.ServerlessCompatAgent;
2+
import java.lang.reflect.Method;
3+
import org.junit.jupiter.params.ParameterizedTest;
4+
import org.junit.jupiter.params.provider.CsvSource;
5+
import org.slf4j.Logger;
6+
import org.slf4j.helpers.NOPLogger;
7+
8+
import static org.junit.jupiter.api.Assertions.*;
9+
10+
class ServerlessCompatAgentTest {
11+
12+
@ParameterizedTest
13+
@CsvSource({
14+
"TRACE, TRACE",
15+
"DEBUG, DEBUG",
16+
"INFO, INFO",
17+
"WARN, WARN",
18+
"ERROR, ERROR",
19+
"CRITICAL, ERROR",
20+
"OFF, null"
21+
})
22+
void testInitLogger(String ddLogLevel, String expectedSlf4jLevel) throws Exception {
23+
Method initLoggerMethod = ServerlessCompatAgent.class.getDeclaredMethod("initLogger", String.class);
24+
initLoggerMethod.setAccessible(true);
25+
Logger logger = (Logger) initLoggerMethod.invoke(null, ddLogLevel);
26+
27+
if ("OFF".equals(ddLogLevel)) {
28+
assertTrue(logger instanceof NOPLogger);
29+
} else {
30+
assertEquals(expectedSlf4jLevel,
31+
System.getProperty("org.slf4j.simpleLogger.defaultLogLevel"));
32+
}
33+
}
34+
}

0 commit comments

Comments
 (0)