uber-java / tally

A Java metrics interface with fast buffered metrics and third party reporters
MIT License
17 stars 17 forks source link

PrometheusReporter set incorrect tags #118

Open ayanyuk-syberry opened 1 year ago

ayanyuk-syberry commented 1 year ago

PrometheusReporter set incorrect tags when tags map returns keyset and values not in same order as it stored in map e.g.

    CollectorRegistry registry = CollectorRegistry.defaultRegistry;
    HTTPServer httpServer = new HTTPServer(new InetSocketAddress(9098), registry);
    PrometheusReporter reporter = PrometheusReporter.builder().registry(registry).build();

    Map<String, String> tags = new HashMap<>();
    tags.put("WorkflowType", "WorkflowType");
    tags.put("Domain", "Domain");
    tags.put("TaskList", "TaskList");
    Scope scope = new RootScopeBuilder().reporter(reporter)
        .reportEvery(Duration.ofSeconds(1));

    Counter counter = scope.tagged(tags).counter("counter");
    while (true) {
      counter.inc(1);
      Thread.sleep(500);
    }

if check metrics on localhost:9098 it looks like this

HELP test_metric test_metric summary TYPE test_metric summary HELP counter_total counter counter TYPE counter_total counter counter_total{WorkflowType="Domain",TaskList="WorkflowType",Domain="TaskList",} 50.0 HELP counter_created counter counter TYPE counter_created gauge counter_created{WorkflowType="Domain",TaskList="WorkflowType",Domain="TaskList",} 1.678364275361E9

tags for counter are incorrect. It looks like the problem is here https://github.com/uber-java/tally/blob/4a7bba5e3add45f5a1b7afd95d1c07bd33acd685/prometheus/src/main/java/com/uber/m3/tally/experimental/prometheus/PrometheusReporter.java#L144

scope.tagged() put tags in immutableMap and immutable map returns keyset in order ("WorkflowType", "TaskList", "Domain") but values() order is ["Domain","WorkflowType","TaskList"]

Could you please have a look? Thanks in advance.

versions: com.uber.m3:tally-core:0.13.0 com.uber.m3:tally-prometheus:0.13.0 io.prometheus:simpleclient:0.16.0 io.prometheus:simpleclient_httpserver:0.16.0

ayanyuk-syberry commented 1 year ago

@SokolAndrey @justinjc could you please check this out?