This is an automated email from the ASF dual-hosted git repository.

pinal pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/atlas.git


The following commit(s) were added to refs/heads/master by this push:
     new a7d739867 ATLAS-4826: Provide Liveness and Readyness probes in Atlas
a7d739867 is described below

commit a7d7398679691694a4fb63480f3d41bac071f965
Author: Disha Talreja <dishatalre...@gmail.com>
AuthorDate: Wed Feb 21 15:08:01 2024 -0800

    ATLAS-4826: Provide Liveness and Readyness probes in Atlas
    
    Signed-off-by: Pinal Shah <pinal.s...@freestoneinfotech.com>
---
 .../org/apache/atlas/util/AtlasMetricsUtil.java    |  8 ++++
 .../apache/atlas/web/resources/AdminResource.java  | 46 +++++++++++++++++++++-
 .../atlas/web/resources/AdminResourceTest.java     |  4 +-
 3 files changed, 55 insertions(+), 3 deletions(-)

diff --git 
a/repository/src/main/java/org/apache/atlas/util/AtlasMetricsUtil.java 
b/repository/src/main/java/org/apache/atlas/util/AtlasMetricsUtil.java
index beb90e67b..a13e07387 100644
--- a/repository/src/main/java/org/apache/atlas/util/AtlasMetricsUtil.java
+++ b/repository/src/main/java/org/apache/atlas/util/AtlasMetricsUtil.java
@@ -236,6 +236,14 @@ public class AtlasMetricsUtil {
         return true;
     }
 
+    public boolean isBackendStoreActive(){
+        return getBackendStoreStatus();
+    }
+
+    public boolean isIndexStoreActive(){
+        return getIndexStoreStatus();
+    }
+
     private void runWithTimeout(final Runnable runnable, long timeout, 
TimeUnit timeUnit) throws Exception {
         runWithTimeout(new Callable<Object>() {
             @Override
diff --git 
a/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java 
b/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
index 4d59fa3d6..27ec59d37 100755
--- a/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
+++ b/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
@@ -23,6 +23,7 @@ import org.apache.atlas.ApplicationProperties;
 import org.apache.atlas.AtlasClient;
 import org.apache.atlas.AtlasConfiguration;
 import org.apache.atlas.AtlasErrorCode;
+import org.apache.atlas.AtlasException;
 import org.apache.atlas.authorize.AtlasAdminAccessRequest;
 import org.apache.atlas.authorize.AtlasAuthorizationUtils;
 import org.apache.atlas.authorize.AtlasEntityAccessRequest;
@@ -67,6 +68,7 @@ import org.apache.atlas.services.MetricsService;
 import org.apache.atlas.tasks.TaskManagement;
 import org.apache.atlas.type.AtlasType;
 import org.apache.atlas.type.AtlasTypeRegistry;
+import org.apache.atlas.util.AtlasMetricsUtil;
 import org.apache.atlas.util.SearchTracker;
 import org.apache.atlas.utils.AtlasJson;
 import org.apache.atlas.utils.AtlasPerfTracer;
@@ -188,6 +190,7 @@ public class AdminResource {
     private final  boolean                  isTasksEnabled;
     private final  boolean                  isOnDemandLineageEnabled;
     private final  int                      defaultLineageNodeCount;
+    private final AtlasMetricsUtil atlasMetricsUtil;
 
     private AtlasAuditReductionService auditReductionService;
 
@@ -206,7 +209,7 @@ public class AdminResource {
                          AtlasServerService serverService,
                          ExportImportAuditService exportImportAuditService, 
AtlasEntityStore entityStore,
                          AtlasPatchManager patchManager, AtlasAuditService 
auditService, EntityAuditRepository auditRepository,
-                         TaskManagement taskManagement, AtlasDebugMetricsSink 
debugMetricsRESTSink, AtlasAuditReductionService atlasAuditReductionService) {
+                         TaskManagement taskManagement, AtlasDebugMetricsSink 
debugMetricsRESTSink, AtlasAuditReductionService atlasAuditReductionService, 
AtlasMetricsUtil atlasMetricsUtil) {
         this.serviceState              = serviceState;
         this.metricsService            = metricsService;
         this.exportService             = exportService;
@@ -224,6 +227,7 @@ public class AdminResource {
         this.taskManagement            = taskManagement;
         this.debugMetricsRESTSink      = debugMetricsRESTSink;
         this.auditReductionService     = atlasAuditReductionService;
+        this.atlasMetricsUtil          = atlasMetricsUtil;
 
         if (atlasProperties != null) {
             this.defaultUIVersion = 
atlasProperties.getString(DEFAULT_UI_VERSION, UI_VERSION_V2);
@@ -1111,4 +1115,44 @@ public class AdminResource {
         }
     }
 
+    /**
+     * API to indicate service liveness
+     * @return response payload as json
+     * @throws AtlasBaseException
+     * @HTTP 200 if Atlas is alive
+     * @HTTP 500 if Atlas is not alive and requires a restart
+     */
+    @GET
+    @Path("/liveness")
+    public Response serviceLiveliness() throws AtlasBaseException {
+
+        if (serviceState.getState() == ServiceState.ServiceStateValue.ACTIVE 
|| serviceState.getState() == ServiceState.ServiceStateValue.MIGRATING) {
+            return Response.status(Response.Status.OK).entity("Service is 
live").build();
+        } else {
+            LOG.error("Atlas Service is not live");
+            throw new AtlasBaseException(AtlasErrorCode.INTERNAL_ERROR, "Atlas 
Service is not live");
+        }
+    }
+
+    /**
+     * API to indicate service readiness
+     * @return response payload as json
+     * @throws AtlasBaseException
+     * @HTTP 200 if Atlas is alive and ready to accept client requests
+     * @HTTP 500 if Atlas is either not alive or not ready to accept client 
requests
+     */
+    @GET
+    @Path("/readiness")
+    public Response serviceReadiness() throws AtlasBaseException {
+
+        if((serviceState.getState() == ServiceState.ServiceStateValue.ACTIVE) 
&&
+                (atlasMetricsUtil.isIndexStoreActive() && 
atlasMetricsUtil.isBackendStoreActive())) {
+            return Response.status(Response.Status.OK).entity("Service is 
ready to accept requests").build();
+        }
+        else {
+            LOG.error("Service is not ready to accept client requests");
+            throw new AtlasBaseException(AtlasErrorCode.INTERNAL_ERROR, 
"Service not ready to accept client requests");
+        }
+    }
+
 }
diff --git 
a/webapp/src/test/java/org/apache/atlas/web/resources/AdminResourceTest.java 
b/webapp/src/test/java/org/apache/atlas/web/resources/AdminResourceTest.java
index 5b16ba149..268fca717 100644
--- a/webapp/src/test/java/org/apache/atlas/web/resources/AdminResourceTest.java
+++ b/webapp/src/test/java/org/apache/atlas/web/resources/AdminResourceTest.java
@@ -51,7 +51,7 @@ public class AdminResourceTest {
 
         
when(serviceState.getState()).thenReturn(ServiceState.ServiceStateValue.ACTIVE);
 
-        AdminResource adminResource = new AdminResource(serviceState, null, 
null, null, null, null, null, null, null, null, null, null, null, null, null, 
null);
+        AdminResource adminResource = new AdminResource(serviceState, null, 
null, null, null, null, null, null, null, null, null, null, null, null, null, 
null, null);
         Response response = adminResource.getStatus();
         assertEquals(response.getStatus(), HttpServletResponse.SC_OK);
         JsonNode entity = AtlasJson.parseToV1JsonNode((String) 
response.getEntity());
@@ -62,7 +62,7 @@ public class AdminResourceTest {
     public void testResourceGetsValueFromServiceState() throws IOException {
         
when(serviceState.getState()).thenReturn(ServiceState.ServiceStateValue.PASSIVE);
 
-        AdminResource adminResource = new AdminResource(serviceState, null, 
null, null, null, null, null, null, null, null, null, null, null, null, null, 
null);
+        AdminResource adminResource = new AdminResource(serviceState, null, 
null, null, null, null, null, null, null, null, null, null, null, null, null, 
null, null);
         Response response = adminResource.getStatus();
 
         verify(serviceState).getState();

Reply via email to