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

pl.allegro.tech.hermes.management.infrastructure.prometheus.PrometheusMetricsProvider Maven / Gradle / Ivy

package pl.allegro.tech.hermes.management.infrastructure.prometheus;

import static pl.allegro.tech.hermes.management.infrastructure.prometheus.PrometheusClient.forSubscription;
import static pl.allegro.tech.hermes.management.infrastructure.prometheus.PrometheusClient.forSubscriptionStatusCode;
import static pl.allegro.tech.hermes.management.infrastructure.prometheus.PrometheusClient.forTopic;

import pl.allegro.tech.hermes.api.SubscriptionName;
import pl.allegro.tech.hermes.api.TopicName;
import pl.allegro.tech.hermes.management.infrastructure.metrics.MonitoringMetricsContainer;
import pl.allegro.tech.hermes.management.infrastructure.metrics.MonitoringSubscriptionMetricsProvider;
import pl.allegro.tech.hermes.management.infrastructure.metrics.MonitoringTopicMetricsProvider;

public class PrometheusMetricsProvider
    implements MonitoringSubscriptionMetricsProvider, MonitoringTopicMetricsProvider {

  private static final String SUBSCRIPTION_DELIVERED = "subscription_delivered_total";
  private static final String SUBSCRIPTION_TIMEOUTS = "subscription_timeouts_total";
  private static final String SUBSCRIPTION_THROUGHPUT = "subscription_throughput_bytes_total";
  private static final String SUBSCRIPTION_OTHER_ERRORS = "subscription_other_errors_total";
  private static final String SUBSCRIPTION_BATCHES = "subscription_batches_total";
  private static final String SUBSCRIPTION_STATUS_CODES = "subscription_http_status_codes_total";
  private static final String SUBSCRIPTION_RETRIES = "subscription_retries_total";

  private static final String TOPIC_RATE = "topic_requests_total";
  private static final String TOPIC_DELIVERY_RATE = "subscription_delivered_total";
  private static final String TOPIC_THROUGHPUT_RATE = "topic_throughput_bytes_total";

  private final String consumersMetricsPrefix;
  private final String frontendMetricsPrefix;
  private final String additionalFilters;
  private final PrometheusClient prometheusClient;

  public PrometheusMetricsProvider(
      PrometheusClient prometheusClient,
      String consumersMetricsPrefix,
      String frontendMetricsPrefix,
      String additionalFilters) {
    this.prometheusClient = prometheusClient;
    this.consumersMetricsPrefix =
        consumersMetricsPrefix.isEmpty() ? "" : consumersMetricsPrefix + "_";
    this.frontendMetricsPrefix = frontendMetricsPrefix.isEmpty() ? "" : frontendMetricsPrefix + "_";
    this.additionalFilters = additionalFilters;
  }

  @Override
  public MonitoringSubscriptionMetrics subscriptionMetrics(SubscriptionName subscriptionName) {
    String subscriptionDeliveredQuery =
        forSubscription(
            consumerMetricName(SUBSCRIPTION_DELIVERED), subscriptionName, additionalFilters);
    String subscriptionTimeoutsQuery =
        forSubscription(
            consumerMetricName(SUBSCRIPTION_TIMEOUTS), subscriptionName, additionalFilters);
    String subscriptionThroughputQuery =
        forSubscription(
            consumerMetricName(SUBSCRIPTION_THROUGHPUT), subscriptionName, additionalFilters);
    String subscriptionOtherErrorsQuery =
        forSubscription(
            consumerMetricName(SUBSCRIPTION_OTHER_ERRORS), subscriptionName, additionalFilters);
    String subscriptionBatchesQuery =
        forSubscription(
            consumerMetricName(SUBSCRIPTION_BATCHES), subscriptionName, additionalFilters);
    String subscriptionRetriesQuery =
        forSubscription(
            consumerMetricName(SUBSCRIPTION_RETRIES), subscriptionName, additionalFilters);
    String subscription2xx =
        forSubscriptionStatusCode(
            consumerMetricName(SUBSCRIPTION_STATUS_CODES),
            subscriptionName,
            "2.*",
            additionalFilters);
    String subscription4xx =
        forSubscriptionStatusCode(
            consumerMetricName(SUBSCRIPTION_STATUS_CODES),
            subscriptionName,
            "4.*",
            additionalFilters);
    String subscription5xx =
        forSubscriptionStatusCode(
            consumerMetricName(SUBSCRIPTION_STATUS_CODES),
            subscriptionName,
            "5.*",
            additionalFilters);

    MonitoringMetricsContainer prometheusMetricsContainer =
        prometheusClient.readMetrics(
            subscriptionDeliveredQuery,
            subscriptionTimeoutsQuery,
            subscriptionRetriesQuery,
            subscriptionThroughputQuery,
            subscriptionOtherErrorsQuery,
            subscriptionBatchesQuery,
            subscription2xx,
            subscription4xx,
            subscription5xx);
    return MonitoringSubscriptionMetricsProvider.metricsBuilder()
        .withRate(prometheusMetricsContainer.metricValue(subscriptionDeliveredQuery))
        .withTimeouts(prometheusMetricsContainer.metricValue(subscriptionTimeoutsQuery))
        .withThroughput(prometheusMetricsContainer.metricValue(subscriptionThroughputQuery))
        .withOtherErrors(prometheusMetricsContainer.metricValue(subscriptionOtherErrorsQuery))
        .withMetricPathBatchRate(prometheusMetricsContainer.metricValue(subscriptionBatchesQuery))
        .withCodes2xx(prometheusMetricsContainer.metricValue(subscription2xx))
        .withCode4xx(prometheusMetricsContainer.metricValue(subscription4xx))
        .withCode5xx(prometheusMetricsContainer.metricValue(subscription5xx))
        .withRetries(prometheusMetricsContainer.metricValue(subscriptionRetriesQuery))
        .build();
  }

  @Override
  public MonitoringTopicMetrics topicMetrics(TopicName topicName) {
    String topicRateQuery = forTopic(frontendMetricName(TOPIC_RATE), topicName, additionalFilters);
    String topicDeliveryRateQuery =
        forTopic(consumerMetricName(TOPIC_DELIVERY_RATE), topicName, additionalFilters);
    String topicThroughputQuery =
        forTopic(frontendMetricName(TOPIC_THROUGHPUT_RATE), topicName, additionalFilters);

    MonitoringMetricsContainer prometheusMetricsContainer =
        prometheusClient.readMetrics(topicRateQuery, topicDeliveryRateQuery, topicThroughputQuery);
    return MonitoringTopicMetricsProvider.metricsBuilder()
        .withRate(prometheusMetricsContainer.metricValue(topicRateQuery))
        .withDeliveryRate(prometheusMetricsContainer.metricValue(topicDeliveryRateQuery))
        .withThroughput(prometheusMetricsContainer.metricValue(topicThroughputQuery))
        .build();
  }

  private String consumerMetricName(String name) {
    return consumersMetricsPrefix + name;
  }

  private String frontendMetricName(String name) {
    return frontendMetricsPrefix + name;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy