From 1f3e7130129ec7611d75cc14db788e1f6bff5dce Mon Sep 17 00:00:00 2001 From: Seoyoung Park Date: Fri, 2 Feb 2024 12:22:55 +0900 Subject: [PATCH] [#9631] Fix encoding of `errorMessage_logtype` --- .../exceptiontrace/web/mapper/CLPMapper.java | 17 ++- .../mapper/ExceptionMetaDataEntityMapper.java | 5 +- .../web/mapper/CLPMapperTest.java | 28 +++++ .../ExceptionMetaDataEntityMapperTest.java | 104 ++++++++++-------- 4 files changed, 104 insertions(+), 50 deletions(-) diff --git a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/CLPMapper.java b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/CLPMapper.java index 016f53c9c69f..54ab0da7578c 100644 --- a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/CLPMapper.java +++ b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/CLPMapper.java @@ -15,6 +15,7 @@ */ package com.navercorp.pinpoint.exceptiontrace.web.mapper; +import java.nio.charset.StandardCharsets; /** * @author intr3p1d @@ -22,12 +23,20 @@ public class CLPMapper { // Special placeholder characters for CLP-encoded log type. - private final static char DICTIONARY_VARIABLE_VALUE = '\u0011'; - private final static char NON_DICTIONARY_VALUE = '\u0012'; + public final static char DICTIONARY_VARIABLE_VALUE = '\u0011'; + public final static char NON_DICTIONARY_VALUE = '\u0012'; + + public final static String DICTIONARY_REPLACEMENT = "▨▨▨"; + public final static String NON_DICTIONARY_REPLACEMENT = "▧▧▧"; + + static String makeReadableString(String encodedLogType) { + byte[] encodedLogTypeBytes = encodedLogType.getBytes(StandardCharsets.ISO_8859_1); + return new String(encodedLogTypeBytes, StandardCharsets.UTF_8); + } static String replacePlaceHolders(String encodedLogType) { return encodedLogType - .replaceAll(String.valueOf(DICTIONARY_VARIABLE_VALUE), "▨▨▨") - .replaceAll(String.valueOf(NON_DICTIONARY_VALUE), "▧▧▧"); + .replaceAll(String.valueOf(DICTIONARY_VARIABLE_VALUE), DICTIONARY_REPLACEMENT) + .replaceAll(String.valueOf(NON_DICTIONARY_VALUE), NON_DICTIONARY_REPLACEMENT); } } diff --git a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/ExceptionMetaDataEntityMapper.java b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/ExceptionMetaDataEntityMapper.java index 4b6b12f27aea..bc5867ecb279 100644 --- a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/ExceptionMetaDataEntityMapper.java +++ b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/ExceptionMetaDataEntityMapper.java @@ -30,6 +30,7 @@ import org.mapstruct.Mappings; import org.mapstruct.Named; +import static com.navercorp.pinpoint.exceptiontrace.web.mapper.CLPMapper.makeReadableString; import static com.navercorp.pinpoint.exceptiontrace.web.mapper.CLPMapper.replacePlaceHolders; /** @@ -75,7 +76,9 @@ public interface ExceptionMetaDataEntityMapper { @Named("selectErrorMessage") default String selectErrorMessage(GroupedFieldNameEntity entity) { if (entity.getErrorMessage_logtype() != null) { - return replacePlaceHolders(entity.getErrorMessage_logtype()); + return replacePlaceHolders( + makeReadableString(entity.getErrorMessage_logtype()) + ); } return entity.getErrorMessage(); } diff --git a/exceptiontrace/exceptiontrace-web/src/test/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/CLPMapperTest.java b/exceptiontrace/exceptiontrace-web/src/test/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/CLPMapperTest.java index 043fe1e19bbd..e8088dc99bd9 100644 --- a/exceptiontrace/exceptiontrace-web/src/test/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/CLPMapperTest.java +++ b/exceptiontrace/exceptiontrace-web/src/test/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/CLPMapperTest.java @@ -4,7 +4,11 @@ import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Test; +import java.io.IOException; + +import static com.navercorp.pinpoint.exceptiontrace.web.mapper.CLPMapper.makeReadableString; import static com.navercorp.pinpoint.exceptiontrace.web.mapper.CLPMapper.replacePlaceHolders; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotEquals; @@ -26,4 +30,28 @@ public void testEncodedLogtype() { assertFalse(replaced.contains("\u0011")); assertFalse(replaced.contains("\u0012")); } + + @Test + public void testMakeReadable1() throws IOException { + String rawExample = "getAgentsList.from: \u0011 ì\u009D´ì\u0083\u0081ì\u009D´ì\u0096´ì\u0095¼ í\u0095©ë\u008B\u0088ë\u008B¤"; + String example = "getAgentsList.from: \u0011 이상이어야 합니다"; + + assertEquals(example, makeReadableString(rawExample)); + } + + @Test + public void testMakeReadable2() { + String rawExample = "\\n not found: limit=\u0011 content=â\u0080¦"; + String example = "\\n not found: limit=\u0011 content=…"; + + assertEquals(example, makeReadableString(rawExample)); + } + + @Test + public void testMakeReadable3() { + String rawExample = "Request processing failed: jakarta.validation.ConstraintViolationException"; + String example = "Request processing failed: jakarta.validation.ConstraintViolationException"; + + assertEquals(example, makeReadableString(rawExample)); + } } \ No newline at end of file diff --git a/exceptiontrace/exceptiontrace-web/src/test/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/ExceptionMetaDataEntityMapperTest.java b/exceptiontrace/exceptiontrace-web/src/test/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/ExceptionMetaDataEntityMapperTest.java index 111113b219c0..687eba504935 100644 --- a/exceptiontrace/exceptiontrace-web/src/test/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/ExceptionMetaDataEntityMapperTest.java +++ b/exceptiontrace/exceptiontrace-web/src/test/java/com/navercorp/pinpoint/exceptiontrace/web/mapper/ExceptionMetaDataEntityMapperTest.java @@ -7,6 +7,7 @@ import com.navercorp.pinpoint.exceptiontrace.web.entity.ExceptionMetaDataEntity; import com.navercorp.pinpoint.exceptiontrace.web.entity.ExceptionTraceSummaryEntity; import com.navercorp.pinpoint.exceptiontrace.web.entity.ExceptionTraceValueViewEntity; +import com.navercorp.pinpoint.exceptiontrace.web.entity.GroupedFieldNameEntity; import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceSummary; import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceValueView; import com.navercorp.pinpoint.exceptiontrace.web.view.ExceptionMetaDataView; @@ -25,6 +26,8 @@ import java.util.function.Function; import java.util.stream.Collectors; +import static org.junit.jupiter.api.Assertions.assertEquals; + /** * @author intr3p1d */ @@ -54,21 +57,21 @@ public void testEntityToModel() { ExceptionMetaDataEntity expected = newExceptionMetaDataEntity(throwable); ExceptionMetaData actual = mapper.toModel(expected); - Assertions.assertEquals(expected.getTimestamp(), actual.getTimestamp()); - Assertions.assertEquals(expected.getTransactionId(), actual.getTransactionId()); - Assertions.assertEquals(expected.getSpanId(), actual.getSpanId()); - Assertions.assertEquals(expected.getExceptionId(), actual.getExceptionId()); + assertEquals(expected.getTimestamp(), actual.getTimestamp()); + assertEquals(expected.getTransactionId(), actual.getTransactionId()); + assertEquals(expected.getSpanId(), actual.getSpanId()); + assertEquals(expected.getExceptionId(), actual.getExceptionId()); - Assertions.assertEquals(expected.getApplicationServiceType(), actual.getApplicationServiceType()); - Assertions.assertEquals(expected.getApplicationName(), actual.getApplicationName()); - Assertions.assertEquals(expected.getAgentId(), actual.getAgentId()); - Assertions.assertEquals(expected.getUriTemplate(), actual.getUriTemplate()); + assertEquals(expected.getApplicationServiceType(), actual.getApplicationServiceType()); + assertEquals(expected.getApplicationName(), actual.getApplicationName()); + assertEquals(expected.getAgentId(), actual.getAgentId()); + assertEquals(expected.getUriTemplate(), actual.getUriTemplate()); - Assertions.assertEquals(expected.getErrorClassName(), actual.getErrorClassName()); - Assertions.assertEquals(expected.getErrorMessage(), actual.getErrorMessage()); - Assertions.assertEquals(expected.getExceptionDepth(), actual.getExceptionDepth()); + assertEquals(expected.getErrorClassName(), actual.getErrorClassName()); + assertEquals(expected.getErrorMessage(), actual.getErrorMessage()); + assertEquals(expected.getExceptionDepth(), actual.getExceptionDepth()); - Assertions.assertEquals(expected.getStackTraceHash(), actual.getStackTraceHash()); + assertEquals(expected.getStackTraceHash(), actual.getStackTraceHash()); int size = throwable.getStackTrace().length; @@ -86,10 +89,10 @@ public void testEntityToModel() { List actualStackTrace = actual.getStackTrace(); for (int i = 0; i < size; i++) { - Assertions.assertEquals(classNameIter.get(i), actualStackTrace.get(i).getClassName()); - Assertions.assertEquals(fileNameIter.get(i), actualStackTrace.get(i).getFileName()); - Assertions.assertEquals(lineNumberIter.get(i), actualStackTrace.get(i).getLineNumber()); - Assertions.assertEquals(methodNameIter.get(i), actualStackTrace.get(i).getMethodName()); + assertEquals(classNameIter.get(i), actualStackTrace.get(i).getClassName()); + assertEquals(fileNameIter.get(i), actualStackTrace.get(i).getFileName()); + assertEquals(lineNumberIter.get(i), actualStackTrace.get(i).getLineNumber()); + assertEquals(methodNameIter.get(i), actualStackTrace.get(i).getMethodName()); } } @@ -100,21 +103,21 @@ public void testEntityToView() { ExceptionMetaDataEntity expected = newExceptionMetaDataEntity(throwable); ExceptionMetaDataView actual = mapper.toView(expected); - Assertions.assertEquals(expected.getTimestamp(), actual.getTimestamp()); - Assertions.assertEquals(expected.getTransactionId(), actual.getTransactionId()); - Assertions.assertEquals(Long.toString(expected.getSpanId()), actual.getSpanId()); - Assertions.assertEquals(Long.toString(expected.getExceptionId()), actual.getExceptionId()); + assertEquals(expected.getTimestamp(), actual.getTimestamp()); + assertEquals(expected.getTransactionId(), actual.getTransactionId()); + assertEquals(Long.toString(expected.getSpanId()), actual.getSpanId()); + assertEquals(Long.toString(expected.getExceptionId()), actual.getExceptionId()); - Assertions.assertEquals(expected.getApplicationServiceType(), actual.getApplicationServiceType()); - Assertions.assertEquals(expected.getApplicationName(), actual.getApplicationName()); - Assertions.assertEquals(expected.getAgentId(), actual.getAgentId()); - Assertions.assertEquals(expected.getUriTemplate(), actual.getUriTemplate()); + assertEquals(expected.getApplicationServiceType(), actual.getApplicationServiceType()); + assertEquals(expected.getApplicationName(), actual.getApplicationName()); + assertEquals(expected.getAgentId(), actual.getAgentId()); + assertEquals(expected.getUriTemplate(), actual.getUriTemplate()); - Assertions.assertEquals(expected.getErrorClassName(), actual.getErrorClassName()); - Assertions.assertEquals(expected.getErrorMessage(), actual.getErrorMessage()); - Assertions.assertEquals(expected.getExceptionDepth(), actual.getExceptionDepth()); + assertEquals(expected.getErrorClassName(), actual.getErrorClassName()); + assertEquals(expected.getErrorMessage(), actual.getErrorMessage()); + assertEquals(expected.getExceptionDepth(), actual.getExceptionDepth()); - Assertions.assertEquals(expected.getStackTraceHash(), actual.getStackTraceHash()); + assertEquals(expected.getStackTraceHash(), actual.getStackTraceHash()); int size = throwable.getStackTrace().length; @@ -132,10 +135,10 @@ public void testEntityToView() { List actualStackTrace = actual.getStackTrace(); for (int i = 0; i < size; i++) { - Assertions.assertEquals(classNameIter.get(i), actualStackTrace.get(i).getClassName()); - Assertions.assertEquals(fileNameIter.get(i), actualStackTrace.get(i).getFileName()); - Assertions.assertEquals(lineNumberIter.get(i), actualStackTrace.get(i).getLineNumber()); - Assertions.assertEquals(methodNameIter.get(i), actualStackTrace.get(i).getMethodName()); + assertEquals(classNameIter.get(i), actualStackTrace.get(i).getClassName()); + assertEquals(fileNameIter.get(i), actualStackTrace.get(i).getFileName()); + assertEquals(lineNumberIter.get(i), actualStackTrace.get(i).getLineNumber()); + assertEquals(methodNameIter.get(i), actualStackTrace.get(i).getMethodName()); } } @@ -179,10 +182,10 @@ public void testEntityToValueView() { ExceptionTraceValueView actual = mapper.entityToExceptionTraceValueView(expected); - Assertions.assertEquals(expected.getUriTemplate(), actual.getGroupedFieldName().getUriTemplate()); - Assertions.assertEquals(expected.getErrorClassName(), actual.getGroupedFieldName().getErrorClassName()); - Assertions.assertEquals(expected.getErrorMessage(), actual.getGroupedFieldName().getErrorMessage()); - Assertions.assertEquals(expected.getStackTraceHash(), actual.getGroupedFieldName().getStackTraceHash()); + assertEquals(expected.getUriTemplate(), actual.getGroupedFieldName().getUriTemplate()); + assertEquals(expected.getErrorClassName(), actual.getGroupedFieldName().getErrorClassName()); + assertEquals(expected.getErrorMessage(), actual.getGroupedFieldName().getErrorMessage()); + assertEquals(expected.getStackTraceHash(), actual.getGroupedFieldName().getStackTraceHash()); Assertions.assertNotNull(actual.getValues()); Assertions.assertFalse(actual.getValues().isEmpty()); @@ -207,16 +210,16 @@ public void testEntityToSummary() { ExceptionTraceSummary actual = mapper.entityToExceptionTraceSummary(expected); - Assertions.assertEquals(expected.getMostRecentErrorClass(), actual.getMostRecentErrorClass()); - Assertions.assertEquals(expected.getMostRecentErrorMessage(), actual.getMostRecentErrorMessage()); - Assertions.assertEquals(expected.getCount(), actual.getCount()); - Assertions.assertEquals(expected.getFirstOccurred(), actual.getFirstOccurred()); - Assertions.assertEquals(expected.getLastOccurred(), actual.getLastOccurred()); + assertEquals(expected.getMostRecentErrorClass(), actual.getMostRecentErrorClass()); + assertEquals(expected.getMostRecentErrorMessage(), actual.getMostRecentErrorMessage()); + assertEquals(expected.getCount(), actual.getCount()); + assertEquals(expected.getFirstOccurred(), actual.getFirstOccurred()); + assertEquals(expected.getLastOccurred(), actual.getLastOccurred()); - Assertions.assertEquals(expected.getUriTemplate(), actual.getGroupedFieldName().getUriTemplate()); - Assertions.assertEquals(expected.getErrorClassName(), actual.getGroupedFieldName().getErrorClassName()); - Assertions.assertEquals(expected.getErrorMessage(), actual.getGroupedFieldName().getErrorMessage()); - Assertions.assertEquals(expected.getStackTraceHash(), actual.getGroupedFieldName().getStackTraceHash()); + assertEquals(expected.getUriTemplate(), actual.getGroupedFieldName().getUriTemplate()); + assertEquals(expected.getErrorClassName(), actual.getGroupedFieldName().getErrorClassName()); + assertEquals(expected.getErrorMessage(), actual.getGroupedFieldName().getErrorMessage()); + assertEquals(expected.getStackTraceHash(), actual.getGroupedFieldName().getStackTraceHash()); } private ExceptionTraceSummaryEntity newExceptionTraceSummaryEntity() { @@ -235,4 +238,15 @@ private ExceptionTraceSummaryEntity newExceptionTraceSummaryEntity() { return entity; } + @Test + public void testSelectErrorMessage(){ + GroupedFieldNameEntity entity = new GroupedFieldNameEntity(); + entity.setErrorMessage_logtype("getAgentsList.from: \u0011 ì\u009D´ì\u0083\u0081ì\u009D´ì\u0096´ì\u0095¼ í\u0095©ë\u008B\u0088ë\u008B¤"); + + String result = mapper.selectErrorMessage(entity); + assertEquals( + "getAgentsList.from: "+ CLPMapper.DICTIONARY_REPLACEMENT +" 이상이어야 합니다" + ,result + ); + } } \ No newline at end of file