Skip to content

Commit

Permalink
Add ability to config Timer and DistributionSummary with user defined…
Browse files Browse the repository at this point in the history
… config
  • Loading branch information
xuanhuy-do committed May 2, 2018
1 parent c51d05f commit 2ff8dcc
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 7 deletions.
Expand Up @@ -18,8 +18,10 @@

import static java.util.Objects.requireNonNull;

import java.time.Duration;
import java.util.Iterator;
import java.util.Map;
import java.util.Optional;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Streams;
Expand All @@ -30,6 +32,7 @@
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tag;
import io.micrometer.core.instrument.Timer;
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;

/**
* Provides utilities for accessing {@link MeterRegistry}.
Expand All @@ -38,9 +41,59 @@ public final class MoreMeters {

private static final double[] PERCENTILES = { 0, 0.5, 0.75, 0.9, 0.95, 0.98, 0.99, 0.999, 1.0 };

private static volatile DistributionStatisticConfig distributionStatisticConfig =
DistributionStatisticConfig.builder()
.percentiles(PERCENTILES)
.build();

/**
* Sets {@link DistributionStatisticConfig} to {@link MoreMeters}.
* Any {@link Timer} and {@link DistributionSummary} which created by {@link MoreMeters}
* using {@link MoreMeters#newTimer(MeterRegistry, String, Iterable)} and
* {@link MoreMeters#newDistributionSummary(MeterRegistry, String, Iterable)} will use this config.
*/
public static void setDistributionStatisticConfig(DistributionStatisticConfig config) {
requireNonNull(config, "config");
distributionStatisticConfig = config;
}

/**
* Returns the {@link DistributionStatisticConfig} to use when the factory methods in {@link MoreMeters}
* create a {@link Timer} or a {@link DistributionSummary}.
*/
public static DistributionStatisticConfig distributionStatisticConfig() {
return distributionStatisticConfig;
}

/**
* Returns a newly-registered {@link DistributionSummary} configured by
* {@link #distributionStatisticConfig()}.
**/
public static DistributionSummary newDistributionSummary(MeterRegistry registry,
String name, Iterable<Tag> tags) {
requireNonNull(registry, "registry");
requireNonNull(name, "name");
requireNonNull(tags, "tags");

return DistributionSummary.builder(name)
.tags(tags)
.publishPercentiles(distributionStatisticConfig.getPercentiles())
.publishPercentileHistogram(
distributionStatisticConfig.isPercentileHistogram())
.maximumExpectedValue(distributionStatisticConfig.getMaximumExpectedValue())
.minimumExpectedValue(distributionStatisticConfig.getMinimumExpectedValue())
.distributionStatisticBufferLength(
distributionStatisticConfig.getBufferLength())
.distributionStatisticExpiry(distributionStatisticConfig.getExpiry())
.sla(distributionStatisticConfig.getSlaBoundaries())
.register(registry);
}

/**
* Returns a newly-registered {@link DistributionSummary} with percentile publication configured.
* @deprecated Use {@link #newDistributionSummary(MeterRegistry, String, Iterable)}.
*/
@Deprecated
public static DistributionSummary summaryWithDefaultQuantiles(MeterRegistry registry,
String name, Iterable<Tag> tags) {
requireNonNull(registry, "registry");
Expand All @@ -52,9 +105,37 @@ public static DistributionSummary summaryWithDefaultQuantiles(MeterRegistry regi
.register(registry);
}

/**
* Returns a newly-registered {@link Timer} configured by {@link #distributionStatisticConfig()}.
*/
public static Timer newTimer(MeterRegistry registry, String name, Iterable<Tag> tags) {
requireNonNull(registry, "registry");
requireNonNull(name, "name");
requireNonNull(tags, "tags");

final Duration maxExpectedValue =
Optional.ofNullable(distributionStatisticConfig.getMaximumExpectedValue())
.map(Duration::ofNanos).orElse(null);
final Duration minExpectedValue =
Optional.ofNullable(distributionStatisticConfig.getMinimumExpectedValue())
.map(Duration::ofNanos).orElse(null);

return Timer.builder(name)
.tags(tags)
.maximumExpectedValue(maxExpectedValue)
.minimumExpectedValue(minExpectedValue)
.publishPercentiles(distributionStatisticConfig.getPercentiles())
.publishPercentileHistogram(distributionStatisticConfig.isPercentileHistogram())
.distributionStatisticBufferLength(distributionStatisticConfig.getBufferLength())
.distributionStatisticExpiry(distributionStatisticConfig.getExpiry())
.register(registry);
}

/**
* Returns a newly-registered {@link Timer} with percentile publication configured.
* @deprecated Use {@link MoreMeters#newTimer(MeterRegistry, String, Iterable)}.
*/
@Deprecated
public static Timer timerWithDefaultQuantiles(MeterRegistry registry, String name, Iterable<Tag> tags) {
requireNonNull(registry, "registry");
requireNonNull(name, "name");
Expand Down
Expand Up @@ -16,8 +16,8 @@

package com.linecorp.armeria.internal.metric;

import static com.linecorp.armeria.common.metric.MoreMeters.summaryWithDefaultQuantiles;
import static com.linecorp.armeria.common.metric.MoreMeters.timerWithDefaultQuantiles;
import static com.linecorp.armeria.common.metric.MoreMeters.newDistributionSummary;
import static com.linecorp.armeria.common.metric.MoreMeters.newTimer;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
Expand Down Expand Up @@ -163,15 +163,15 @@ private static final class DefaultRequestMetrics implements RequestMetrics {
success = parent.counter(requests, idPrefix.tags("result", "success"));
failure = parent.counter(requests, idPrefix.tags("result", "failure"));

requestDuration = timerWithDefaultQuantiles(
requestDuration = newTimer(
parent, idPrefix.name("requestDuration"), idPrefix.tags());
requestLength = summaryWithDefaultQuantiles(
requestLength = newDistributionSummary(
parent, idPrefix.name("requestLength"), idPrefix.tags());
responseDuration = timerWithDefaultQuantiles(
responseDuration = newTimer(
parent, idPrefix.name("responseDuration"), idPrefix.tags());
responseLength = summaryWithDefaultQuantiles(
responseLength = newDistributionSummary(
parent, idPrefix.name("responseLength"), idPrefix.tags());
totalDuration = timerWithDefaultQuantiles(
totalDuration = newTimer(
parent, idPrefix.name("totalDuration"), idPrefix.tags());
}

Expand Down

0 comments on commit 2ff8dcc

Please sign in to comment.