Skip to content

Commit 38ae66d

Browse files
authored
Update http dependency name (#1884)
1 parent 6cfcef6 commit 38ae66d

File tree

13 files changed

+236
-18
lines changed

13 files changed

+236
-18
lines changed

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/exporter/Exporter.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,11 @@ private void exportRemoteDependency(SpanData span, boolean inProc) {
299299
private static String getDependencyName(SpanData span) {
300300
String name = span.getName();
301301

302+
String method = span.getAttributes().get(SemanticAttributes.HTTP_METHOD);
303+
if (method == null) {
304+
return name;
305+
}
306+
302307
if (!DEFAULT_HTTP_SPAN_NAMES.contains(name)) {
303308
return name;
304309
}
@@ -309,7 +314,10 @@ private static String getDependencyName(SpanData span) {
309314
}
310315

311316
String path = UrlParser.getPathFromUrl(url);
312-
return path != null ? path : name;
317+
if (path == null) {
318+
return name;
319+
}
320+
return path.isEmpty() ? method + " /" : method + " " + path;
313321
}
314322

315323
private static void applySemanticConventions(

agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/exporter/UrlParser.java

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,68 @@
2121

2222
package com.microsoft.applicationinsights.agent.internal.exporter;
2323

24+
import org.checkerframework.checker.nullness.qual.Nullable;
25+
2426
class UrlParser {
2527

2628
/**
2729
* Returns the path portion of the url.
2830
*
2931
* <p>Returns {@code null} if the path cannot be extracted from url for any reason.
3032
*/
33+
@Nullable
3134
static String getPathFromUrl(String url) {
32-
// TODO implement something efficient and add tests
33-
return null;
35+
36+
int schemeEndIndex = url.indexOf(':');
37+
if (schemeEndIndex == -1) {
38+
// not a valid url
39+
return null;
40+
}
41+
42+
int len = url.length();
43+
if (schemeEndIndex + 2 < len
44+
&& url.charAt(schemeEndIndex + 1) == '/'
45+
&& url.charAt(schemeEndIndex + 2) == '/') {
46+
// has authority component
47+
// look for
48+
// '/' - start of path
49+
// '?' or end of string - empty path
50+
int pathStartIndex = -1;
51+
for (int i = schemeEndIndex + 3; i < len; i++) {
52+
char c = url.charAt(i);
53+
if (c == '/') {
54+
pathStartIndex = i;
55+
break;
56+
} else if (c == '?' || c == '#') {
57+
// empty path
58+
return "";
59+
}
60+
}
61+
if (pathStartIndex == -1) {
62+
// end of the url was reached while scanning for the beginning of the path
63+
// which means the path is empty
64+
return "";
65+
}
66+
int pathEndIndex = getPathEndIndex(url, pathStartIndex + 1);
67+
return url.substring(pathStartIndex, pathEndIndex);
68+
} else {
69+
// has no authority, path starts right away
70+
int pathStartIndex = schemeEndIndex + 1;
71+
int pathEndIndex = getPathEndIndex(url, pathStartIndex);
72+
return url.substring(pathStartIndex, pathEndIndex);
73+
}
74+
}
75+
76+
// returns the ending index of the path component (exclusive)
77+
private static int getPathEndIndex(String url, int startIndex) {
78+
int len = url.length();
79+
for (int i = startIndex; i < len; i++) {
80+
char c = url.charAt(i);
81+
if (c == '?' || c == '#') {
82+
return i;
83+
}
84+
}
85+
return len;
3486
}
3587

3688
private UrlParser() {}
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
/*
2+
* ApplicationInsights-Java
3+
* Copyright (c) Microsoft Corporation
4+
* All rights reserved.
5+
*
6+
* MIT License
7+
* Permission is hereby granted, free of charge, to any person obtaining a copy of this
8+
* software and associated documentation files (the ""Software""), to deal in the Software
9+
* without restriction, including without limitation the rights to use, copy, modify, merge,
10+
* publish, distribute, sublicense, and/or sell copies of the Software, and to permit
11+
* persons to whom the Software is furnished to do so, subject to the following conditions:
12+
* The above copyright notice and this permission notice shall be included in all copies or
13+
* substantial portions of the Software.
14+
* THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
15+
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
16+
* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
17+
* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
18+
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
19+
* DEALINGS IN THE SOFTWARE.
20+
*/
21+
22+
package com.microsoft.applicationinsights.agent.internal.exporter;
23+
24+
import static org.assertj.core.api.Assertions.assertThat;
25+
26+
import org.junit.jupiter.api.Test;
27+
28+
public class UrlParserTest {
29+
30+
@Test
31+
public void testGetPathFromUrl() {
32+
assertThat(UrlParser.getPathFromUrl("https://localhost")).isEqualTo("");
33+
assertThat(UrlParser.getPathFromUrl("https://localhost/")).isEqualTo("/");
34+
assertThat(UrlParser.getPathFromUrl("https://localhost/path")).isEqualTo("/path");
35+
assertThat(UrlParser.getPathFromUrl("https://localhost/path/")).isEqualTo("/path/");
36+
assertThat(UrlParser.getPathFromUrl("https://localhost/more/path")).isEqualTo("/more/path");
37+
assertThat(UrlParser.getPathFromUrl("https://localhost/more/path/")).isEqualTo("/more/path/");
38+
39+
assertThat(UrlParser.getPathFromUrl("https://localhost?")).isEqualTo("");
40+
assertThat(UrlParser.getPathFromUrl("https://localhost/?")).isEqualTo("/");
41+
assertThat(UrlParser.getPathFromUrl("https://localhost/path?")).isEqualTo("/path");
42+
assertThat(UrlParser.getPathFromUrl("https://localhost/path/?")).isEqualTo("/path/");
43+
assertThat(UrlParser.getPathFromUrl("https://localhost/more/path?")).isEqualTo("/more/path");
44+
assertThat(UrlParser.getPathFromUrl("https://localhost/more/path/?")).isEqualTo("/more/path/");
45+
46+
assertThat(UrlParser.getPathFromUrl("https://localhost?query")).isEqualTo("");
47+
assertThat(UrlParser.getPathFromUrl("https://localhost/?query")).isEqualTo("/");
48+
assertThat(UrlParser.getPathFromUrl("https://localhost/path?query")).isEqualTo("/path");
49+
assertThat(UrlParser.getPathFromUrl("https://localhost/path/?query")).isEqualTo("/path/");
50+
assertThat(UrlParser.getPathFromUrl("https://localhost/more/path?query"))
51+
.isEqualTo("/more/path");
52+
assertThat(UrlParser.getPathFromUrl("https://localhost/more/path/?query"))
53+
.isEqualTo("/more/path/");
54+
55+
assertThat(UrlParser.getPathFromUrl("https://localhost#")).isEqualTo("");
56+
assertThat(UrlParser.getPathFromUrl("https://localhost/#")).isEqualTo("/");
57+
assertThat(UrlParser.getPathFromUrl("https://localhost/path#")).isEqualTo("/path");
58+
assertThat(UrlParser.getPathFromUrl("https://localhost/path/#")).isEqualTo("/path/");
59+
assertThat(UrlParser.getPathFromUrl("https://localhost/more/path#")).isEqualTo("/more/path");
60+
assertThat(UrlParser.getPathFromUrl("https://localhost/more/path/#")).isEqualTo("/more/path/");
61+
62+
assertThat(UrlParser.getPathFromUrl("https://localhost#fragment")).isEqualTo("");
63+
assertThat(UrlParser.getPathFromUrl("https://localhost/#fragment")).isEqualTo("/");
64+
assertThat(UrlParser.getPathFromUrl("https://localhost/path#fragment")).isEqualTo("/path");
65+
assertThat(UrlParser.getPathFromUrl("https://localhost/path/#fragment")).isEqualTo("/path/");
66+
assertThat(UrlParser.getPathFromUrl("https://localhost/more/path#fragment"))
67+
.isEqualTo("/more/path");
68+
assertThat(UrlParser.getPathFromUrl("https://localhost/more/path/#fragment"))
69+
.isEqualTo("/more/path/");
70+
}
71+
72+
@Test
73+
public void testGetPathFromUrlWithPort() {
74+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080")).isEqualTo("");
75+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/")).isEqualTo("/");
76+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/path")).isEqualTo("/path");
77+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/path/")).isEqualTo("/path/");
78+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/more/path"))
79+
.isEqualTo("/more/path");
80+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/more/path/"))
81+
.isEqualTo("/more/path/");
82+
83+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080?")).isEqualTo("");
84+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/?")).isEqualTo("/");
85+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/path?")).isEqualTo("/path");
86+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/path/?")).isEqualTo("/path/");
87+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/more/path?"))
88+
.isEqualTo("/more/path");
89+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/more/path/?"))
90+
.isEqualTo("/more/path/");
91+
92+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080?query")).isEqualTo("");
93+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/?query")).isEqualTo("/");
94+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/path?query")).isEqualTo("/path");
95+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/path/?query")).isEqualTo("/path/");
96+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/more/path?query"))
97+
.isEqualTo("/more/path");
98+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/more/path/?query"))
99+
.isEqualTo("/more/path/");
100+
101+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080#")).isEqualTo("");
102+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/#")).isEqualTo("/");
103+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/path#")).isEqualTo("/path");
104+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/path/#")).isEqualTo("/path/");
105+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/more/path#"))
106+
.isEqualTo("/more/path");
107+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/more/path/#"))
108+
.isEqualTo("/more/path/");
109+
110+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080#fragment")).isEqualTo("");
111+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/#fragment")).isEqualTo("/");
112+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/path#fragment")).isEqualTo("/path");
113+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/path/#fragment"))
114+
.isEqualTo("/path/");
115+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/more/path#fragment"))
116+
.isEqualTo("/more/path");
117+
assertThat(UrlParser.getPathFromUrl("https://localhost:8080/more/path/#fragment"))
118+
.isEqualTo("/more/path/");
119+
}
120+
121+
@Test
122+
public void testGetPathFromUrlWithNoAuthority() {
123+
assertThat(UrlParser.getPathFromUrl("https:")).isEqualTo("");
124+
assertThat(UrlParser.getPathFromUrl("https:/")).isEqualTo("/");
125+
assertThat(UrlParser.getPathFromUrl("https:/path")).isEqualTo("/path");
126+
assertThat(UrlParser.getPathFromUrl("https:/path/")).isEqualTo("/path/");
127+
assertThat(UrlParser.getPathFromUrl("https:/more/path")).isEqualTo("/more/path");
128+
assertThat(UrlParser.getPathFromUrl("https:/more/path/")).isEqualTo("/more/path/");
129+
130+
assertThat(UrlParser.getPathFromUrl("https:?")).isEqualTo("");
131+
assertThat(UrlParser.getPathFromUrl("https:/?")).isEqualTo("/");
132+
assertThat(UrlParser.getPathFromUrl("https:/path?")).isEqualTo("/path");
133+
assertThat(UrlParser.getPathFromUrl("https:/path/?")).isEqualTo("/path/");
134+
assertThat(UrlParser.getPathFromUrl("https:/more/path?")).isEqualTo("/more/path");
135+
assertThat(UrlParser.getPathFromUrl("https:/more/path/?")).isEqualTo("/more/path/");
136+
137+
assertThat(UrlParser.getPathFromUrl("https:?query")).isEqualTo("");
138+
assertThat(UrlParser.getPathFromUrl("https:/?query")).isEqualTo("/");
139+
assertThat(UrlParser.getPathFromUrl("https:/path?query")).isEqualTo("/path");
140+
assertThat(UrlParser.getPathFromUrl("https:/path/?query")).isEqualTo("/path/");
141+
assertThat(UrlParser.getPathFromUrl("https:/more/path?query")).isEqualTo("/more/path");
142+
assertThat(UrlParser.getPathFromUrl("https:/more/path/?query")).isEqualTo("/more/path/");
143+
144+
assertThat(UrlParser.getPathFromUrl("https:#")).isEqualTo("");
145+
assertThat(UrlParser.getPathFromUrl("https:/#")).isEqualTo("/");
146+
assertThat(UrlParser.getPathFromUrl("https:/path#")).isEqualTo("/path");
147+
assertThat(UrlParser.getPathFromUrl("https:/path/#")).isEqualTo("/path/");
148+
assertThat(UrlParser.getPathFromUrl("https:/more/path#")).isEqualTo("/more/path");
149+
assertThat(UrlParser.getPathFromUrl("https:/more/path/#")).isEqualTo("/more/path/");
150+
151+
assertThat(UrlParser.getPathFromUrl("https:#fragment")).isEqualTo("");
152+
assertThat(UrlParser.getPathFromUrl("https:/#fragment")).isEqualTo("/");
153+
assertThat(UrlParser.getPathFromUrl("https:/path#fragment")).isEqualTo("/path");
154+
assertThat(UrlParser.getPathFromUrl("https:/path/#fragment")).isEqualTo("/path/");
155+
assertThat(UrlParser.getPathFromUrl("https:/more/path#fragment")).isEqualTo("/more/path");
156+
assertThat(UrlParser.getPathFromUrl("https:/more/path/#fragment")).isEqualTo("/more/path/");
157+
}
158+
}

test/smoke/testApps/HttpClients/src/smokeTest/java/com/microsoft/applicationinsights/smoketestapp/HttpClientSmokeTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ private static void verify(String capturedUrl) throws Exception {
9191
assertTrue(telemetry.rd.getProperties().isEmpty());
9292
assertTrue(telemetry.rd.getSuccess());
9393

94-
assertEquals("HTTP GET", telemetry.rdd1.getName());
94+
assertEquals("GET /search", telemetry.rdd1.getName());
9595
assertEquals(capturedUrl, telemetry.rdd1.getData());
9696
assertEquals("Http", telemetry.rdd1.getType());
9797
assertEquals("www.bing.com", telemetry.rdd1.getTarget());

test/smoke/testApps/JMS/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/JmsControllerSpansDisabledTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public void doMostBasicTest() throws Exception {
4848

4949
Envelope rdEnvelope2 = getRequestEnvelope(rdList, "message process");
5050
Envelope rddEnvelope1 = getDependencyEnvelope(rddList, "message send");
51-
Envelope rddEnvelope2 = getDependencyEnvelope(rddList, "HTTP GET");
51+
Envelope rddEnvelope2 = getDependencyEnvelope(rddList, "GET /");
5252

5353
RequestData rd1 = (RequestData) ((Data<?>) rdEnvelope1.getData()).getBaseData();
5454
RequestData rd2 = (RequestData) ((Data<?>) rdEnvelope2.getData()).getBaseData();
@@ -74,7 +74,7 @@ public void doMostBasicTest() throws Exception {
7474
assertTrue(rd2.getProperties().isEmpty());
7575
assertTrue(rd2.getSuccess());
7676

77-
assertEquals("HTTP GET", rdd2.getName());
77+
assertEquals("GET /", rdd2.getName());
7878
assertEquals("https://www.bing.com", rdd2.getData());
7979
assertEquals("Http", rdd2.getType());
8080
assertEquals("www.bing.com", rdd2.getTarget());

test/smoke/testApps/JMS/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/JmsDisabledTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public void doMostBasicTest() throws Exception {
6767
}
6868
rdd = (RemoteDependencyData) ((Data<?>) rddEnvelope.getData()).getBaseData();
6969

70-
assertEquals("HTTP GET", rdd.getName());
70+
assertEquals("GET /", rdd.getName());
7171
assertEquals("https://www.bing.com", rdd.getData());
7272
assertTrue(rdd.getProperties().isEmpty());
7373
assertTrue(rdd.getSuccess());

test/smoke/testApps/JMS/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/JmsTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void doMostBasicTest() throws Exception {
4949
Envelope rdEnvelope2 = getRequestEnvelope(rdList, "message process");
5050
Envelope rddEnvelope1 = getDependencyEnvelope(rddList, "HelloController.sendMessage");
5151
Envelope rddEnvelope2 = getDependencyEnvelope(rddList, "message send");
52-
Envelope rddEnvelope3 = getDependencyEnvelope(rddList, "HTTP GET");
52+
Envelope rddEnvelope3 = getDependencyEnvelope(rddList, "GET /");
5353

5454
RequestData rd1 = (RequestData) ((Data<?>) rdEnvelope1.getData()).getBaseData();
5555
RequestData rd2 = (RequestData) ((Data<?>) rdEnvelope2.getData()).getBaseData();
@@ -84,7 +84,7 @@ public void doMostBasicTest() throws Exception {
8484
assertTrue(rd2.getProperties().isEmpty());
8585
assertTrue(rd2.getSuccess());
8686

87-
assertEquals("HTTP GET", rdd3.getName());
87+
assertEquals("GET /", rdd3.getName());
8888
assertEquals("https://www.bing.com", rdd3.getData());
8989
assertEquals("Http", rdd3.getType());
9090
assertEquals("www.bing.com", rdd3.getTarget());

test/smoke/testApps/Kafka/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/KafkaControllerSpansDisabledTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public void doMostBasicTest() throws Exception {
6464

6565
Envelope rdEnvelope2 = getRequestEnvelope(rdList, "mytopic process");
6666
Envelope rddEnvelope1 = getDependencyEnvelope(rddList, "mytopic send");
67-
Envelope rddEnvelope2 = getDependencyEnvelope(rddList, "HTTP GET");
67+
Envelope rddEnvelope2 = getDependencyEnvelope(rddList, "GET /");
6868

6969
RequestData rd1 = (RequestData) ((Data<?>) rdEnvelope1.getData()).getBaseData();
7070
RequestData rd2 = (RequestData) ((Data<?>) rdEnvelope2.getData()).getBaseData();
@@ -90,7 +90,7 @@ public void doMostBasicTest() throws Exception {
9090
assertTrue(rd2.getProperties().isEmpty());
9191
assertTrue(rd2.getSuccess());
9292

93-
assertEquals("HTTP GET", rdd2.getName());
93+
assertEquals("GET /", rdd2.getName());
9494
assertEquals("https://www.bing.com", rdd2.getData());
9595
assertEquals("Http", rdd2.getType());
9696
assertEquals("www.bing.com", rdd2.getTarget());

test/smoke/testApps/Kafka/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/KafkaDisabledTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public void doMostBasicTest() throws Exception {
8383
}
8484
rdd = (RemoteDependencyData) ((Data<?>) rddEnvelope.getData()).getBaseData();
8585

86-
assertEquals("HTTP GET", rdd.getName());
86+
assertEquals("GET /", rdd.getName());
8787
assertEquals("https://www.bing.com", rdd.getData());
8888
assertTrue(rdd.getProperties().isEmpty());
8989
assertTrue(rdd.getSuccess());

test/smoke/testApps/Kafka/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/KafkaTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public void doMostBasicTest() throws Exception {
6565
Envelope rdEnvelope2 = getRequestEnvelope(rdList, "mytopic process");
6666
Envelope rddEnvelope1 = getDependencyEnvelope(rddList, "HelloController.sendMessage");
6767
Envelope rddEnvelope2 = getDependencyEnvelope(rddList, "mytopic send");
68-
Envelope rddEnvelope3 = getDependencyEnvelope(rddList, "HTTP GET");
68+
Envelope rddEnvelope3 = getDependencyEnvelope(rddList, "GET /");
6969

7070
RequestData rd1 = (RequestData) ((Data<?>) rdEnvelope1.getData()).getBaseData();
7171
RequestData rd2 = (RequestData) ((Data<?>) rdEnvelope2.getData()).getBaseData();
@@ -101,7 +101,7 @@ public void doMostBasicTest() throws Exception {
101101
assertTrue(rd2.getSuccess());
102102
assertTrue(rd2.getMeasurements().containsKey("timeSinceEnqueued"));
103103

104-
assertEquals("HTTP GET", rdd3.getName());
104+
assertEquals("GET /", rdd3.getName());
105105
assertEquals("https://www.bing.com", rdd3.getData());
106106
assertEquals("Http", rdd3.getType());
107107
assertEquals("www.bing.com", rdd3.getTarget());

0 commit comments

Comments
 (0)