Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Duplicate Metric Error when Tracing Enabled on Both WebServer and gRPC Server #5811

Closed
jburgess opened this issue Jan 9, 2023 · 0 comments
Closed
Assignees
Labels
2.x Issues for 2.x version branch bug Something isn't working grpc metrics P2 tracing

Comments

@jburgess
Copy link

jburgess commented Jan 9, 2023

Environment Details

  • Helidon Version: 2.5.5
  • Helidon SE
  • JDK version: 17
  • OS: Any

Problem Description

I am experiencing an issue when attempting to add Tracing to both the WebServer and gRPC Server in my Helidon application, which is configured with MetricsSupport. When I try to configure tracing for both servers, I receive the following error. It is worth noting that this error does not occur if I only configure Tracing for one server with .tracer(tracer).

Exception in thread "main" java.lang.RuntimeException: No reflection exceptions should be thrown unless there is a fundamental error in your code set up.
	at io.jaegertracing.internal.metrics.Metrics.createMetrics(Metrics.java:76)
	at io.jaegertracing.internal.metrics.Metrics.<init>(Metrics.java:32)
	at io.jaegertracing.internal.metrics.Metrics.<init>(Metrics.java:28)
	at io.jaegertracing.Configuration.getTracerBuilder(Configuration.java:229)
	at io.helidon.tracing.jaeger.JaegerTracerBuilder.build(JaegerTracerBuilder.java:456)
	at io.helidon.tracing.jaeger.JaegerTracerBuilder.build(JaegerTracerBuilder.java:153)
	at io.helidon.common.Builder.get(Builder.java:41)
	at io.helidon.grpc.server.GrpcServerConfiguration$Builder.tracer(GrpcServerConfiguration.java:240)
	at com.example.tracing.Main.startServer(Main.java:71)
	at com.example.tracing.Main.main(Main.java:21)
Caused by: java.lang.IllegalArgumentException: Attempt to reregister the existing metric MetricID{name='jaeger_tracer_reporter_queue_length', tags=[]}
	at io.helidon.metrics.api.AbstractRegistry.enforceMetricUniqueness(AbstractRegistry.java:713)
	at io.helidon.metrics.api.AbstractRegistry.enforceMetricUniqueness(AbstractRegistry.java:708)
	at io.helidon.metrics.api.AbstractRegistry.registerUniqueMetric(AbstractRegistry.java:668)
	at io.helidon.metrics.api.AbstractRegistry.register(AbstractRegistry.java:118)
	at io.helidon.metrics.jaeger.HelidonJaegerMetricsFactory$3.<init>(HelidonJaegerMetricsFactory.java:88)
	at io.helidon.metrics.jaeger.HelidonJaegerMetricsFactory.createGauge(HelidonJaegerMetricsFactory.java:82)
	at io.jaegertracing.internal.metrics.Metrics.createMetrics(Metrics.java:66)
	... 9 more

Steps to reproduce

This error can be reproduced with the following Java code:

    LogConfig.configureRuntime();

    var config = Config.create();

    var metrics = MetricsSupport.create();

    var tracer = TracerBuilder.create(config.get("tracing"));

    var simpleGreetService = new SimpleGreetService(config);
    var builder = Routing.builder()
        .register("/simple-greet", simpleGreetService);

    var health = HealthSupport.builder().addLiveness(HealthChecks.healthChecks()).build();
    var adminRouting = Routing.builder()
        .register(health)
        .register(metrics)
        .register(WebTracingConfig.create(config.get("tracing")))
        .build();

    // Web Server
    var server = WebServer.builder(builder)
        .tracer(tracer)
        .addNamedRouting("admin", adminRouting)
        .config(config.get("server"))
        .build();

    var webserver = server.start();
    webserver.thenAccept(ws -> ws.whenShutdown().thenRun(() -> System.out.println("WEB server is DOWN. Good bye!")))
        .exceptionallyAccept(t -> t.printStackTrace(System.err));

    // gRPC Server
    var tracingConfig = GrpcTracingConfig.builder()
        .withStreaming()
        .withVerbosity()
        .withTracedAttributes(ServerRequestAttribute.CALL_ATTRIBUTES,
            ServerRequestAttribute.HEADERS, ServerRequestAttribute.METHOD_NAME)
        .build();

    var grpcServerConfig =
        GrpcServerConfiguration.builder(config.get("grpc"))
            .tracer(tracer)
            .tracingConfig(tracingConfig)
            .build();

    var grpcRouting = GrpcRouting.builder()
        .register(new EchoService())
        .build();

    var grpcServer =
        GrpcServer.create(grpcServerConfig, grpcRouting);

    grpcServer.start().thenAccept(s -> s.whenShutdown().thenRun(() ->
        System.out.println("gRPC server is DOWN. Good bye!"))).exceptionally(t -> {
      System.out.println("Startup failed: " + t.getMessage());
      return null;
    });
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
2.x Issues for 2.x version branch bug Something isn't working grpc metrics P2 tracing
Projects
Archived in project
Development

No branches or pull requests

2 participants