1717import io .opentelemetry .semconv .incubating .UrlIncubatingAttributes ;
1818import java .net .URI ;
1919import java .net .URISyntaxException ;
20+ import java .util .Map ;
2021import java .util .Optional ;
22+ import java .util .concurrent .ConcurrentHashMap ;
2123import org .apache .maven .execution .ExecutionListener ;
2224import org .apache .maven .execution .MavenSession ;
2325import org .eclipse .aether .transfer .AbstractTransferListener ;
@@ -39,6 +41,8 @@ public final class OtelTransferListener extends AbstractTransferListener {
3941
4042 private final OpenTelemetrySdkService openTelemetrySdkService ;
4143
44+ private final Map <String , Optional <URI >> repositoryURIs = new ConcurrentHashMap <>();
45+
4246 OtelTransferListener (SpanRegistry spanRegistry , OpenTelemetrySdkService openTelemetrySdkService ) {
4347 this .spanRegistry = spanRegistry ;
4448 this .openTelemetrySdkService = openTelemetrySdkService ;
@@ -64,8 +68,9 @@ public void transferInitiated(TransferEvent event) {
6468 httpRequestMethod = event .getRequestType ().name ();
6569 }
6670
67- String urlTemplate = event .getResource ().getRepositoryUrl ()
68- + "$groupId/$version/$artifactId-$version.$classifier" ;
71+ String urlTemplate =
72+ event .getResource ().getRepositoryUrl ()
73+ + "$groupId/$artifactId/$version/$artifactId-$version.$classifier" ;
6974
7075 String spanName = httpRequestMethod + " " + urlTemplate ;
7176
@@ -75,29 +80,33 @@ public void transferInitiated(TransferEvent event) {
7580 .spanBuilder (spanName )
7681 .setSpanKind (SpanKind .CLIENT )
7782 .setAttribute (HttpAttributes .HTTP_REQUEST_METHOD , httpRequestMethod )
78- .setAttribute (UrlAttributes .URL_PATH ,
83+ .setAttribute (
84+ UrlAttributes .URL_PATH ,
7985 event .getResource ().getRepositoryUrl () + event .getResource ().getResourceName ())
8086 .setAttribute (UrlIncubatingAttributes .URL_TEMPLATE , urlTemplate )
81- .setAttribute (MavenOtelSemanticAttributes . MAVEN_TRANSFER_TYPE ,
82- event .getRequestType ().name ());
83-
84- // TODO keep in cache the repositoryUrl parsing
85- Optional . ofNullable ( event . getResource (). getRepositoryUrl ())
86- . filter ( url -> ! url . isEmpty ())
87- . map ( str -> {
88- try {
89- return new URI (str );
90- } catch (URISyntaxException e ) {
91- return null ;
92- }
93- })
87+ .setAttribute (
88+ MavenOtelSemanticAttributes . MAVEN_TRANSFER_TYPE , event .getRequestType ().name ());
89+
90+ repositoryURIs
91+ . computeIfAbsent (
92+ event . getResource (). getRepositoryUrl (),
93+ str -> {
94+ try {
95+ return str . isBlank () ? Optional . empty () : Optional . of ( new URI (str ) );
96+ } catch (URISyntaxException e ) {
97+ return Optional . empty () ;
98+ }
99+ })
94100 .ifPresent (
95101 uri -> {
96- spanBuilder
97- .setAttribute (ServerAttributes .SERVER_ADDRESS , uri .getHost ());
102+ spanBuilder .setAttribute (ServerAttributes .SERVER_ADDRESS , uri .getHost ());
98103 if (uri .getPort () != -1 ) {
99104 spanBuilder .setAttribute (ServerAttributes .SERVER_PORT , uri .getPort ());
100105 }
106+ // prevent ever increasing size
107+ if (repositoryURIs .size () > 128 ) {
108+ repositoryURIs .clear ();
109+ }
101110 });
102111 spanRegistry .putSpan (spanBuilder .startSpan (), event );
103112 }
@@ -118,9 +127,7 @@ public void transferSucceeded(TransferEvent event) {
118127 public void transferFailed (TransferEvent event ) {
119128 logger .info ("OpenTelemetry: OtelTransferListener#transferFailed({})" , event );
120129
121- Optional .ofNullable (spanRegistry .removeSpan (event ))
122- .ifPresent (span -> fail (span , event ));
123-
130+ Optional .ofNullable (spanRegistry .removeSpan (event )).ifPresent (span -> fail (span , event ));
124131 }
125132
126133 @ Override
@@ -133,13 +140,13 @@ public void transferCorrupted(TransferEvent event) {
133140 void finish (Span span , TransferEvent event ) {
134141 switch (event .getRequestType ()) {
135142 case PUT :
136- span .setAttribute (HttpIncubatingAttributes . HTTP_REQUEST_BODY_SIZE ,
137- event .getTransferredBytes ());
143+ span .setAttribute (
144+ HttpIncubatingAttributes . HTTP_REQUEST_BODY_SIZE , event .getTransferredBytes ());
138145 break ;
139146 case GET :
140147 case GET_EXISTENCE :
141- span .setAttribute (HttpIncubatingAttributes . HTTP_RESPONSE_BODY_SIZE ,
142- event .getTransferredBytes ());
148+ span .setAttribute (
149+ HttpIncubatingAttributes . HTTP_RESPONSE_BODY_SIZE , event .getTransferredBytes ());
143150 break ;
144151 }
145152 span .end ();
@@ -151,5 +158,4 @@ void fail(Span span, TransferEvent event) {
151158 Optional .ofNullable (event .getException ()).map (Exception ::getMessage ).orElse ("n/a" ));
152159 finish (span , event );
153160 }
154-
155161}
0 commit comments