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