blob: f05813e9bfecd2f107530ea9a82b847720e6dd7a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.component.micrometer;
import java.time.Duration;
import java.util.function.Predicate;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.config.MeterFilter;
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
import static org.apache.camel.component.micrometer.MicrometerConstants.ALWAYS;
import static org.apache.camel.component.micrometer.MicrometerConstants.CAMEL_METERS;
/**
* Filter for adding distribution statistics to Timers and Distribution Summaries.
* Configure and add this to the {@link io.micrometer.core.instrument.MeterRegistry}
* if desired:
*
* <pre>
* DistributionStatisticConfigFilter filter = new DistributionStatisticConfigFilter()
* // filter.set...
* meterRegistry.config().meterFilter(filter)
* </pre>
*/
public class DistributionStatisticConfigFilter implements MeterFilter {
private Predicate<Meter.Id> appliesTo = ALWAYS;
private Long maximumExpectedValue;
private Long minimumExpectedValue;
private Boolean publishPercentileHistogram = true;
private Integer percentilePrecision;
private Integer bufferLength;
private Duration expiry;
private double[] percentiles;
private long[] slas;
@Override
public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {
if (CAMEL_METERS.and(appliesTo).test(id)) {
return DistributionStatisticConfig.builder()
.percentilesHistogram(publishPercentileHistogram)
.percentiles(percentiles)
.percentilePrecision(percentilePrecision)
.maximumExpectedValue(maximumExpectedValue)
.minimumExpectedValue(minimumExpectedValue)
.sla(slas)
.bufferLength(bufferLength)
.expiry(expiry)
.build()
.merge(config);
}
return config;
}
/**
* Restrict a condition under which this config applies to a Camel meter
*
* @param appliesTo predicate that must return true so that this config applies
*/
public DistributionStatisticConfigFilter andAppliesTo(Predicate<Meter.Id> appliesTo) {
this.appliesTo = this.appliesTo.and(appliesTo);
return this;
}
/**
* Add a condition under which this config applies to a Camel meter
*
* @param appliesTo predicate that must return true so that this config applies
*/
public DistributionStatisticConfigFilter orAppliesTo(Predicate<Meter.Id> appliesTo) {
this.appliesTo = this.appliesTo.or(appliesTo);
return this;
}
/**
* Sets the maximum expected value for a distribution summary value.
* Controls the number of buckets shipped by publishPercentileHistogram as well as controlling the
* accuracy and memory footprint of the underlying HdrHistogram structure.
*
* @param maximumExpectedValue the maximum expected value for a distribution summary value
*/
public DistributionStatisticConfigFilter setMaximumExpectedValue(Long maximumExpectedValue) {
this.maximumExpectedValue = maximumExpectedValue;
return this;
}
/**
* Sets the minimum expected value for a distribution summary value.
* Controls the number of buckets shipped by publishPercentileHistogram as well as controlling the
* accuracy and memory footprint of the underlying HdrHistogram structure.
*
* @param minimumExpectedValue the minimum expected value for a distribution summary value
*/
public DistributionStatisticConfigFilter setMinimumExpectedValue(Long minimumExpectedValue) {
this.minimumExpectedValue = minimumExpectedValue;
return this;
}
/**
* Sets the maximum expected duration for a timer value
* Controls the number of buckets shipped by publishPercentileHistogram as well as controlling the
* accuracy and memory footprint of the underlying HdrHistogram structure.
*
* @param maximumExpectedDuration the maximum expected duration for a timer value
*/
public DistributionStatisticConfigFilter setMaximumExpectedDuration(Duration maximumExpectedDuration) {
this.maximumExpectedValue = maximumExpectedDuration.toNanos();
return this;
}
/**
* Sets the minimum expected duration for a timer value
* Controls the number of buckets shipped by publishPercentileHistogram as well as controlling the
* accuracy and memory footprint of the underlying HdrHistogram structure.
*
* @param minimumExpectedDuration the minimum expected duration for a timer value
*/
public DistributionStatisticConfigFilter setMinimumExpectedDuration(Duration minimumExpectedDuration) {
this.minimumExpectedValue = minimumExpectedDuration.toNanos();
return this;
}
/**
* Whether to publish aggregatable percentile approximations for Prometheus or Atlas.
* Has no effect on systems that do not support aggregatable percentile approximations.
* This defaults to true.
*
* @param publishPercentileHistogram Whether to publish aggregatable percentile approximations.
*/
public DistributionStatisticConfigFilter setPublishPercentileHistogram(Boolean publishPercentileHistogram) {
this.publishPercentileHistogram = publishPercentileHistogram;
return this;
}
public DistributionStatisticConfigFilter setBufferLength(Integer bufferLength) {
this.bufferLength = bufferLength;
return this;
}
public DistributionStatisticConfigFilter setExpiry(Duration expiry) {
this.expiry = expiry;
return this;
}
/**
* Calculate and publish percentile values. These values are non-aggregatable across dimensions.
*
* @param percentiles array of percentiles to be published
*/
public DistributionStatisticConfigFilter setPercentiles(double[] percentiles) {
this.percentiles = percentiles;
return this;
}
public DistributionStatisticConfigFilter setPercentilePrecision(Integer percentilePrecision) {
this.percentilePrecision = percentilePrecision;
return this;
}
/**
* Publish a cumulative histogram with buckets defined by your SLAs. Used together with publishPercentileHistogram
* on a monitoring system that supports aggregatable percentiles, this setting adds additional buckets to the published histogram.
* Used on a system that does not support aggregatable percentiles, this setting causes a histogram to be published with only these buckets.
*
* @param slas array of percentiles to be published
*/
public DistributionStatisticConfigFilter setSlas(long[] slas) {
this.slas = slas;
return this;
}
}