|
17 | 17 |
|
18 | 18 | package org.openqa.selenium.remote.tracing.opentelemetry; |
19 | 19 |
|
20 | | -import io.opentelemetry.api.common.Attributes; |
21 | | -import io.opentelemetry.api.trace.StatusCode; |
22 | | -import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; |
| 20 | +import io.opentelemetry.api.trace.Tracer; |
23 | 21 | import io.opentelemetry.context.Context; |
24 | | -import io.opentelemetry.context.propagation.ContextPropagators; |
25 | 22 | import io.opentelemetry.context.propagation.TextMapPropagator; |
26 | | -import io.opentelemetry.api.trace.Tracer; |
27 | 23 | import io.opentelemetry.sdk.OpenTelemetrySdk; |
28 | | -import io.opentelemetry.sdk.common.CompletableResultCode; |
29 | | -import io.opentelemetry.sdk.resources.Resource; |
30 | | -import io.opentelemetry.sdk.trace.SdkTracerProvider; |
31 | | -import io.opentelemetry.sdk.trace.SpanProcessor; |
32 | | -import io.opentelemetry.sdk.trace.data.EventData; |
33 | | -import io.opentelemetry.sdk.trace.data.SpanData; |
34 | | -import io.opentelemetry.sdk.trace.data.StatusData; |
35 | | -import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; |
36 | | -import io.opentelemetry.sdk.trace.export.SpanExporter; |
37 | | - |
38 | | -import io.opentelemetry.semconv.resource.attributes.ResourceAttributes; |
| 24 | +import io.opentelemetry.sdk.autoconfigure.OpenTelemetrySdkAutoConfiguration; |
39 | 25 | import org.openqa.selenium.internal.Require; |
40 | | -import org.openqa.selenium.json.Json; |
41 | | -import org.openqa.selenium.json.JsonOutput; |
42 | 26 | import org.openqa.selenium.remote.tracing.Propagator; |
43 | 27 | import org.openqa.selenium.remote.tracing.TraceContext; |
44 | 28 |
|
45 | | -import java.util.Collection; |
46 | | -import java.util.HashMap; |
47 | | -import java.util.LinkedList; |
48 | | -import java.util.List; |
49 | | -import java.util.Map; |
50 | | -import java.util.Optional; |
51 | | -import java.util.logging.Level; |
52 | 29 | import java.util.logging.Logger; |
53 | 30 |
|
54 | 31 | public class OpenTelemetryTracer implements org.openqa.selenium.remote.tracing.Tracer { |
@@ -80,102 +57,22 @@ public static OpenTelemetryTracer getInstance() { |
80 | 57 |
|
81 | 58 | private static OpenTelemetryTracer createTracer() { |
82 | 59 | LOG.info("Using OpenTelemetry for tracing"); |
83 | | - List<SpanProcessor> exporters = new LinkedList<>(); |
84 | | - exporters.add(SimpleSpanProcessor.create(new SpanExporter() { |
85 | | - @Override |
86 | | - public CompletableResultCode export(Collection<SpanData> spans) { |
87 | | - |
88 | | - spans.forEach(span -> { |
89 | | - LOG.fine(String.valueOf(span)); |
90 | | - |
91 | | - String traceId = span.getTraceId(); |
92 | | - String spanId = span.getSpanId(); |
93 | | - StatusData status = span.getStatus(); |
94 | | - List<EventData> eventList = span.getEvents(); |
95 | | - eventList.forEach(event -> { |
96 | | - Map<String, Object> map = new HashMap<>(); |
97 | | - map.put("eventTime", event.getEpochNanos()); |
98 | | - map.put("traceId", traceId); |
99 | | - map.put("spanId", spanId); |
100 | | - map.put("spanKind", span.getKind().toString()); |
101 | | - map.put("eventName", event.getName()); |
102 | 60 |
|
103 | | - Attributes attributes = event.getAttributes(); |
104 | | - map.put("attributes", attributes.asMap()); |
105 | | - String jsonString = getJsonString(map); |
106 | | - if (status.getStatusCode() == StatusCode.ERROR) { |
107 | | - LOG.log(Level.WARNING, jsonString); |
108 | | - } else { |
109 | | - LOG.log(Level.FINE, jsonString); |
110 | | - } |
111 | | - }); |
112 | | - }); |
113 | | - return CompletableResultCode.ofSuccess(); |
114 | | - } |
115 | | - |
116 | | - @Override |
117 | | - public CompletableResultCode flush() { |
118 | | - return CompletableResultCode.ofSuccess(); |
119 | | - } |
120 | | - |
121 | | - @Override |
122 | | - public CompletableResultCode shutdown() { |
123 | | - // no-op |
124 | | - return CompletableResultCode.ofSuccess(); |
125 | | - } |
126 | | - })); |
127 | | - |
128 | | - // The Jaeger exporter doesn't yet have a `TracerFactoryProvider`, so we |
129 | | - // shall look up the class using reflection, and beg for forgiveness |
130 | | - // later. |
131 | | - Optional<SpanExporter> maybeJaeger = JaegerTracing.findJaegerExporter(); |
132 | | - maybeJaeger.ifPresent( |
133 | | - exporter -> exporters.add(SimpleSpanProcessor.create(exporter))); |
134 | | - |
135 | | - Resource serviceNameResource = |
136 | | - Resource.create(Attributes.of( |
137 | | - ResourceAttributes.SERVICE_NAME, |
138 | | - System.getProperty("JAEGER_SERVICE_NAME", "selenium"))); |
139 | | - |
140 | | - // OpenTelemetry default propagators are no-op since version 0.9.0. |
141 | | - // Hence, required propagators need to defined and added. |
142 | | - ContextPropagators propagators = |
143 | | - ContextPropagators.create((W3CTraceContextPropagator.getInstance())); |
144 | | - |
145 | | - SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder() |
146 | | - .addSpanProcessor(SpanProcessor.composite(exporters)) |
147 | | - .setResource(Resource.getDefault().merge(serviceNameResource)) |
148 | | - .build(); |
149 | | - |
150 | | - OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder() |
151 | | - .setTracerProvider(sdkTracerProvider) |
152 | | - .setPropagators(propagators) |
153 | | - .buildAndRegisterGlobal(); |
154 | | - |
155 | | - Runtime.getRuntime() |
156 | | - .addShutdownHook(new Thread(sdkTracerProvider::close)); |
| 61 | + OpenTelemetrySdk autoConfiguredSdk = OpenTelemetrySdkAutoConfiguration.initialize(); |
157 | 62 |
|
158 | 63 | return new OpenTelemetryTracer( |
159 | | - openTelemetrySdk.getTracer("default"), |
160 | | - propagators.getTextMapPropagator()); |
161 | | - } |
162 | | - |
163 | | - private static String getJsonString(Map<String, Object> map) { |
164 | | - StringBuilder text = new StringBuilder(); |
165 | | - try (JsonOutput json = new Json().newOutput(text).setPrettyPrint(false)) { |
166 | | - json.write(map); |
167 | | - text.append('\n'); |
168 | | - } |
169 | | - return text.toString(); |
| 64 | + autoConfiguredSdk.getTracer("default"), |
| 65 | + autoConfiguredSdk.getPropagators().getTextMapPropagator()); |
170 | 66 | } |
171 | 67 |
|
172 | 68 | private final Tracer tracer; |
173 | 69 | private final OpenTelemetryPropagator telemetryPropagator; |
174 | 70 |
|
175 | | - public OpenTelemetryTracer(Tracer tracer, TextMapPropagator textMapPropagator) { |
| 71 | + public OpenTelemetryTracer(Tracer tracer, TextMapPropagator propagator) { |
176 | 72 | this.tracer = Require.nonNull("Tracer", tracer); |
177 | 73 | this.telemetryPropagator = new OpenTelemetryPropagator( |
178 | | - tracer, Require.nonNull("Formatter", textMapPropagator)); |
| 74 | + tracer, |
| 75 | + Require.nonNull("Formatter", propagator)); |
179 | 76 | } |
180 | 77 |
|
181 | 78 | @Override |
|
0 commit comments