From e02ad3ed9ce507d8b78cc511ea1832a86f77c274 Mon Sep 17 00:00:00 2001 From: "andre.schmid" Date: Wed, 6 Apr 2022 15:42:02 +0100 Subject: Add application metrics in the onboarding backend A new endpoint was introduced /onboarding-api/v1.0/actuator/prometheus in the onboarding backend, that returns application metrics in a format consumable by prometheus, using the micrometer library. Change-Id: I684b5cab55947c6bedee1b838343676489ad3ebf Issue-ID: SDC-3956 Signed-off-by: andre.schmid --- .../openecomp-sdc-rest-webapp/metrics-rest/pom.xml | 68 +++++++++++++++++++++ .../sdcrests/config/MicrometerSpringConfig.java | 38 ++++++++++++ .../metrics/api/PrometheusMetricsController.java | 42 +++++++++++++ .../impl/PrometheusMetricControllerImpl.java | 69 ++++++++++++++++++++++ 4 files changed, 217 insertions(+) create mode 100644 openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/pom.xml create mode 100644 openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/src/main/java/org/openecomp/sdcrests/config/MicrometerSpringConfig.java create mode 100644 openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/src/main/java/org/openecomp/sdcrests/metrics/api/PrometheusMetricsController.java create mode 100644 openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/src/main/java/org/openecomp/sdcrests/metrics/impl/PrometheusMetricControllerImpl.java (limited to 'openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest') diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/pom.xml b/openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/pom.xml new file mode 100644 index 0000000000..d5d022f6fe --- /dev/null +++ b/openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/pom.xml @@ -0,0 +1,68 @@ + + + + + + org.openecomp.sdc + openecomp-sdc-rest-webapp + 1.11.0-SNAPSHOT + + 4.0.0 + + metrics-rest + + + + javax.ws.rs + javax.ws.rs-api + ${ws.rs.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-web + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + io.micrometer + micrometer-registry-prometheus + ${micrometer.version} + + + io.swagger.core.v3 + swagger-annotations + ${swagger.version} + + + + \ No newline at end of file diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/src/main/java/org/openecomp/sdcrests/config/MicrometerSpringConfig.java b/openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/src/main/java/org/openecomp/sdcrests/config/MicrometerSpringConfig.java new file mode 100644 index 0000000000..847f6bcf0d --- /dev/null +++ b/openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/src/main/java/org/openecomp/sdcrests/config/MicrometerSpringConfig.java @@ -0,0 +1,38 @@ +/* + * - + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdcrests.config; + +import io.micrometer.prometheus.PrometheusConfig; +import io.micrometer.prometheus.PrometheusMeterRegistry; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MicrometerSpringConfig { + + @Bean(name = "prometheusRegistry") + PrometheusMeterRegistry prometheusRegistry() { + return new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); + } + +} + diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/src/main/java/org/openecomp/sdcrests/metrics/api/PrometheusMetricsController.java b/openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/src/main/java/org/openecomp/sdcrests/metrics/api/PrometheusMetricsController.java new file mode 100644 index 0000000000..d7b6e36c61 --- /dev/null +++ b/openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/src/main/java/org/openecomp/sdcrests/metrics/api/PrometheusMetricsController.java @@ -0,0 +1,42 @@ +/* + * - + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdcrests.metrics.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.Path; + +@Path(PrometheusMetricsController.URL) +@Tag(name = "SDCE-1 APIs") +public interface PrometheusMetricsController { + + String URL = "/v1.0/actuator/prometheus"; + + @GET + @Operation(summary = "Prometheus Micrometer Metrics", description = "Gets the prometheus micrometer application metrics") + String prometheusMetrics(@Parameter(description = "The Accept header to determine the output content type") + @HeaderParam(value = "Accept") String acceptHeader); + +} diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/src/main/java/org/openecomp/sdcrests/metrics/impl/PrometheusMetricControllerImpl.java b/openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/src/main/java/org/openecomp/sdcrests/metrics/impl/PrometheusMetricControllerImpl.java new file mode 100644 index 0000000000..0472bc703b --- /dev/null +++ b/openecomp-be/api/openecomp-sdc-rest-webapp/metrics-rest/src/main/java/org/openecomp/sdcrests/metrics/impl/PrometheusMetricControllerImpl.java @@ -0,0 +1,69 @@ +/* + * - + * ============LICENSE_START======================================================= + * Copyright (C) 2022 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdcrests.metrics.impl; + +import io.micrometer.core.instrument.binder.jetty.JettyConnectionMetrics; +import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics; +import io.micrometer.core.instrument.binder.jvm.JvmCompilationMetrics; +import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics; +import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics; +import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; +import io.micrometer.core.instrument.binder.system.FileDescriptorMetrics; +import io.micrometer.core.instrument.binder.system.ProcessorMetrics; +import io.micrometer.core.instrument.binder.system.UptimeMetrics; +import io.micrometer.prometheus.PrometheusMeterRegistry; +import io.prometheus.client.exporter.common.TextFormat; +import org.openecomp.sdcrests.metrics.api.PrometheusMetricsController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.RestController; + +@RestController("prometheusMetricsController") +public class PrometheusMetricControllerImpl implements PrometheusMetricsController { + + private static final Logger LOGGER = LoggerFactory.getLogger(PrometheusMetricControllerImpl.class); + + private final PrometheusMeterRegistry prometheusMeterRegistry; + + public PrometheusMetricControllerImpl(final PrometheusMeterRegistry prometheusMeterRegistry) { + this.prometheusMeterRegistry = prometheusMeterRegistry; + new ClassLoaderMetrics().bindTo(prometheusMeterRegistry); + try (final JvmGcMetrics jvmGcMetrics = new JvmGcMetrics()) { + jvmGcMetrics.bindTo(prometheusMeterRegistry); + } catch (final Exception e) { + LOGGER.error("Could not instantiate the JVM GC Metrics", e); + } + new JvmMemoryMetrics().bindTo(prometheusMeterRegistry); + new JvmCompilationMetrics().bindTo(prometheusMeterRegistry); + new JvmThreadMetrics().bindTo(prometheusMeterRegistry); + new ProcessorMetrics().bindTo(prometheusMeterRegistry); + new UptimeMetrics().bindTo(prometheusMeterRegistry); + new FileDescriptorMetrics().bindTo(prometheusMeterRegistry); + new JettyConnectionMetrics(prometheusMeterRegistry); + } + + @Override + public String prometheusMetrics(final String acceptHeader) { + return prometheusMeterRegistry.scrape(TextFormat.chooseContentType(acceptHeader)); + } + +} -- cgit 1.2.3-korg