All Downloads are FREE. Search and download functionalities are using the official Maven repository.

zipkin2.reporter.metrics.micrometer.MicrometerReporterMetrics Maven / Gradle / Ivy

The newest version!
/*
 * Copyright The OpenZipkin Authors
 * SPDX-License-Identifier: Apache-2.0
 */
package zipkin2.reporter.metrics.micrometer;

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tag;
import io.micrometer.core.instrument.Tags;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;
import zipkin2.reporter.ReporterMetrics;

/**
 * Implementation of {@link ReporterMetrics} with Micrometer.
 */
public class MicrometerReporterMetrics implements ReporterMetrics {

  private static final String PREFIX = "zipkin.reporter.";

  final MeterRegistry meterRegistry;
  final Iterable extraTags;

  final Counter messages;
  final Counter messageBytes;
  final Counter spans;
  final Counter spanBytes;
  final Counter spansDropped;
  final AtomicInteger queuedSpans;
  final AtomicInteger queuedBytes;

  /**
   * Creates a {@link MicrometerReporterMetrics} instance that registers all metrics to the given {@link MeterRegistry}.
   * Any other options use the default. To customize other options, use {@link #builder(MeterRegistry)} instead.
   *
   * @param meterRegistry all metrics will be registered to this registry
   */
  public static MicrometerReporterMetrics create(MeterRegistry meterRegistry) {
    return new Builder(meterRegistry).build();
  }

  /**
   * Like {@link #create(MeterRegistry)} but returns a builder where you can customize optional settings like extra tags.
   */
  public static Builder builder(MeterRegistry meterRegistry) {
    return new Builder(meterRegistry);
  }

  private MicrometerReporterMetrics(MeterRegistry meterRegistry, Tag... extraTags) {
    this.meterRegistry = meterRegistry;
    this.extraTags = Arrays.asList(extraTags);

    messages = Counter.builder(PREFIX + "messages.total")
      .description("Messages reported (or attempted to be reported)")
      .tags(this.extraTags).register(meterRegistry);
    messageBytes = Counter.builder(PREFIX + "messages")
      .description("Total bytes of messages reported")
      .baseUnit("bytes")
      .tags(this.extraTags).register(meterRegistry);
    spans = Counter.builder(PREFIX + "spans.total")
      .description("Spans reported")
      .tags(this.extraTags).register(meterRegistry);
    spanBytes = Counter.builder(PREFIX + "spans")
      .description("Total bytes of encoded spans reported")
      .baseUnit("bytes")
      .tags(this.extraTags).register(meterRegistry);
    spansDropped = Counter.builder(PREFIX + "spans.dropped")
      .description("Spans dropped (failed to report)")
      .tags(this.extraTags).register(meterRegistry);
    queuedSpans = new AtomicInteger();
    Gauge.builder(PREFIX + "queue.spans", queuedSpans, AtomicInteger::get)
      .description("Spans queued for reporting")
      .tags(this.extraTags).register(meterRegistry);
    queuedBytes = new AtomicInteger();
    Gauge.builder(PREFIX + "queue.bytes", queuedBytes, AtomicInteger::get)
      .description("Total size of all encoded spans queued for reporting")
      .baseUnit("bytes")
      .tags(this.extraTags).register(meterRegistry);
  }

  @Override
  public void incrementMessages() {
    messages.increment();
  }

  @Override
  public void incrementMessageBytes(int i) {
    messageBytes.increment(i);
  }

  @Override
  public void incrementMessagesDropped(Throwable cause) {
    Iterable tags = Tags.concat(extraTags, "cause", cause.getClass().getSimpleName());
    meterRegistry.counter(PREFIX + "messages.dropped", tags).increment();
  }

  @Override
  public void incrementSpans(int i) {
    spans.increment(i);
  }

  @Override
  public void incrementSpanBytes(int i) {
    spanBytes.increment(i);
  }

  @Override
  public void incrementSpansDropped(int i) {
    spansDropped.increment(i);
  }

  @Override
  public void updateQueuedSpans(int i) {
    queuedSpans.set(i);
  }

  @Override
  public void updateQueuedBytes(int i) {
    queuedBytes.set(i);
  }

  public static final class Builder {
    final MeterRegistry meterRegistry;
    Tag[] extraTags = new Tag[0];

    Builder(MeterRegistry meterRegistry) {
      this.meterRegistry = meterRegistry;
    }

    /**
     * Additional tags to attach to all Zipkin Reporter metrics.
     */
    public Builder extraTags(Tag... extraTags) {
      this.extraTags = extraTags;
      return this;
    }

    public MicrometerReporterMetrics build() {
      return new MicrometerReporterMetrics(meterRegistry, extraTags);
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy