Unable to send spring boot application traces to remote otel(open telemetry) collector

52 Views Asked by At

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.

  1. My intention is send Spring Boot app traces to collector which is running at remote host.
  2. 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.)

0

There are 0 best solutions below