Skip to content

Commit

Permalink
add health check endpoint to config api (#1135)
Browse files Browse the repository at this point in the history
  • Loading branch information
cgardens authored Dec 1, 2020
1 parent 721cf3e commit f703fea
Show file tree
Hide file tree
Showing 4 changed files with 150 additions and 1 deletion.
26 changes: 25 additions & 1 deletion airbyte-api/src/main/openapi/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ tags:
description: Connection between sources and destinations.
- name: web_backend
description: Connection between sources and destinations.
- name: health
description: Healthchecks

paths:
/v1/workspaces/get:
Expand Down Expand Up @@ -957,7 +959,21 @@ paths:
$ref: "#/components/schemas/DebugRead"
"404":
description: Debug info not found

/v1/health:
get:
tags:
- health
summary: Health Check
operationId: getHealthCheck
responses:
"200":
description: Successful operation
content:
application/json:
schema:
$ref: "#/components/schemas/HealthCheckRead"
"404":
description: Debug info not found
components:
securitySchemes:
bearerAuth:
Expand Down Expand Up @@ -1680,6 +1696,14 @@ components:
type: array
items:
type: string
# Health
HealthCheckRead:
type: object
required:
- db
properties:
db:
type: boolean
# General
CheckConnectionRead:
type: object
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import io.airbyte.api.model.DestinationReadList;
import io.airbyte.api.model.DestinationRecreate;
import io.airbyte.api.model.DestinationUpdate;
import io.airbyte.api.model.HealthCheckRead;
import io.airbyte.api.model.JobIdRequestBody;
import io.airbyte.api.model.JobInfoRead;
import io.airbyte.api.model.JobListRequestBody;
Expand Down Expand Up @@ -76,6 +77,7 @@
import io.airbyte.server.handlers.DebugInfoHandler;
import io.airbyte.server.handlers.DestinationDefinitionsHandler;
import io.airbyte.server.handlers.DestinationHandler;
import io.airbyte.server.handlers.HealthCheckHandler;
import io.airbyte.server.handlers.JobHistoryHandler;
import io.airbyte.server.handlers.SchedulerHandler;
import io.airbyte.server.handlers.SourceDefinitionsHandler;
Expand Down Expand Up @@ -106,6 +108,7 @@ public class ConfigurationApi implements io.airbyte.api.V1Api {
private final WebBackendConnectionsHandler webBackendConnectionsHandler;
private final WebBackendSourceHandler webBackendSourceHandler;
private final WebBackendDestinationHandler webBackendDestinationHandler;
private final HealthCheckHandler healthCheckHandler;

public ConfigurationApi(final ConfigRepository configRepository, final SchedulerPersistence schedulerPersistence, final SpecCache specCache) {
final JsonSchemaValidator schemaValidator = new JsonSchemaValidator();
Expand All @@ -122,6 +125,7 @@ public ConfigurationApi(final ConfigRepository configRepository, final Scheduler
webBackendSourceHandler = new WebBackendSourceHandler(sourceHandler, schedulerHandler);
webBackendDestinationHandler = new WebBackendDestinationHandler(destinationHandler, schedulerHandler);
debugInfoHandler = new DebugInfoHandler(configRepository);
healthCheckHandler = new HealthCheckHandler(configRepository);
}

// WORKSPACE
Expand Down Expand Up @@ -343,6 +347,12 @@ public DebugRead getDebuggingInfo() {
return execute(debugInfoHandler::getInfo);
}

// HEALTH
@Override
public HealthCheckRead getHealthCheck() {
return healthCheckHandler.health();
}

// WEB BACKEND

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* MIT License
*
* Copyright (c) 2020 Airbyte
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

package io.airbyte.server.handlers;

import io.airbyte.api.model.HealthCheckRead;
import io.airbyte.config.persistence.ConfigRepository;
import io.airbyte.config.persistence.PersistenceConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HealthCheckHandler {

private static final Logger LOGGER = LoggerFactory.getLogger(HealthCheckHandler.class);

private final ConfigRepository configRepository;

public HealthCheckHandler(ConfigRepository configRepository) {
this.configRepository = configRepository;
}

// todo (cgardens) - add more checks as we go.
public HealthCheckRead health() {
boolean databaseHealth = false;
try {
databaseHealth = configRepository.getStandardWorkspace(PersistenceConstants.DEFAULT_WORKSPACE_ID) != null;
} catch (Exception e) {
LOGGER.error("database health check failed.");
}

return new HealthCheckRead().db(databaseHealth);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* MIT License
*
* Copyright (c) 2020 Airbyte
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

package io.airbyte.server.handlers;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import io.airbyte.api.model.HealthCheckRead;
import io.airbyte.config.StandardWorkspace;
import io.airbyte.config.persistence.ConfigNotFoundException;
import io.airbyte.config.persistence.ConfigRepository;
import io.airbyte.config.persistence.PersistenceConstants;
import io.airbyte.validation.json.JsonValidationException;
import java.io.IOException;
import org.junit.jupiter.api.Test;

class HealthCheckHandlerTest {

@Test
void testDbHealth() throws ConfigNotFoundException, IOException, JsonValidationException {
final ConfigRepository configRepository = mock(ConfigRepository.class);
final HealthCheckHandler healthCheckHandler = new HealthCheckHandler(configRepository);

// check db healthy
when(configRepository.getStandardWorkspace(PersistenceConstants.DEFAULT_WORKSPACE_ID)).thenReturn(new StandardWorkspace());
assertEquals(new HealthCheckRead().db(true), healthCheckHandler.health());

// check db unhealthy
when(configRepository.getStandardWorkspace(PersistenceConstants.DEFAULT_WORKSPACE_ID)).thenReturn(null);
assertEquals(new HealthCheckRead().db(false), healthCheckHandler.health());

doThrow(IOException.class).when(configRepository).getStandardWorkspace(PersistenceConstants.DEFAULT_WORKSPACE_ID);
assertEquals(new HealthCheckRead().db(false), healthCheckHandler.health());
}

}

0 comments on commit f703fea

Please sign in to comment.