Skip to content

Commit

Permalink
[#9631] Fix encoding of errorMessage_logtype
Browse files Browse the repository at this point in the history
  • Loading branch information
intr3p1d committed Feb 6, 2024
1 parent 9ae0d63 commit 1f3e713
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,28 @@
*/
package com.navercorp.pinpoint.exceptiontrace.web.mapper;

import java.nio.charset.StandardCharsets;

/**
* @author intr3p1d
*/
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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand Down Expand Up @@ -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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -25,6 +26,8 @@
import java.util.function.Function;
import java.util.stream.Collectors;

import static org.junit.jupiter.api.Assertions.assertEquals;

/**
* @author intr3p1d
*/
Expand Down Expand Up @@ -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;
Expand All @@ -86,10 +89,10 @@ public void testEntityToModel() {
List<StackTraceElementWrapper> 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());
}
}

Expand All @@ -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;
Expand All @@ -132,10 +135,10 @@ public void testEntityToView() {
List<StackTraceElementWrapper> 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());
}
}

Expand Down Expand Up @@ -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());
Expand All @@ -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() {
Expand All @@ -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
);
}
}

0 comments on commit 1f3e713

Please sign in to comment.