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

com.sap.cloud.cf.monitoring.java.CustomMetricsReporter Maven / Gradle / Ivy

package com.sap.cloud.cf.monitoring.java;

import java.util.Collection;
import java.util.List;
import java.util.SortedMap;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.codahale.metrics.Counter;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.Histogram;
import com.codahale.metrics.Meter;
import com.codahale.metrics.MetricFilter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.ScheduledReporter;
import com.codahale.metrics.Timer;
import com.sap.cloud.cf.monitoring.client.MonitoringClient;
import com.sap.cloud.cf.monitoring.client.configuration.CustomMetricsConfiguration;
import com.sap.cloud.cf.monitoring.client.exceptions.MonitoringClientException;
import com.sap.cloud.cf.monitoring.client.model.Metric;
import com.sap.cloud.cf.monitoring.java.converter.CounterConverter;
import com.sap.cloud.cf.monitoring.java.converter.GaugeConverter;
import com.sap.cloud.cf.monitoring.java.converter.HistogramConverter;
import com.sap.cloud.cf.monitoring.java.converter.MeterConverter;
import com.sap.cloud.cf.monitoring.java.converter.TimerConverter;

public class CustomMetricsReporter extends ScheduledReporter {
    static final int SEND_METRICS_ATTEMPTS = 2;
    private static final Logger LOGGER = LoggerFactory.getLogger(CustomMetricsReporter.class);
    private final MonitoringClient client;
    private final CustomMetricsConfiguration customMetricsConfig;

    private static MetricFilter getFilter(final List whitelistMetrics) {
        if (whitelistMetrics == null || whitelistMetrics.isEmpty()) {
            return MetricFilter.ALL;
        }
        return new MetricFilter() {
            @Override
            public boolean matches(String name, com.codahale.metrics.Metric metric) {
                return whitelistMetrics.contains(name);
            }
        };
    }

    public CustomMetricsReporter(MetricRegistry registry, MonitoringClient client,
                                 CustomMetricsConfiguration customMetricsConfig) {
        super(registry, "custom-metrics-reporter", getFilter(customMetricsConfig.getMetrics()), TimeUnit.SECONDS,
              TimeUnit.MILLISECONDS);
        this.client = client;
        this.customMetricsConfig = customMetricsConfig;
    }

    @Override
    public void report(SortedMap gauges, SortedMap counters,
                       SortedMap histograms, SortedMap meters,
                       SortedMap timers) {
        try {
            List convertedMetrics = convert(gauges, counters, histograms, meters, timers);
            if (convertedMetrics.isEmpty()) {
                LOGGER.debug("No metrics for sending.");
                return;
            }
            sendMetrics(convertedMetrics);
        } catch (Exception e) {
            LOGGER.error("Unable to send metrics.", e);
        }
    }

    private List convert(SortedMap gauges, SortedMap counters,
                                 SortedMap histograms, SortedMap meters,
                                 SortedMap timers) {
        long timestamp = System.currentTimeMillis();
        boolean metricQuantiles = customMetricsConfig.metricQuantiles();

        return Stream.of(new GaugeConverter().convert(gauges, timestamp), 
                  new CounterConverter().convert(counters, timestamp),
                  new HistogramConverter(metricQuantiles).convert(histograms, timestamp), 
                  new MeterConverter(metricQuantiles).convert(meters, timestamp),
                  new TimerConverter(metricQuantiles).convert(timers, timestamp))
        .flatMap(Collection::stream)
        .collect(Collectors.toList());
    }

    private void sendMetrics(List convertedMetrics) {
        for (int i = 0; i < SEND_METRICS_ATTEMPTS; i++) {
            try {
                client.send(convertedMetrics);
                break;
            } catch (MonitoringClientException e) {
                LOGGER.error("Unable to send metrics. Retrying ...", e);
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy