This is an automated email from the ASF dual-hosted git repository. liubao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
commit 10b916be22f3b0c1fa0fb0b9da2764109f2a4f7e Author: wujimin <[email protected]> AuthorDate: Thu Nov 22 09:19:12 2018 +0800 [SCB-1034][WIP] rest and Prometheus publisher switch to new mechanism --- .../demo/springmvc/client/SpringmvcClient.java | 4 ---- .../demo/springmvc/server/CodeFirstSpringmvc.java | 8 ++++++++ .../foundation/metrics/MetricsBootstrap.java | 2 +- .../metrics/core/MetricsBootListener.java | 4 ++++ .../metrics/core/publish/MetricsRestPublisher.java | 22 +++++++++++---------- .../core/publish/TestMetricsRestPublisher.java | 5 ++--- .../metrics/prometheus/PrometheusPublisher.java | 23 ++++++++++++---------- .../prometheus/TestPrometheusPublisher.java | 5 ++--- 8 files changed, 42 insertions(+), 31 deletions(-) diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java index e380804..411aa11 100644 --- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java +++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java @@ -125,10 +125,6 @@ public class SpringmvcClient { // TestMgr.check(true, metrics.get("jvm(name=heapUsed,statistic=gauge)") != 0); TestMgr.check(true, metrics.size() > 0); - TestMgr.check(true, - metrics.get( - "servicecomb.invocation(operation=springmvc.codeFirst.saySomething,role=PRODUCER,stage=total,statistic=count,status=200,transport=highway)") - >= 0); //prometheus integration test try { diff --git a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java index 0ab7487..36adfcb 100644 --- a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java +++ b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/CodeFirstSpringmvc.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; +import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Part; import javax.ws.rs.QueryParam; @@ -44,6 +45,7 @@ import org.apache.servicecomb.demo.ignore.OutputModelForTestIgnore; import org.apache.servicecomb.demo.jaxbbean.JAXBPerson; import org.apache.servicecomb.demo.server.User; import org.apache.servicecomb.demo.springmvc.decoderesponse.DecodeTestResponse; +import org.apache.servicecomb.metrics.core.MetricsBootListener; import org.apache.servicecomb.provider.rest.common.RestSchema; import org.apache.servicecomb.swagger.extend.annotations.RawJsonRequestBody; import org.apache.servicecomb.swagger.extend.annotations.ResponseHeaders; @@ -361,9 +363,15 @@ public class CodeFirstSpringmvc { return form1 + form2; } + @Inject + MetricsBootListener metricsBootListener; + //Only for Prometheus integration test @RequestMapping(path = "/prometheusForTest", method = RequestMethod.GET) public String prometheusForTest() { + // just for test, this makes client always can got latest metrics + metricsBootListener.getMetricsBootstrap().pollMeters(); + RestTemplate defaultRestTemplate = new RestTemplate(); return defaultRestTemplate.getForObject("http://localhost:9696/metrics", String.class); } diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java index a63a98d..d2647f0 100644 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java +++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java @@ -72,7 +72,7 @@ public class MetricsBootstrap { TimeUnit.MILLISECONDS); } - protected void pollMeters() { + public synchronized void pollMeters() { long secondInterval = TimeUnit.MILLISECONDS.toSeconds(config.getMsPollInterval()); PolledEvent polledEvent = globalRegistry.poll(secondInterval); eventBus.post(polledEvent); diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java index be8963d..376c502 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java @@ -36,6 +36,10 @@ public class MetricsBootListener implements BootListener { @Inject private ProducerSchemaFactory producerSchemaFactory; + public MetricsBootstrap getMetricsBootstrap() { + return metricsBootstrap; + } + @Override public void onBootEvent(BootEvent event) { switch (event.getEventType()) { diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/MetricsRestPublisher.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/MetricsRestPublisher.java index 2669b37..629b171 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/MetricsRestPublisher.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/MetricsRestPublisher.java @@ -27,20 +27,22 @@ import javax.ws.rs.Path; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; import org.apache.servicecomb.foundation.metrics.MetricsInitializer; +import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry; import com.google.common.eventbus.EventBus; -import com.netflix.spectator.api.CompositeRegistry; import com.netflix.spectator.api.Id; +import com.netflix.spectator.api.Meter; +import com.netflix.spectator.api.Registry; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; @Path("/metrics") public class MetricsRestPublisher implements MetricsInitializer { - private CompositeRegistry globalRegistry; + private GlobalRegistry globalRegistry; @Override - public void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { + public void init(GlobalRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { this.globalRegistry = globalRegistry; } @@ -56,14 +58,14 @@ public class MetricsRestPublisher implements MetricsInitializer { } StringBuilder sb = new StringBuilder(); - globalRegistry - .iterator() - .forEachRemaining(meter -> { - meter.measure().forEach(measurement -> { - String key = idToString(measurement.id(), sb); - measurements.put(key, measurement.value()); - }); + for (Registry registry : globalRegistry.getRegistries()) { + for (Meter meter : registry) { + meter.measure().forEach(measurement -> { + String key = idToString(measurement.id(), sb); + measurements.put(key, measurement.value()); }); + } + } return measurements; } diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestMetricsRestPublisher.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestMetricsRestPublisher.java index 83ed66d..40b72f3 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestMetricsRestPublisher.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestMetricsRestPublisher.java @@ -19,16 +19,15 @@ package org.apache.servicecomb.metrics.core.publish; import java.util.Map; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; +import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry; import org.junit.Assert; import org.junit.Test; import com.google.common.eventbus.EventBus; import com.netflix.spectator.api.Clock; -import com.netflix.spectator.api.CompositeRegistry; import com.netflix.spectator.api.DefaultRegistry; import com.netflix.spectator.api.ManualClock; import com.netflix.spectator.api.Registry; -import com.netflix.spectator.api.SpectatorUtils; public class TestMetricsRestPublisher { MetricsRestPublisher publisher = new MetricsRestPublisher(); @@ -43,7 +42,7 @@ public class TestMetricsRestPublisher { @Test public void measure_normal() { Clock clock = new ManualClock(); - CompositeRegistry globalRegistry = SpectatorUtils.createCompositeRegistry(clock); + GlobalRegistry globalRegistry = new GlobalRegistry(); Registry registry = new DefaultRegistry(clock); registry.timer(registry.createId("name", "t1", "v1", "t2", "v2")); globalRegistry.add(registry); diff --git a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java index b1eb9c6..af62c09 100644 --- a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java +++ b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java @@ -24,13 +24,15 @@ import java.util.List; import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; import org.apache.servicecomb.foundation.metrics.MetricsInitializer; +import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.eventbus.EventBus; import com.netflix.config.DynamicPropertyFactory; -import com.netflix.spectator.api.CompositeRegistry; import com.netflix.spectator.api.Measurement; +import com.netflix.spectator.api.Meter; +import com.netflix.spectator.api.Registry; import com.netflix.spectator.api.Tag; import io.prometheus.client.Collector; @@ -45,10 +47,10 @@ public class PrometheusPublisher extends Collector implements Collector.Describa private HTTPServer httpServer; - private CompositeRegistry globalRegistry; + private GlobalRegistry globalRegistry; @Override - public void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { + public void init(GlobalRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { this.globalRegistry = globalRegistry; //prometheus default port allocation is here : https://github.com/prometheus/prometheus/wiki/Default-port-allocations @@ -82,14 +84,15 @@ public class PrometheusPublisher extends Collector implements Collector.Describa } List<Sample> samples = new ArrayList<>(); - globalRegistry - .iterator() - .forEachRemaining(meter -> { - meter.measure().forEach(measurement -> { - Sample sample = convertMeasurementToSample(measurement); - samples.add(sample); - }); + for (Registry registry : globalRegistry.getRegistries()) { + for (Meter meter : registry) { + meter.measure().forEach(measurement -> { + Sample sample = convertMeasurementToSample(measurement); + samples.add(sample); }); + } + } + familySamples.add(new MetricFamilySamples("ServiceComb Metrics", Type.UNTYPED, "ServiceComb Metrics", samples)); return familySamples; diff --git a/metrics/metrics-integration/metrics-prometheus/src/test/java/org/apache/servicecomb/metrics/prometheus/TestPrometheusPublisher.java b/metrics/metrics-integration/metrics-prometheus/src/test/java/org/apache/servicecomb/metrics/prometheus/TestPrometheusPublisher.java index c953730..cc10b4e 100644 --- a/metrics/metrics-integration/metrics-prometheus/src/test/java/org/apache/servicecomb/metrics/prometheus/TestPrometheusPublisher.java +++ b/metrics/metrics-integration/metrics-prometheus/src/test/java/org/apache/servicecomb/metrics/prometheus/TestPrometheusPublisher.java @@ -25,6 +25,7 @@ import java.net.URL; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.servicecomb.foundation.common.exceptions.ServiceCombException; +import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry; import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils; import org.junit.AfterClass; import org.junit.Assert; @@ -32,19 +33,17 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import com.netflix.spectator.api.CompositeRegistry; import com.netflix.spectator.api.Counter; import com.netflix.spectator.api.DefaultRegistry; import com.netflix.spectator.api.ManualClock; import com.netflix.spectator.api.Registry; -import com.netflix.spectator.api.SpectatorUtils; import com.sun.net.httpserver.HttpServer; import io.prometheus.client.exporter.HTTPServer; @SuppressWarnings("restriction") public class TestPrometheusPublisher { - CompositeRegistry globalRegistry = SpectatorUtils.createCompositeRegistry(new ManualClock()); + GlobalRegistry globalRegistry = new GlobalRegistry(new ManualClock()); PrometheusPublisher publisher = new PrometheusPublisher();
