diff --git a/.licenserc.yaml b/.licenserc.yaml index e9f54c08041d..48421ae2827f 100644 --- a/.licenserc.yaml +++ b/.licenserc.yaml @@ -106,10 +106,10 @@ dependency: version: 2.13.4 license: Apache-2.0 - name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310 - version: 2.16.1 + version: 2.17.1 license: Apache-2.0 - name: com.fasterxml.jackson.datatype:jackson-datatype-jdk8 - version: 2.16.1 + version: 2.17.1 license: Apache-2.0 - name: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml version: 2.15.2 @@ -139,7 +139,7 @@ dependency: version: 0.6.13 license: Apache-2.0 - name: com.aayushatharva.brotli4j:service - version: 1.15.0 + version: 1.16.0 license: Apache-2.0 - name: io.vertx:vertx-grpc version: 4.5.1 diff --git a/dist-material/release-docs/LICENSE b/dist-material/release-docs/LICENSE index 7cbf202b2713..6e0abc9d70aa 100644 --- a/dist-material/release-docs/LICENSE +++ b/dist-material/release-docs/LICENSE @@ -210,8 +210,8 @@ The following components are provided under the Apache-2.0 License. See project The text of each license is the standard Apache 2.0 license. https://mvnrepository.com/artifact/build.buf.protoc-gen-validate/pgv-java-stub/0.6.13 Apache-2.0 https://mvnrepository.com/artifact/build.buf.protoc-gen-validate/protoc-gen-validate/0.6.13 Apache-2.0 - https://mvnrepository.com/artifact/com.aayushatharva.brotli4j/brotli4j/1.15.0 Apache-2.0 - https://mvnrepository.com/artifact/com.aayushatharva.brotli4j/service/1.15.0 Apache-2.0 + https://mvnrepository.com/artifact/com.aayushatharva.brotli4j/brotli4j/1.16.0 Apache-2.0 + https://mvnrepository.com/artifact/com.aayushatharva.brotli4j/service/1.16.0 Apache-2.0 https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-auth-plugin/2.3.2 Apache-2.0 https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client/2.3.2 Apache-2.0 https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-encryption-plugin/2.3.2 Apache-2.0 @@ -222,8 +222,8 @@ The text of each license is the standard Apache 2.0 license. https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind/2.16.0 Apache-2.0 https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml/2.15.2 Apache-2.0 https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-guava/2.12.0 Apache-2.0 - https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jdk8/2.16.1 Apache-2.0 - https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.16.1 Apache-2.0 + https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jdk8/2.17.1 Apache-2.0 + https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.17.1 Apache-2.0 https://mvnrepository.com/artifact/com.fasterxml.jackson.module/jackson-module-kotlin/2.13.4 Apache-2.0 https://mvnrepository.com/artifact/com.fasterxml/classmate/1.5.1 Apache-2.0 https://mvnrepository.com/artifact/com.google.api.grpc/proto-google-common-protos/2.29.0 Apache-2.0 @@ -238,12 +238,12 @@ The text of each license is the standard Apache 2.0 license. https://mvnrepository.com/artifact/com.google.inject/guice/4.1.0 Apache-2.0 https://mvnrepository.com/artifact/com.google.j2objc/j2objc-annotations/2.8 Apache-2.0 https://mvnrepository.com/artifact/com.graphql-java/java-dataloader/3.2.0 Apache-2.0 - https://mvnrepository.com/artifact/com.linecorp.armeria/armeria/1.27.3 Apache-2.0 - https://mvnrepository.com/artifact/com.linecorp.armeria/armeria-graphql/1.27.3 Apache-2.0 - https://mvnrepository.com/artifact/com.linecorp.armeria/armeria-graphql-protocol/1.27.3 Apache-2.0 - https://mvnrepository.com/artifact/com.linecorp.armeria/armeria-grpc/1.27.3 Apache-2.0 - https://mvnrepository.com/artifact/com.linecorp.armeria/armeria-grpc-protocol/1.27.3 Apache-2.0 - https://mvnrepository.com/artifact/com.linecorp.armeria/armeria-protobuf/1.27.3 Apache-2.0 + https://mvnrepository.com/artifact/com.linecorp.armeria/armeria/1.29.3 Apache-2.0 + https://mvnrepository.com/artifact/com.linecorp.armeria/armeria-graphql/1.29.3 Apache-2.0 + https://mvnrepository.com/artifact/com.linecorp.armeria/armeria-graphql-protocol/1.29.3 Apache-2.0 + https://mvnrepository.com/artifact/com.linecorp.armeria/armeria-grpc/1.29.3 Apache-2.0 + https://mvnrepository.com/artifact/com.linecorp.armeria/armeria-grpc-protocol/1.29.3 Apache-2.0 + https://mvnrepository.com/artifact/com.linecorp.armeria/armeria-protobuf/1.29.3 Apache-2.0 https://mvnrepository.com/artifact/com.orbitz.consul/consul-client/1.5.3 Apache-2.0 https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp/3.14.9 Apache-2.0 https://mvnrepository.com/artifact/com.squareup.okio/okio/1.17.2 Apache-2.0 @@ -297,12 +297,12 @@ The text of each license is the standard Apache 2.0 license. https://mvnrepository.com/artifact/io.grpc/grpc-netty/1.63.0 Apache-2.0 https://mvnrepository.com/artifact/io.grpc/grpc-protobuf/1.63.0 Apache-2.0 https://mvnrepository.com/artifact/io.grpc/grpc-protobuf-lite/1.63.0 Apache-2.0 - https://mvnrepository.com/artifact/io.grpc/grpc-services/1.61.0 Apache-2.0 + https://mvnrepository.com/artifact/io.grpc/grpc-services/1.64.0 Apache-2.0 https://mvnrepository.com/artifact/io.grpc/grpc-stub/1.63.0 Apache-2.0 https://mvnrepository.com/artifact/io.grpc/grpc-util/1.63.0 Apache-2.0 - https://mvnrepository.com/artifact/io.micrometer/micrometer-commons/1.12.2 Apache-2.0 - https://mvnrepository.com/artifact/io.micrometer/micrometer-core/1.12.2 Apache-2.0 - https://mvnrepository.com/artifact/io.micrometer/micrometer-observation/1.12.2 Apache-2.0 + https://mvnrepository.com/artifact/io.micrometer/micrometer-commons/1.13.0 Apache-2.0 + https://mvnrepository.com/artifact/io.micrometer/micrometer-core/1.13.0 Apache-2.0 + https://mvnrepository.com/artifact/io.micrometer/micrometer-observation/1.13.0 Apache-2.0 https://mvnrepository.com/artifact/io.netty/netty-buffer/4.1.108.Final Apache-2.0 https://mvnrepository.com/artifact/io.netty/netty-codec/4.1.108.Final Apache-2.0 https://mvnrepository.com/artifact/io.netty/netty-codec-dns/4.1.108.Final Apache-2.0 @@ -416,7 +416,7 @@ CC0-1.0 and BSD-2-Clause licenses The following components are provided under the CC0-1.0 and BSD-2-Clause License. See project link for details. The text of each license is also included in licenses/LICENSE-[project].txt. - https://mvnrepository.com/artifact/org.hdrhistogram/HdrHistogram/2.1.12 CC0-1.0 and BSD-2-Clause + https://mvnrepository.com/artifact/org.hdrhistogram/HdrHistogram/2.2.1 CC0-1.0 and BSD-2-Clause ======================================================================== ISC licenses @@ -548,7 +548,7 @@ The text of each license is also included in licenses/LICENSE-[project].txt. https://npmjs.com/package/nanoid/v/3.3.7 3.3.7 MIT https://mvnrepository.com/artifact/org.checkerframework/checker-qual/3.33.0 MIT https://mvnrepository.com/artifact/org.codehaus.mojo/animal-sniffer-annotations/1.23 MIT - https://mvnrepository.com/artifact/org.curioswitch.curiostack/protobuf-jackson/2.2.0 MIT + https://mvnrepository.com/artifact/org.curioswitch.curiostack/protobuf-jackson/2.5.0 MIT https://npmjs.com/package/pinia/v/2.0.28 2.0.28 MIT https://npmjs.com/package/pinia/node_modules/vue-demi/v/0.13.11 0.13.11 MIT https://npmjs.com/package/postcss/v/8.4.33 8.4.33 MIT diff --git a/docs/en/api/health-check.md b/docs/en/api/health-check.md new file mode 100644 index 000000000000..16927d514273 --- /dev/null +++ b/docs/en/api/health-check.md @@ -0,0 +1,9 @@ +# Check OAP healthiness + +This is an http wrapper of the [health checker](../setup/backend/backend-health-check.md), +make sure to set necessary configurations required by the health checker before using this endpoint, +otherwise 404 will be returned. + +> GET http://localhost:12800/healthcheck + +When the OAP server is healthy, the request returns status 200, otherwise, the request returns status 503. diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md index b137a366d42d..497296faacad 100644 --- a/docs/en/changes/changes.md +++ b/docs/en/changes/changes.md @@ -40,6 +40,8 @@ * BanyanDB: Zipkin Module set service as Entity for improving the query performance. * MQE: check the metrics value before do binary operation to improve robustness. * Replace workaround with Armeria native supported context path. +* Add an http endpoint wrapper for health check. +* Bump up Armeria and transitive dependencies. #### UI diff --git a/docs/en/setup/backend/backend-health-check.md b/docs/en/setup/backend/backend-health-check.md index 5c718cceeb09..c717851ca16d 100644 --- a/docs/en/setup/backend/backend-health-check.md +++ b/docs/en/setup/backend/backend-health-check.md @@ -17,8 +17,10 @@ health-checker: ``` Note: The `telemetry` module should be enabled at the same time. This means that the provider should not be `-` and `none`. -After that, we can check the OAP server health status by querying GraphQL: +After that, we can check the OAP server health status by querying the http endpoint: `/healthcheck`, +see [the health check http endpoint doc](../../api/health-check.md). +You can also query the healthiness via other methods like GraphQL, see following. ``` query{ checkHealth{ diff --git a/docs/menu.yml b/docs/menu.yml index 7e9a4ccbcada..50e0a2927790 100644 --- a/docs/menu.yml +++ b/docs/menu.yml @@ -322,6 +322,8 @@ catalog: path: "/en/api/promql-service" - name: "LogQL APIs" path: "/en/api/logql-service" + - name: "Health Check API" + path: "/en/api/health-check" - name: "Customization" catalog: - name: "Overview" diff --git a/oap-server-bom/pom.xml b/oap-server-bom/pom.xml index 6f4e6845cbef..96e40db30812 100644 --- a/oap-server-bom/pom.xml +++ b/oap-server-bom/pom.xml @@ -68,7 +68,7 @@ 42.4.4 0.6.1 1.17.6 - 1.27.3 + 1.29.3 3.0.0 4.4.13 4.1.5 @@ -548,7 +548,11 @@ com.aayushatharva.brotli4j - native-osx-x86_64 + native-linux-x86_64 + + + com.aayushatharva.brotli4j + native-osx-aarch64 diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/HealthStatus.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/HealthStatus.java index f32ccf73c3f5..ac83e8bfb0b7 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/HealthStatus.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/HealthStatus.java @@ -20,9 +20,11 @@ import lombok.Getter; import lombok.Setter; +import lombok.ToString; @Getter @Setter +@ToString public class HealthStatus { // score == 0 means healthy, otherwise it's unhealthy. private int score; diff --git a/oap-server/server-health-checker/src/main/java/org/apache/skywalking/oap/server/health/checker/provider/HealthCheckerHttpService.java b/oap-server/server-health-checker/src/main/java/org/apache/skywalking/oap/server/health/checker/provider/HealthCheckerHttpService.java new file mode 100644 index 000000000000..356d76a79efe --- /dev/null +++ b/oap-server/server-health-checker/src/main/java/org/apache/skywalking/oap/server/health/checker/provider/HealthCheckerHttpService.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.skywalking.oap.server.health.checker.provider; + +import com.linecorp.armeria.common.HttpRequest; +import com.linecorp.armeria.common.HttpResponse; +import com.linecorp.armeria.common.HttpStatus; +import com.linecorp.armeria.server.ServiceRequestContext; +import com.linecorp.armeria.server.annotation.Get; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +public class HealthCheckerHttpService { + private final HealthQueryService healthQueryService; + + @Get("/healthcheck") + public HttpResponse healthcheck(ServiceRequestContext ctx, HttpRequest req) throws Exception { + final var status = healthQueryService.checkHealth(); + log.info("Health status: {}", status); + + if (status.getScore() == 0) { + return HttpResponse.of(HttpStatus.OK); + } + return HttpResponse.of(HttpStatus.SERVICE_UNAVAILABLE); + } +} diff --git a/oap-server/server-health-checker/src/main/java/org/apache/skywalking/oap/server/health/checker/provider/HealthCheckerProvider.java b/oap-server/server-health-checker/src/main/java/org/apache/skywalking/oap/server/health/checker/provider/HealthCheckerProvider.java index 557cb0178226..29760f02ac27 100644 --- a/oap-server/server-health-checker/src/main/java/org/apache/skywalking/oap/server/health/checker/provider/HealthCheckerProvider.java +++ b/oap-server/server-health-checker/src/main/java/org/apache/skywalking/oap/server/health/checker/provider/HealthCheckerProvider.java @@ -20,12 +20,16 @@ import com.google.common.util.concurrent.AtomicDouble; import io.vavr.collection.Stream; + +import java.util.Arrays; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import org.apache.skywalking.oap.server.core.CoreModule; +import org.apache.skywalking.oap.server.core.server.HTTPHandlerRegister; import org.apache.skywalking.oap.server.health.checker.module.HealthCheckerModule; import org.apache.skywalking.oap.server.library.module.ModuleDefine; import org.apache.skywalking.oap.server.library.module.ModuleProvider; @@ -36,6 +40,8 @@ import org.apache.skywalking.oap.server.telemetry.api.MetricsCollector; import org.apache.skywalking.oap.server.telemetry.api.MetricsCreator; +import com.linecorp.armeria.common.HttpMethod; + /** * HealthCheckerProvider fetches health check metrics from telemetry module, then calculates health score and generates * details explains the score. External service or users can query health status by HealthCheckerService. @@ -48,6 +54,7 @@ public class HealthCheckerProvider extends ModuleProvider { private MetricsCollector collector; private MetricsCreator metricsCreator; private ScheduledExecutorService ses; + private HealthQueryService healthQueryService; @Override public String name() { return "default"; @@ -75,13 +82,19 @@ public void onInitialized(final HealthCheckerConfig initialized) { @Override public void prepare() throws ServiceNotProvidedException, ModuleStartException { score.set(-1); ses = Executors.newSingleThreadScheduledExecutor(); - this.registerServiceImplementation(HealthQueryService.class, new HealthQueryService(score, details)); + healthQueryService = new HealthQueryService(score, details); + this.registerServiceImplementation(HealthQueryService.class, healthQueryService); } @Override public void start() throws ServiceNotProvidedException, ModuleStartException { ModuleServiceHolder telemetry = getManager().find(TelemetryModule.NAME).provider(); metricsCreator = telemetry.getService(MetricsCreator.class); collector = telemetry.getService(MetricsCollector.class); + + final var service = getManager().find(CoreModule.NAME) + .provider() + .getService(HTTPHandlerRegister.class); + service.addHandler(new HealthCheckerHttpService(healthQueryService), Arrays.asList(HttpMethod.HEAD, HttpMethod.GET)); } @Override public void notifyAfterCompleted() throws ServiceNotProvidedException, ModuleStartException { diff --git a/oap-server/server-library/library-server/src/main/java/org/apache/skywalking/oap/server/library/server/http/HTTPServer.java b/oap-server/server-library/library-server/src/main/java/org/apache/skywalking/oap/server/library/server/http/HTTPServer.java index 5c787f673f76..3f4410e77957 100644 --- a/oap-server/server-library/library-server/src/main/java/org/apache/skywalking/oap/server/library/server/http/HTTPServer.java +++ b/oap-server/server-library/library-server/src/main/java/org/apache/skywalking/oap/server/library/server/http/HTTPServer.java @@ -26,7 +26,6 @@ import com.linecorp.armeria.server.ServerBuilder; import com.linecorp.armeria.server.docs.DocService; import com.linecorp.armeria.server.encoding.DecodingService; -import com.linecorp.armeria.server.healthcheck.HealthCheckService; import com.linecorp.armeria.server.logging.LoggingService; import java.io.FileInputStream; @@ -61,7 +60,6 @@ public void initialize() { .builder() .baseContextPath(config.getContextPath()) .serviceUnder("/docs", DocService.builder().build()) - .service("/internal/l7check", HealthCheckService.of()) .workerGroup(config.getMaxThreads()) .http1MaxHeaderSize(config.getMaxRequestHeaderSize()) .idleTimeout(Duration.ofMillis(config.getIdleTimeOut()))