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()))