From 759e1bfa9f86527f9b16f730d28c5a0b743f11a6 Mon Sep 17 00:00:00 2001 From: Tim Quinn Date: Tue, 29 Oct 2019 13:13:48 -0500 Subject: [PATCH] Changes to metrics to work with MP metrics 2.2 (#1117) --- dependencies/pom.xml | 2 +- .../java/io/helidon/metrics/HelidonGauge.java | 78 +++++++++++-------- .../java/io/helidon/metrics/Registry.java | 2 +- .../microprofile/metrics/DelegatingGauge.java | 6 +- .../microprofile/metrics/MetricProducer.java | 6 +- .../metrics/MetricsCdiExtension.java | 12 ++- .../microprofile/metrics/BadGaugeTest.java | 2 + 7 files changed, 65 insertions(+), 43 deletions(-) diff --git a/dependencies/pom.xml b/dependencies/pom.xml index e20ab90e9a5..1e8a43fae73 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -73,7 +73,7 @@ 2.1 1.1.1 1.1 - 2.1.0 + 2.2 1.1.2 2.0 1.3.1 diff --git a/metrics2/metrics2/src/main/java/io/helidon/metrics/HelidonGauge.java b/metrics2/metrics2/src/main/java/io/helidon/metrics/HelidonGauge.java index c9b3dc7a621..98641951de2 100644 --- a/metrics2/metrics2/src/main/java/io/helidon/metrics/HelidonGauge.java +++ b/metrics2/metrics2/src/main/java/io/helidon/metrics/HelidonGauge.java @@ -36,7 +36,8 @@ /** * Gauge implementation. */ -final class HelidonGauge extends MetricImpl implements Gauge { +final class HelidonGauge extends MetricImpl implements Gauge { + // TODO uncomment above once MP metrics enforces the Number restriction private final Supplier value; private HelidonGauge(String registryType, Metadata metadata, Gauge metric) { @@ -45,8 +46,9 @@ private HelidonGauge(String registryType, Metadata metadata, Gauge metric) { value = metric::getValue; } - static HelidonGauge create(String registryType, Metadata metadata, + static HelidonGauge create(String registryType, Metadata metadata, Gauge metric) { + // TODO uncomment above once MP metrics enforces the Number restriction return new HelidonGauge<>(registryType, metadata, metric); } @@ -67,40 +69,50 @@ public String prometheusValue() { @Override public void jsonData(JsonObjectBuilder builder, MetricID metricID) { - T value = getValue(); + // TODO uncomment 'value' declaration below and remove 'untypedValue' once MP metrics enforces restriction + // T value = getValue(); + T untypedValue = getValue(); String nameWithTags = jsonFullKey(metricID); - if (value instanceof AtomicInteger) { - builder.add(nameWithTags, value.doubleValue()); - } else if (value instanceof AtomicLong) { - builder.add(nameWithTags, value.longValue()); - } else if (value instanceof BigDecimal) { - builder.add(nameWithTags, (BigDecimal) value); - } else if (value instanceof BigInteger) { - builder.add(nameWithTags, (BigInteger) value); - } else if (value instanceof Byte) { - builder.add(nameWithTags, value.intValue()); - } else if (value instanceof Double) { - builder.add(nameWithTags, (Double) value); - } else if (value instanceof DoubleAccumulator) { - builder.add(nameWithTags, value.doubleValue()); - } else if (value instanceof DoubleAdder) { - builder.add(nameWithTags, value.doubleValue()); - } else if (value instanceof Float) { - builder.add(nameWithTags, value.floatValue()); - } else if (value instanceof Integer) { - builder.add(nameWithTags, (Integer) value); - } else if (value instanceof Long) { - builder.add(nameWithTags, (Long) value); - } else if (value instanceof LongAccumulator) { - builder.add(nameWithTags, value.longValue()); - } else if (value instanceof LongAdder) { - builder.add(nameWithTags, value.longValue()); - } else if (value instanceof Short) { - builder.add(nameWithTags, value.intValue()); + // TODO remove following 'if' and 'value' assignment once MP metrics enforces restriction, + // promoting the nested 'if' one level. + if (untypedValue instanceof Number) { + Number value = (Number) untypedValue; + if (value instanceof AtomicInteger) { + builder.add(nameWithTags, value.doubleValue()); + } else if (value instanceof AtomicLong) { + builder.add(nameWithTags, value.longValue()); + } else if (value instanceof BigDecimal) { + builder.add(nameWithTags, (BigDecimal) value); + } else if (value instanceof BigInteger) { + builder.add(nameWithTags, (BigInteger) value); + } else if (value instanceof Byte) { + builder.add(nameWithTags, value.intValue()); + } else if (value instanceof Double) { + builder.add(nameWithTags, (Double) value); + } else if (value instanceof DoubleAccumulator) { + builder.add(nameWithTags, value.doubleValue()); + } else if (value instanceof DoubleAdder) { + builder.add(nameWithTags, value.doubleValue()); + } else if (value instanceof Float) { + builder.add(nameWithTags, value.floatValue()); + } else if (value instanceof Integer) { + builder.add(nameWithTags, (Integer) value); + } else if (value instanceof Long) { + builder.add(nameWithTags, (Long) value); + } else if (value instanceof LongAccumulator) { + builder.add(nameWithTags, value.longValue()); + } else if (value instanceof LongAdder) { + builder.add(nameWithTags, value.longValue()); + } else if (value instanceof Short) { + builder.add(nameWithTags, value.intValue()); + } else { + // Might be a developer-provided class which extends Number. + builder.add(nameWithTags, value.doubleValue()); + } + // TODO remove following 'else' and 'builder.add' once MP metrics enforces restriction } else { - // Might be a developer-provided class which extends Number. - builder.add(nameWithTags, value.doubleValue()); + builder.add(nameWithTags, String.valueOf(value)); } } diff --git a/metrics2/metrics2/src/main/java/io/helidon/metrics/Registry.java b/metrics2/metrics2/src/main/java/io/helidon/metrics/Registry.java index 610b0fe046c..904af5565a8 100644 --- a/metrics2/metrics2/src/main/java/io/helidon/metrics/Registry.java +++ b/metrics2/metrics2/src/main/java/io/helidon/metrics/Registry.java @@ -485,8 +485,8 @@ static Metadata toMetadata(io.helidon.common.metrics.InternalBridge.Metadata met final MetadataBuilder builder = new MetadataBuilder(); builder.withName(metadata.getName()) .withDisplayName(metadata.getDisplayName()) - .withType(metadata.getTypeRaw()) .reusable(metadata.isReusable()); + metadata.getDescription().ifPresent(builder::withDescription); metadata.getUnit().ifPresent(builder::withUnit); return builder.build(); diff --git a/microprofile/metrics2/src/main/java/io/helidon/microprofile/metrics/DelegatingGauge.java b/microprofile/metrics2/src/main/java/io/helidon/microprofile/metrics/DelegatingGauge.java index 7349c27f018..9c17df5c4f2 100644 --- a/microprofile/metrics2/src/main/java/io/helidon/microprofile/metrics/DelegatingGauge.java +++ b/microprofile/metrics2/src/main/java/io/helidon/microprofile/metrics/DelegatingGauge.java @@ -28,7 +28,8 @@ * * @param data type reported by the underlying {@code Gauge} */ -class DelegatingGauge implements Gauge { +class DelegatingGauge implements Gauge { + // TODO uncomment preceding clause once MP metrics enforces restriction private final Method method; private final Object obj; @@ -50,8 +51,9 @@ private DelegatingGauge(Method method, Object obj, Class clazz) { * @param clazz type of the underlying gauge * @return {@code DelegatingGauge} */ - public static DelegatingGauge newInstance(Method method, Object obj, + public static DelegatingGauge newInstance(Method method, Object obj, Class clazz) { + // TODO uncomment preceding clause once MP metrics enforces restriction return new DelegatingGauge<>(method, obj, clazz); } diff --git a/microprofile/metrics2/src/main/java/io/helidon/microprofile/metrics/MetricProducer.java b/microprofile/metrics2/src/main/java/io/helidon/microprofile/metrics/MetricProducer.java index 750d01579af..22348cc16f1 100644 --- a/microprofile/metrics2/src/main/java/io/helidon/microprofile/metrics/MetricProducer.java +++ b/microprofile/metrics2/src/main/java/io/helidon/microprofile/metrics/MetricProducer.java @@ -189,7 +189,8 @@ private ConcurrentGauge produceConcurrentGauge(MetricRegistry registry, Injectio @Produces @VendorDefined @SuppressWarnings("unchecked") - private Gauge produceGauge(MetricRegistry registry, InjectionPoint ip) { + private Gauge produceGauge(MetricRegistry registry, InjectionPoint ip) { + // TODO uncomment preceding clause once MP metrics enforces restriction Metric metric = ip.getAnnotated().getAnnotation(Metric.class); return (Gauge) registry.getGauges().entrySet().stream() .filter(entry -> entry.getKey().getName().equals(metric.name())) @@ -207,8 +208,9 @@ private Gauge produceGauge(MetricRegistry registry, Inject * @return requested gauge */ @Produces - private Gauge produceGaugeDefault(MetricRegistry registry, + private Gauge produceGaugeDefault(MetricRegistry registry, InjectionPoint ip) { + // TODO uncomment preceding clause once MP metrics enforces restrictions return produceGauge(registry, ip); } diff --git a/microprofile/metrics2/src/main/java/io/helidon/microprofile/metrics/MetricsCdiExtension.java b/microprofile/metrics2/src/main/java/io/helidon/microprofile/metrics/MetricsCdiExtension.java index 6968d1983a6..2be31779abd 100644 --- a/microprofile/metrics2/src/main/java/io/helidon/microprofile/metrics/MetricsCdiExtension.java +++ b/microprofile/metrics2/src/main/java/io/helidon/microprofile/metrics/MetricsCdiExtension.java @@ -394,7 +394,8 @@ private void registerAnnotatedGauges(@Observes AfterDeploymentValidation adv, Be MetricID gaugeID = gaugeSite.getKey(); AnnotatedMethodConfigurator site = gaugeSite.getValue(); - DelegatingGauge dg; + // TODO uncomment following clause once MP metrics enforces restriction + DelegatingGauge dg; try { dg = buildDelegatingGauge(gaugeID.getName(), site, bm); @@ -417,20 +418,23 @@ private void registerAnnotatedGauges(@Observes AfterDeploymentValidation adv, Be annotatedGaugeSites.clear(); } - private DelegatingGauge buildDelegatingGauge(String gaugeName, + private DelegatingGauge buildDelegatingGauge(String gaugeName, AnnotatedMethodConfigurator site, BeanManager bm) { + // TODO uncomment preceding clause once MP metrics enforces restriction Bean bean = bm.getBeans(site.getAnnotated().getJavaMember().getDeclaringClass()) .stream() .findFirst() .orElseThrow(() -> new IllegalArgumentException("Cannot find bean for annotated gauge " + gaugeName)); Class returnType = site.getAnnotated().getJavaMember().getReturnType(); - Class narrowedReturnType = typeToNumber(returnType); + // TODO uncomment following line once MP metrics enforces restriction +// Class narrowedReturnType = typeToNumber(returnType); return DelegatingGauge.newInstance( site.getAnnotated().getJavaMember(), getReference(bm, bean.getBeanClass(), bean), - narrowedReturnType); + // TODO use narrowedReturnType instead of returnType below once MP metrics enforces restriction + returnType); } @SuppressWarnings("unchecked") diff --git a/microprofile/metrics2/src/test/java/io/helidon/microprofile/metrics/BadGaugeTest.java b/microprofile/metrics2/src/test/java/io/helidon/microprofile/metrics/BadGaugeTest.java index 87b7b8afe09..7254d209563 100644 --- a/microprofile/metrics2/src/test/java/io/helidon/microprofile/metrics/BadGaugeTest.java +++ b/microprofile/metrics2/src/test/java/io/helidon/microprofile/metrics/BadGaugeTest.java @@ -35,6 +35,8 @@ public class BadGaugeTest { + // TODO - remove following Disabled line once MP metrics enforces restriction + @org.junit.jupiter.api.Disabled @Test public void testBadBean() { SeContainerInitializer initializer = SeContainerInitializer.newInstance();