From bf68553857b7d2923ed0c957e48a0650c38f9e13 Mon Sep 17 00:00:00 2001 From: Jaehong-Kim Date: Mon, 24 Apr 2023 15:12:54 +0900 Subject: [PATCH] [#9892] Update agent proxy-user plugin for apache format update update --- agent-plugins/proxy-user/README.md | 71 ++++++++- .../plugin/proxy/user/UserRequestParser.java | 92 ++++++++---- .../proxy/user/UserRequestParserTest.java | 84 ++++++++--- .../agent-proxy-plugin-testweb/pom.xml | 38 +++++ .../plugin/AgentProxyPluginController.java | 136 ++++++++++++++++++ .../plugin/AgentProxyPluginTestStarter.java | 27 ++++ .../src/main/resources/application.yml | 12 ++ agent-testweb/pom.xml | 1 + .../proxy/DefaultProxyRequestRecorder.java | 6 +- 9 files changed, 421 insertions(+), 46 deletions(-) create mode 100644 agent-testweb/agent-proxy-plugin-testweb/pom.xml create mode 100644 agent-testweb/agent-proxy-plugin-testweb/src/main/java/com/pinpoint/test/plugin/AgentProxyPluginController.java create mode 100644 agent-testweb/agent-proxy-plugin-testweb/src/main/java/com/pinpoint/test/plugin/AgentProxyPluginTestStarter.java create mode 100644 agent-testweb/agent-proxy-plugin-testweb/src/main/resources/application.yml diff --git a/agent-plugins/proxy-user/README.md b/agent-plugins/proxy-user/README.md index b68e385358bd..8c1eef8d40b5 100644 --- a/agent-plugins/proxy-user/README.md +++ b/agent-plugins/proxy-user/README.md @@ -7,10 +7,79 @@ pinpoint.config #### HTTP headers option. ~~~ # User-specified HTTP headers -# e.g. profiler.proxy.http.headers=X-Trace, X-Request +# Supports apache and nginx formats. +# e.g. profiler.proxy.http.headers=X-Trace, X-Request, X-ApacheLB, X-SSL-nginx profiler.proxy.http.headers= ~~~ +### Apache HTTP Server + +* [http://httpd.apache.org/docs/2.4/en/mod/mod\_headers.html](http://httpd.apache.org/docs/2.4/en/mod/mod_headers.html) + +Add HTTP header. + +```text +X-ApacheLB: t=991424704447256 D=3775428 +``` + +e.g. + +httpd.conf + +```text + +... +RequestHeader set X-ApacheLB "%t %D" +... + +``` + +**%t is required value.** + +### Nginx + +* [http://nginx.org/en/docs/http/ngx\_http\_core\_module.html](http://nginx.org/en/docs/http/ngx_http_core_module.html) +* [http://nginx.org/en/docs/http/ngx\_http\_proxy\_module.html\#proxy\_set\_header](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header) + +Add HTTP header. + +```text +X-SSL-nginx: t=1504248328.423 D=0.123 +``` + +e.g. + +nginx.conf + +```text +... + server { + listen 9080; + server_name localhost; + + location / { + ... + set $pinpoint_proxy_header "t=$msec D=$request_time"; + proxy_set_header X-SSL-nginx $pinpoint_proxy_header; + } + } +... +``` + +or + +```text +http { +... + + proxy_set_header X-SSL-nginx t=$msec; + +... +} +``` + +**t=$msec is required value.** + ### Mobile app Add HTTP header. ~~~ diff --git a/agent-plugins/proxy-user/src/main/java/com/navercorp/pinpoint/agent/plugin/proxy/user/UserRequestParser.java b/agent-plugins/proxy-user/src/main/java/com/navercorp/pinpoint/agent/plugin/proxy/user/UserRequestParser.java index 9e46b46b9a71..3195dd2ccef2 100644 --- a/agent-plugins/proxy-user/src/main/java/com/navercorp/pinpoint/agent/plugin/proxy/user/UserRequestParser.java +++ b/agent-plugins/proxy-user/src/main/java/com/navercorp/pinpoint/agent/plugin/proxy/user/UserRequestParser.java @@ -27,6 +27,9 @@ import java.util.List; public class UserRequestParser implements ProxyRequestParser { + static final String PREFIX_RECEIVED = "t="; + static final String PREFIX_DURATION = "D="; + private List headerNameList = Collections.emptyList(); @Override @@ -44,61 +47,100 @@ public void init(ProfilerConfig profilerConfig) { if (profilerConfig == null) { return; } - this.headerNameList = profilerConfig.readList(UserRequestConstants.USER_PROXY_HEADER_NAME_LIST); + headerNameList = profilerConfig.readList(UserRequestConstants.USER_PROXY_HEADER_NAME_LIST); } @Override public ProxyRequestHeader parseHeader(String name, String value) { final ProxyRequestHeaderBuilder header = new ProxyRequestHeaderBuilder(); header.setApp(name); - for (String token : StringUtils.tokenizeToStringList(value, " ")) { - if (token.startsWith("t=")) { - final long receivedTimeMillis = toReceivedTimeMillis(token.substring(2)); - if (receivedTimeMillis > 0) { - header.setReceivedTimeMillis(receivedTimeMillis); - header.setValid(true); - } else { - header.setValid(false); - header.setCause("invalid received time"); - return header.build(); - } - } else if (token.startsWith("D=")) { - final long durationTimeMicroseconds = toDurationTimeMicros(token.substring(2)); - if (durationTimeMicroseconds > 0) { - header.setDurationTimeMicroseconds((int) durationTimeMicroseconds); - } + + final List tokenList = StringUtils.tokenizeToStringList(value, " "); + final String receivedTimeValue = findValue(tokenList, PREFIX_RECEIVED); + if (receivedTimeValue != null) { + final long receivedTimeMillis = toReceivedTimeMillis(receivedTimeValue); + if (receivedTimeMillis > 0) { + header.setReceivedTimeMillis(receivedTimeMillis); + header.setValid(true); + } else { + header.setValid(false); + header.setCause("invalid received time"); + return header.build(); + } + } else { + header.setValid(false); + header.setCause("not found received time"); + return header.build(); + } + final String durationTimeValue = findValue(tokenList, PREFIX_DURATION); + if (durationTimeValue != null) { + final long durationTimeMicroseconds = toDurationTimeMicros(durationTimeValue); + if (durationTimeMicroseconds > 0) { + header.setDurationTimeMicroseconds((int) durationTimeMicroseconds); } } return header.build(); } - public long toReceivedTimeMillis(final String value) { + String findValue(List tokenList, String prefix) { + for (String token : tokenList) { + if (token.startsWith(prefix)) { + return token.substring(prefix.length()); + } + } + return null; + } + + long toReceivedTimeMillis(final String value) { if (value == null) { return 0; } final int length = value.length(); + if (length < 13) { + return 0; + } + if (length >= 16) { + // apache - microseconds + return NumberUtils.parseLong(value.substring(0, length - 3), 0); + } final int millisPosition = value.lastIndexOf('.'); if (millisPosition != -1) { - if (length - millisPosition != 4) { + // nginx - seconds.milliseconds + // e.g. 1504230492.763 + if (millisPosition < 10 || length - millisPosition != 4) { // invalid format. return 0; } - String strValue = value.substring(0, millisPosition) + value.substring(millisPosition + 1); + final String strValue = value.substring(0, millisPosition) + value.substring(millisPosition + 1); return NumberUtils.parseLong(strValue, 0); - }else { - return NumberUtils.parseLong(value, 0); } + // app - milliseconds + return NumberUtils.parseLong(value, 0); } - public int toDurationTimeMicros(final String value) { + int toDurationTimeMicros(final String value) { if (value == null) { return 0; } - // to microseconds. - return NumberUtils.parseInteger(value, 0); + final int length = value.length(); + final int millisPosition = value.lastIndexOf('.'); + if (millisPosition != -1) { + // nginx + // e.g. 0.000 + if (length - millisPosition != 4) { + // invalid format. + return 0; + } + final String strValue = value.substring(0, millisPosition) + value.substring(millisPosition + 1); + return NumberUtils.parseInteger(strValue, 0) * 1000; + } else { + // apache, app + // to microseconds. + return NumberUtils.parseInteger(value, 0); + } } } \ No newline at end of file diff --git a/agent-plugins/proxy-user/src/test/java/com/navercorp/pinpoint/agent/plugin/proxy/user/UserRequestParserTest.java b/agent-plugins/proxy-user/src/test/java/com/navercorp/pinpoint/agent/plugin/proxy/user/UserRequestParserTest.java index 12d157c73171..1d959b693e3a 100644 --- a/agent-plugins/proxy-user/src/test/java/com/navercorp/pinpoint/agent/plugin/proxy/user/UserRequestParserTest.java +++ b/agent-plugins/proxy-user/src/test/java/com/navercorp/pinpoint/agent/plugin/proxy/user/UserRequestParserTest.java @@ -22,16 +22,38 @@ import static org.assertj.core.api.Assertions.assertThat; public class UserRequestParserTest { + static final String HEADER_NAME = "X-LB-SSL"; @Test public void parse() { UserRequestParser parser = new UserRequestParser(); String value = "t=1625212448369 D=123"; - ProxyRequestHeader proxyHttpHeader = parser.parseHeader("HEADER_NAME", value); + ProxyRequestHeader proxyHttpHeader = parser.parseHeader(HEADER_NAME, value); assertThat(proxyHttpHeader.isValid()).isTrue(); assertThat(1625212448369L).isEqualTo(proxyHttpHeader.getReceivedTimeMillis()); assertThat(123L).isEqualTo(proxyHttpHeader.getDurationTimeMicroseconds()); - assertThat("HEADER_NAME").isEqualTo(proxyHttpHeader.getApp()); + assertThat(HEADER_NAME).isEqualTo(proxyHttpHeader.getApp()); + assertThat(-1).isEqualTo(proxyHttpHeader.getIdlePercent()); + assertThat(-1).isEqualTo(proxyHttpHeader.getBusyPercent()); + + // apache + final long currentTimeMillis = System.currentTimeMillis(); + value = "t=" + currentTimeMillis + "999" + " D=12345"; + proxyHttpHeader = parser.parseHeader(HEADER_NAME, value); + assertThat(proxyHttpHeader.isValid()).isTrue(); + assertThat(currentTimeMillis).isEqualTo(proxyHttpHeader.getReceivedTimeMillis()); + assertThat(12345).isEqualTo(proxyHttpHeader.getDurationTimeMicroseconds()); + assertThat(HEADER_NAME).isEqualTo(proxyHttpHeader.getApp()); + assertThat(-1).isEqualTo(proxyHttpHeader.getIdlePercent()); + assertThat(-1).isEqualTo(proxyHttpHeader.getBusyPercent()); + + // nginx + value = "t=1504248328.423 D=0.123"; + proxyHttpHeader = parser.parseHeader(HEADER_NAME, value); + assertThat(proxyHttpHeader.isValid()).isTrue(); + assertThat(1504248328423L).isEqualTo(proxyHttpHeader.getReceivedTimeMillis()); + assertThat(123000L).isEqualTo(proxyHttpHeader.getDurationTimeMicroseconds()); + assertThat(HEADER_NAME).isEqualTo(proxyHttpHeader.getApp()); assertThat(-1).isEqualTo(proxyHttpHeader.getIdlePercent()); assertThat(-1).isEqualTo(proxyHttpHeader.getBusyPercent()); } @@ -40,10 +62,31 @@ public void parse() { public void parseOnlyReceivedTime() { UserRequestParser parser = new UserRequestParser(); String value = "t=1625212448369"; - ProxyRequestHeader proxyHttpHeader = parser.parseHeader("HEADER_NAME", value); + ProxyRequestHeader proxyHttpHeader = parser.parseHeader(HEADER_NAME, value); assertThat(proxyHttpHeader.isValid()).isTrue(); assertThat(1625212448369L).isEqualTo(proxyHttpHeader.getReceivedTimeMillis()); assertThat(-1).isEqualTo(proxyHttpHeader.getDurationTimeMicroseconds()); + assertThat(HEADER_NAME).isEqualTo(proxyHttpHeader.getApp()); + assertThat(-1).isEqualTo(proxyHttpHeader.getIdlePercent()); + assertThat(-1).isEqualTo(proxyHttpHeader.getBusyPercent()); + + // apache + final long currentTimeMillis = System.currentTimeMillis(); + value = "t=" + currentTimeMillis + "999"; + proxyHttpHeader = parser.parseHeader(HEADER_NAME, value); + assertThat(currentTimeMillis).isEqualTo(proxyHttpHeader.getReceivedTimeMillis()); + assertThat(-1).isEqualTo(proxyHttpHeader.getDurationTimeMicroseconds()); + assertThat(HEADER_NAME).isEqualTo(proxyHttpHeader.getApp()); + assertThat(-1).isEqualTo(proxyHttpHeader.getIdlePercent()); + assertThat(-1).isEqualTo(proxyHttpHeader.getBusyPercent()); + + // nginx + value = "t=1504248328.423"; + proxyHttpHeader = parser.parseHeader(HEADER_NAME, value); + assertThat(proxyHttpHeader.isValid()).isTrue(); + assertThat(1504248328423L).isEqualTo(proxyHttpHeader.getReceivedTimeMillis()); + assertThat(-1).isEqualTo(proxyHttpHeader.getDurationTimeMicroseconds()); + assertThat(HEADER_NAME).isEqualTo(proxyHttpHeader.getApp()); assertThat(-1).isEqualTo(proxyHttpHeader.getIdlePercent()); assertThat(-1).isEqualTo(proxyHttpHeader.getBusyPercent()); } @@ -52,26 +95,35 @@ public void parseOnlyReceivedTime() { public void parseNotFoundReceived() { UserRequestParser parser = new UserRequestParser(); String value = "D=123"; - ProxyRequestHeader proxyHttpHeader = parser.parseHeader("HEADER_NAME", value); + ProxyRequestHeader proxyHttpHeader = parser.parseHeader(HEADER_NAME, value); assertThat(proxyHttpHeader.isValid()).isFalse(); } - @Test - public void parseReceivedSeconds() { - UserRequestParser parser = new UserRequestParser(); - String value = "t=1625212448.369"; - ProxyRequestHeader proxyHttpHeader = parser.parseHeader("HEADER_NAME", value); - assertThat(1625212448369L).isEqualTo(proxyHttpHeader.getReceivedTimeMillis()); - assertThat(-1).isEqualTo(proxyHttpHeader.getDurationTimeMicroseconds()); - assertThat(-1).isEqualTo(proxyHttpHeader.getIdlePercent()); - assertThat(-1).isEqualTo(proxyHttpHeader.getBusyPercent()); - } - @Test public void parseInvalidReceived() { UserRequestParser parser = new UserRequestParser(); String value = "t=1625212448:369"; - ProxyRequestHeader proxyHttpHeader = parser.parseHeader("HEADER_NAME", value); + ProxyRequestHeader proxyHttpHeader = parser.parseHeader(HEADER_NAME, value); + assertThat(proxyHttpHeader.isValid()).isFalse(); + + value = "t=alpha-1625212448369"; + proxyHttpHeader = parser.parseHeader(HEADER_NAME, value); + assertThat(proxyHttpHeader.isValid()).isFalse(); + + value = "t=-1625212448369"; + proxyHttpHeader = parser.parseHeader(HEADER_NAME, value); + assertThat(proxyHttpHeader.isValid()).isFalse(); + + value = "t=1000"; + proxyHttpHeader = parser.parseHeader(HEADER_NAME, value); + assertThat(proxyHttpHeader.isValid()).isFalse(); + + value = "t=-16252124483691784578975972957897594795479379"; + proxyHttpHeader = parser.parseHeader(HEADER_NAME, value); + assertThat(proxyHttpHeader.isValid()).isFalse(); + + value = "t=123.456"; + proxyHttpHeader = parser.parseHeader(HEADER_NAME, value); assertThat(proxyHttpHeader.isValid()).isFalse(); } } \ No newline at end of file diff --git a/agent-testweb/agent-proxy-plugin-testweb/pom.xml b/agent-testweb/agent-proxy-plugin-testweb/pom.xml new file mode 100644 index 000000000000..abe2862a8e0f --- /dev/null +++ b/agent-testweb/agent-proxy-plugin-testweb/pom.xml @@ -0,0 +1,38 @@ + + + + 4.0.0 + + com.navercorp.pinpoint + pinpoint-agent-testweb + 2.6.0-SNAPSHOT + + + pinpoint-agent-proxy-plugin-testweb + + jar + + + + ${pinpoint.agent.default.jvmargument} + + + + + + org.springframework.boot + spring-boot-starter-webflux + + + org.springframework.boot + spring-boot-autoconfigure + + + com.navercorp.pinpoint + pinpoint-agent-testweb-commons + + + + \ No newline at end of file diff --git a/agent-testweb/agent-proxy-plugin-testweb/src/main/java/com/pinpoint/test/plugin/AgentProxyPluginController.java b/agent-testweb/agent-proxy-plugin-testweb/src/main/java/com/pinpoint/test/plugin/AgentProxyPluginController.java new file mode 100644 index 000000000000..50f1a13facbe --- /dev/null +++ b/agent-testweb/agent-proxy-plugin-testweb/src/main/java/com/pinpoint/test/plugin/AgentProxyPluginController.java @@ -0,0 +1,136 @@ +/* + * Copyright 2020 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.pinpoint.test.plugin; + +import com.pinpoint.test.common.view.ApiLinkPage; +import com.pinpoint.test.common.view.HrefTag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpMethod; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.result.method.RequestMappingInfo; +import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping; +import reactor.core.publisher.Mono; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +@RestController +public class AgentProxyPluginController { + + private final RequestMappingHandlerMapping handlerMapping; + + @Autowired + public AgentProxyPluginController(RequestMappingHandlerMapping handlerMapping) { + this.handlerMapping = handlerMapping; + } + + @GetMapping("/") + String welcome() { + Map handlerMethods = this.handlerMapping.getHandlerMethods(); + List list = new ArrayList<>(); + for (RequestMappingInfo info : handlerMethods.keySet()) { + for (String path : info.getDirectPaths()) { + list.add(HrefTag.of(path)); + } + } + list.sort(Comparator.comparing(HrefTag::getPath)); + return new ApiLinkPage("agent-proxy-plugin-testweb") + .addHrefTag(list) + .build(); + } + + @GetMapping("/proxy/apache") + public Mono proxyApache() { + final String proxyHeaderValue = "t=" + System.currentTimeMillis() + "999" + " D=12345"; + + WebClient client = WebClient.create("http://localhost:18080"); + WebClient.ResponseSpec response = client.method(HttpMethod.GET) + .uri("") + .header("Pinpoint-ProxyApache", proxyHeaderValue) + .retrieve(); + return response.bodyToMono(String.class); + } + + @GetMapping("/proxy/nginx") + public Mono proxyNginx() { + String timestamp = String.valueOf(System.currentTimeMillis()); + timestamp = timestamp.substring(0, timestamp.length() - 3) + "." + timestamp.substring(timestamp.length() - 3); + final String proxyHeaderValue = "t=" + timestamp + " D=0.000"; + + WebClient client = WebClient.create("http://localhost:18080"); + WebClient.ResponseSpec response = client.method(HttpMethod.GET) + .uri("") + .header("Pinpoint-ProxyNginx", proxyHeaderValue) + .retrieve(); + return response.bodyToMono(String.class); + } + + @GetMapping("/proxy/app") + public Mono proxyApp() { + final String proxyHeaderValue = "t=" + String.valueOf(System.currentTimeMillis()) + " app=foo-bar"; + + WebClient client = WebClient.create("http://localhost:18080"); + WebClient.ResponseSpec response = client.method(HttpMethod.GET) + .uri("") + .header("Pinpoint-ProxyApp", proxyHeaderValue) + .retrieve(); + return response.bodyToMono(String.class); + } + + @GetMapping("/proxy/user/apache") + public Mono proxyUserApache() { + final String proxyHeaderValue = "t=" + System.currentTimeMillis() + "999" + " D=12345"; + + WebClient client = WebClient.create("http://localhost:18080"); + WebClient.ResponseSpec response = client.method(HttpMethod.GET) + .uri("") + .header("X-Request", proxyHeaderValue) + .retrieve(); + return response.bodyToMono(String.class); + } + + @GetMapping("/proxy/user/nginx") + public Mono proxyUserNginx() { + String timestamp = String.valueOf(System.currentTimeMillis()); + timestamp = timestamp.substring(0, timestamp.length() - 3) + "." + timestamp.substring(timestamp.length() - 3); + final String proxyHeaderValue = "t=" + timestamp + " D=0.000"; + + WebClient client = WebClient.create("http://localhost:18080"); + WebClient.ResponseSpec response = client.method(HttpMethod.GET) + .uri("") + .header("X-Request", proxyHeaderValue) + .retrieve(); + return response.bodyToMono(String.class); + } + + @GetMapping("/proxy/user/app") + public Mono proxyUserApp() { + final String proxyHeaderValue = "t=" + String.valueOf(System.currentTimeMillis()); + + WebClient client = WebClient.create("http://localhost:18080"); + WebClient.ResponseSpec response = client.method(HttpMethod.GET) + .uri("") + .header("X-Request", proxyHeaderValue) + .retrieve(); + return response.bodyToMono(String.class); + } +} diff --git a/agent-testweb/agent-proxy-plugin-testweb/src/main/java/com/pinpoint/test/plugin/AgentProxyPluginTestStarter.java b/agent-testweb/agent-proxy-plugin-testweb/src/main/java/com/pinpoint/test/plugin/AgentProxyPluginTestStarter.java new file mode 100644 index 000000000000..a066dd1f0a8d --- /dev/null +++ b/agent-testweb/agent-proxy-plugin-testweb/src/main/java/com/pinpoint/test/plugin/AgentProxyPluginTestStarter.java @@ -0,0 +1,27 @@ +/* + * Copyright 2020 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.pinpoint.test.plugin; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AgentProxyPluginTestStarter { + public static void main(String[] args) { + SpringApplication.run(AgentProxyPluginTestStarter.class, args); + } +} \ No newline at end of file diff --git a/agent-testweb/agent-proxy-plugin-testweb/src/main/resources/application.yml b/agent-testweb/agent-proxy-plugin-testweb/src/main/resources/application.yml new file mode 100644 index 000000000000..63e910045a4b --- /dev/null +++ b/agent-testweb/agent-proxy-plugin-testweb/src/main/resources/application.yml @@ -0,0 +1,12 @@ +# Defined in commandlineArgument of agent-test pom.xml + +server: + port: 18080 + +logging: + level: + root: info + +springdoc: + swagger-ui: + path: / \ No newline at end of file diff --git a/agent-testweb/pom.xml b/agent-testweb/pom.xml index a5e6d1eceb27..b9d3f0c63f70 100644 --- a/agent-testweb/pom.xml +++ b/agent-testweb/pom.xml @@ -80,6 +80,7 @@ kafka-streams-testweb cassandra3-plugin-testweb cassandra4-plugin-testweb + agent-proxy-plugin-testweb diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/recorder/proxy/DefaultProxyRequestRecorder.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/recorder/proxy/DefaultProxyRequestRecorder.java index 94089ec197f7..2f8e97b078e6 100644 --- a/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/recorder/proxy/DefaultProxyRequestRecorder.java +++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/recorder/proxy/DefaultProxyRequestRecorder.java @@ -19,14 +19,12 @@ import com.navercorp.pinpoint.bootstrap.context.SpanRecorder; import com.navercorp.pinpoint.bootstrap.plugin.proxy.ProxyRequestRecorder; import com.navercorp.pinpoint.bootstrap.plugin.request.RequestAdaptor; - -import java.util.Objects; - import com.navercorp.pinpoint.common.util.StringUtils; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.util.List; +import java.util.Objects; /** * @author jaehong.kim