Class SolrMetricManager

java.lang.Object
org.apache.solr.metrics.SolrMetricManager

public class SolrMetricManager extends Object
This class maintains a repository of named SdkMeterProvider instances. It provides utility to create, manage, record and export metrics through OpenTelemetry's APIs as well as managing the lifecycle of these MeterProviders.

Solr creates 2 main SdkMeterProvider's (solr.jvm, solr.node) as well as an additional provider for every SolrCore JVM metrics and registry are collected from RuntimeMetrics

The SolrMetricManager acts as a bridge between Solr and OpenTelemetry SDK providing the following:

  • MeterProvider creation and removal.
  • Access to metric instruments such as LongCounter, LongUpDownCounter, LongGauge, LongHistogram and observable instruments to a specific MeterProvider instances
  • FilterablePrometheusMetricReader for reading and fitlering OpenTelemetry metrics in Prometheus Format from all MeterProviders
  • Enablement of optional OTLP exporter

Instances of SolrMetricManager are intended to be owned per CoreContainer and automatically manage JVM-wide MeterProviders.

  • Field Details

    • OTEL_SCOPE_NAME

      public static final String OTEL_SCOPE_NAME
      See Also:
    • REGISTRY_NAME_PREFIX

      public static final String REGISTRY_NAME_PREFIX
      Common prefix for all registry names that Solr uses.
      See Also:
    • JVM_REGISTRY

      public static final String JVM_REGISTRY
      Registry name for JVM-specific metrics. This name is also subject to overrides controlled by system properties. This registry is shared between instances of SolrMetricManager.
    • NODE_REGISTRY

      public static final String NODE_REGISTRY
    • DEFAULT_CLOUD_REPORTER_PERIOD

      public static final int DEFAULT_CLOUD_REPORTER_PERIOD
      See Also:
  • Constructor Details

    • SolrMetricManager

      public SolrMetricManager(io.opentelemetry.sdk.metrics.export.MetricExporter exporter)
    • SolrMetricManager

      public SolrMetricManager(SolrResourceLoader loader, MetricsConfig metricsConfig)
  • Method Details

    • longCounter

      public io.opentelemetry.api.metrics.LongCounter longCounter(String registry, String counterName, String description, OtelUnit unit)
    • longUpDownCounter

      public io.opentelemetry.api.metrics.LongUpDownCounter longUpDownCounter(String registry, String counterName, String description, OtelUnit unit)
    • doubleUpDownCounter

      public io.opentelemetry.api.metrics.DoubleUpDownCounter doubleUpDownCounter(String registry, String counterName, String description, OtelUnit unit)
    • doubleCounter

      public io.opentelemetry.api.metrics.DoubleCounter doubleCounter(String registry, String counterName, String description, OtelUnit unit)
    • doubleHistogram

      public io.opentelemetry.api.metrics.DoubleHistogram doubleHistogram(String registry, String histogramName, String description, OtelUnit unit)
    • longHistogram

      public io.opentelemetry.api.metrics.LongHistogram longHistogram(String registry, String histogramName, String description, OtelUnit unit)
    • doubleGauge

      public io.opentelemetry.api.metrics.DoubleGauge doubleGauge(String registry, String gaugeName, String description, OtelUnit unit)
    • longGauge

      public io.opentelemetry.api.metrics.LongGauge longGauge(String registry, String gaugeName, String description, OtelUnit unit)
    • observableLongCounter

      public io.opentelemetry.api.metrics.ObservableLongCounter observableLongCounter(String registry, String counterName, String description, Consumer<io.opentelemetry.api.metrics.ObservableLongMeasurement> callback, OtelUnit unit)
    • observableDoubleCounter

      public io.opentelemetry.api.metrics.ObservableDoubleCounter observableDoubleCounter(String registry, String counterName, String description, Consumer<io.opentelemetry.api.metrics.ObservableDoubleMeasurement> callback, OtelUnit unit)
    • observableLongGauge

      public io.opentelemetry.api.metrics.ObservableLongGauge observableLongGauge(String registry, String gaugeName, String description, Consumer<io.opentelemetry.api.metrics.ObservableLongMeasurement> callback, OtelUnit unit)
    • observableDoubleGauge

      public io.opentelemetry.api.metrics.ObservableDoubleGauge observableDoubleGauge(String registry, String gaugeName, String description, Consumer<io.opentelemetry.api.metrics.ObservableDoubleMeasurement> callback, OtelUnit unit)
    • observableLongUpDownCounter

      public io.opentelemetry.api.metrics.ObservableLongUpDownCounter observableLongUpDownCounter(String registry, String counterName, String description, Consumer<io.opentelemetry.api.metrics.ObservableLongMeasurement> callback, String unit)
    • observableDoubleUpDownCounter

      public io.opentelemetry.api.metrics.ObservableDoubleUpDownCounter observableDoubleUpDownCounter(String registry, String counterName, String description, Consumer<io.opentelemetry.api.metrics.ObservableDoubleMeasurement> callback, String unit)
    • hasRegistry

      public boolean hasRegistry(String name)
      Check whether a registry with a given name already exists.
      Parameters:
      name - registry name
      Returns:
      true if this name points to a registry that already exists, false otherwise
    • meterProvider

      public io.opentelemetry.sdk.metrics.SdkMeterProvider meterProvider(String providerName)
      Get (or create if not present) a named SdkMeterProvider.
      Parameters:
      providerName - name of the meter provider and prometheus metric reader
      Returns:
      existing or newly created meter provider
    • registryNames

      public Set<String> registryNames()
      Return a set of existing registry names.
    • removeRegistry

      public void removeRegistry(String registry)
      Remove a named registry and close an existing SdkMeterProvider. Upon closing of provider, all metric readers registered to it are closed.
      Parameters:
      registry - name of the registry to remove
    • closeAllRegistries

      public void closeAllRegistries()
      Close all meter providers and their associated metric readers.
    • mkName

      public static String mkName(String name, String... path)
      This method creates a hierarchical name with arbitrary levels of hierarchy
      Parameters:
      name - the final segment of the name, must not be null or empty.
      path - optional path segments, starting from the top level. Empty or null segments will be skipped.
      Returns:
      fully-qualified name using dotted notation, with all valid hierarchy segments prepended to the name.
    • makeName

      public static String makeName(List<String> path, String name)
    • enforcePrefix

      public static String enforcePrefix(String name)
      Enforces the leading REGISTRY_NAME_PREFIX in a name.
      Parameters:
      name - input name, possibly without the prefix
      Returns:
      original name if it contained the prefix, or the input name with the prefix prepended.
    • getPrometheusMetricReaders

      public Map<String,FilterablePrometheusMetricReader> getPrometheusMetricReaders()
      Get a shallow copied map of FilterablePrometheusMetricReader.
    • getPrometheusMetricReader

      public FilterablePrometheusMetricReader getPrometheusMetricReader(String providerName)
    • getMetricExporter

      public io.opentelemetry.sdk.metrics.export.MetricExporter getMetricExporter()