Extend heartbeat to also include som health status 08/84508/7
authorelinuxhenrik <henrik.b.andersson@est.tech>
Thu, 11 Apr 2019 07:04:31 +0000 (07:04 +0000)
committerelinuxhenrik <henrik.b.andersson@est.tech>
Thu, 11 Apr 2019 07:04:31 +0000 (07:04 +0000)
Add info about the internal status of DFC to the healtCheck message.

Change-Id: Ic2ad3e5b97c42d6affe1ac4e1d7cf2274027f881
Issue-ID: DCAEGEN2-1403
Signed-off-by: elinuxhenrik <henrik.b.andersson@est.tech>
datafile-app-server/pom.xml
datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/controllers/HeartbeatController.java
datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/service/PublishedFileCache.java
datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/tasks/ScheduledTasks.java
datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/controller/HeartbeatControllerTest.java [new file with mode: 0644]
datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/utils/LoggingUtils.java [new file with mode: 0644]

index fa02b79..c985a03 100644 (file)
       <artifactId>testng</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
     <dependency>
       <groupId>com.github.stefanbirkner</groupId>
       <artifactId>fake-sftp-server-rule</artifactId>
index b0e339e..c6d56c4 100644 (file)
 
 package org.onap.dcaegen2.collectors.datafile.controllers;
 
+import static org.onap.dcaegen2.collectors.datafile.model.logging.MappedDiagnosticContext.ENTRY;
+import static org.onap.dcaegen2.collectors.datafile.model.logging.MappedDiagnosticContext.EXIT;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
 import org.onap.dcaegen2.collectors.datafile.model.logging.MappedDiagnosticContext;
+import org.onap.dcaegen2.collectors.datafile.tasks.ScheduledTasks;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -43,6 +48,13 @@ public class HeartbeatController {
 
     private static final Logger logger = LoggerFactory.getLogger(HeartbeatController.class);
 
+    private final ScheduledTasks scheduledTasks;
+
+    @Autowired
+    public HeartbeatController(ScheduledTasks scheduledTasks) {
+        this.scheduledTasks = scheduledTasks;
+    }
+
     /**
      * Checks the heartbeat of DFC.
      *
@@ -54,13 +66,18 @@ public class HeartbeatController {
             @ApiResponse(code = 200, message = "DATAFILE service is living"),
             @ApiResponse(code = 401, message = "You are not authorized to view the resource"),
             @ApiResponse(code = 403, message = "Accessing the resource you were trying to reach is forbidden"),
-            @ApiResponse(code = 404, message = "The resource you were trying to reach is not found")})
+            @ApiResponse(code = 404, message = "The resource you were trying to reach is not found") })
     public Mono<ResponseEntity<String>> heartbeat(@RequestHeader HttpHeaders headers) {
         MappedDiagnosticContext.initializeTraceContext(headers);
-        logger.info(MappedDiagnosticContext.ENTRY, "Heartbeat request");
-        Mono<ResponseEntity<String>> response = Mono.just(new ResponseEntity<>("I'm living", HttpStatus.OK));
-        logger.trace("Heartbeat");
-        logger.info(MappedDiagnosticContext.EXIT, "Heartbeat request");
+        logger.info(ENTRY, "Heartbeat request");
+
+        StringBuilder statusString = new StringBuilder("I'm living! Status: ");
+        statusString.append("numberOfFileCollectionTasks=").append(scheduledTasks.getCurrentNumberOfTasks())
+                .append(",");
+        statusString.append("fileCacheSize=").append(scheduledTasks.publishedFilesCacheSize());
+
+        Mono<ResponseEntity<String>> response = Mono.just(new ResponseEntity<>(statusString.toString(), HttpStatus.OK));
+        logger.info(EXIT, "Heartbeat request");
         return response;
     }
 }
index 037f495..3e4481d 100644 (file)
@@ -111,10 +111,14 @@ public class ScheduledTasks {
         return new PublishedChecker(applicationConfiguration);
     }
 
-    protected int getCurrentNumberOfTasks() {
+    public int getCurrentNumberOfTasks() {
         return currentNumberOfTasks.get();
     }
 
+    public int publishedFilesCacheSize() {
+        return alreadyPublishedFiles.size();
+    }
+
     protected DMaaPMessageConsumer createConsumerTask() {
         return new DMaaPMessageConsumer(this.applicationConfiguration);
     }
diff --git a/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/controller/HeartbeatControllerTest.java b/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/controller/HeartbeatControllerTest.java
new file mode 100644 (file)
index 0000000..814509d
--- /dev/null
@@ -0,0 +1,77 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 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.onap.dcaegen2.collectors.datafile.controller;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.read.ListAppender;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.Test;
+import org.onap.dcaegen2.collectors.datafile.controllers.HeartbeatController;
+import org.onap.dcaegen2.collectors.datafile.tasks.ScheduledTasks;
+import org.onap.dcaegen2.collectors.datafile.utils.LoggingUtils;
+import org.onap.dcaegen2.services.sdk.rest.services.model.logging.MdcVariables;
+import org.slf4j.MDC;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
+import reactor.core.publisher.Mono;
+
+public class HeartbeatControllerTest {
+    @Test
+    public void heartbeat_success() {
+        ScheduledTasks scheduledTasksMock = mock(ScheduledTasks.class);
+        when(scheduledTasksMock.getCurrentNumberOfTasks()).thenReturn(10);
+        when(scheduledTasksMock.publishedFilesCacheSize()).thenReturn(20);
+
+        HttpHeaders httpHeaders = new HttpHeaders();
+
+        HeartbeatController controllerUnderTest = new HeartbeatController(scheduledTasksMock);
+
+        ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(HeartbeatController.class);
+        Mono<ResponseEntity<String>> result = controllerUnderTest.heartbeat(httpHeaders);
+
+        validateLogging(logAppender);
+
+        String body = result.block().getBody();
+        assertTrue(body.startsWith("I'm living! Status: "));
+        assertTrue(body.contains("numberOfFileCollectionTasks=10"));
+        assertTrue(body.contains("fileCacheSize=20"));
+
+        assertFalse(StringUtils.isBlank(MDC.get(MdcVariables.REQUEST_ID)));
+        assertFalse(StringUtils.isBlank(MDC.get(MdcVariables.INVOCATION_ID)));
+    }
+
+    private void validateLogging(ListAppender<ILoggingEvent> logAppender) {
+        assertEquals(logAppender.list.get(0).getMarker().getName(), "ENTRY");
+        assertNotNull(logAppender.list.get(0).getMDCPropertyMap().get("InvocationID"));
+        assertNotNull(logAppender.list.get(0).getMDCPropertyMap().get("RequestID"));
+        assertEquals("[INFO] Heartbeat request", logAppender.list.get(0).toString());
+        assertEquals(logAppender.list.get(1).getMarker().getName(), "EXIT");
+        assertEquals("[INFO] Heartbeat request", logAppender.list.get(1).toString());
+        logAppender.stop();
+    }
+}
diff --git a/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/utils/LoggingUtils.java b/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/utils/LoggingUtils.java
new file mode 100644 (file)
index 0000000..45edac7
--- /dev/null
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 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.onap.dcaegen2.collectors.datafile.utils;
+
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.read.ListAppender;
+import org.slf4j.LoggerFactory;
+
+public class LoggingUtils {
+
+    /**
+     * Returns a ListAppender that contains all logging events. Call this method at the very beginning of the test
+     * */
+    public static ListAppender<ILoggingEvent> getLogListAppender(Class<?> logClass) {
+        Logger logger = (Logger) LoggerFactory.getLogger(logClass);
+        ListAppender<ILoggingEvent> listAppender = new ListAppender<>();
+        listAppender.start();
+        logger.addAppender(listAppender);
+
+        return listAppender;
+    }
+}