How to get Micrometer to output all custom metrics

Viewed 38

I am using Micrometer 1.9.0 and Spring boot 4.2.16 to report metrics to DataDog over StatsD. Some metrics are showing up, but very few. Using the Metrics Explorer in DataDog, it's very hard to find any metrics at all because they are so scarce.

To test this locally, I started up https://hub.docker.com/r/jonmorehouse/dogstatsd-local/dockerfile/ and it does display all of the standard metrics provided by Micrometer, and very occasionally displays one of my custom metrics.

I have set breakpoints and verified that my Counter instances are being incremented on every request to my application, but for some reason very few metrics are written to StatsD.

All of my metric reporting is encapsulated in a class called Metrics which is autowired into controllers etc. The Metrics class looks like this:

package com.****.metrics;

import com.****.commons.metrics.MetricId;
import com.****.commons.metrics.MetricTagName;
import com.****.commons.metrics.MetricTagValue;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.DistributionSummary;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import java.util.concurrent.TimeUnit;
import org.springframework.stereotype.Component;

@Component
public class Metrics {

  private final MeterRegistry meterRegistry;
  private final DistributionSummary orderCountDistribution;

  public Metrics(MeterRegistry meterRegistry) {
    this.meterRegistry = meterRegistry;

    DistributionSummary.Builder builder =
        DistributionSummary.builder(MetricId.UPDATED_ORDERS_COUNT_DISTRIBUTION.getValue())
            .description("Records the average number of modified orders returned")
            .tags(MetricTagName.PURPOSE.getValue(), MetricTagValue.ANALYTICS.getValue())
            .tags(MetricTagName.LAYER.getValue(), MetricTagValue.DATA.getValue())
            .minimumExpectedValue(1d)
            .maximumExpectedValue(100d)
            .publishPercentileHistogram();
    orderCountDistribution = builder.register(meterRegistry);
  };

  public void recordApiRequest(
      String apiVersion,
      String controller,
      String endpoint,
      String method,
      long elapsed,
      TimeUnit timeUnit) {
    Counter.Builder counterBuilder =
        Counter.builder(MetricId.API_REQUEST_COUNT.getValue())
            .description("Counts the number of API requests")
            .tags(MetricTagName.PURPOSE.getValue(), MetricTagValue.ANALYTICS.getValue())
            .tags(MetricTagName.LAYER.getValue(), MetricTagValue.ENDPOINT.getValue())
            .tags(MetricTagName.API_VERSION.getValue(), apiVersion)
            .tags(MetricTagName.CONTROLLER.getValue(), controller)
            .tags(MetricTagName.ENDPOINT.getValue(), endpoint)
            .tags(MetricTagName.METHOD.getValue(), method);
    Counter counter = counterBuilder.register(meterRegistry);
    counter.increment();

    Timer.Builder timerBuilder =
        Timer.builder(MetricId.EXECUTION_TIME.getValue())
            .description("Records the time taken to process an API request")
            .tags(MetricTagName.PURPOSE.getValue(), MetricTagValue.PERFORMANCE.getValue())
            .tags(MetricTagName.LAYER.getValue(), MetricTagValue.ENDPOINT.getValue())
            .tags(MetricTagName.API_VERSION.getValue(), apiVersion)
            .tags(MetricTagName.CONTROLLER.getValue(), controller)
            .tags(MetricTagName.ENDPOINT.getValue(), endpoint)
            .tags(MetricTagName.METHOD.getValue(), method);
    Timer timer = timerBuilder.register(meterRegistry);
    timer.record(elapsed, timeUnit);
  }

  public void recordExecutionTime(
      String module, String operation, long elapsed, TimeUnit timeUnit) {
    Timer.Builder builder =
        Timer.builder(MetricId.EXECUTION_TIME.getValue())
            .description("Records the time taken to complete an operation")
            .tags(MetricTagName.PURPOSE.getValue(), MetricTagValue.PERFORMANCE.getValue())
            .tags(MetricTagName.LAYER.getValue(), MetricTagValue.PROCESSING.getValue())
            .tags(MetricTagName.MODULE.getValue(), module)
            .tags(MetricTagName.OPERATION.getValue(), operation);
    Timer timer = builder.register(meterRegistry);
    timer.record(elapsed, timeUnit);
  }

  public void recordUpdatedOrderCount(int orderCount) {
    orderCountDistribution.record(orderCount);
  }
}

What could be causing the sparse output of data?

0 Answers
Related