Skip to content

Commit af64d84

Browse files
authored
Support attaching tags to telemetry logs (#8921)
1 parent 83532cf commit af64d84

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

internal-api/src/main/java/datadog/trace/api/telemetry/LogCollector.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.Objects;
1010
import java.util.concurrent.ConcurrentHashMap;
1111
import java.util.concurrent.atomic.AtomicInteger;
12+
import javax.annotation.Nullable;
1213
import org.slf4j.Marker;
1314
import org.slf4j.MarkerFactory;
1415

@@ -34,13 +35,27 @@ private LogCollector() {
3435
this.rawLogMessages = new ConcurrentHashMap<>(maxCapacity);
3536
}
3637

37-
public void addLogMessage(String logLevel, String message, Throwable throwable) {
38+
public void addLogMessage(String logLevel, String message, @Nullable Throwable throwable) {
39+
addLogMessage(logLevel, message, throwable, null);
40+
}
41+
42+
/**
43+
* Queue a log message to be sent on next telemetry flush.
44+
*
45+
* @param logLevel Log level (ERROR, WARN, DEBUG). Unknown log levels will be ignored.
46+
* @param message Log message.
47+
* @param throwable Optional throwable to attach a stacktrace.
48+
* @param tags Optional tags to attach to the log. These are a comma-separated list, e.g.
49+
* tag1:value1,tag2:value2
50+
*/
51+
public void addLogMessage(
52+
String logLevel, String message, @Nullable Throwable throwable, @Nullable String tags) {
3853
if (rawLogMessages.size() >= maxCapacity) {
3954
// TODO: We could emit a metric for dropped logs.
4055
return;
4156
}
4257
RawLogMessage rawLogMessage =
43-
new RawLogMessage(logLevel, message, throwable, System.currentTimeMillis() / 1000);
58+
new RawLogMessage(logLevel, message, throwable, tags, System.currentTimeMillis() / 1000);
4459
AtomicInteger count = rawLogMessages.computeIfAbsent(rawLogMessage, k -> new AtomicInteger());
4560
count.incrementAndGet();
4661
}
@@ -73,13 +88,16 @@ public static class RawLogMessage {
7388
public final String message;
7489
public final String logLevel;
7590
public final Throwable throwable;
91+
public final String tags;
7692
public final long timestamp;
7793
public int count;
7894

79-
public RawLogMessage(String logLevel, String message, Throwable throwable, long timestamp) {
95+
public RawLogMessage(
96+
String logLevel, String message, Throwable throwable, String tags, long timestamp) {
8097
this.logLevel = logLevel;
8198
this.message = message;
8299
this.throwable = throwable;
100+
this.tags = tags;
83101
this.timestamp = timestamp;
84102
}
85103

telemetry/src/main/java/datadog/telemetry/log/LogPeriodicAction.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public void doIteration(TelemetryService service) {
3636
new LogMessage()
3737
.message(rawLogMsg.message)
3838
.tracerTime(rawLogMsg.timestamp)
39+
.tags(rawLogMsg.tags)
3940
.count(rawLogMsg.count);
4041

4142
if (rawLogMsg.logLevel != null) {

telemetry/src/test/groovy/datadog/telemetry/log/LogPeriodicActionTest.groovy

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,21 @@ class LogPeriodicActionTest extends DDSpecification {
2121
LogCollector.get().drain()
2222
}
2323

24+
void 'log with tags'() {
25+
LogMessage logMessage
26+
27+
when:
28+
LogCollector.get().addLogMessage('ERROR', "test", null, 'tag1:value1,tag2:value2')
29+
periodicAction.doIteration(telemetryService)
30+
31+
then:
32+
1 * telemetryService.addLogMessage(_) >> { args -> logMessage = args[0] }
33+
0 * _
34+
logMessage.getLevel() == LogMessageLevel.ERROR
35+
logMessage.getMessage() == 'test'
36+
logMessage.getTags() == 'tag1:value1,tag2:value2'
37+
}
38+
2439
void 'log with datadog throwable'() {
2540
LogMessage logMessage
2641

0 commit comments

Comments
 (0)