From 5320c926ca6036b1695955a5c3ae55aeb87fdf64 Mon Sep 17 00:00:00 2001 From: Laxman Ch Date: Tue, 6 Dec 2022 18:36:24 +0530 Subject: [PATCH 1/4] grpc metrics --- platform-grpc-service-framework/build.gradle.kts | 1 + .../serviceframework/grpc/GrpcPlatformServiceContainer.java | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/platform-grpc-service-framework/build.gradle.kts b/platform-grpc-service-framework/build.gradle.kts index eb757a2..79dfedc 100644 --- a/platform-grpc-service-framework/build.gradle.kts +++ b/platform-grpc-service-framework/build.gradle.kts @@ -17,6 +17,7 @@ dependencies { annotationProcessor("org.projectlombok:lombok:1.18.24") compileOnly("org.projectlombok:lombok:1.18.24") + implementation(project(":platform-metrics")) implementation("org.slf4j:slf4j-api:1.7.36") implementation("org.hypertrace.core.grpcutils:grpc-server-utils:0.9.1") } diff --git a/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServiceContainer.java b/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServiceContainer.java index 34de8e5..4326b88 100644 --- a/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServiceContainer.java +++ b/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServiceContainer.java @@ -23,6 +23,8 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; + +import io.micrometer.core.instrument.binder.grpc.MetricCollectingServerInterceptor; import lombok.Value; import lombok.extern.slf4j.Slf4j; import org.hypertrace.core.grpcutils.client.InProcessGrpcChannelRegistry; @@ -30,6 +32,7 @@ import org.hypertrace.core.grpcutils.server.ServerManagementUtil; import org.hypertrace.core.serviceframework.PlatformService; import org.hypertrace.core.serviceframework.config.ConfigClient; +import org.hypertrace.core.serviceframework.metrics.PlatformMetricsRegistry; import org.hypertrace.core.serviceframework.spi.PlatformServiceLifecycle.State; @Slf4j @@ -219,6 +222,9 @@ protected abstract GrpcServiceContainerEnvironment buildContainerEnvironment( private ServerBuilder initializeBuilder(GrpcPlatformServerDefinition serverDefinition) { ServerBuilder builder = ServerBuilder.forPort(serverDefinition.getPort()); + // add micrometer-grpc interceptor to collect server metrics. + builder.intercept(new MetricCollectingServerInterceptor(PlatformMetricsRegistry.getMeterRegistry())); + if (serverDefinition.getMaxInboundMessageSize() > 0) { builder.maxInboundMessageSize(serverDefinition.getMaxInboundMessageSize()); } From 42596f2583e965766b42cb4443d5c98421cd91bb Mon Sep 17 00:00:00 2001 From: Aaron Steinfeld <45047841+aaron-steinfeld@users.noreply.github.com> Date: Wed, 7 Dec 2022 07:05:28 -0800 Subject: [PATCH 2/4] Grpc metrics suggestions (#61) * refactor: example * upgrade grpc-utils lib to the latest Co-authored-by: Laxman Ch --- .../build.gradle.kts | 4 ++-- ...solidatedGrpcPlatformServiceContainer.java | 12 ++++------ .../grpc/GrpcPlatformServiceContainer.java | 22 +++++++++++++++---- .../build.gradle.kts | 2 +- 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/platform-grpc-service-framework/build.gradle.kts b/platform-grpc-service-framework/build.gradle.kts index 79dfedc..0dd6b60 100644 --- a/platform-grpc-service-framework/build.gradle.kts +++ b/platform-grpc-service-framework/build.gradle.kts @@ -10,7 +10,7 @@ dependencies { api(platform("io.grpc:grpc-bom:1.47.0")) api("io.grpc:grpc-api") api("io.grpc:grpc-services") - api("org.hypertrace.core.grpcutils:grpc-client-utils:0.9.1") + api("org.hypertrace.core.grpcutils:grpc-client-utils:0.10.0") api("com.typesafe:config:1.4.2") api(project(":service-framework-spi")) @@ -19,5 +19,5 @@ dependencies { implementation(project(":platform-metrics")) implementation("org.slf4j:slf4j-api:1.7.36") - implementation("org.hypertrace.core.grpcutils:grpc-server-utils:0.9.1") + implementation("org.hypertrace.core.grpcutils:grpc-server-utils:0.10.0") } diff --git a/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/ConsolidatedGrpcPlatformServiceContainer.java b/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/ConsolidatedGrpcPlatformServiceContainer.java index 97746ac..c0fab1f 100644 --- a/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/ConsolidatedGrpcPlatformServiceContainer.java +++ b/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/ConsolidatedGrpcPlatformServiceContainer.java @@ -21,12 +21,6 @@ public ConsolidatedGrpcPlatformServiceContainer(ConfigClient configClient) { super(configClient); } - @Override - protected InProcessGrpcChannelRegistry buildChannelRegistry() { - return new InProcessGrpcChannelRegistry( - this.getAuthorityInProcessOverrideMap(this.getInProcessServerName())); - } - @Override protected GrpcServiceContainerEnvironment buildContainerEnvironment( InProcessGrpcChannelRegistry channelRegistry, HealthStatusManager healthStatusManager) { @@ -63,8 +57,10 @@ protected Collection getAuthoritiesToTreatAsInProcess() { return Collections.emptySet(); } - private Map getAuthorityInProcessOverrideMap(String inProcessName) { + protected Map getAuthorityInProcessOverrideMap() { return this.getAuthoritiesToTreatAsInProcess().stream() - .collect(Collectors.toUnmodifiableMap(Function.identity(), unused -> inProcessName)); + .collect( + Collectors.toUnmodifiableMap( + Function.identity(), unused -> this.getInProcessServerName())); } } diff --git a/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServiceContainer.java b/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServiceContainer.java index 4326b88..c3167eb 100644 --- a/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServiceContainer.java +++ b/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServiceContainer.java @@ -12,8 +12,10 @@ import io.grpc.health.v1.HealthGrpc.HealthBlockingStub; import io.grpc.inprocess.InProcessServerBuilder; import io.grpc.protobuf.services.HealthStatusManager; +import io.micrometer.core.instrument.binder.grpc.MetricCollectingClientInterceptor; import java.io.IOException; import java.util.Collection; +import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -27,6 +29,7 @@ import io.micrometer.core.instrument.binder.grpc.MetricCollectingServerInterceptor; import lombok.Value; import lombok.extern.slf4j.Slf4j; +import org.hypertrace.core.grpcutils.client.GrpcRegistryConfig; import org.hypertrace.core.grpcutils.client.InProcessGrpcChannelRegistry; import org.hypertrace.core.grpcutils.server.InterceptorUtil; import org.hypertrace.core.grpcutils.server.ServerManagementUtil; @@ -59,6 +62,8 @@ protected void doInit() { .collect(Collectors.toUnmodifiableMap(Function.identity(), this::initializeBuilder)); final ServerBuilder inProcessServerBuilder = InProcessServerBuilder.forName(this.getInProcessServerName()) + .intercept( + new MetricCollectingServerInterceptor(PlatformMetricsRegistry.getMeterRegistry())) .addService(this.healthStatusManager.getHealthService()); final GrpcServiceContainerEnvironment serviceContainerEnvironment = this.buildContainerEnvironment(this.grpcChannelRegistry, this.healthStatusManager); @@ -189,7 +194,12 @@ public boolean healthCheck() { } protected InProcessGrpcChannelRegistry buildChannelRegistry() { - return new InProcessGrpcChannelRegistry(); + return new InProcessGrpcChannelRegistry( + this.getAuthorityInProcessOverrideMap(), + GrpcRegistryConfig.builder() + .defaultInterceptor( + new MetricCollectingClientInterceptor(PlatformMetricsRegistry.getMeterRegistry())) + .build()); } protected String getInProcessServerName() { @@ -214,6 +224,10 @@ protected void registerManagedPeriodicTask(PlatformPeriodicTaskDefinition period } } + protected Map getAuthorityInProcessOverrideMap() { + return Collections.emptyMap(); + } + protected abstract List getServerDefinitions(); protected abstract GrpcServiceContainerEnvironment buildContainerEnvironment( @@ -222,12 +236,12 @@ protected abstract GrpcServiceContainerEnvironment buildContainerEnvironment( private ServerBuilder initializeBuilder(GrpcPlatformServerDefinition serverDefinition) { ServerBuilder builder = ServerBuilder.forPort(serverDefinition.getPort()); - // add micrometer-grpc interceptor to collect server metrics. - builder.intercept(new MetricCollectingServerInterceptor(PlatformMetricsRegistry.getMeterRegistry())); - if (serverDefinition.getMaxInboundMessageSize() > 0) { builder.maxInboundMessageSize(serverDefinition.getMaxInboundMessageSize()); } + // add micrometer-grpc interceptor to collect server metrics. + builder.intercept( + new MetricCollectingServerInterceptor(PlatformMetricsRegistry.getMeterRegistry())); serverDefinition.getServerInterceptors().forEach(builder::intercept); return builder; diff --git a/platform-http-service-framework/build.gradle.kts b/platform-http-service-framework/build.gradle.kts index 072e141..43d975d 100644 --- a/platform-http-service-framework/build.gradle.kts +++ b/platform-http-service-framework/build.gradle.kts @@ -5,7 +5,7 @@ plugins { dependencies { api(project(":platform-service-framework")) - api("org.hypertrace.core.grpcutils:grpc-client-utils:0.9.1") + api("org.hypertrace.core.grpcutils:grpc-client-utils:0.10.0") api("com.typesafe:config:1.4.2") api("javax.servlet:javax.servlet-api:4.0.1") api("com.google.inject:guice:5.1.0") From fa97442ca3551addb546f3d8b09c9eb2fa08c408 Mon Sep 17 00:00:00 2001 From: Laxman Ch Date: Thu, 8 Dec 2022 00:51:09 +0530 Subject: [PATCH 3/4] refactor default tags mechanism --- .../metrics/PlatformMetricsRegistry.java | 45 ++++++++++--------- .../serviceframework/PlatformServiceTest.java | 14 +++--- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/platform-metrics/src/main/java/org/hypertrace/core/serviceframework/metrics/PlatformMetricsRegistry.java b/platform-metrics/src/main/java/org/hypertrace/core/serviceframework/metrics/PlatformMetricsRegistry.java index 2eef97d..bbce3d2 100644 --- a/platform-metrics/src/main/java/org/hypertrace/core/serviceframework/metrics/PlatformMetricsRegistry.java +++ b/platform-metrics/src/main/java/org/hypertrace/core/serviceframework/metrics/PlatformMetricsRegistry.java @@ -12,6 +12,7 @@ import com.typesafe.config.Config; import io.github.mweirauch.micrometer.jvm.extras.ProcessMemoryMetrics; import io.github.mweirauch.micrometer.jvm.extras.ProcessThreadMetrics; +import io.micrometer.common.util.StringUtils; import io.micrometer.core.instrument.Clock; import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.DistributionSummary; @@ -33,7 +34,6 @@ import io.micrometer.core.instrument.logging.LoggingMeterRegistry; import io.micrometer.core.instrument.logging.LoggingRegistryConfig; import io.micrometer.core.instrument.simple.SimpleMeterRegistry; -import io.micrometer.core.instrument.util.StringUtils; import io.micrometer.core.lang.NonNull; import io.micrometer.core.lang.Nullable; import io.micrometer.prometheus.PrometheusConfig; @@ -98,7 +98,6 @@ public class PlatformMetricsRegistry { }}; private static boolean isInit = false; - private static final Set DEFAULT_TAGS = new HashSet<>(); /** * Main MetricMeter registry, with which all the metrics should be registered. We use @@ -261,16 +260,18 @@ public synchronized static void initMetricsRegistry(String serviceName, Config c } LOGGER.info("Setting default tags for all metrics to: {}", defaultTags); - defaultTags.forEach((key, value) -> DEFAULT_TAGS.add(new ImmutableTag(key, value))); + defaultTags.forEach((key, value) -> { + METER_REGISTRY.config().commonTags(List.of((new ImmutableTag(key, value)))); + }); // Register different metrics with the registry. - new ClassLoaderMetrics(DEFAULT_TAGS).bindTo(METER_REGISTRY); - new JvmGcMetrics(DEFAULT_TAGS).bindTo(METER_REGISTRY); - new ProcessorMetrics(DEFAULT_TAGS).bindTo(METER_REGISTRY); - new JvmThreadMetrics(DEFAULT_TAGS).bindTo(METER_REGISTRY); - new JvmMemoryMetrics(DEFAULT_TAGS).bindTo(METER_REGISTRY); - new UptimeMetrics(DEFAULT_TAGS).bindTo(METER_REGISTRY); - new Log4j2Metrics(DEFAULT_TAGS).bindTo(METER_REGISTRY); + new ClassLoaderMetrics().bindTo(METER_REGISTRY); + new JvmGcMetrics().bindTo(METER_REGISTRY); + new ProcessorMetrics().bindTo(METER_REGISTRY); + new JvmThreadMetrics().bindTo(METER_REGISTRY); + new JvmMemoryMetrics().bindTo(METER_REGISTRY); + new UptimeMetrics().bindTo(METER_REGISTRY); + new Log4j2Metrics().bindTo(METER_REGISTRY); new ProcessMemoryMetrics().bindTo(METER_REGISTRY); new ProcessThreadMetrics().bindTo(METER_REGISTRY); @@ -302,7 +303,7 @@ public static void register(String metricName, Metric metric) { * See https://micrometer.io/docs/concepts#_counters for more details on the Counter. */ public static Counter registerCounter(String name, Map tags) { - return METER_REGISTRY.counter(name, addDefaultTags(tags)); + return METER_REGISTRY.counter(name, toIterable(tags)); } /** @@ -326,7 +327,8 @@ public static Timer registerTimer(String name, Map tags) { public static Timer registerTimer(String name, Map tags, boolean histogram) { Timer.Builder builder = Timer.builder(name) .publishPercentiles(0.5, 0.95, 0.99) - .tags(addDefaultTags(tags)); + .tags(toIterable(tags)); + if (histogram) { builder = builder.publishPercentileHistogram(); } @@ -341,7 +343,7 @@ public static Timer registerTimer(String name, Map tags, boolean * See https://micrometer.io/docs/concepts#_gauges for more details on the Gauges. */ public static T registerGauge(String name, Map tags, T number) { - Gauge.builder(name, number, Number::doubleValue).tags(addDefaultTags(tags)).strongReference(true).register(METER_REGISTRY); + Gauge.builder(name, number, Number::doubleValue).tags(toIterable(tags)).strongReference(true).register(METER_REGISTRY); return number; } @@ -372,7 +374,7 @@ public static DistributionSummary registerDistributionSummary(String name, Map tags, boolean histogram) { DistributionSummary.Builder builder = DistributionSummary.builder(name) .publishPercentiles(0.5, 0.95, 0.99) - .tags(addDefaultTags(tags)); + .tags(toIterable(tags)); if (histogram) { builder = builder.publishPercentileHistogram(); } @@ -384,7 +386,7 @@ public static DistributionSummary registerDistributionSummary(String name, * cacheName for the given guavaCache */ public static void registerCache(String cacheName, Cache guavaCache, Map tags) { - GuavaCacheMetrics.monitor(METER_REGISTRY, guavaCache, cacheName, addDefaultTags(tags)); + GuavaCacheMetrics.monitor(METER_REGISTRY, guavaCache, cacheName, toIterable(tags)); } @@ -397,16 +399,16 @@ public static void registerCache(String cacheName, Cache guavaCache */ public static void monitorExecutorService(String name, ExecutorService executorService, @Nullable Map tags) { - new ExecutorServiceMetrics(executorService, name, addDefaultTags(tags)).bindTo(METER_REGISTRY); + new ExecutorServiceMetrics(executorService, name, toIterable(tags)).bindTo(METER_REGISTRY); } - private static Iterable addDefaultTags(Map tags) { - if (tags == null || tags.isEmpty()) { - return DEFAULT_TAGS; + private static Iterable toIterable(Map tags) { + Set newTags = new HashSet<>(); + + if (tags != null) { + tags.forEach((k, v) -> newTags.add(new ImmutableTag(k, v))); } - Set newTags = new HashSet<>(DEFAULT_TAGS); - tags.forEach((k, v) -> newTags.add(new ImmutableTag(k, v))); return newTags; } @@ -422,7 +424,6 @@ public static synchronized void stop() { stopConsoleMetricsReporter(); METRIC_REGISTRY.getNames().forEach(METRIC_REGISTRY::remove); - DEFAULT_TAGS.clear(); /* For each meter registry in this composite, it will call the close function */ METER_REGISTRY.getRegistries().forEach(MeterRegistry::close); METER_REGISTRY.forEachMeter(METER_REGISTRY::remove); diff --git a/platform-service-framework/src/test/java/org/hypertrace/core/serviceframework/PlatformServiceTest.java b/platform-service-framework/src/test/java/org/hypertrace/core/serviceframework/PlatformServiceTest.java index 0a9971a..013f330 100644 --- a/platform-service-framework/src/test/java/org/hypertrace/core/serviceframework/PlatformServiceTest.java +++ b/platform-service-framework/src/test/java/org/hypertrace/core/serviceframework/PlatformServiceTest.java @@ -92,11 +92,11 @@ private void startService(final PlatformService service) { @Test public void testMetricInitialization() { - PlatformService service = getService(Map.of("service.name", "test-service", + PlatformService service = getService(Map.of("service.name", "sample-app", "service.admin.port", "59001")); startService(service); - assertEquals("test-service", service.getServiceName()); + assertEquals("sample-app", service.getServiceName()); Assertions.assertTrue(service.healthCheck()); // Verify that the metric registry is initialized and `/metrics` endpoint is working. @@ -109,7 +109,7 @@ public void testMetricInitialization() { EntityUtils.consume(response.getEntity()); // Verify that some key JVM metrics are present in the response. - Assertions.assertTrue(responseStr.contains("jvm_memory_used_bytes{app=\"test-service\",area=\"heap\"")); + Assertions.assertTrue(responseStr.contains("jvm_memory_used_bytes{app=\"sample-app\",area=\"heap\"")); } catch (IOException e) { e.printStackTrace(); Assertions.fail("Unexpected exception: " + e.getMessage()); @@ -129,13 +129,13 @@ public void testMetricInitialization() { @Test public void testMetricInitializationWithDefaultTags() { PlatformService service = getService( - Map.of("service.name", "test-service2", + Map.of("service.name", "sample-app", "service.admin.port", "59002", "metrics.defaultTags", List.of("foo", "bar", "k1", "v1", "k2")) ); startService(service); - assertEquals("test-service2", service.getServiceName()); + assertEquals("sample-app", service.getServiceName()); Assertions.assertTrue(service.healthCheck()); // Verify that the metric registry is initialized and `/metrics` endpoint is working. @@ -149,7 +149,7 @@ public void testMetricInitializationWithDefaultTags() { System.out.println(responseStr); // Verify that some key JVM metrics are present in the response. - Assertions.assertTrue(responseStr.contains("jvm_memory_used_bytes{app=\"test-service2\",area=\"heap\",foo=\"bar\"")); + Assertions.assertTrue(responseStr.contains("jvm_memory_used_bytes{app=\"sample-app\",area=\"heap\",foo=\"bar\"")); } catch (IOException e) { e.printStackTrace(); Assertions.fail("Unexpected exception: " + e.getMessage()); @@ -190,7 +190,7 @@ public void testSampleAppInitialization() { @Test void testLifecycle() { PlatformService service = getService( - Map.of("service.name", "test-service2", + Map.of("service.name", "sample-app", "service.admin.port", "59002") ); assertEquals(State.NOT_STARTED, service.getServiceState()); From 46f57de249901d96e39aab7e33c5b9ebb5915c5d Mon Sep 17 00:00:00 2001 From: Laxman Ch Date: Thu, 8 Dec 2022 02:12:25 +0530 Subject: [PATCH 4/4] review comments fix --- .../metrics/PlatformMetricsRegistry.java | 58 ++++++++++--------- .../serviceframework/PlatformServiceTest.java | 14 ++--- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/platform-metrics/src/main/java/org/hypertrace/core/serviceframework/metrics/PlatformMetricsRegistry.java b/platform-metrics/src/main/java/org/hypertrace/core/serviceframework/metrics/PlatformMetricsRegistry.java index bbce3d2..f79ee32 100644 --- a/platform-metrics/src/main/java/org/hypertrace/core/serviceframework/metrics/PlatformMetricsRegistry.java +++ b/platform-metrics/src/main/java/org/hypertrace/core/serviceframework/metrics/PlatformMetricsRegistry.java @@ -42,6 +42,7 @@ import io.prometheus.client.dropwizard.DropwizardExports; import io.prometheus.client.exporter.PushGateway; import java.time.Duration; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -104,13 +105,13 @@ public class PlatformMetricsRegistry { * a {@link CompositeMeterRegistry} here so that we can even registry multiple registries * like Prometheus and Logging registries, if needed. */ - private static final CompositeMeterRegistry METER_REGISTRY = new CompositeMeterRegistry(); + private static CompositeMeterRegistry meterRegistry = new CompositeMeterRegistry(); private static void initPrometheusReporter(int reportInterval) { LOGGER.info("Trying to init PrometheusReporter"); // Add Prometheus registry to the composite registry. - METER_REGISTRY.add(new PrometheusMeterRegistry(new PrometheusConfig() { + meterRegistry.add(new PrometheusMeterRegistry(new PrometheusConfig() { @Override @NonNull public Duration step() { @@ -137,7 +138,7 @@ private static void initConsoleMetricsReporter(final int reportIntervalSec) { private static void initLoggingMetricsReporter(int reportIntervalSec) { LOGGER.info("Initializing the logging metric reporter."); - METER_REGISTRY.add(new LoggingMeterRegistry(new LoggingRegistryConfig() { + meterRegistry.add(new LoggingMeterRegistry(new LoggingRegistryConfig() { @Override @NonNull public Duration step() { @@ -155,7 +156,7 @@ public String get(String key) { private static void initTestingMetricsReporter() { LOGGER.info("Initializing the testing metric reporter."); - METER_REGISTRY.add(new SimpleMeterRegistry()); + meterRegistry.add(new SimpleMeterRegistry()); } private static void initPrometheusPushGatewayReporter(String serviceName, @@ -169,7 +170,7 @@ private static void initPrometheusPushGatewayReporter(String serviceName, throw new IllegalArgumentException("pushUrlAddress configuration is not specified."); } - METER_REGISTRY.add(new PrometheusPushMeterRegistry( + meterRegistry.add(new PrometheusPushMeterRegistry( new PrometheusPushRegistryConfig() { @Override public String jobName() { @@ -261,20 +262,20 @@ public synchronized static void initMetricsRegistry(String serviceName, Config c LOGGER.info("Setting default tags for all metrics to: {}", defaultTags); defaultTags.forEach((key, value) -> { - METER_REGISTRY.config().commonTags(List.of((new ImmutableTag(key, value)))); + meterRegistry.config().commonTags(List.of((new ImmutableTag(key, value)))); }); // Register different metrics with the registry. - new ClassLoaderMetrics().bindTo(METER_REGISTRY); - new JvmGcMetrics().bindTo(METER_REGISTRY); - new ProcessorMetrics().bindTo(METER_REGISTRY); - new JvmThreadMetrics().bindTo(METER_REGISTRY); - new JvmMemoryMetrics().bindTo(METER_REGISTRY); - new UptimeMetrics().bindTo(METER_REGISTRY); - new Log4j2Metrics().bindTo(METER_REGISTRY); + new ClassLoaderMetrics().bindTo(meterRegistry); + new JvmGcMetrics().bindTo(meterRegistry); + new ProcessorMetrics().bindTo(meterRegistry); + new JvmThreadMetrics().bindTo(meterRegistry); + new JvmMemoryMetrics().bindTo(meterRegistry); + new UptimeMetrics().bindTo(meterRegistry); + new Log4j2Metrics().bindTo(meterRegistry); - new ProcessMemoryMetrics().bindTo(METER_REGISTRY); - new ProcessThreadMetrics().bindTo(METER_REGISTRY); + new ProcessMemoryMetrics().bindTo(meterRegistry); + new ProcessThreadMetrics().bindTo(meterRegistry); for (String key : DEFAULT_METRIC_SET.keySet()) { METRIC_REGISTRY @@ -303,7 +304,7 @@ public static void register(String metricName, Metric metric) { * See https://micrometer.io/docs/concepts#_counters for more details on the Counter. */ public static Counter registerCounter(String name, Map tags) { - return METER_REGISTRY.counter(name, toIterable(tags)); + return meterRegistry.counter(name, toIterable(tags)); } /** @@ -332,7 +333,7 @@ public static Timer registerTimer(String name, Map tags, boolean if (histogram) { builder = builder.publishPercentileHistogram(); } - return builder.register(METER_REGISTRY); + return builder.register(meterRegistry); } /** @@ -343,7 +344,7 @@ public static Timer registerTimer(String name, Map tags, boolean * See https://micrometer.io/docs/concepts#_gauges for more details on the Gauges. */ public static T registerGauge(String name, Map tags, T number) { - Gauge.builder(name, number, Number::doubleValue).tags(toIterable(tags)).strongReference(true).register(METER_REGISTRY); + Gauge.builder(name, number, Number::doubleValue).tags(toIterable(tags)).strongReference(true).register(meterRegistry); return number; } @@ -378,7 +379,7 @@ public static DistributionSummary registerDistributionSummary(String name, if (histogram) { builder = builder.publishPercentileHistogram(); } - return builder.register(METER_REGISTRY); + return builder.register(meterRegistry); } /** @@ -386,7 +387,7 @@ public static DistributionSummary registerDistributionSummary(String name, * cacheName for the given guavaCache */ public static void registerCache(String cacheName, Cache guavaCache, Map tags) { - GuavaCacheMetrics.monitor(METER_REGISTRY, guavaCache, cacheName, toIterable(tags)); + GuavaCacheMetrics.monitor(meterRegistry, guavaCache, cacheName, toIterable(tags)); } @@ -399,11 +400,11 @@ public static void registerCache(String cacheName, Cache guavaCache */ public static void monitorExecutorService(String name, ExecutorService executorService, @Nullable Map tags) { - new ExecutorServiceMetrics(executorService, name, toIterable(tags)).bindTo(METER_REGISTRY); + new ExecutorServiceMetrics(executorService, name, toIterable(tags)).bindTo(meterRegistry); } private static Iterable toIterable(Map tags) { - Set newTags = new HashSet<>(); + List newTags = new ArrayList<>(); if (tags != null) { tags.forEach((k, v) -> newTags.add(new ImmutableTag(k, v))); @@ -417,7 +418,7 @@ public static MetricRegistry getMetricRegistry() { } public static MeterRegistry getMeterRegistry() { - return METER_REGISTRY; + return meterRegistry; } public static synchronized void stop() { @@ -425,13 +426,14 @@ public static synchronized void stop() { METRIC_REGISTRY.getNames().forEach(METRIC_REGISTRY::remove); /* For each meter registry in this composite, it will call the close function */ - METER_REGISTRY.getRegistries().forEach(MeterRegistry::close); - METER_REGISTRY.forEachMeter(METER_REGISTRY::remove); - METER_REGISTRY.getRegistries().forEach(MeterRegistry::clear); - Set registries = new HashSet<>(METER_REGISTRY.getRegistries()); - registries.forEach(METER_REGISTRY::remove); + meterRegistry.getRegistries().forEach(MeterRegistry::close); + meterRegistry.forEachMeter(meterRegistry::remove); + meterRegistry.getRegistries().forEach(MeterRegistry::clear); + Set registries = new HashSet<>(meterRegistry.getRegistries()); + registries.forEach(meterRegistry::remove); registries.clear(); CollectorRegistry.defaultRegistry.clear(); + meterRegistry = new CompositeMeterRegistry(); isInit = false; } diff --git a/platform-service-framework/src/test/java/org/hypertrace/core/serviceframework/PlatformServiceTest.java b/platform-service-framework/src/test/java/org/hypertrace/core/serviceframework/PlatformServiceTest.java index 013f330..0a9971a 100644 --- a/platform-service-framework/src/test/java/org/hypertrace/core/serviceframework/PlatformServiceTest.java +++ b/platform-service-framework/src/test/java/org/hypertrace/core/serviceframework/PlatformServiceTest.java @@ -92,11 +92,11 @@ private void startService(final PlatformService service) { @Test public void testMetricInitialization() { - PlatformService service = getService(Map.of("service.name", "sample-app", + PlatformService service = getService(Map.of("service.name", "test-service", "service.admin.port", "59001")); startService(service); - assertEquals("sample-app", service.getServiceName()); + assertEquals("test-service", service.getServiceName()); Assertions.assertTrue(service.healthCheck()); // Verify that the metric registry is initialized and `/metrics` endpoint is working. @@ -109,7 +109,7 @@ public void testMetricInitialization() { EntityUtils.consume(response.getEntity()); // Verify that some key JVM metrics are present in the response. - Assertions.assertTrue(responseStr.contains("jvm_memory_used_bytes{app=\"sample-app\",area=\"heap\"")); + Assertions.assertTrue(responseStr.contains("jvm_memory_used_bytes{app=\"test-service\",area=\"heap\"")); } catch (IOException e) { e.printStackTrace(); Assertions.fail("Unexpected exception: " + e.getMessage()); @@ -129,13 +129,13 @@ public void testMetricInitialization() { @Test public void testMetricInitializationWithDefaultTags() { PlatformService service = getService( - Map.of("service.name", "sample-app", + Map.of("service.name", "test-service2", "service.admin.port", "59002", "metrics.defaultTags", List.of("foo", "bar", "k1", "v1", "k2")) ); startService(service); - assertEquals("sample-app", service.getServiceName()); + assertEquals("test-service2", service.getServiceName()); Assertions.assertTrue(service.healthCheck()); // Verify that the metric registry is initialized and `/metrics` endpoint is working. @@ -149,7 +149,7 @@ public void testMetricInitializationWithDefaultTags() { System.out.println(responseStr); // Verify that some key JVM metrics are present in the response. - Assertions.assertTrue(responseStr.contains("jvm_memory_used_bytes{app=\"sample-app\",area=\"heap\",foo=\"bar\"")); + Assertions.assertTrue(responseStr.contains("jvm_memory_used_bytes{app=\"test-service2\",area=\"heap\",foo=\"bar\"")); } catch (IOException e) { e.printStackTrace(); Assertions.fail("Unexpected exception: " + e.getMessage()); @@ -190,7 +190,7 @@ public void testSampleAppInitialization() { @Test void testLifecycle() { PlatformService service = getService( - Map.of("service.name", "sample-app", + Map.of("service.name", "test-service2", "service.admin.port", "59002") ); assertEquals(State.NOT_STARTED, service.getServiceState());