From 3f3382ca4b034d8e644f70b6da8c1fd88b8141fe Mon Sep 17 00:00:00 2001 From: Yongseok Kang Date: Thu, 1 Dec 2022 00:31:38 +0900 Subject: [PATCH] [#9380] add location field Fix intelliJ warning * Warning:(91, 29) 'StringBuilder sb' can be replaced with 'String' --- .../common/server/bo/ApiMetaDataBo.java | 4 ++ .../pinpoint/common/server/trace/Api.java | 48 ++++++++++++++++++- .../common/server/trace/DefaultApiParser.java | 7 ++- .../server/trace/DefaultApiParserTest.java | 23 +++++++++ .../web/vo/callstacks/RecordFactory.java | 7 ++- .../web/vo/callstacks/RecordFactoryTest.java | 22 +++++++++ 6 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 commons-server/src/test/java/com/navercorp/pinpoint/common/server/trace/DefaultApiParserTest.java diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/ApiMetaDataBo.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/ApiMetaDataBo.java index 9fb7ddc19a73c..234ccc7736d7c 100644 --- a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/ApiMetaDataBo.java +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/ApiMetaDataBo.java @@ -18,6 +18,7 @@ import com.navercorp.pinpoint.common.server.bo.serializer.metadata.MetaDataRowKey; import com.navercorp.pinpoint.common.util.LineNumber; +import com.navercorp.pinpoint.common.util.StringUtils; import java.util.Objects; @@ -120,6 +121,9 @@ public Builder(String agentId, long startTime, int apiId, int lineNumber, } public Builder setLocation(String location) { + if (StringUtils.isEmpty(location)) { + return this; + } this.location = location; return this; } diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/trace/Api.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/trace/Api.java index 307697fb0c797..f6baa213dbf8a 100644 --- a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/trace/Api.java +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/trace/Api.java @@ -1,6 +1,7 @@ package com.navercorp.pinpoint.common.server.trace; import com.navercorp.pinpoint.common.server.bo.MethodTypeEnum; +import com.navercorp.pinpoint.common.util.StringUtils; import java.util.Objects; @@ -9,8 +10,10 @@ public class Api { private final String className; private final String description; private final MethodTypeEnum methodTypeEnum; + private int lineNumber; + private String location; - public Api(String method, String className, String description, MethodTypeEnum methodTypeEnum) { + private Api(String method, String className, String description, MethodTypeEnum methodTypeEnum) { this.method = Objects.requireNonNull(method, "title"); this.className = Objects.requireNonNull(className, "className"); this.description = Objects.requireNonNull(description, "description"); @@ -32,4 +35,47 @@ public String getDescription() { public MethodTypeEnum getMethodTypeEnum() { return methodTypeEnum; } + + public int getLineNumber() { + return lineNumber; + } + + public String getLocation() { + return location; + } + + public static class Builder { + private final String method; + private final String className; + private final String description; + private final MethodTypeEnum methodTypeEnum; + private String location; + private int lineNumber; + + public Builder(String method, String className, String description, MethodTypeEnum methodTypeEnum) { + this.method = Objects.requireNonNull(method, "title"); + this.className = Objects.requireNonNull(className, "className"); + this.description = Objects.requireNonNull(description, "description"); + this.methodTypeEnum = Objects.requireNonNull(methodTypeEnum, "methodTypeEnum"); + this.lineNumber = 0; + this.location = null; + } + + public Builder setLocation(String location) { + this.location = location; + return this; + } + + public Builder setLineNumber(int lineNumber) { + this.lineNumber = lineNumber; + return this; + } + + public Api build() { + Api result = new Api(this.method, this.className, this.description, this.methodTypeEnum); + result.lineNumber = Math.max(this.lineNumber, 0); + result.location = StringUtils.defaultIfEmpty(this.location, ""); + return result; + } + } } diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/trace/DefaultApiParser.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/trace/DefaultApiParser.java index 50b145a8692c6..f2369f73cc9db 100644 --- a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/trace/DefaultApiParser.java +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/trace/DefaultApiParser.java @@ -28,12 +28,15 @@ public Api parse(ApiMetaDataBo apiMetadata) { String className = apiDescription.getSimpleClassName(); String apiInfo = apiDescription.getApiDescription(); - return new Api(method, className, apiInfo, MethodTypeEnum.DEFAULT); + return new Api.Builder(method, className, apiInfo, MethodTypeEnum.DEFAULT) + .setLineNumber(apiMetadata.getLineNumber()) + .setLocation(apiMetadata.getLocation()) + .build(); } catch (Exception ignored) { // ignore } String description = apiMetadata.getDescription(); - return new Api(description, "", description, apiMetadata.getMethodTypeEnum()); + return new Api.Builder(description, "", description, apiMetadata.getMethodTypeEnum()).build(); } } diff --git a/commons-server/src/test/java/com/navercorp/pinpoint/common/server/trace/DefaultApiParserTest.java b/commons-server/src/test/java/com/navercorp/pinpoint/common/server/trace/DefaultApiParserTest.java new file mode 100644 index 0000000000000..cc98b307739f4 --- /dev/null +++ b/commons-server/src/test/java/com/navercorp/pinpoint/common/server/trace/DefaultApiParserTest.java @@ -0,0 +1,23 @@ +package com.navercorp.pinpoint.common.server.trace; + +import com.navercorp.pinpoint.common.server.bo.ApiMetaDataBo; +import com.navercorp.pinpoint.common.server.bo.MethodTypeEnum; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DefaultApiParserTest { + @Test + public void testParse() { + ApiDescriptionParser apiDescriptionParser = new ApiDescriptionParser(); + DefaultApiParser dut = new DefaultApiParser(apiDescriptionParser); + ApiMetaDataBo expected = new ApiMetaDataBo.Builder("express-node-sample-id", 1669280767548L, 12, 169, MethodTypeEnum.DEFAULT, "express.Function.proto.get(path, callback)") + .setLocation("/Users/workspace/pinpoint/@pinpoint-naver-apm/pinpoint-agent-node/samples/express/src/routes/index.js") + .build(); + + Api actual = dut.parse(expected); + + assertThat(actual).extracting("method", "className", "description", "methodTypeEnum", "lineNumber", "location") + .contains("get(path, callback)", "proto", "express.Function.proto.get(path, callback)", MethodTypeEnum.DEFAULT, 169, "/Users/workspace/pinpoint/@pinpoint-naver-apm/pinpoint-agent-node/samples/express/src/routes/index.js"); + } +} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/vo/callstacks/RecordFactory.java b/web/src/main/java/com/navercorp/pinpoint/web/vo/callstacks/RecordFactory.java index 02d6663fa0769..fc96304a9c055 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/vo/callstacks/RecordFactory.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/vo/callstacks/RecordFactory.java @@ -220,11 +220,14 @@ private Api getApi(final Align align) { return parser.parse(apiMetaData); } // parse error - return new Api(apiInfo, "", apiInfo, apiMetaData.getMethodTypeEnum()); + return new Api.Builder(apiInfo, "", apiInfo, apiMetaData.getMethodTypeEnum()) + .setLineNumber(apiMetaData.getLineNumber()) + .setLocation(apiMetaData.getLocation()) + .build(); } else { AnnotationKey apiMetaDataError = getApiMetaDataError(align.getAnnotationBoList()); - return new Api(apiMetaDataError.getName(), "", "", MethodTypeEnum.DEFAULT); + return new Api.Builder(apiMetaDataError.getName(), "", "", MethodTypeEnum.DEFAULT).build(); } } diff --git a/web/src/test/java/com/navercorp/pinpoint/web/vo/callstacks/RecordFactoryTest.java b/web/src/test/java/com/navercorp/pinpoint/web/vo/callstacks/RecordFactoryTest.java index d0a81811d3e79..11b919a8d709c 100644 --- a/web/src/test/java/com/navercorp/pinpoint/web/vo/callstacks/RecordFactoryTest.java +++ b/web/src/test/java/com/navercorp/pinpoint/web/vo/callstacks/RecordFactoryTest.java @@ -22,6 +22,7 @@ import com.navercorp.pinpoint.loader.service.AnnotationKeyRegistryService; import com.navercorp.pinpoint.loader.service.ServiceTypeRegistryService; import com.navercorp.pinpoint.web.calltree.span.Align; +import com.navercorp.pinpoint.web.calltree.span.CallTreeNode; import com.navercorp.pinpoint.web.calltree.span.SpanAlign; import com.navercorp.pinpoint.web.service.AnnotationKeyMatcherService; import com.navercorp.pinpoint.web.service.ProxyRequestTypeRegistryService; @@ -89,4 +90,25 @@ public void getParameter_check_argument() { Assertions.assertEquals(exceptionRecord.getArguments(), "null"); } + // 0 = {CallTreeNode@12622} "{depth=0, child=true, sibling=false, align=SpanAlign{spanBo=5997054625569493, hasChild=true, meta=false, id=1, gap=0, depth=0, executionMilliseconds=574}}" + // 1 = {CallTreeNode@14600} "{depth=1, child=false, sibling=true, align=SpanEventAlign{spanBo=5997054625569493, spanEventBo={version=0, sequence=0, startElapsed=4, endElapsed=3, serviceType=6600, destinationId=localhost:3000, endPoint=localhost:3000, apiId=17, annotationBoList=[AnnotationBo{key=-1, value=/, isAuthorized=true}, AnnotationBo{key=13, value=ApiMetaDataBo{agentId='express-node-sample-id', startTime=1669746947722, apiId=17, apiInfo='express.Function.use(logger)', lineNumber=42, methodTypeEnum=DEFAULT, location='/Users/workspace/pinpoint/@pinpoint-naver-apm/pinpoint-agent-node/samples/express/src/app.js'}, isAuthorized=true}, AnnotationBo{key=12, value=express.Function.use(logger):42, isAuthorized=true}], depth=1, nextSpanId=-1, hasException=false, exceptionClass=null, nextAsyncId=0}, id=0, gap=4, depth=1, executionMilliseconds=3}}" + // 2 = {CallTreeNode@14601} "{depth=1, child=false, sibling=true, align=SpanEventAlign{spanBo=5997054625569493, spanEventBo={version=0, sequence=1, startElapsed=7, endElapsed=0, serviceType=6600, destinationId=localhost:3000, endPoint=localhost:3000, apiId=18, annotationBoList=[AnnotationBo{key=-1, value=/, isAuthorized=true}, AnnotationBo{key=13, value=ApiMetaDataBo{agentId='express-node-sample-id', startTime=1669746947722, apiId=18, apiInfo='express.Function.use(jsonParser)', lineNumber=43, methodTypeEnum=DEFAULT, location='/Users/workspace/pinpoint/@pinpoint-naver-apm/pinpoint-agent-node/samples/express/src/app.js'}, isAuthorized=true}, AnnotationBo{key=12, value=express.Function.use(jsonParser):43, isAuthorized=true}], depth=1, nextSpanId=-1, hasException=false, exceptionClass=null, nextAsyncId=0}, id=0, gap=0, depth=1, executionMilliseconds=0}}" + // 3 = {CallTreeNode@14602} "{depth=1, child=false, sibling=true, align=SpanEventAlign{spanBo=5997054625569493, spanEventBo={version=0, sequence=2, startElapsed=7, endElapsed=0, serviceType=6600, destinationId=localhost:3000, endPoint=localhost:3000, apiId=19, annotationBoList=[AnnotationBo{key=-1, value=/, isAuthorized=true}, AnnotationBo{key=13, value=ApiMetaDataBo{agentId='express-node-sample-id', startTime=1669746947722, apiId=19, apiInfo='express.Function.use(urlencodedParser)', lineNumber=44, methodTypeEnum=DEFAULT, location='/Users/workspace/pinpoint/@pinpoint-naver-apm/pinpoint-agent-node/samples/express/src/app.js'}, isAuthorized=true}, AnnotationBo{key=12, value=express.Function.use(urlencodedParser):44, isAuthorized=true}], depth=1, nextSpanId=-1, hasException=false, exceptionClass=null, nextAsyncId=0}, id=0, gap=0, depth=1, executionMilliseconds=0}}" + // 4 = {CallTreeNode@14603} "{depth=1, child=false, sibling=true, align=SpanEventAlign{spanBo=5997054625569493, spanEventBo={version=0, sequence=3, startElapsed=7, endElapsed=1, serviceType=6600, destinationId=localhost:3000, endPoint=localhost:3000, apiId=20, annotationBoList=[AnnotationBo{key=-1, value=/, isAuthorized=true}, AnnotationBo{key=13, value=ApiMetaDataBo{agentId='express-node-sample-id', startTime=1669746947722, apiId=20, apiInfo='express.Function.use(cookieParser)', lineNumber=45, methodTypeEnum=DEFAULT, location='/Users/workspace/pinpoint/@pinpoint-naver-apm/pinpoint-agent-node/samples/express/src/app.js'}, isAuthorized=true}, AnnotationBo{key=12, value=express.Function.use(cookieParser):45, isAuthorized=true}], depth=1, nextSpanId=-1, hasException=false, exceptionClass=null, nextAsyncId=0}, id=0, gap=0, depth=1, executionMilliseconds=1}}" + // 5 = {CallTreeNode@14604} "{depth=1, child=false, sibling=true, align=SpanEventAlign{spanBo=5997054625569493, spanEventBo={version=0, sequence=4, startElapsed=8, endElapsed=2, serviceType=6600, destinationId=localhost:3000, endPoint=localhost:3000, apiId=21, annotationBoList=[AnnotationBo{key=-1, value=/, isAuthorized=true}, AnnotationBo{key=13, value=ApiMetaDataBo{agentId='express-node-sample-id', startTime=1669746947722, apiId=21, apiInfo='express.Function.use(serveStatic)', lineNumber=46, methodTypeEnum=DEFAULT, location='/Users/workspace/pinpoint/@pinpoint-naver-apm/pinpoint-agent-node/samples/express/src/app.js'}, isAuthorized=true}, AnnotationBo{key=12, value=express.Function.use(serveStatic):46, isAuthorized=true}], depth=1, nextSpanId=-1, hasException=false, exceptionClass=null, nextAsyncId=0}, id=0, gap=0, depth=1, executionMilliseconds=2}}" + // 6 = {CallTreeNode@14605} "{depth=1, child=true, sibling=false, align=SpanEventAlign{spanBo=5997054625569493, spanEventBo={version=0, sequence=5, startElapsed=12, endElapsed=4, serviceType=6600, destinationId=localhost:3000, endPoint=localhost:3000, apiId=11, annotationBoList=[AnnotationBo{key=-1, value=/, isAuthorized=true}, AnnotationBo{key=13, value=ApiMetaDataBo{agentId='express-node-sample-id', startTime=1669746947722, apiId=11, apiInfo='express.Function.proto.get(path, callback)', lineNumber=24, methodTypeEnum=DEFAULT, location='/Users/workspace/pinpoint/@pinpoint-naver-apm/pinpoint-agent-node/samples/express/src/routes/index.js'}, isAuthorized=true}, AnnotationBo{key=12, value=express.Function.proto.get(path, callback):24, isAuthorized=true}], depth=1, nextSpanId=-1, hasException=false, exceptionClass=null, nextAsyncId=0}, id=0, gap=2, depth=1, executionMilliseconds=4}}" + // 7 = {CallTreeNode@14606} "{depth=2, child=true, sibling=true, align=SpanEventAlign{spanBo=5997054625569493, spanEventBo={version=0, sequence=6, startElapsed=13, endElapsed=0, serviceType=8200, destinationId=Redis, endPoint=127.0.0.1:6379, apiId=0, annotationBoList=[AnnotationBo{key=12, value=redis.set.call, isAuthorized=true}, AnnotationBo{key=13, value=ApiMetaDataBo{agentId='express-node-sample-id', startTime=1669747061820, apiId=0, apiInfo='redis.set.call', lineNumber=0, methodTypeEnum=DEFAULT, location='null'}, isAuthorized=true}], depth=2, nextSpanId=-1, hasException=false, exceptionClass=null, nextAsyncId=1}, id=0, gap=1, depth=2, executionMilliseconds=0}}" + // 8 = {CallTreeNode@14607} "{depth=3, child=true, sibling=false, align=SpanEventAlign{spanBo=5997054625569493, spanEventBo={version=0, sequence=0, startElapsed=0, endElapsed=0, serviceType=100, destinationId=null, endPoint=null, apiId=2, annotationBoList=[AnnotationBo{key=13, value=ApiMetaDataBo{agentId='express-node-sample-id', startTime=1669746947722, apiId=2, apiInfo='Asynchronous Invocation', lineNumber=0, methodTypeEnum=INVOCATION, location='null'}, isAuthorized=true}, AnnotationBo{key=10015, value=Asynchronous Invocation, isAuthorized=true}], depth=1, nextSpanId=-1, hasException=false, exceptionClass=null, nextAsyncId=0}, id=0, gap=0, depth=3, executionMilliseconds=0}}" + // 9 = {CallTreeNode@14608} "{depth=4, child=false, sibling=false, align=SpanEventAlign{spanBo=5997054625569493, spanEventBo={version=0, sequence=1, startElapsed=0, endElapsed=0, serviceType=8200, destinationId=Redis, endPoint=127.0.0.1:6379, apiId=0, annotationBoList=[AnnotationBo{key=12, value=redis.set.end, isAuthorized=true}, AnnotationBo{key=13, value=ApiMetaDataBo{agentId='express-node-sample-id', startTime=1669747061820, apiId=0, apiInfo='redis.set.end', lineNumber=0, methodTypeEnum=DEFAULT, location='null'}, isAuthorized=true}], depth=2, nextSpanId=8082279540288497, hasException=false, exceptionClass=null, nextAsyncId=0}, id=0, gap=0, depth=4, executionMilliseconds=0}}" + // 10 = {CallTreeNode@14609} "{depth=2, child=true, sibling=false, align=SpanEventAlign{spanBo=5997054625569493, spanEventBo={version=0, sequence=7, startElapsed=14, endElapsed=0, serviceType=8200, destinationId=Redis, endPoint=127.0.0.1:6379, apiId=0, annotationBoList=[AnnotationBo{key=12, value=redis.get.call, isAuthorized=true}, AnnotationBo{key=13, value=ApiMetaDataBo{agentId='express-node-sample-id', startTime=1669747061821, apiId=0, apiInfo='redis.get.call', lineNumber=0, methodTypeEnum=DEFAULT, location='null'}, isAuthorized=true}], depth=2, nextSpanId=-1, hasException=false, exceptionClass=null, nextAsyncId=2}, id=0, gap=1, depth=2, executionMilliseconds=0}}" + // 11 = {CallTreeNode@14610} "{depth=3, child=true, sibling=false, align=SpanEventAlign{spanBo=5997054625569493, spanEventBo={version=0, sequence=0, startElapsed=0, endElapsed=0, serviceType=100, destinationId=null, endPoint=null, apiId=2, annotationBoList=[AnnotationBo{key=13, value=ApiMetaDataBo{agentId='express-node-sample-id', startTime=1669746947722, apiId=2, apiInfo='Asynchronous Invocation', lineNumber=0, methodTypeEnum=INVOCATION, location='null'}, isAuthorized=true}, AnnotationBo{key=10015, value=Asynchronous Invocation, isAuthorized=true}], depth=1, nextSpanId=-1, hasException=false, exceptionClass=null, nextAsyncId=0}, id=0, gap=0, depth=3, executionMilliseconds=0}}" + // 12 = {CallTreeNode@14611} "{depth=4, child=false, sibling=false, align=SpanEventAlign{spanBo=5997054625569493, spanEventBo={version=0, sequence=1, startElapsed=0, endElapsed=0, serviceType=8200, destinationId=Redis, endPoint=127.0.0.1:6379, apiId=0, annotationBoList=[AnnotationBo{key=12, value=redis.get.end, isAuthorized=true}, AnnotationBo{key=13, value=ApiMetaDataBo{agentId='express-node-sample-id', startTime=1669747061821, apiId=0, apiInfo='redis.get.end', lineNumber=0, methodTypeEnum=DEFAULT, location='null'}, isAuthorized=true}], depth=2, nextSpanId=7264920545515817, hasException=false, exceptionClass=null, nextAsyncId=0}, id=0, gap=0, depth=4, executionMilliseconds=0}}" + @Test + public void testMakeRecord() { + RecordFactory dut = newRecordFactory(); + + CallTreeNode node = new CallTreeNode(null, new SpanAlign(new SpanBo())); +// CallTreeNode root = new CallTreeNode(null); +// dut.get(); + } } \ No newline at end of file