diff --git a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/controller/ExceptionTraceController.java b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/controller/ExceptionTraceController.java index d12014bb05f0..a6c2d59e6d5f 100644 --- a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/controller/ExceptionTraceController.java +++ b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/controller/ExceptionTraceController.java @@ -16,12 +16,12 @@ package com.navercorp.pinpoint.exceptiontrace.web.controller; -import com.navercorp.pinpoint.exceptiontrace.common.model.ExceptionMetaData; import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceSummary; import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceValueView; import com.navercorp.pinpoint.exceptiontrace.web.service.ExceptionTraceService; import com.navercorp.pinpoint.exceptiontrace.web.util.ExceptionTraceQueryParameter; import com.navercorp.pinpoint.exceptiontrace.web.util.GroupByAttributes; +import com.navercorp.pinpoint.exceptiontrace.web.view.ExceptionMetaDataView; import com.navercorp.pinpoint.exceptiontrace.web.view.ExceptionTraceView; import com.navercorp.pinpoint.metric.web.util.Range; import com.navercorp.pinpoint.metric.web.util.TimePrecision; @@ -68,7 +68,7 @@ public ExceptionTraceController(ExceptionTraceService exceptionTraceService, Ten } @GetMapping("/transactionInfo") - public List getListOfExceptionMetaDataFromTransactionId( + public List getListOfExceptionMetaDataFromTransactionId( @RequestParam("applicationName") @NotBlank String applicationName, @RequestParam("agentId") @NotBlank String agentId, @RequestParam("transactionId") @NotBlank String transactionId, @@ -89,7 +89,7 @@ public List getListOfExceptionMetaDataFromTransactionId( } @GetMapping("/errorList") - public List getListOfExceptionMetaDataByGivenRange( + public List getListOfExceptionMetaDataByGivenRange( @RequestParam("applicationName") @NotBlank String applicationName, @RequestParam(value = "agentId", required = false) String agentId, @RequestParam("from") @PositiveOrZero long from, diff --git a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/dao/ExceptionTraceDao.java b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/dao/ExceptionTraceDao.java index 85c0dcf20ef8..0ad00a05645d 100644 --- a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/dao/ExceptionTraceDao.java +++ b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/dao/ExceptionTraceDao.java @@ -21,6 +21,7 @@ import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceSummary; import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceValueView; import com.navercorp.pinpoint.exceptiontrace.web.util.ExceptionTraceQueryParameter; +import com.navercorp.pinpoint.exceptiontrace.web.view.ExceptionMetaDataView; import java.util.List; @@ -28,8 +29,8 @@ * @author intr3p1d */ public interface ExceptionTraceDao { - List getExceptions(ExceptionTraceQueryParameter exceptionTraceQueryParameter); - List getSummarizedExceptions(ExceptionTraceQueryParameter exceptionTraceQueryParameter); + List getExceptions(ExceptionTraceQueryParameter exceptionTraceQueryParameter); + List getSummarizedExceptions(ExceptionTraceQueryParameter exceptionTraceQueryParameter); ExceptionMetaData getException(ExceptionTraceQueryParameter exceptionTraceQueryParameter); List getSummaries(ExceptionTraceQueryParameter exceptionTraceQueryParameter); List getValueViews(ExceptionTraceQueryParameter exceptionTraceQueryParameter); diff --git a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/dao/PinotExceptionTraceDao.java b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/dao/PinotExceptionTraceDao.java index ab26ce168ad0..e12bfa0842d6 100644 --- a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/dao/PinotExceptionTraceDao.java +++ b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/dao/PinotExceptionTraceDao.java @@ -24,6 +24,7 @@ import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceSummary; import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceValueView; import com.navercorp.pinpoint.exceptiontrace.web.util.ExceptionTraceQueryParameter; +import com.navercorp.pinpoint.exceptiontrace.web.view.ExceptionMetaDataView; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.mybatis.spring.SqlSessionTemplate; @@ -62,18 +63,18 @@ public PinotExceptionTraceDao( } @Override - public List getExceptions(ExceptionTraceQueryParameter exceptionTraceQueryParameter) { + public List getExceptions(ExceptionTraceQueryParameter exceptionTraceQueryParameter) { List dataEntities = this.sqlPinotSessionTemplate.selectList(NAMESPACE + SELECT_QUERY, exceptionTraceQueryParameter); return dataEntities.stream() - .map(mapper::toModel) + .map(mapper::toView) .collect(Collectors.toList()); } @Override - public List getSummarizedExceptions(ExceptionTraceQueryParameter exceptionTraceQueryParameter) { + public List getSummarizedExceptions(ExceptionTraceQueryParameter exceptionTraceQueryParameter) { List dataEntities = this.sqlPinotSessionTemplate.selectList(NAMESPACE + SELECT_SUMMARIZED_QUERY, exceptionTraceQueryParameter); return dataEntities.stream() - .map(mapper::toModel) + .map(mapper::toView) .collect(Collectors.toList()); } 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 a34f2dcbf966..2806277ac6ac 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 @@ -22,6 +22,7 @@ import com.navercorp.pinpoint.exceptiontrace.web.entity.ExceptionTraceValueViewEntity; import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceSummary; import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceValueView; +import com.navercorp.pinpoint.exceptiontrace.web.view.ExceptionMetaDataView; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; @@ -37,6 +38,11 @@ public interface ExceptionMetaDataEntityMapper { ) ExceptionMetaData toModel(ExceptionMetaDataEntity entity); + @Mappings( + @Mapping(source = ".", target = "stackTrace", qualifiedBy = StackTraceMapper.StringsToStackTrace.class) + ) + ExceptionMetaDataView toView(ExceptionMetaDataEntity entity); + @Mappings({ @Mapping(source = "values", target = "values", qualifiedBy = MapStructUtils.JsonStrToList.class), @Mapping(source = "uriTemplate", target = "groupedFieldName.uriTemplate"), diff --git a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/service/ExceptionTraceService.java b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/service/ExceptionTraceService.java index 205390cb5d20..c25217898bc4 100644 --- a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/service/ExceptionTraceService.java +++ b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/service/ExceptionTraceService.java @@ -16,10 +16,10 @@ package com.navercorp.pinpoint.exceptiontrace.web.service; -import com.navercorp.pinpoint.exceptiontrace.common.model.ExceptionMetaData; import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceSummary; import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceValueView; import com.navercorp.pinpoint.exceptiontrace.web.util.ExceptionTraceQueryParameter; +import com.navercorp.pinpoint.exceptiontrace.web.view.ExceptionMetaDataView; import java.util.List; @@ -28,9 +28,9 @@ */ public interface ExceptionTraceService { - List getTransactionExceptions(ExceptionTraceQueryParameter queryParameter); + List getTransactionExceptions(ExceptionTraceQueryParameter queryParameter); - List getSummarizedExceptionsInRange(ExceptionTraceQueryParameter queryParameter); + List getSummarizedExceptionsInRange(ExceptionTraceQueryParameter queryParameter); List getSummaries(ExceptionTraceQueryParameter queryParameter); diff --git a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/service/ExceptionTraceServiceImpl.java b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/service/ExceptionTraceServiceImpl.java index 0c373961c2eb..05710625d9f5 100644 --- a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/service/ExceptionTraceServiceImpl.java +++ b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/service/ExceptionTraceServiceImpl.java @@ -16,11 +16,11 @@ package com.navercorp.pinpoint.exceptiontrace.web.service; -import com.navercorp.pinpoint.exceptiontrace.common.model.ExceptionMetaData; import com.navercorp.pinpoint.exceptiontrace.web.dao.ExceptionTraceDao; import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceSummary; import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceValueView; import com.navercorp.pinpoint.exceptiontrace.web.util.ExceptionTraceQueryParameter; +import com.navercorp.pinpoint.exceptiontrace.web.view.ExceptionMetaDataView; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.stereotype.Service; @@ -44,7 +44,7 @@ public ExceptionTraceServiceImpl(ExceptionTraceDao exceptionTraceDao) { } @Override - public List getTransactionExceptions( + public List getTransactionExceptions( ExceptionTraceQueryParameter queryParameter ) { return applyQueryFunction( @@ -54,7 +54,7 @@ public List getTransactionExceptions( } @Override - public List getSummarizedExceptionsInRange(ExceptionTraceQueryParameter queryParameter) { + public List getSummarizedExceptionsInRange(ExceptionTraceQueryParameter queryParameter) { return applyQueryFunction( queryParameter, this::getSummarizedExeptionMetaDataList @@ -84,11 +84,11 @@ private List applyQueryFunction( return queryFunction.apply(queryParameter); } - private List getExeptionMetaDataList(ExceptionTraceQueryParameter queryParameter) { + private List getExeptionMetaDataList(ExceptionTraceQueryParameter queryParameter) { return exceptionTraceDao.getExceptions(queryParameter); } - private List getSummarizedExeptionMetaDataList(ExceptionTraceQueryParameter queryParameter) { + private List getSummarizedExeptionMetaDataList(ExceptionTraceQueryParameter queryParameter) { return exceptionTraceDao.getSummarizedExceptions(queryParameter); } diff --git a/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/view/ExceptionMetaDataView.java b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/view/ExceptionMetaDataView.java new file mode 100644 index 000000000000..bd7f93703830 --- /dev/null +++ b/exceptiontrace/exceptiontrace-web/src/main/java/com/navercorp/pinpoint/exceptiontrace/web/view/ExceptionMetaDataView.java @@ -0,0 +1,152 @@ +/* + * Copyright 2023 NAVER Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.navercorp.pinpoint.exceptiontrace.web.view; + +import com.navercorp.pinpoint.exceptiontrace.common.model.StackTraceElementWrapper; + +import java.util.List; + +/** + * @author intr3p1d + */ +public class ExceptionMetaDataView { + + private long timestamp; + + private String transactionId; + private String spanId; + private String exceptionId; + + private String applicationServiceType; + private String applicationName; + private String agentId; + private String uriTemplate; + + private String errorClassName; + private String errorMessage; + private int exceptionDepth; + + private List stackTrace; + + private String stackTraceHash; + + public ExceptionMetaDataView() { + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + public String getTransactionId() { + return transactionId; + } + + public void setTransactionId(String transactionId) { + this.transactionId = transactionId; + } + + public String getSpanId() { + return spanId; + } + + public void setSpanId(String spanId) { + this.spanId = spanId; + } + + public String getExceptionId() { + return exceptionId; + } + + public void setExceptionId(String exceptionId) { + this.exceptionId = exceptionId; + } + + public String getApplicationServiceType() { + return applicationServiceType; + } + + public void setApplicationServiceType(String applicationServiceType) { + this.applicationServiceType = applicationServiceType; + } + + public String getApplicationName() { + return applicationName; + } + + public void setApplicationName(String applicationName) { + this.applicationName = applicationName; + } + + public String getAgentId() { + return agentId; + } + + public void setAgentId(String agentId) { + this.agentId = agentId; + } + + public String getUriTemplate() { + return uriTemplate; + } + + public void setUriTemplate(String uriTemplate) { + this.uriTemplate = uriTemplate; + } + + public String getErrorClassName() { + return errorClassName; + } + + public void setErrorClassName(String errorClassName) { + this.errorClassName = errorClassName; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + public int getExceptionDepth() { + return exceptionDepth; + } + + public void setExceptionDepth(int exceptionDepth) { + this.exceptionDepth = exceptionDepth; + } + + public List getStackTrace() { + return stackTrace; + } + + public void setStackTrace(List stackTrace) { + this.stackTrace = stackTrace; + } + + public String getStackTraceHash() { + return stackTraceHash; + } + + public void setStackTraceHash(String stackTraceHash) { + this.stackTraceHash = stackTraceHash; + } +} 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 812cd56340b4..bb24d0d13874 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 @@ -9,6 +9,7 @@ import com.navercorp.pinpoint.exceptiontrace.web.entity.ExceptionTraceValueViewEntity; import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceSummary; import com.navercorp.pinpoint.exceptiontrace.web.model.ExceptionTraceValueView; +import com.navercorp.pinpoint.exceptiontrace.web.view.ExceptionMetaDataView; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Assertions; @@ -92,6 +93,52 @@ public void testEntityToModel() { } } + @Test + public void testEntityToView() { + Throwable throwable = new RuntimeException(); + + 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()); + + Assertions.assertEquals(expected.getApplicationServiceType(), actual.getApplicationServiceType()); + Assertions.assertEquals(expected.getApplicationName(), actual.getApplicationName()); + Assertions.assertEquals(expected.getAgentId(), actual.getAgentId()); + Assertions.assertEquals(expected.getUriTemplate(), actual.getUriTemplate()); + + Assertions.assertEquals(expected.getErrorClassName(), actual.getErrorClassName()); + Assertions.assertEquals(expected.getErrorMessage(), actual.getErrorMessage()); + Assertions.assertEquals(expected.getExceptionDepth(), actual.getExceptionDepth()); + + Assertions.assertEquals(expected.getStackTraceHash(), actual.getStackTraceHash()); + + + int size = throwable.getStackTrace().length; + + String classNames = expected.getStackTraceClassName(); + String fileNames = expected.getStackTraceFileName(); + String lineNumbers = expected.getStackTraceLineNumber(); + String methodNames = expected.getStackTraceMethodName(); + + List classNameIter = convertToList(classNames); + List fileNameIter = convertToList(fileNames); + List lineNumberIter = convertToList(lineNumbers); + List methodNameIter = convertToList(methodNames); + + 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()); + } + } + private ExceptionMetaDataEntity newExceptionMetaDataEntity(Throwable throwable) { ExceptionMetaDataEntity dataEntity = new ExceptionMetaDataEntity();