[AAI] Expose relevant key metrics for monitoring via prometheus 50/126250/1
authorsuresh.charan <suresh.charan@amdocs.com>
Wed, 15 Dec 2021 10:23:01 +0000 (05:23 -0500)
committersuresh.charan <suresh.charan@amdocs.com>
Wed, 15 Dec 2021 10:23:01 +0000 (05:23 -0500)
The Key metrics are available via endpoints:
/actuator/prometheus
/actuator/info
/actuator/health

Issue-ID: AAI-3415
Signed-off-by: Suresh Charan <suresh.charan@amdocs.com>
Change-Id: I5760095973c7f3d58a3770e221dee1c3ca9d5370

pom.xml
src/main/resources/application.properties
src/test/java/org/onap/aai/MetricsConfigurationTest.java [new file with mode: 0644]
src/test/resources/application-test.properties

diff --git a/pom.xml b/pom.xml
index 6ae2a5f..1a716e4 100755 (executable)
--- a/pom.xml
+++ b/pom.xml
         <schema.version.list>v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20,v21,v22,v23,v24</schema.version.list>
         <schema.uri.base.path>/aai</schema.uri.base.path>
         <!-- End of Default ONAP Schema Properties -->
+
+        <!-- Start of graphadmin metric collection Properties -->
+        <micrometer.core.version>1.8.1</micrometer.core.version>
+        <micrometer.registry.prometheus.version>1.8.1</micrometer.registry.prometheus.version>
+        <micrometer.jersey2.version>1.8.1</micrometer.jersey2.version>
+        <spring.boot.starter.actuator.version>2.1.12.RELEASE</spring.boot.starter.actuator.version>
+        <!-- End of graphadmin metric collection Properties -->
     </properties>
 
     <profiles>
     </profiles>
 
     <dependencies>
+        <!-- Start of graphadmin metric collection dependencies -->
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-core</artifactId>
+            <version>${micrometer.core.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-registry-prometheus</artifactId>
+            <version>${micrometer.registry.prometheus.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-jersey2</artifactId>
+            <version>${micrometer.jersey2.version}</version>
+        </dependency>
+        <!-- End of graphadmin metric collection dependencies -->
+
         <dependency>
             <groupId>javax.jms</groupId>
             <artifactId>javax.jms-api</artifactId>
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+            <version>${spring.boot.starter.actuator.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-test</artifactId>
index 48c6de5..89f8bf7 100644 (file)
@@ -86,3 +86,11 @@ aperture.service.ssl.trust-store=${server.local.startpath}etc/auth/aai_keystore
 aperture.service.ssl.key-store-password=password(OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0)
 aperture.service.ssl.trust-store-password=password(OBF:1vn21ugu1saj1v9i1v941sar1ugw1vo0)
 aperture.service.timeout-in-milliseconds=300000
+
+#To Expose the Prometheus scraping endpoint
+management.server.port=8448
+#To Enable Actuator Endpoint, you can override this to True in OOM charts
+management.endpoints.enabled-by-default=false
+#To Enable Actuator Endpoint, you can override this in OOM Charts
+#management.endpoints.web.exposure.include=info, health, loggers, prometheus
+management.metrics.web.server.auto-time-requests=false
diff --git a/src/test/java/org/onap/aai/MetricsConfigurationTest.java b/src/test/java/org/onap/aai/MetricsConfigurationTest.java
new file mode 100644 (file)
index 0000000..d0c0ce4
--- /dev/null
@@ -0,0 +1,136 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.aai;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+
+import java.io.UnsupportedEncodingException;
+import java.util.Base64;
+import java.util.Collections;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.onap.aai.config.SpringContextAware;
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.restclient.PropertyPasswordConfiguration;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.autoconfigure.web.server.LocalManagementPort;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.context.annotation.Import;
+import org.springframework.http.*;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.rules.SpringClassRule;
+import org.springframework.test.context.junit4.rules.SpringMethodRule;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * Test management endpoints against configuration resource.
+ */
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
+    classes = {SpringContextAware.class, GraphAdminApp.class})
+@ContextConfiguration(initializers = PropertyPasswordConfiguration.class, classes = {SpringContextAware.class})
+@Import(GraphAdminTestConfiguration.class)
+@TestPropertySource(locations = "classpath:application-test.properties")
+public class MetricsConfigurationTest {
+
+    @ClassRule
+    public static final SpringClassRule springClassRule = new SpringClassRule();
+
+    @Rule
+    public final SpringMethodRule springMethodRule = new SpringMethodRule();
+
+    @Autowired
+    RestTemplate restTemplate;
+
+    @LocalServerPort
+    int randomPort;
+
+    @LocalManagementPort
+    private long localManagementPort;
+
+    private HttpEntity<String> httpEntity;
+    private HttpEntity<String> httpEntityPut;
+    private HttpEntity<String> httpEntityPatch;
+    private String baseUrl;
+    private String actuatorUrl;
+    private HttpHeaders headers;
+
+    @BeforeClass
+    public static void setupConfig() throws AAIException {
+        System.setProperty("AJSC_HOME", "./");
+        System.setProperty("BUNDLECONFIG_DIR", "src/main/resources/");
+    }
+
+    @Before
+    public void setup() throws UnsupportedEncodingException {
+
+        headers = new HttpHeaders();
+
+        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        headers.add("Real-Time", "true");
+        headers.add("X-FromAppId", "JUNIT");
+        headers.add("X-TransactionId", "JUNIT");
+
+        String authorization = Base64.getEncoder().encodeToString("AAI:AAI".getBytes("UTF-8"));
+        headers.add("Authorization", "Basic " + authorization);
+
+        httpEntity = new HttpEntity<String>(headers);
+        baseUrl = "http://localhost:" + randomPort;
+        actuatorUrl = "http://localhost:" + localManagementPort;
+    }
+
+
+    @Test
+    public void testManagementEndpointConfiguration() {
+        ResponseEntity responseEntity = null;
+        String responseBody = null;
+
+        //set Accept as text/plain in order to get access of endpoint "/actuator/prometheus"
+        headers.set("Accept", "text/plain");
+        httpEntity = new HttpEntity<String>(headers);
+        responseEntity =
+            restTemplate.exchange(actuatorUrl + "/actuator/prometheus", HttpMethod.GET, httpEntity, String.class);
+        responseBody = (String) responseEntity.getBody();
+        assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
+
+        //Set Accept as MediaType.APPLICATION_JSON in order to get access of endpoint "/actuator/info" and "/actuator/health"
+        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
+        httpEntity = new HttpEntity<String>(headers);
+        responseEntity =
+            restTemplate.exchange(actuatorUrl + "/actuator/info", HttpMethod.GET, httpEntity, String.class);
+        responseBody = (String) responseEntity.getBody();
+        assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
+
+        responseEntity =
+            restTemplate.exchange(actuatorUrl + "/actuator/health", HttpMethod.GET, httpEntity, String.class);
+        responseBody = (String) responseEntity.getBody();
+        assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
+        assertTrue(responseBody.contains("UP"));
+    }
+}
index d245a53..5ac9491 100644 (file)
@@ -73,3 +73,9 @@ schema.service.versions.endpoint=versions
 
 # Location of the cadi properties file should be specified here
 aaf.cadi.file=${server.local.startpath}/cadi.properties
+
+#To expose the Prometheus scraping endpoint in unit test
+management.server.port=0
+management.endpoints.enabled-by-default=true
+management.endpoints.web.exposure.include=info, health, loggers, prometheus
+management.metrics.web.server.auto-time-requests=false