diff --git a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/serialize/DslJsonSerializer.java b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/serialize/DslJsonSerializer.java index 7c6d0c4bd0..19fdc015ca 100644 --- a/apm-agent-core/src/main/java/co/elastic/apm/agent/report/serialize/DslJsonSerializer.java +++ b/apm-agent-core/src/main/java/co/elastic/apm/agent/report/serialize/DslJsonSerializer.java @@ -677,12 +677,28 @@ private void serializeStackTraceElement(StackTraceElement stacktrace) { jw.writeByte(OBJECT_START); writeField("filename", stacktrace.getFileName()); writeField("function", stacktrace.getMethodName()); - writeField("library_frame", isLibraryFrame(stacktrace.getClassName())); + String className = stacktrace.getClassName(); + writeField("library_frame", isLibraryFrame(className)); writeField("lineno", stacktrace.getLineNumber()); - serializeStackFrameModule(stacktrace.getClassName()); + int lastDotIndex = className.lastIndexOf('.'); + if (lastDotIndex > 0) { + StringBuilder replaceBuilder = getReplaceBuilder(); + replaceBuilder.append(className, 0, lastDotIndex); + replace(replaceBuilder, ".", "/", 0); + replaceBuilder.append("/"); + replaceBuilder.append(stacktrace.getFileName()); + writeField("abs_path", replaceBuilder); + } + serializeStackFrameModule(className); jw.writeByte(OBJECT_END); } + private StringBuilder getReplaceBuilder() { + StringBuilder builder = this.replaceBuilder; + builder.setLength(0); + return builder; + } + private void serializeStackFrameModule(final String fullyQualifiedClassName) { writeFieldName("module"); replaceBuilder.setLength(0); diff --git a/apm-agent-core/src/test/java/co/elastic/apm/agent/report/serialize/DslJsonSerializerTest.java b/apm-agent-core/src/test/java/co/elastic/apm/agent/report/serialize/DslJsonSerializerTest.java index 6d6523da31..c61d8d304b 100644 --- a/apm-agent-core/src/test/java/co/elastic/apm/agent/report/serialize/DslJsonSerializerTest.java +++ b/apm-agent-core/src/test/java/co/elastic/apm/agent/report/serialize/DslJsonSerializerTest.java @@ -123,6 +123,7 @@ void testErrorSerialization() throws IOException { assertThat(stackTraceElement.get("library_frame")).isNotNull(); assertThat(stackTraceElement.get("lineno")).isNotNull(); assertThat(stackTraceElement.get("module")).isNotNull(); + assertThat(stackTraceElement.get("abs_path").textValue()).isEqualTo(stackTraceElement.get("module").textValue().replace('.', '/') + "/" + stackTraceElement.get("filename").textValue()); assertThat(exception.get("type").textValue()).isEqualTo(Exception.class.getName()); assertThat(errorTree.get("transaction").get("sampled").booleanValue()).isTrue(); assertThat(errorTree.get("transaction").get("type").textValue()).isEqualTo("test-type");