diff options
author | Piotr Jaszczyk <piotr.jaszczyk@nokia.com> | 2019-06-03 14:20:40 +0200 |
---|---|---|
committer | Piotr Jaszczyk <piotr.jaszczyk@nokia.com> | 2019-06-12 09:41:01 +0000 |
commit | 3d6feef167f8e8eb716312599132c41dd89457cb (patch) | |
tree | 0a3b8b8f7371a0d655fff0146dd70080098f5102 /standardization/moher-api/server-adapters/spring-webflux | |
parent | 6c2951519650779c019431f990b22b71feb220dc (diff) |
Monitoring API - write framework adapters
Change-Id: Iaba9c4ef6022d01c1f572055316700a3a4dfa8f2
Issue-ID: DCAEGEN2-1589
Signed-off-by: Piotr Jaszczyk <piotr.jaszczyk@nokia.com>
Diffstat (limited to 'standardization/moher-api/server-adapters/spring-webflux')
5 files changed, 325 insertions, 0 deletions
diff --git a/standardization/moher-api/server-adapters/spring-webflux/pom.xml b/standardization/moher-api/server-adapters/spring-webflux/pom.xml new file mode 100644 index 00000000..7eff97aa --- /dev/null +++ b/standardization/moher-api/server-adapters/spring-webflux/pom.xml @@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ ============LICENSE_START======================================================= + ~ DCAEGEN2-SERVICES-SDK + ~ ================================================================================ + ~ Copyright (C) 2019 Nokia + ~ ================================================================================ + ~ 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. + ~ ============LICENSE_END========================================================= + --> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <artifactId>dcaegen2-sdk-moher-server-adapters</artifactId> + <groupId>org.onap.dcaegen2.services.sdk</groupId> + <version>1.2.0-SNAPSHOT</version> + </parent> + + <name>Monitoring and Healthcheck :: Server Adapters :: Spring Webflux</name> + <description>MoHeR Spring server adapter</description> + <artifactId>dcae-sdk-moher-spring-webflux</artifactId> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-failsafe-plugin</artifactId> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-webflux</artifactId> + </dependency> + <dependency> + <groupId>org.onap.dcaegen2.services.sdk</groupId> + <artifactId>dcaegen2-sdk-moher-metrics</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.onap.dcaegen2.services.sdk</groupId> + <artifactId>dcaegen2-sdk-moher-healthstate</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-engine</artifactId> + </dependency> + <dependency> + <groupId>org.assertj</groupId> + <artifactId>assertj-core</artifactId> + </dependency> + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>hamcrest-core</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + </dependency> + <dependency> + <artifactId>spring-boot-starter-webflux</artifactId> + <groupId>org.springframework.boot</groupId> + <scope>test</scope> + </dependency> + </dependencies> +</project>
\ No newline at end of file diff --git a/standardization/moher-api/server-adapters/spring-webflux/src/main/java/org/onap/dcaegen2/services/sdk/standardization/moher/adapters/springwebflux/HealthController.java b/standardization/moher-api/server-adapters/spring-webflux/src/main/java/org/onap/dcaegen2/services/sdk/standardization/moher/adapters/springwebflux/HealthController.java new file mode 100644 index 00000000..1f9eb4b0 --- /dev/null +++ b/standardization/moher-api/server-adapters/spring-webflux/src/main/java/org/onap/dcaegen2/services/sdk/standardization/moher/adapters/springwebflux/HealthController.java @@ -0,0 +1,72 @@ +/* + * ============LICENSE_START==================================== + * DCAEGEN2-SERVICES-SDK + * ========================================================= + * Copyright (C) 2019 Nokia. All rights reserved. + * ========================================================= + * 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. + * ============LICENSE_END===================================== + */ + +package org.onap.dcaegen2.services.sdk.standardization.moher.adapters.springwebflux; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.onap.dcaegen2.services.sdk.standardization.moher.health.api.AliveMessage; +import org.onap.dcaegen2.services.sdk.standardization.moher.health.api.GsonAdaptersHealth; +import org.onap.dcaegen2.services.sdk.standardization.moher.health.api.Health; +import org.onap.dcaegen2.services.sdk.standardization.moher.health.api.HealthProvider; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; + +@RestController +@RequestMapping(value = "/health", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) +public class HealthController { + private final Gson gson; + private final HealthProvider healthProvider; + + public static HealthController create(HealthProvider healthProvider) { + GsonBuilder gson = new GsonBuilder(); + gson.registerTypeAdapterFactory(new GsonAdaptersHealth()); + return new HealthController(gson.create(), healthProvider); + } + + public HealthController(Gson gson, HealthProvider healthProvider) { + this.gson = gson; + this.healthProvider = healthProvider; + } + + @GetMapping("/ready") + public Mono<ResponseEntity<String>> readinessCheck() { + return healthProvider.currentHealth() + .map(health -> responseStatusForHealth(health) + .contentType(MediaType.APPLICATION_JSON_UTF8) + .body(gson.toJson(health))); + } + + @GetMapping("/alive") + public Mono<String> livenessCheck() { + return Mono.just(AliveMessage.ALIVE_MESSAGE_JSON); + } + + private ResponseEntity.BodyBuilder responseStatusForHealth(Health health) { + return health.healthy() + ? ResponseEntity.ok() + : ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE); + } +} diff --git a/standardization/moher-api/server-adapters/spring-webflux/src/main/java/org/onap/dcaegen2/services/sdk/standardization/moher/adapters/springwebflux/MetricsController.java b/standardization/moher-api/server-adapters/spring-webflux/src/main/java/org/onap/dcaegen2/services/sdk/standardization/moher/adapters/springwebflux/MetricsController.java new file mode 100644 index 00000000..4ce4fd12 --- /dev/null +++ b/standardization/moher-api/server-adapters/spring-webflux/src/main/java/org/onap/dcaegen2/services/sdk/standardization/moher/adapters/springwebflux/MetricsController.java @@ -0,0 +1,43 @@ +/* + * ============LICENSE_START==================================== + * DCAEGEN2-SERVICES-SDK + * ========================================================= + * Copyright (C) 2019 Nokia. All rights reserved. + * ========================================================= + * 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. + * ============LICENSE_END===================================== + */ + +package org.onap.dcaegen2.services.sdk.standardization.moher.adapters.springwebflux; + +import org.onap.dcaegen2.services.sdk.standardization.moher.metrics.api.Metrics; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Mono; + +@RestController +@RequestMapping(value = "/metrics", produces = MediaType.TEXT_PLAIN_VALUE) +public class MetricsController { + private final Metrics metrics; + + public MetricsController(Metrics metrics) { + this.metrics = metrics; + } + + @GetMapping + public Mono<String> prometheusMetrics() { + return metrics.collect(); + } +} diff --git a/standardization/moher-api/server-adapters/spring-webflux/src/test/java/org/onap/dcaegen2/services/sdk/standardization/moher/adapters/springwebflux/HealthControllerIT.java b/standardization/moher-api/server-adapters/spring-webflux/src/test/java/org/onap/dcaegen2/services/sdk/standardization/moher/adapters/springwebflux/HealthControllerIT.java new file mode 100644 index 00000000..236cc16f --- /dev/null +++ b/standardization/moher-api/server-adapters/spring-webflux/src/test/java/org/onap/dcaegen2/services/sdk/standardization/moher/adapters/springwebflux/HealthControllerIT.java @@ -0,0 +1,81 @@ +/* + * ============LICENSE_START==================================== + * DCAEGEN2-SERVICES-SDK + * ========================================================= + * Copyright (C) 2019 Nokia. All rights reserved. + * ========================================================= + * 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. + * ============LICENSE_END===================================== + */ + +package org.onap.dcaegen2.services.sdk.standardization.moher.adapters.springwebflux; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.concurrent.atomic.AtomicReference; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import org.junit.jupiter.api.Test; +import org.onap.dcaegen2.services.sdk.standardization.moher.health.api.AliveMessage; +import org.onap.dcaegen2.services.sdk.standardization.moher.health.api.GsonAdaptersHealth; +import org.onap.dcaegen2.services.sdk.standardization.moher.health.api.Health; +import org.onap.dcaegen2.services.sdk.standardization.moher.health.api.HealthProvider; +import org.springframework.http.MediaType; +import org.springframework.test.web.reactive.server.WebTestClient; + +import reactor.core.publisher.Mono; + +class HealthControllerIT { + + private final AtomicReference<Health> currentHealth = new AtomicReference<>(); + private final HealthProvider healthProvider = () -> Mono.fromCallable(currentHealth::get); + private final HealthController sut = HealthController.create(healthProvider); + private final WebTestClient client = WebTestClient.bindToController(sut).build(); + private final Gson gsonForDeserialization = new GsonBuilder().registerTypeAdapterFactory(new GsonAdaptersHealth()) + .create(); + + @Test + void readinessProbeShouldReturnOkWhenHealthy() { + final Health expectedHealth = Health.createHealthy("Ready to go"); + currentHealth.set(expectedHealth); + + client.get().uri("/health/ready").accept(MediaType.APPLICATION_JSON).exchange().expectStatus().isOk() + .expectBody(String.class).value(body -> { + final Health actualHealth = gsonForDeserialization.fromJson(body, Health.class); + assertThat(actualHealth).isEqualTo(expectedHealth); + }); + } + + @Test + void readinessProbeShouldReturnUnavailableWhenNotHealthy() { + final Health expectedHealth = Health.createUnhealthy("Waiting for CBS update"); + currentHealth.set(expectedHealth); + + client.get().uri("/health/ready").accept(MediaType.APPLICATION_JSON).exchange().expectStatus() + .is5xxServerError().expectBody(String.class).value(body -> { + final Health actualHealth = gsonForDeserialization.fromJson(body, Health.class); + assertThat(actualHealth).isEqualTo(expectedHealth); + }); + } + + @Test + void livenessProbeShouldAlwaysReturnOk() { + client.get().uri("/health/alive").accept(MediaType.APPLICATION_JSON).exchange().expectStatus().isOk() + .expectBody(String.class).value(body -> { + assertThat(body).isEqualTo(AliveMessage.ALIVE_MESSAGE_JSON); + }); + } + +} diff --git a/standardization/moher-api/server-adapters/spring-webflux/src/test/java/org/onap/dcaegen2/services/sdk/standardization/moher/adapters/springwebflux/MetricsControllerIT.java b/standardization/moher-api/server-adapters/spring-webflux/src/test/java/org/onap/dcaegen2/services/sdk/standardization/moher/adapters/springwebflux/MetricsControllerIT.java new file mode 100644 index 00000000..32d00449 --- /dev/null +++ b/standardization/moher-api/server-adapters/spring-webflux/src/test/java/org/onap/dcaegen2/services/sdk/standardization/moher/adapters/springwebflux/MetricsControllerIT.java @@ -0,0 +1,48 @@ +/* + * ============LICENSE_START==================================== + * DCAEGEN2-SERVICES-SDK + * ========================================================= + * Copyright (C) 2019 Nokia. All rights reserved. + * ========================================================= + * 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. + * ============LICENSE_END===================================== + */ + +package org.onap.dcaegen2.services.sdk.standardization.moher.adapters.springwebflux; + + +import static org.assertj.core.api.Assertions.assertThat; + +import io.micrometer.prometheus.PrometheusMeterRegistry; +import org.junit.jupiter.api.Test; +import org.onap.dcaegen2.services.sdk.standardization.moher.metrics.api.Metrics; +import org.onap.dcaegen2.services.sdk.standardization.moher.metrics.api.MetricsFactory; +import org.springframework.http.MediaType; +import org.springframework.test.web.reactive.server.WebTestClient; + +class MetricsControllerIT { + + private final PrometheusMeterRegistry defaultRegistry = MetricsFactory.createDefaultRegistry(); + private final Metrics metrics = MetricsFactory.createMetrics(defaultRegistry); + private final MetricsController sut = new MetricsController(metrics); + private final WebTestClient client = WebTestClient.bindToController(sut).build(); + + @Test + void prometheusMetrics() { + client.get().uri("/metrics").accept(MediaType.ALL).exchange() + .expectStatus().isOk() + .expectHeader().contentTypeCompatibleWith(MediaType.TEXT_PLAIN) + .expectBody(String.class) + .value(body -> assertThat(body).contains("system_cpu").contains("jvm_classes")); + } +} |