I am unable to send my Spring Boot application (which is running locally) traces to otel collector running at remote host. I used the code mentioned in open telemetry github repo. Below are two Java code files and otel collector config.
public final class ExampleConfiguration {
static OpenTelemetry initOpenTelemetry() {
Resource resource = Resource.getDefault()
.merge(Resource.builder()
.put(SERVICE_NAME, "OtlpExporterExample")
.build());
OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()
.setTracerProvider(SdkTracerProvider.builder()
.setResource(resource)
.addSpanProcessor(BatchSpanProcessor.builder(OtlpGrpcSpanExporter.builder()
.setTimeout(2, TimeUnit.SECONDS)
.setEndpoint("http://remotehost:4343"))
.build())
.setScheduleDelay(100, TimeUnit.MILLISECONDS)
.build())
.build())
.setMeterProvider(SdkMeterProvider.builder()
.setResource(resource)
.registerMetricReader(PeriodicMetricReader.builder(OtlpGrpcMetricExporter.getDefault())
.setInterval(Duration.ofMillis(1000))
.build())
.build())
.buildAndRegisterGlobal();
Runtime.getRuntime()
.addShutdownHook(new Thread(openTelemetrySdk::close));
return openTelemetrySdk;
}
}
public final class OtlpExporterExample {
public static void main(String[] args) throws InterruptedException {
OpenTelemetry openTelemetry = ExampleConfiguration.initOpenTelemetry();
Tracer tracer = openTelemetry.getTracer("io.opentelemetry.example");
Meter meter = openTelemetry.getMeter("io.opentelemetry.example");
LongCounter counter = meter.counterBuilder("example_counter")
.build();
LongHistogram histogram = meter.histogramBuilder("super_timer")
.ofLongs()
.setUnit("ms")
.build();
for (int i = 0; i < 100; i++) {
long startTime = System.currentTimeMillis();
Span exampleSpan = tracer.spanBuilder("exampleSpan")
.startSpan();
Context exampleContext = Context.current()
.with(exampleSpan);
try (Scope scope = exampleContext.makeCurrent()) {
counter.add(1);
exampleSpan.setAttribute("good", true);
exampleSpan.setAttribute("exampleNumber", i);
Thread.sleep(100);
} finally {
histogram.record(System.currentTimeMillis() - startTime, Attributes.empty(), exampleContext);
exampleSpan.end();
}
}
Thread.sleep(2000);
System.out.println("Bye");
}
}
otel collector config below
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
extensions:
health_check: {}
zpages: {}
exporters:
logging:
loglevel: info
otlp/jaeger:
endpoint: 0.0.0.0:14250
tls:
insecure: true
debug:
verbosity: detailed
service:
extensions:
- health_check
- zpages
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlp/jaeger,debug,logging]
telemetry:
logs:
level: debug
When I deploy this to remote host it's able to send traces to otel collector, but same is not happening when I ran same application locally.
- My intention is send Spring Boot app traces to collector which is running at remote host.
- And from otel collector to jaeger (and unable to run otel collector and jaeger at the same time because it's saying 0.0.0.0.4317 already running and I am unable to change jaegar or otel collector port).
Could some one help on this please? (Sorry for the improper code format in the question.)