diff --git a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractor.java b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractor.java index dc49ee641fc8..aa2414db1e17 100644 --- a/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractor.java +++ b/instrumentation-api-semconv/src/main/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractor.java @@ -59,6 +59,10 @@ public void onEnd( String peerName = attributesGetter.getPeerName(request); String peerService = mapToPeerService(peerName); + if (peerService == null) { + String sockPeerName = attributesGetter.getSockPeerName(request, response); + peerService = mapToPeerService(sockPeerName); + } if (peerService != null) { attributes.put(SemanticAttributes.PEER_SERVICE, peerService); } diff --git a/instrumentation-api-semconv/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractorTest.java b/instrumentation-api-semconv/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractorTest.java index 97d755f16a24..4d0206070038 100644 --- a/instrumentation-api-semconv/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractorTest.java +++ b/instrumentation-api-semconv/src/test/java/io/opentelemetry/instrumentation/api/instrumenter/net/PeerServiceAttributesExtractorTest.java @@ -10,6 +10,8 @@ import static org.assertj.core.api.Assertions.entry; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import io.opentelemetry.api.common.Attributes; @@ -89,6 +91,33 @@ void shouldSetPeerNameIfItMatches() { AttributesBuilder endAttributes = Attributes.builder(); underTest.onEnd(endAttributes, context, "request", "response", null); + // then + assertThat(startAttributes.build()).isEmpty(); + assertThat(endAttributes.build()) + .containsOnly(entry(SemanticAttributes.PEER_SERVICE, "myService")); + verify(netAttributesExtractor, never()).getSockPeerName(any(), any()); + } + + @Test + void shouldSetSockPeerNameIfItMatchesAndNoPeerNameProvided() { + // given + Map peerServiceMapping = new HashMap<>(); + peerServiceMapping.put("example.com", "myService"); + peerServiceMapping.put("1.2.3.4", "someOtherService"); + + PeerServiceAttributesExtractor underTest = + new PeerServiceAttributesExtractor<>(netAttributesExtractor, peerServiceMapping); + + when(netAttributesExtractor.getSockPeerName(any(), any())).thenReturn("example.com"); + + Context context = Context.root(); + + // when + AttributesBuilder startAttributes = Attributes.builder(); + underTest.onStart(startAttributes, context, "request"); + AttributesBuilder endAttributes = Attributes.builder(); + underTest.onEnd(endAttributes, context, "request", "response", null); + // then assertThat(startAttributes.build()).isEmpty(); assertThat(endAttributes.build())