Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public class EcsJsonSerializer {
"event.dataset",
"process.thread.name",
"process.thread.id",
"event.sequence",
"ecs.version"));

public static CharSequence toNullSafeString(final CharSequence s) {
Expand Down Expand Up @@ -144,6 +145,12 @@ public static void serializeEventDataset(StringBuilder builder, String eventData
}
}

public static void serializeEventSequence(StringBuilder builder, long sequenceNumber) {
builder.append("\"event.sequence\":");
builder.append(sequenceNumber);
builder.append(",");
}

public static void serializeLogLevel(StringBuilder builder, String level) {
builder.append("\"log.level\":");
// add padding so that all levels line up
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,26 @@ void getMessageStringBuilderReuseNormallySizedBuffer() {
assertThat(sb2.length()).isZero();
}

@Test
void serializeEventSequence() throws JsonProcessingException {
StringBuilder jsonBuilder = new StringBuilder();
jsonBuilder.append('{');
EcsJsonSerializer.serializeEventSequence(jsonBuilder, 42);
EcsJsonSerializer.serializeObjectEnd(jsonBuilder);
JsonNode jsonNode = objectMapper.readTree(jsonBuilder.toString());
assertThat(jsonNode.get("event.sequence").longValue()).isEqualTo(42);
}

@Test
void serializeEventSequenceZero() throws JsonProcessingException {
StringBuilder jsonBuilder = new StringBuilder();
jsonBuilder.append('{');
EcsJsonSerializer.serializeEventSequence(jsonBuilder, 0);
EcsJsonSerializer.serializeObjectEnd(jsonBuilder);
JsonNode jsonNode = objectMapper.readTree(jsonBuilder.toString());
assertThat(jsonNode.get("event.sequence").longValue()).isEqualTo(0);
}

private void assertRemoveIfEndsWith(String builder, String ending, String expected) {
StringBuilder sb = new StringBuilder(builder);
EcsJsonSerializer.removeIfEndsWith(sb, ending);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@

import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Iterator;
Expand All @@ -45,6 +46,16 @@
public class EcsEncoder extends EncoderBase<ILoggingEvent> {

private static final Charset UTF_8 = Charset.forName("UTF-8");
private static final Method GET_SEQUENCE_NUMBER;
static {
Method m = null;
try {
m = ILoggingEvent.class.getMethod("getSequenceNumber");
} catch (NoSuchMethodException ignored) {
}
GET_SEQUENCE_NUMBER = m;
}
private boolean emitEventSequence;
private boolean stackTraceAsArray = false;
private String serviceName;
private String serviceVersion;
Expand Down Expand Up @@ -72,6 +83,13 @@ public void start() {
throwableConverter.start();
}
eventDataset = EcsJsonSerializer.computeEventDataset(eventDataset, serviceName);
if (GET_SEQUENCE_NUMBER != null && getContext() != null) {
try {
Method getGenerator = getContext().getClass().getMethod("getSequenceNumberGenerator");
emitEventSequence = getGenerator.invoke(getContext()) != null;
} catch (Exception ignored) {
}
}
}

/**
Expand Down Expand Up @@ -115,6 +133,14 @@ public byte[] encode(ILoggingEvent event) {
EcsJsonSerializer.serializeServiceEnvironment(builder, serviceEnvironment);
EcsJsonSerializer.serializeServiceNodeName(builder, serviceNodeName);
EcsJsonSerializer.serializeEventDataset(builder, eventDataset);
if (emitEventSequence) {
try {
EcsJsonSerializer.serializeEventSequence(builder, (Long) GET_SEQUENCE_NUMBER.invoke(event));
} catch (Exception ignored) {
// Reflection call failed at runtime; disable for subsequent events
emitEventSequence = false;
}
}
EcsJsonSerializer.serializeThreadName(builder, event.getThreadName());
EcsJsonSerializer.serializeLoggerName(builder, event.getLoggerName());
EcsJsonSerializer.serializeAdditionalFields(builder, additionalFields);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@

import java.io.IOException;

import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;

public class EcsEncoderTest extends AbstractEcsEncoderTest {

private OutputStreamAppender appender;
Expand Down Expand Up @@ -61,4 +64,13 @@ void setUp() {
public JsonNode getLastLogLine() throws IOException {
return objectMapper.readTree(appender.getBytes());
}

@Test
void testEventSequenceAbsentWithoutGenerator() throws Exception {
logger.debug("test");
JsonNode logLine = getLastLogLine();
// No SequenceNumberGenerator on the context (and logback 1.2.x lacks
// the API entirely), so event.sequence must not appear.
assertThat(logLine.has("event.sequence")).isFalse();
}
}
Loading