diff --git a/catalog-rest-service/pom.xml b/catalog-rest-service/pom.xml
index 9d9d970a9a2..a33cc5f9bf2 100644
--- a/catalog-rest-service/pom.xml
+++ b/catalog-rest-service/pom.xml
@@ -94,6 +94,14 @@
org.glassfish.jersey.media
jersey-media-multipart
+
+ io.github.maksymdolgykh.dropwizard
+ dropwizard-micrometer-core
+
+
+ io.github.maksymdolgykh.dropwizard
+ dropwizard-micrometer-jdbi
+
commons-lang
commons-lang
diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/CatalogApplication.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/CatalogApplication.java
index 4c230bf64e5..eb89d0f7520 100644
--- a/catalog-rest-service/src/main/java/org/openmetadata/catalog/CatalogApplication.java
+++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/CatalogApplication.java
@@ -29,10 +29,16 @@ import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import io.federecio.dropwizard.swagger.SwaggerBundle;
import io.federecio.dropwizard.swagger.SwaggerBundleConfiguration;
+import io.github.maksymdolgykh.dropwizard.micrometer.MicrometerBundle;
+import io.github.maksymdolgykh.dropwizard.micrometer.MicrometerHttpFilter;
+import io.github.maksymdolgykh.dropwizard.micrometer.MicrometerJdbiTimingCollector;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.time.temporal.ChronoUnit;
+import java.util.EnumSet;
import java.util.Optional;
+import javax.servlet.DispatcherType;
+import javax.servlet.FilterRegistration;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.Response;
@@ -79,6 +85,7 @@ public class CatalogApplication extends Application {
throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException,
InvocationTargetException, IOException {
final Jdbi jdbi = new JdbiFactory().build(environment, catalogConfig.getDataSourceFactory(), "database");
+ jdbi.setTimingCollector(new MicrometerJdbiTimingCollector());
SqlLogger sqlLogger =
new SqlLogger() {
@@ -125,7 +132,7 @@ public class CatalogApplication extends Application {
environment.jersey().register(new JsonProcessingExceptionMapper(true));
environment.jersey().register(new EarlyEofExceptionMapper());
environment.jersey().register(JsonMappingExceptionMapper.class);
- environment.healthChecks().register("UserDatabaseCheck", new CatalogHealthCheck(jdbi));
+ environment.healthChecks().register("OpenMetadataServerHealthCheck", new OpenMetadataServerHealthCheck());
registerResources(catalogConfig, environment, jdbi);
RoleEvaluator.getInstance().load();
PolicyEvaluator.getInstance().load();
@@ -137,9 +144,13 @@ public class CatalogApplication extends Application {
EventPubSub.start();
// Register Event publishers
registerEventPublisher(catalogConfig);
+
// start authorizer after event publishers
// authorizer creates admin/bot users, ES publisher should start before to index users created by authorizer
authorizer.init(catalogConfig.getAuthorizerConfiguration(), jdbi);
+ FilterRegistration.Dynamic micrometerFilter =
+ environment.servlets().addFilter("MicrometerHttpFilter", new MicrometerHttpFilter());
+ micrometerFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
}
@SneakyThrows
@@ -163,6 +174,7 @@ public class CatalogApplication extends Application {
return configuration.getHealthConfiguration();
}
});
+ bootstrap.addBundle(new MicrometerBundle());
super.initialize(bootstrap);
}
diff --git a/catalog-rest-service/src/main/java/org/openmetadata/catalog/OpenMetadataServerHealthCheck.java b/catalog-rest-service/src/main/java/org/openmetadata/catalog/OpenMetadataServerHealthCheck.java
new file mode 100644
index 00000000000..4a4a5d975e6
--- /dev/null
+++ b/catalog-rest-service/src/main/java/org/openmetadata/catalog/OpenMetadataServerHealthCheck.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2021 Collate
+ * 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.
+ */
+
+package org.openmetadata.catalog;
+
+import com.codahale.metrics.health.HealthCheck;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class OpenMetadataServerHealthCheck extends HealthCheck {
+
+ @Override
+ protected Result check() throws Exception {
+ return Result.healthy();
+ }
+}
diff --git a/catalog-rest-service/src/test/resources/openmetadata-secure-test.yaml b/catalog-rest-service/src/test/resources/openmetadata-secure-test.yaml
index 7eb8ba56885..5038292a1d8 100644
--- a/catalog-rest-service/src/test/resources/openmetadata-secure-test.yaml
+++ b/catalog-rest-service/src/test/resources/openmetadata-secure-test.yaml
@@ -114,9 +114,8 @@ migrationConfiguration:
health:
delayedShutdownHandlerEnabled: true
shutdownWaitPeriod: 5s
- healthCheckUrlPaths: ["/api/v1/health-check"]
healthChecks:
- - name: UserDatabaseCheck
+ - name: OpenMetadataServerHealthCheck
critical: true
# Authorizer Configuration
diff --git a/conf/openmetadata.yaml b/conf/openmetadata.yaml
index 78d1f1e5173..1112c13be3c 100644
--- a/conf/openmetadata.yaml
+++ b/conf/openmetadata.yaml
@@ -221,9 +221,8 @@ fernetConfiguration:
health:
delayedShutdownHandlerEnabled: true
shutdownWaitPeriod: 1s
- healthCheckUrlPaths: ["/api/v1/health-check"]
healthChecks:
- - name: UserDatabaseCheck
+ - name: OpenMetadataServerHealthCheck
critical: true
schedule:
checkInterval: 2500ms
diff --git a/docker/local-metadata/docker-compose.yml b/docker/local-metadata/docker-compose.yml
index 1085f326c1e..af0a0a2ee4b 100644
--- a/docker/local-metadata/docker-compose.yml
+++ b/docker/local-metadata/docker-compose.yml
@@ -98,11 +98,13 @@ services:
OM_AUTH_AIRFLOW_CUSTOM_OIDC_TOKEN_ENDPOINT_URL: ${OM_AUTH_AIRFLOW_CUSTOM_OIDC_TOKEN_ENDPOINT_URL:-""}
expose:
- 8585
+ - 8586
- 9200
- 9300
- 3306
ports:
- 8585:8585
+ - 8586:8586
depends_on:
- elasticsearch
- mysql
diff --git a/docker/metadata/docker-compose.yml b/docker/metadata/docker-compose.yml
index 7836c51abbe..82fbd166c76 100644
--- a/docker/metadata/docker-compose.yml
+++ b/docker/metadata/docker-compose.yml
@@ -87,11 +87,13 @@ services:
OM_AUTH_AIRFLOW_CUSTOM_OIDC_TOKEN_ENDPOINT_URL: ${OM_AUTH_AIRFLOW_CUSTOM_OIDC_TOKEN_ENDPOINT_URL:-""}
expose:
- 8585
+ - 8586
- 9200
- 9300
- 3306
ports:
- 8585:8585
+ - 8586:8586
depends_on:
- mysql
networks:
diff --git a/ingestion/src/metadata/ingestion/ometa/ometa_api.py b/ingestion/src/metadata/ingestion/ometa/ometa_api.py
index 5bf01b81dd9..fefdc8cefc9 100644
--- a/ingestion/src/metadata/ingestion/ometa/ometa_api.py
+++ b/ingestion/src/metadata/ingestion/ometa/ometa_api.py
@@ -649,9 +649,10 @@ class OpenMetadata(
def health_check(self) -> bool:
"""
- Run endpoint health-check. Return `true` if OK
+ Run version api call. Return `true` if response is not None
"""
- return self.client.get("/health-check")["status"] == "healthy"
+ raw_version = self.client.get("/version")["version"]
+ return raw_version is not None
def close(self):
"""
diff --git a/ingestion/tests/integration/source/hive/test_hive_crud.py b/ingestion/tests/integration/source/hive/test_hive_crud.py
index 58af2d35e07..0e68760785a 100644
--- a/ingestion/tests/integration/source/hive/test_hive_crud.py
+++ b/ingestion/tests/integration/source/hive/test_hive_crud.py
@@ -154,7 +154,7 @@ def test_read_tables(hive_service):
def test_check_table():
- is_responsive("http://localhost:8585/api/v1/health-check")
+ is_responsive("http://localhost:8586/healthcheck")
metadata_config = MetadataServerConfig.parse_obj(
{"api_endpoint": "http://localhost:8585/api", "auth_provider_type": "no-auth"}
)
diff --git a/ingestion/tests/integration/source/trino/test_trino_crud.py b/ingestion/tests/integration/source/trino/test_trino_crud.py
index 685a7f35369..f2160b2f8d2 100644
--- a/ingestion/tests/integration/source/trino/test_trino_crud.py
+++ b/ingestion/tests/integration/source/trino/test_trino_crud.py
@@ -162,7 +162,7 @@ def test_read_tables(trino_service):
def test_check_table():
- is_responsive("http://localhost:8585/api/v1/health-check")
+ is_responsive("http://localhost:8586/healthcheck")
metadata_config = MetadataServerConfig.parse_obj(
{"api_endpoint": "http://localhost:8585/api", "auth_provider_type": "no-auth"}
)
diff --git a/pom.xml b/pom.xml
index d140bbfdbc2..b66149e7df8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -95,6 +95,7 @@
false
reuseReports
7.6.0
+ 2.0.5
@@ -318,6 +319,16 @@
spring-core
${spring.version}
+
+ io.github.maksymdolgykh.dropwizard
+ dropwizard-micrometer-core
+ ${dropwizard-micrometer.version}
+
+
+ io.github.maksymdolgykh.dropwizard
+ dropwizard-micrometer-jdbi
+ ${dropwizard-micrometer.version}
+
jakarta.xml.bind