starting to impl the rest endpoint
diff --git a/pom.xml b/pom.xml
index 0f3cefc..f8d9650 100644
--- a/pom.xml
+++ b/pom.xml
@@ -168,10 +168,8 @@
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
- <!-- current setup has some leakage it seems
- <forkCount>1</forkCount>
+ <forkCount>2</forkCount>
<reuseForks>false</reuseForks>
- -->
<dependenciesToScan>
<dependency>org.eclipse.microprofile.metrics:microprofile-metrics-api-tck</dependency>
<dependency>org.eclipse.microprofile.metrics:microprofile-metrics-rest-tck</dependency>
@@ -179,6 +177,9 @@
<environmentVariables>
<MP_METRICS_TAGS>tier=integration</MP_METRICS_TAGS>
</environmentVariables>
+ <systemPropertyVariables>
+ <geronimo.metrics.jaxrs.activated>true</geronimo.metrics.jaxrs.activated>
+ </systemPropertyVariables>
</configuration>
</plugin>
<plugin>
diff --git a/src/main/java/org/apache/geronimo/microprofile/metrics/cdi/MetricsExtension.java b/src/main/java/org/apache/geronimo/microprofile/metrics/cdi/MetricsExtension.java
index 87fbb43..1f50cde 100644
--- a/src/main/java/org/apache/geronimo/microprofile/metrics/cdi/MetricsExtension.java
+++ b/src/main/java/org/apache/geronimo/microprofile/metrics/cdi/MetricsExtension.java
@@ -42,6 +42,7 @@
import org.apache.geronimo.microprofile.metrics.impl.GaugeImpl;
import org.apache.geronimo.microprofile.metrics.impl.RegistryImpl;
+import org.apache.geronimo.microprofile.metrics.jaxrs.MetricsEndpoints;
import org.eclipse.microprofile.metrics.Counter;
import org.eclipse.microprofile.metrics.Gauge;
import org.eclipse.microprofile.metrics.Histogram;
@@ -64,6 +65,12 @@
private final Map<String, Function<BeanManager, Gauge<?>>> gaugeFactories = new HashMap<>();
private final Collection<CreationalContext<?>> creationalContexts = new ArrayList<>();
+ void letOtherExtensionsUseRegistries(@Observes final ProcessAnnotatedType<MetricsEndpoints> processAnnotatedType) {
+ if (!Boolean.getBoolean("geronimo.metrics.jaxrs.activated")) {
+ processAnnotatedType.veto();
+ }
+ }
+
void letOtherExtensionsUseRegistries(@Observes final BeforeBeanDiscovery beforeBeanDiscovery, final BeanManager beanManager) {
beforeBeanDiscovery.addQualifier(RegistryType.class);
beanManager.fireEvent(applicationRegistry);
diff --git a/src/main/java/org/apache/geronimo/microprofile/metrics/impl/HistogramImpl.java b/src/main/java/org/apache/geronimo/microprofile/metrics/impl/HistogramImpl.java
index edd7c00..c6ff674 100644
--- a/src/main/java/org/apache/geronimo/microprofile/metrics/impl/HistogramImpl.java
+++ b/src/main/java/org/apache/geronimo/microprofile/metrics/impl/HistogramImpl.java
@@ -47,6 +47,46 @@
return new SnapshotImpl(values.toArray(EMPTY_VALUES_ARRAY));
}
+ public double getP50() {
+ return getSnapshot().getMedian();
+ }
+
+ public double getP75() {
+ return getSnapshot().get75thPercentile();
+ }
+
+ public double getP95() {
+ return getSnapshot().get95thPercentile();
+ }
+
+ public double getP98() {
+ return getSnapshot().get98thPercentile();
+ }
+
+ public double getP99() {
+ return getSnapshot().get99thPercentile();
+ }
+
+ public double getP999() {
+ return getSnapshot().get999thPercentile();
+ }
+
+ public long getMax() {
+ return getSnapshot().getMax();
+ }
+
+ public double getMean() {
+ return getSnapshot().getMean();
+ }
+
+ public long getMin() {
+ return getSnapshot().getMin();
+ }
+
+ public double getStdDev() {
+ return getSnapshot().getStdDev();
+ }
+
// cheap way to avoid to explode the mem for nothing
private void refresh() {
final long now = System.nanoTime();
diff --git a/src/main/java/org/apache/geronimo/microprofile/metrics/impl/MeterImpl.java b/src/main/java/org/apache/geronimo/microprofile/metrics/impl/MeterImpl.java
index 631900b..5eddc83 100644
--- a/src/main/java/org/apache/geronimo/microprofile/metrics/impl/MeterImpl.java
+++ b/src/main/java/org/apache/geronimo/microprofile/metrics/impl/MeterImpl.java
@@ -40,20 +40,6 @@
rate15.update(n);
}
- private void doRefresh() {
- final long now = System.nanoTime();
- final long lastUpdateNs = lastUpdate.get();
- final long elaspsedTime = now - lastUpdateNs;
- if (elaspsedTime > INTERVAL_NS && lastUpdate.compareAndSet(lastUpdateNs, now)) {
- final long diff = elaspsedTime / INTERVAL_NS;
- for (long it = 0; it < diff; it++) { // simulate time, avoids a background thread
- rate1.refresh();
- rate5.refresh();
- rate15.refresh();
- }
- }
- }
-
@Override
public long getCount() {
return count.sum();
@@ -86,6 +72,20 @@
return count / TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - initNs);
}
+ private void doRefresh() {
+ final long now = System.nanoTime();
+ final long lastUpdateNs = lastUpdate.get();
+ final long elaspsedTime = now - lastUpdateNs;
+ if (elaspsedTime > INTERVAL_NS && lastUpdate.compareAndSet(lastUpdateNs, now)) {
+ final long diff = elaspsedTime / INTERVAL_NS;
+ for (long it = 0; it < diff; it++) { // simulate time, avoids a background thread
+ rate1.refresh();
+ rate5.refresh();
+ rate15.refresh();
+ }
+ }
+ }
+
private static class Rate {
private volatile double value = 0;
diff --git a/src/main/java/org/apache/geronimo/microprofile/metrics/impl/TimerImpl.java b/src/main/java/org/apache/geronimo/microprofile/metrics/impl/TimerImpl.java
index 1eb053d..9777164 100644
--- a/src/main/java/org/apache/geronimo/microprofile/metrics/impl/TimerImpl.java
+++ b/src/main/java/org/apache/geronimo/microprofile/metrics/impl/TimerImpl.java
@@ -81,6 +81,46 @@
return histogram.getSnapshot();
}
+ public double getP50() {
+ return getSnapshot().getMedian();
+ }
+
+ public double getP75() {
+ return getSnapshot().get75thPercentile();
+ }
+
+ public double getP95() {
+ return getSnapshot().get95thPercentile();
+ }
+
+ public double getP98() {
+ return getSnapshot().get98thPercentile();
+ }
+
+ public double getP99() {
+ return getSnapshot().get99thPercentile();
+ }
+
+ public double getP999() {
+ return getSnapshot().get999thPercentile();
+ }
+
+ public long getMax() {
+ return getSnapshot().getMax();
+ }
+
+ public double getMean() {
+ return getSnapshot().getMean();
+ }
+
+ public long getMin() {
+ return getSnapshot().getMin();
+ }
+
+ public double getStdDev() {
+ return getSnapshot().getStdDev();
+ }
+
private class ContextImpl implements Context {
private final long start = System.nanoTime();
diff --git a/src/main/java/org/apache/geronimo/microprofile/metrics/jaxrs/MetricsEndpoints.java b/src/main/java/org/apache/geronimo/microprofile/metrics/jaxrs/MetricsEndpoints.java
new file mode 100644
index 0000000..e31760f
--- /dev/null
+++ b/src/main/java/org/apache/geronimo/microprofile/metrics/jaxrs/MetricsEndpoints.java
@@ -0,0 +1,76 @@
+package org.apache.geronimo.microprofile.metrics.jaxrs;
+
+import static java.util.Collections.singletonMap;
+import static java.util.Locale.ROOT;
+import static java.util.stream.Collectors.toMap;
+import static org.eclipse.microprofile.metrics.MetricRegistry.Type.BASE;
+import static org.eclipse.microprofile.metrics.MetricRegistry.Type.VENDOR;
+
+import java.util.stream.Stream;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+import javax.ws.rs.GET;
+import javax.ws.rs.OPTIONS;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.eclipse.microprofile.metrics.MetricRegistry;
+import org.eclipse.microprofile.metrics.annotation.RegistryType;
+
+// TODO: ensure this is NOT deployed out of the box, this is a security hole!
+@Path("metrics")
+@ApplicationScoped
+@Produces(MediaType.APPLICATION_JSON)
+public class MetricsEndpoints {
+ @Inject
+ @RegistryType(type = BASE)
+ private MetricRegistry baseRegistry;
+
+ @Inject
+ @RegistryType(type = VENDOR)
+ private MetricRegistry vendorRegistry;
+
+ @Inject
+ private MetricRegistry applicationRegistry;
+
+ @GET
+ public Object get() {
+ return Stream.of(MetricRegistry.Type.values())
+ .collect(toMap(MetricRegistry.Type::getName, it -> findRegistry(it.getName())));
+ }
+
+ @GET
+ @Path("{registry}")
+ public Object get(@PathParam("registry") final String registry) {
+ return findRegistry(registry).getMetrics();
+ }
+
+ @GET
+ @Path("{registry}/{metric}")
+ public Object get(@PathParam("registry") final String registry,
+ @PathParam("metric") final String name) {
+ return singletonMap(name, findRegistry(registry).getMetrics().get(name));
+ }
+
+ @OPTIONS
+ @Path("{registry}/{metric}")
+ public Object options(@PathParam("registry") final String registry,
+ @PathParam("metric") final String name) {
+ return singletonMap(name, findRegistry(registry).getMetadata().get(name));
+ }
+
+ private MetricRegistry findRegistry(final String registry) {
+ switch (Stream.of(MetricRegistry.Type.values()).filter(it -> it.getName().equals(registry)).findFirst()
+ .orElseThrow(() -> new IllegalArgumentException(registry + " is not a valid registry"))) {
+ case BASE:
+ return baseRegistry;
+ case VENDOR:
+ return vendorRegistry;
+ default:
+ return applicationRegistry;
+ }
+ }
+}