diff --git a/docs/en/api/metrics-query-expression.md b/docs/en/api/metrics-query-expression.md index 9f8a02a01a..74550e0934 100644 --- a/docs/en/api/metrics-query-expression.md +++ b/docs/en/api/metrics-query-expression.md @@ -511,7 +511,7 @@ baseline(service_resp_time, upper) ``` **Notice**: -- This feature is required to enable the `baseline module` and deploy a baseline service. And the baseline service should implement the protocol of the [baseline.proto](../../../oap-server/metrics-baseline/src/main/proto/baseline.proto). +- This feature is required to enable the `baseline module` and deploy a baseline service. And the baseline service should implement the protocol of the [baseline.proto](../../../oap-server/ai-pipeline/src/main/proto/baseline.proto). Otherwise, the result will be empty. - The baseline operation requires the relative metrics declared through baseline service. Otherwise, the result will be empty, which means there is no baseline or predicated value. diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md index 37c970a109..0ae72511d9 100644 --- a/docs/en/changes/changes.md +++ b/docs/en/changes/changes.md @@ -15,6 +15,7 @@ production-ready. Don't need H2 as default storage anymore. * [Breaking Change] Bump up BanyanDB server version to 0.8.0. This version is not compatible with the previous versions. Please upgrade the BanyanDB server to 0.8.0 before upgrading OAP to 10.2.0. +* Move `metrics-baseline` module into `ai-pipeline` module. #### OAP Server diff --git a/oap-server/ai-pipeline/pom.xml b/oap-server/ai-pipeline/pom.xml index 5b98b6fc56..ddcf480d7c 100644 --- a/oap-server/ai-pipeline/pom.xml +++ b/oap-server/ai-pipeline/pom.xml @@ -62,6 +62,21 @@ library-client ${project.version} + + org.apache.skywalking + server-core + ${project.version} + + + io.grpc + grpc-testing + test + + + org.powermock + powermock-reflect + test + @@ -95,4 +110,4 @@ - \ No newline at end of file + diff --git a/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/AIPipelineConfig.java b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/AIPipelineConfig.java index 64714a77d4..3cd005dc29 100644 --- a/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/AIPipelineConfig.java +++ b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/AIPipelineConfig.java @@ -27,4 +27,6 @@ import org.apache.skywalking.oap.server.library.module.ModuleConfig; public class AIPipelineConfig extends ModuleConfig { private String uriRecognitionServerAddr; private int uriRecognitionServerPort = 17128; + private String baselineServerAddr; + private int baselineServerPort = 18080; } diff --git a/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/AIPipelineModule.java b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/AIPipelineModule.java index 0ffe9d975a..d325447d3d 100644 --- a/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/AIPipelineModule.java +++ b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/AIPipelineModule.java @@ -18,7 +18,7 @@ package org.apache.skywalking.oap.server.ai.pipeline; -import org.apache.skywalking.oap.server.ai.pipeline.services.api.HttpUriRecognition; +import org.apache.skywalking.oap.server.ai.pipeline.services.BaselineQueryService; import org.apache.skywalking.oap.server.library.module.ModuleDefine; public class AIPipelineModule extends ModuleDefine { @@ -30,8 +30,6 @@ public class AIPipelineModule extends ModuleDefine { @Override public Class[] services() { - return new Class[]{ - HttpUriRecognition.class - }; + return new Class[]{BaselineQueryService.class}; } } diff --git a/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/AIPipelineProvider.java b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/AIPipelineProvider.java index 6bc924781c..70dfffdce9 100644 --- a/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/AIPipelineProvider.java +++ b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/AIPipelineProvider.java @@ -18,8 +18,11 @@ package org.apache.skywalking.oap.server.ai.pipeline; +import org.apache.skywalking.oap.server.ai.pipeline.services.BaselineQueryService; +import org.apache.skywalking.oap.server.ai.pipeline.services.BaselineQueryServiceImpl; import org.apache.skywalking.oap.server.ai.pipeline.services.HttpUriRecognitionService; -import org.apache.skywalking.oap.server.ai.pipeline.services.api.HttpUriRecognition; +import org.apache.skywalking.oap.server.core.CoreModule; +import org.apache.skywalking.oap.server.core.config.group.EndpointNameGroupService; import org.apache.skywalking.oap.server.library.module.ModuleConfig; import org.apache.skywalking.oap.server.library.module.ModuleDefine; import org.apache.skywalking.oap.server.library.module.ModuleProvider; @@ -56,25 +59,31 @@ public class AIPipelineProvider extends ModuleProvider { @Override public void prepare() throws ServiceNotProvidedException, ModuleStartException { - final HttpUriRecognitionService httpUriRecognitionService = new HttpUriRecognitionService( - aiPipelineConfig.getUriRecognitionServerAddr(), - aiPipelineConfig.getUriRecognitionServerPort() - ); - this.registerServiceImplementation(HttpUriRecognition.class, httpUriRecognitionService); + this.registerServiceImplementation(BaselineQueryService.class, new BaselineQueryServiceImpl( + aiPipelineConfig.getBaselineServerAddr(), + aiPipelineConfig.getBaselineServerPort() + )); } @Override public void start() throws ServiceNotProvidedException, ModuleStartException { - + final HttpUriRecognitionService httpUriRecognitionService = new HttpUriRecognitionService( + aiPipelineConfig.getUriRecognitionServerAddr(), + aiPipelineConfig.getUriRecognitionServerPort() + ); + getManager().find(CoreModule.NAME).provider() + .getService(EndpointNameGroupService.class) + .startHttpUriRecognitionSvr(httpUriRecognitionService); } @Override public void notifyAfterCompleted() throws ServiceNotProvidedException, ModuleStartException { - } @Override public String[] requiredModules() { - return new String[0]; + return new String[] { + CoreModule.NAME + }; } } diff --git a/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/service/BaselineQueryService.java b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/BaselineQueryService.java similarity index 96% rename from oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/service/BaselineQueryService.java rename to oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/BaselineQueryService.java index 860c836d0b..1b97aff777 100644 --- a/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/service/BaselineQueryService.java +++ b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/BaselineQueryService.java @@ -16,7 +16,7 @@ * */ -package org.apache.skywalking.oap.server.baseline.service; +package org.apache.skywalking.oap.server.ai.pipeline.services; import java.util.Map; import org.apache.skywalking.oap.server.library.module.Service; diff --git a/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/service/BaselineQueryServiceImpl.java b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/BaselineQueryServiceImpl.java similarity index 99% rename from oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/service/BaselineQueryServiceImpl.java rename to oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/BaselineQueryServiceImpl.java index c7b43698ca..5f686b071e 100644 --- a/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/service/BaselineQueryServiceImpl.java +++ b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/BaselineQueryServiceImpl.java @@ -16,7 +16,7 @@ * */ -package org.apache.skywalking.oap.server.baseline.service; +package org.apache.skywalking.oap.server.ai.pipeline.services; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; diff --git a/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/HttpUriRecognitionService.java b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/HttpUriRecognitionService.java index e4e37289e2..d98b748805 100644 --- a/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/HttpUriRecognitionService.java +++ b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/HttpUriRecognitionService.java @@ -28,8 +28,8 @@ import org.apache.skywalking.oap.server.ai.pipeline.grpc.HttpUriRecognitionReque import org.apache.skywalking.oap.server.ai.pipeline.grpc.HttpUriRecognitionResponse; import org.apache.skywalking.oap.server.ai.pipeline.grpc.HttpUriRecognitionServiceGrpc; import org.apache.skywalking.oap.server.ai.pipeline.grpc.HttpUriRecognitionSyncRequest; -import org.apache.skywalking.oap.server.ai.pipeline.services.api.HttpUriPattern; -import org.apache.skywalking.oap.server.ai.pipeline.services.api.HttpUriRecognition; +import org.apache.skywalking.oap.server.core.config.group.ai.HttpUriPattern; +import org.apache.skywalking.oap.server.core.config.group.ai.HttpUriRecognition; import org.apache.skywalking.oap.server.library.client.grpc.GRPCClient; import org.apache.skywalking.oap.server.library.util.StringUtil; diff --git a/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/service/PredictServiceMetrics.java b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/PredictServiceMetrics.java similarity index 96% rename from oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/service/PredictServiceMetrics.java rename to oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/PredictServiceMetrics.java index f2abf524d0..b5c4442bad 100644 --- a/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/service/PredictServiceMetrics.java +++ b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/PredictServiceMetrics.java @@ -16,7 +16,7 @@ * */ -package org.apache.skywalking.oap.server.baseline.service; +package org.apache.skywalking.oap.server.ai.pipeline.services; import lombok.Builder; import lombok.Data; diff --git a/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/service/ServiceMetrics.java b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/ServiceMetrics.java similarity index 94% rename from oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/service/ServiceMetrics.java rename to oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/ServiceMetrics.java index cb7de2f1a3..e46c94a70c 100644 --- a/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/service/ServiceMetrics.java +++ b/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/ServiceMetrics.java @@ -16,7 +16,7 @@ * */ -package org.apache.skywalking.oap.server.baseline.service; +package org.apache.skywalking.oap.server.ai.pipeline.services; import lombok.Builder; import lombok.Data; diff --git a/oap-server/metrics-baseline/src/main/proto/baseline.proto b/oap-server/ai-pipeline/src/main/proto/baseline.proto similarity index 100% rename from oap-server/metrics-baseline/src/main/proto/baseline.proto rename to oap-server/ai-pipeline/src/main/proto/baseline.proto diff --git a/oap-server/metrics-baseline/src/test/java/org/apache/skywalking/oap/server/baseline/BaselineQueryServer.java b/oap-server/ai-pipeline/src/test/java/BaselineQueryServer.java similarity index 99% rename from oap-server/metrics-baseline/src/test/java/org/apache/skywalking/oap/server/baseline/BaselineQueryServer.java rename to oap-server/ai-pipeline/src/test/java/BaselineQueryServer.java index b2eafd8597..65f3b72ce6 100644 --- a/oap-server/metrics-baseline/src/test/java/org/apache/skywalking/oap/server/baseline/BaselineQueryServer.java +++ b/oap-server/ai-pipeline/src/test/java/BaselineQueryServer.java @@ -16,19 +16,17 @@ * */ -package org.apache.skywalking.oap.server.baseline; - import com.google.protobuf.Empty; import io.grpc.stub.StreamObserver; import lombok.Builder; import lombok.Data; -import org.apache.skywalking.apm.baseline.v3.AlarmBaselineMetricsNames; -import org.apache.skywalking.oap.server.core.analysis.DownSampling; -import org.apache.skywalking.oap.server.core.analysis.TimeBucket; -import org.apache.skywalking.apm.baseline.v3.AlarmBaselineServiceGrpc; import org.apache.skywalking.apm.baseline.v3.AlarmBaselineLabeledValue; +import org.apache.skywalking.apm.baseline.v3.AlarmBaselineMetricsNames; +import org.apache.skywalking.apm.baseline.v3.AlarmBaselineServiceGrpc; import org.apache.skywalking.apm.baseline.v3.AlarmBaselineValue; import org.apache.skywalking.apm.baseline.v3.KeyStringValuePair; +import org.apache.skywalking.oap.server.core.analysis.DownSampling; +import org.apache.skywalking.oap.server.core.analysis.TimeBucket; import java.util.ArrayList; import java.util.Calendar; diff --git a/oap-server/metrics-baseline/src/test/java/org/apache/skywalking/oap/server/baseline/BaselineServerTest.java b/oap-server/ai-pipeline/src/test/java/BaselineServerTest.java similarity index 93% rename from oap-server/metrics-baseline/src/test/java/org/apache/skywalking/oap/server/baseline/BaselineServerTest.java rename to oap-server/ai-pipeline/src/test/java/BaselineServerTest.java index 254ef3e4ec..2685a849af 100644 --- a/oap-server/metrics-baseline/src/test/java/org/apache/skywalking/oap/server/baseline/BaselineServerTest.java +++ b/oap-server/ai-pipeline/src/test/java/BaselineServerTest.java @@ -16,17 +16,15 @@ * */ -package org.apache.skywalking.oap.server.baseline; - import io.grpc.ManagedChannel; import io.grpc.Server; import io.grpc.inprocess.InProcessChannelBuilder; import io.grpc.inprocess.InProcessServerBuilder; import io.grpc.util.MutableHandlerRegistry; import lombok.extern.slf4j.Slf4j; -import org.apache.skywalking.oap.server.baseline.service.BaselineQueryServiceImpl; -import org.apache.skywalking.oap.server.baseline.service.PredictServiceMetrics; -import org.apache.skywalking.oap.server.baseline.service.ServiceMetrics; +import org.apache.skywalking.oap.server.ai.pipeline.services.BaselineQueryServiceImpl; +import org.apache.skywalking.oap.server.ai.pipeline.services.PredictServiceMetrics; +import org.apache.skywalking.oap.server.ai.pipeline.services.ServiceMetrics; import org.apache.skywalking.oap.server.core.analysis.DownSampling; import org.apache.skywalking.oap.server.core.analysis.TimeBucket; import org.junit.jupiter.api.AfterEach; diff --git a/oap-server/metrics-baseline/pom.xml b/oap-server/metrics-baseline/pom.xml deleted file mode 100644 index 34a2e0aa2c..0000000000 --- a/oap-server/metrics-baseline/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - oap-server - org.apache.skywalking - ${revision} - - 4.0.0 - - metrics-baseline - - - - org.apache.skywalking - server-core - ${project.version} - - - io.grpc - grpc-testing - test - - - org.powermock - powermock-reflect - test - - - - - - - org.xolstice.maven.plugins - protobuf-maven-plugin - ${protobuf-maven-plugin.version} - - - com.google.protobuf:protoc:${com.google.protobuf.protoc.version}:exe:${os.detected.classifier} - - grpc-java - io.grpc:protoc-gen-grpc-java:${protoc-gen-grpc-java.plugin.version}:exe:${os.detected.classifier} - - - - - - compile - compile-custom - - - - - - - diff --git a/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/BaselineModule.java b/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/BaselineModule.java deleted file mode 100644 index 0d27a456ac..0000000000 --- a/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/BaselineModule.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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.baseline; - -import org.apache.skywalking.oap.server.baseline.service.BaselineQueryService; -import org.apache.skywalking.oap.server.library.module.ModuleDefine; - -public class BaselineModule extends ModuleDefine { - public static final String NAME = "baseline"; - - public BaselineModule() { - super(NAME); - } - - @Override - public Class[] services() { - return new Class[]{BaselineQueryService.class}; - } - -} diff --git a/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/BaselineModuleProvider.java b/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/BaselineModuleProvider.java deleted file mode 100644 index 20e5b63398..0000000000 --- a/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/BaselineModuleProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * 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.baseline; - -import org.apache.skywalking.oap.server.baseline.service.BaselineQueryService; -import org.apache.skywalking.oap.server.baseline.service.BaselineQueryServiceImpl; -import org.apache.skywalking.oap.server.library.module.ModuleConfig; -import org.apache.skywalking.oap.server.library.module.ModuleDefine; -import org.apache.skywalking.oap.server.library.module.ModuleProvider; -import org.apache.skywalking.oap.server.library.module.ModuleStartException; -import org.apache.skywalking.oap.server.library.module.ServiceNotProvidedException; - -public class BaselineModuleProvider extends ModuleProvider { - private BaselineModuleConfig config; - - @Override - public String name() { - return "default"; - } - - @Override - public Class module() { - return BaselineModule.class; - } - - @Override - public ConfigCreator newConfigCreator() { - return new ConfigCreator() { - @Override - public Class type() { - return BaselineModuleConfig.class; - } - - @Override - public void onInitialized(BaselineModuleConfig moduleConfig) { - config = moduleConfig; - } - }; - } - - @Override - public void prepare() throws ServiceNotProvidedException, ModuleStartException { - this.registerServiceImplementation(BaselineQueryService.class, new BaselineQueryServiceImpl(config.getServiceHost(), - config.getServicePort())); - } - - @Override - public void start() throws ServiceNotProvidedException, ModuleStartException { - - } - - @Override - public void notifyAfterCompleted() throws ServiceNotProvidedException, ModuleStartException { - - } - - @Override - public String[] requiredModules() { - return new String[0]; - } -} diff --git a/oap-server/metrics-baseline/src/main/resources/META-INF/services/org.apache.skywalking.oap.server.library.module.ModuleDefine b/oap-server/metrics-baseline/src/main/resources/META-INF/services/org.apache.skywalking.oap.server.library.module.ModuleDefine deleted file mode 100644 index fed83836ee..0000000000 --- a/oap-server/metrics-baseline/src/main/resources/META-INF/services/org.apache.skywalking.oap.server.library.module.ModuleDefine +++ /dev/null @@ -1,19 +0,0 @@ -# -# 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. -# -# - -org.apache.skywalking.oap.server.baseline.BaselineModule diff --git a/oap-server/metrics-baseline/src/main/resources/META-INF/services/org.apache.skywalking.oap.server.library.module.ModuleProvider b/oap-server/metrics-baseline/src/main/resources/META-INF/services/org.apache.skywalking.oap.server.library.module.ModuleProvider deleted file mode 100755 index 1721d6f41a..0000000000 --- a/oap-server/metrics-baseline/src/main/resources/META-INF/services/org.apache.skywalking.oap.server.library.module.ModuleProvider +++ /dev/null @@ -1,19 +0,0 @@ -# -# 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. -# -# - -org.apache.skywalking.oap.server.baseline.BaselineModuleProvider diff --git a/oap-server/mqe-rt/pom.xml b/oap-server/mqe-rt/pom.xml index fcaa3ae0f3..a70dec6fdd 100644 --- a/oap-server/mqe-rt/pom.xml +++ b/oap-server/mqe-rt/pom.xml @@ -46,7 +46,7 @@ org.apache.skywalking - metrics-baseline + ai-pipeline ${project.version} diff --git a/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/MQEVisitorBase.java b/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/MQEVisitorBase.java index 9d44c232f9..a1691e9dec 100644 --- a/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/MQEVisitorBase.java +++ b/oap-server/mqe-rt/src/main/java/org/apache/skywalking/mqe/rt/MQEVisitorBase.java @@ -40,9 +40,9 @@ import org.apache.skywalking.mqe.rt.operation.SortLabelValuesOp; import org.apache.skywalking.mqe.rt.operation.SortValuesOp; import org.apache.skywalking.mqe.rt.operation.TopNOfOp; import org.apache.skywalking.mqe.rt.operation.TrendOp; -import org.apache.skywalking.oap.server.baseline.BaselineModule; -import org.apache.skywalking.oap.server.baseline.service.BaselineQueryService; -import org.apache.skywalking.oap.server.baseline.service.PredictServiceMetrics; +import org.apache.skywalking.oap.server.ai.pipeline.AIPipelineModule; +import org.apache.skywalking.oap.server.ai.pipeline.services.BaselineQueryService; +import org.apache.skywalking.oap.server.ai.pipeline.services.PredictServiceMetrics; import org.apache.skywalking.oap.server.core.analysis.metrics.DataLabel; import org.apache.skywalking.oap.server.core.analysis.metrics.DataTable; import org.apache.skywalking.oap.server.core.query.mqe.ExpressionResult; @@ -87,7 +87,7 @@ public abstract class MQEVisitorBase extends MQEParserBaseVisitorai-pipeline mqe-grammar mqe-rt - metrics-baseline diff --git a/oap-server/server-core/pom.xml b/oap-server/server-core/pom.xml index b7d8be798d..784da5435c 100644 --- a/oap-server/server-core/pom.xml +++ b/oap-server/server-core/pom.xml @@ -102,11 +102,6 @@ io.zipkin.zipkin2 zipkin - - org.apache.skywalking - ai-pipeline - ${project.version} - org.apache.groovy groovy diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java index 176aca298a..91509759ea 100755 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModule.java @@ -30,6 +30,7 @@ import org.apache.skywalking.oap.server.core.config.DownSamplingConfigService; import org.apache.skywalking.oap.server.core.config.HierarchyDefinitionService; import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService; import org.apache.skywalking.oap.server.core.config.NamingControl; +import org.apache.skywalking.oap.server.core.config.group.EndpointNameGroupService; import org.apache.skywalking.oap.server.core.hierarchy.HierarchyService; import org.apache.skywalking.oap.server.core.management.ui.menu.UIMenuManagementService; import org.apache.skywalking.oap.server.core.management.ui.template.UITemplateManagementService; @@ -108,6 +109,7 @@ public class CoreModule extends ModuleDefine { classes.add(CommandService.class); classes.add(HierarchyService.class); + classes.add(EndpointNameGroupService.class); return classes.toArray(new Class[]{}); } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java index 7b61f0e901..f07049a285 100755 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java @@ -20,8 +20,6 @@ package org.apache.skywalking.oap.server.core; import java.io.FileNotFoundException; import java.io.IOException; -import org.apache.skywalking.oap.server.ai.pipeline.AIPipelineModule; -import org.apache.skywalking.oap.server.ai.pipeline.services.api.HttpUriRecognition; import org.apache.skywalking.oap.server.configuration.api.ConfigurationModule; import org.apache.skywalking.oap.server.configuration.api.DynamicConfigurationService; import org.apache.skywalking.oap.server.core.analysis.ApdexThresholdConfig; @@ -48,6 +46,7 @@ import org.apache.skywalking.oap.server.core.config.DownSamplingConfigService; import org.apache.skywalking.oap.server.core.config.HierarchyDefinitionService; import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService; import org.apache.skywalking.oap.server.core.config.NamingControl; +import org.apache.skywalking.oap.server.core.config.group.EndpointNameGroupService; import org.apache.skywalking.oap.server.core.config.group.EndpointNameGrouping; import org.apache.skywalking.oap.server.core.config.group.EndpointNameGroupingRuleWatcher; import org.apache.skywalking.oap.server.core.config.group.openapi.EndpointNameGroupingRule4OpenapiWatcher; @@ -190,6 +189,7 @@ public class CoreModuleProvider extends ModuleProvider { endpointNameGrouping ); this.registerServiceImplementation(NamingControl.class, namingControl); + this.registerServiceImplementation(EndpointNameGroupService.class, endpointNameGrouping); MeterEntity.setNamingControl(namingControl); try { endpointNameGroupingRuleWatcher = new EndpointNameGroupingRuleWatcher( @@ -396,11 +396,7 @@ public class CoreModuleProvider extends ModuleProvider { grpcServer.addHandler(new HealthCheckServiceHandler()); grpcServer.addInterceptor(WatermarkGRPCInterceptor.INSTANCE); - endpointNameGrouping.startHttpUriRecognitionSvr( - getManager() - .find(AIPipelineModule.NAME) - .provider() - .getService(HttpUriRecognition.class), + endpointNameGrouping.prepareForHTTPUrlRecognition( getService(MetadataQueryService.class), moduleConfig.getSyncPeriodHttpUriRecognitionPattern(), moduleConfig.getTrainingPeriodHttpUriRecognitionPattern(), @@ -490,7 +486,6 @@ public class CoreModuleProvider extends ModuleProvider { return new String[] { TelemetryModule.NAME, ConfigurationModule.NAME, - AIPipelineModule.NAME }; } } diff --git a/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/BaselineModuleConfig.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGroupService.java similarity index 65% rename from oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/BaselineModuleConfig.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGroupService.java index 7bad4169c3..373061465a 100644 --- a/oap-server/metrics-baseline/src/main/java/org/apache/skywalking/oap/server/baseline/BaselineModuleConfig.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGroupService.java @@ -16,17 +16,14 @@ * */ -package org.apache.skywalking.oap.server.baseline; +package org.apache.skywalking.oap.server.core.config.group; -import lombok.Getter; -import lombok.Setter; -import org.apache.skywalking.oap.server.library.module.ModuleConfig; +import org.apache.skywalking.oap.server.core.config.group.ai.HttpUriRecognition; +import org.apache.skywalking.oap.server.library.module.Service; -public class BaselineModuleConfig extends ModuleConfig { - @Setter - @Getter - private String serviceHost = ""; - @Setter - @Getter - private int servicePort = 0; +public interface EndpointNameGroupService extends Service { + /** + * Start the HTTP URL Recognition service to group endpoint name + */ + void startHttpUriRecognitionSvr(final HttpUriRecognition httpUriRecognitionSvr); } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGrouping.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGrouping.java index 5647c30590..81de84d04f 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGrouping.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGrouping.java @@ -30,8 +30,11 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import org.apache.skywalking.oap.server.ai.pipeline.services.api.HttpUriPattern; -import org.apache.skywalking.oap.server.ai.pipeline.services.api.HttpUriRecognition; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.apache.skywalking.oap.server.core.config.group.ai.HttpUriPattern; +import org.apache.skywalking.oap.server.core.config.group.ai.HttpUriRecognition; import org.apache.skywalking.oap.server.core.config.group.openapi.EndpointGroupingRule4Openapi; import org.apache.skywalking.oap.server.core.config.group.uri.quickmatch.QuickUriGroupingRule; import org.apache.skywalking.oap.server.core.query.MetadataQueryService; @@ -46,7 +49,7 @@ import lombok.Setter; import lombok.extern.slf4j.Slf4j; @Slf4j -public class EndpointNameGrouping { +public class EndpointNameGrouping implements EndpointNameGroupService { public static final String ABANDONED_ENDPOINT_NAME = "_abandoned"; /** @@ -83,6 +86,10 @@ public class EndpointNameGrouping { * The max number of HTTP URIs per service for further URI pattern recognition. */ private int maxHttpUrisNumberPerService = 3000; + /** + * Prepare for start HTTP URL Recognition config + */ + private HTTPUrlRecognitionConfig httpUrlRecognitionConfig; /** * Format the endpoint name according to the API patterns. @@ -185,68 +192,85 @@ public class EndpointNameGrouping { return new Tuple2<>(formatResult.getReplacedName(), formatResult.isMatch()); } - public void startHttpUriRecognitionSvr(final HttpUriRecognition httpUriRecognitionSvr, - final MetadataQueryService metadataQueryService, - int syncPeriodHttpUriRecognitionPattern, - int trainingPeriodHttpUriRecognitionPattern, - int maxEndpointCandidatePerSvr) { + public void prepareForHTTPUrlRecognition(final MetadataQueryService metadataQueryService, + int syncPeriodHttpUriRecognitionPattern, + int trainingPeriodHttpUriRecognitionPattern, + int maxEndpointCandidatePerSvr) { this.maxHttpUrisNumberPerService = maxEndpointCandidatePerSvr; - if (!httpUriRecognitionSvr.isInitialized()) { + this.httpUrlRecognitionConfig = new HTTPUrlRecognitionConfig( + metadataQueryService, syncPeriodHttpUriRecognitionPattern, trainingPeriodHttpUriRecognitionPattern, + maxEndpointCandidatePerSvr + ); + } + + @Override + public void startHttpUriRecognitionSvr(HttpUriRecognition httpUriRecognitionSvr) { + if (this.httpUrlRecognitionConfig == null || !httpUriRecognitionSvr.isInitialized()) { return; } this.quickUriGroupingRule = new QuickUriGroupingRule(); + HTTPUrlRecognitionConfig config = this.httpUrlRecognitionConfig; Executors.newSingleThreadScheduledExecutor() - .scheduleWithFixedDelay( - new RunnableWithExceptionProtection( - () -> { - int currentExecutionCounter = aiPipelineExecutionCounter.incrementAndGet(); - if (currentExecutionCounter % trainingPeriodHttpUriRecognitionPattern == 0) { - // Send the cached URIs to the recognition server to build new patterns. - cachedHttpUris.forEach((serviceName, httpUris) -> { - final List candidates4UriPatterns = new ArrayList<>( - 3000); - httpUris.forEach((uri, candidates) -> { - if (candidates.size() == 0) { - //unrecognized uri - candidates4UriPatterns.add(new HttpUriRecognition.HTTPUri(uri)); - } else { - String candidateUri; - while ((candidateUri = candidates.poll()) != null) { - candidates4UriPatterns.add( - new HttpUriRecognition.HTTPUri(candidateUri)); - } - } - }); + .scheduleWithFixedDelay( + new RunnableWithExceptionProtection( + () -> { + int currentExecutionCounter = aiPipelineExecutionCounter.incrementAndGet(); + if (currentExecutionCounter % config.trainingPeriodHttpUriRecognitionPattern == 0) { + // Send the cached URIs to the recognition server to build new patterns. + cachedHttpUris.forEach((serviceName, httpUris) -> { + final List candidates4UriPatterns = new ArrayList<>( + 3000); + httpUris.forEach((uri, candidates) -> { + if (candidates.size() == 0) { + //unrecognized uri + candidates4UriPatterns.add(new HttpUriRecognition.HTTPUri(uri)); + } else { + String candidateUri; + while ((candidateUri = candidates.poll()) != null) { + candidates4UriPatterns.add( + new HttpUriRecognition.HTTPUri(candidateUri)); + } + } + }); - // Reset the cache once the URIs are sent to the recognition server. - httpUris.clear(); - httpUriRecognitionSvr.feedRawData(serviceName, candidates4UriPatterns); - }); - } - if (currentExecutionCounter % syncPeriodHttpUriRecognitionPattern == 0) { - // Sync with the recognition server per 1 min to get the latest patterns. - try { - metadataQueryService.listServices(null, null).forEach( - service -> { - final List patterns - = httpUriRecognitionSvr.fetchAllPatterns(service.getName()); - if (CollectionUtils.isNotEmpty(patterns)) { - patterns.forEach( - p -> quickUriGroupingRule.addRule( - service.getName(), p.getPattern())); + // Reset the cache once the URIs are sent to the recognition server. + httpUris.clear(); + httpUriRecognitionSvr.feedRawData(serviceName, candidates4UriPatterns); + }); + } + if (currentExecutionCounter % config.syncPeriodHttpUriRecognitionPattern == 0) { + // Sync with the recognition server per 1 min to get the latest patterns. + try { + config.metadataQueryService.listServices(null, null).forEach( + service -> { + final List patterns + = httpUriRecognitionSvr.fetchAllPatterns(service.getName()); + if (CollectionUtils.isNotEmpty(patterns)) { + patterns.forEach( + p -> quickUriGroupingRule.addRule( + service.getName(), p.getPattern())); - } - } - ); - } catch (IOException e) { - log.error("Fail to load all services.", e); - } + } + } + ); + } catch (IOException e) { + log.error("Fail to load all services.", e); + } - } - }, - t -> log.error("Fail to recognize URI patterns.", t) - ), 60, 1, TimeUnit.SECONDS - ); + } + }, + t -> log.error("Fail to recognize URI patterns.", t) + ), 60, 1, TimeUnit.SECONDS + ); } + + @Data + @AllArgsConstructor + private static class HTTPUrlRecognitionConfig { + private MetadataQueryService metadataQueryService; + private int syncPeriodHttpUriRecognitionPattern; + private int trainingPeriodHttpUriRecognitionPattern; + private int maxEndpointCandidatePerSvr; + } } diff --git a/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/api/HttpUriPattern.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/ai/HttpUriPattern.java similarity index 94% rename from oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/api/HttpUriPattern.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/ai/HttpUriPattern.java index bb3f0a588d..cc04ac6d31 100644 --- a/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/api/HttpUriPattern.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/ai/HttpUriPattern.java @@ -16,7 +16,7 @@ * */ -package org.apache.skywalking.oap.server.ai.pipeline.services.api; +package org.apache.skywalking.oap.server.core.config.group.ai; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/api/HttpUriRecognition.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/ai/HttpUriRecognition.java similarity index 90% rename from oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/api/HttpUriRecognition.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/ai/HttpUriRecognition.java index 40daefc1b5..39724d4351 100644 --- a/oap-server/ai-pipeline/src/main/java/org/apache/skywalking/oap/server/ai/pipeline/services/api/HttpUriRecognition.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/ai/HttpUriRecognition.java @@ -16,17 +16,16 @@ * */ -package org.apache.skywalking.oap.server.ai.pipeline.services.api; +package org.apache.skywalking.oap.server.core.config.group.ai; import java.util.List; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.apache.skywalking.oap.server.library.module.Service; /** * HttpUriRecognition is a service to recognize the patterns of HTTP URIs */ -public interface HttpUriRecognition extends Service { +public interface HttpUriRecognition { /** * @return true if the service is initialized and active. diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/CoreModuleTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/CoreModuleTest.java index 4f6276d97a..a8e0098a72 100644 --- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/CoreModuleTest.java +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/CoreModuleTest.java @@ -26,6 +26,6 @@ public class CoreModuleTest { public void testOpenServiceList() { CoreModule coreModule = new CoreModule(); - Assertions.assertEquals(48, coreModule.services().length); + Assertions.assertEquals(49, coreModule.services().length); } } diff --git a/oap-server/server-starter/pom.xml b/oap-server/server-starter/pom.xml index ab9961114d..51f79f3fc6 100644 --- a/oap-server/server-starter/pom.xml +++ b/oap-server/server-starter/pom.xml @@ -296,11 +296,6 @@ storage-elasticsearch-plugin ${project.version} - - org.apache.skywalking - metrics-baseline - ${project.version} - diff --git a/oap-server/server-starter/src/main/resources/application.yml b/oap-server/server-starter/src/main/resources/application.yml index 469c4ace7f..674f2bb481 100644 --- a/oap-server/server-starter/src/main/resources/application.yml +++ b/oap-server/server-starter/src/main/resources/application.yml @@ -693,9 +693,5 @@ ai-pipeline: default: uriRecognitionServerAddr: ${SW_AI_PIPELINE_URI_RECOGNITION_SERVER_ADDR:} uriRecognitionServerPort: ${SW_AI_PIPELINE_URI_RECOGNITION_SERVER_PORT:17128} - -baseline: - selector: ${SW_BASELINE:default} - default: - serviceHost: ${SW_BASELINE_SERVICE_HOST:} - servicePort: ${SW_BASELINE_SERVICE_PORT:18080} + baselineServerAddr: ${SW_API_PIPELINE_BASELINE_SERVICE_HOST:} + baselineServerPort: ${SW_API_PIPELINE_BASELINE_SERVICE_PORT:18080} diff --git a/test/e2e-v2/cases/alarm/banyandb/docker-compose.yml b/test/e2e-v2/cases/alarm/banyandb/docker-compose.yml index 3be2aca755..9c42ee12e1 100644 --- a/test/e2e-v2/cases/alarm/banyandb/docker-compose.yml +++ b/test/e2e-v2/cases/alarm/banyandb/docker-compose.yml @@ -30,7 +30,7 @@ services: environment: SW_STORAGE: banyandb SW_SEARCHABLE_ALARM_TAG_KEYS: level,receivers - SW_BASELINE_SERVICE_HOST: baseline-server + SW_API_PIPELINE_BASELINE_SERVICE_HOST: baseline-server ports: - 12800 depends_on: diff --git a/test/e2e-v2/cases/alarm/es/docker-compose.yml b/test/e2e-v2/cases/alarm/es/docker-compose.yml index 6f30d90658..6c066a40a5 100644 --- a/test/e2e-v2/cases/alarm/es/docker-compose.yml +++ b/test/e2e-v2/cases/alarm/es/docker-compose.yml @@ -37,7 +37,7 @@ services: environment: SW_STORAGE: elasticsearch SW_SEARCHABLE_ALARM_TAG_KEYS: level,receivers - SW_BASELINE_SERVICE_HOST: baseline-server + SW_API_PIPELINE_BASELINE_SERVICE_HOST: baseline-server ports: - 12800 depends_on: diff --git a/test/e2e-v2/cases/alarm/es/es-sharding/docker-compose.yml b/test/e2e-v2/cases/alarm/es/es-sharding/docker-compose.yml index 22f38c98fb..a8cef85fd9 100644 --- a/test/e2e-v2/cases/alarm/es/es-sharding/docker-compose.yml +++ b/test/e2e-v2/cases/alarm/es/es-sharding/docker-compose.yml @@ -38,7 +38,7 @@ services: SW_STORAGE: elasticsearch SW_SEARCHABLE_ALARM_TAG_KEYS: level,receivers SW_STORAGE_ES_LOGIC_SHARDING: "true" - SW_BASELINE_SERVICE_HOST: baseline-server + SW_API_PIPELINE_BASELINE_SERVICE_HOST: baseline-server ports: - 12800 depends_on: diff --git a/test/e2e-v2/cases/alarm/mysql/docker-compose.yml b/test/e2e-v2/cases/alarm/mysql/docker-compose.yml index 19711a7e73..ce79c178f2 100644 --- a/test/e2e-v2/cases/alarm/mysql/docker-compose.yml +++ b/test/e2e-v2/cases/alarm/mysql/docker-compose.yml @@ -39,7 +39,7 @@ services: environment: SW_STORAGE: mysql SW_SEARCHABLE_ALARM_TAG_KEYS: level,receivers - SW_BASELINE_SERVICE_HOST: baseline-server + SW_API_PIPELINE_BASELINE_SERVICE_HOST: baseline-server entrypoint: ['sh', '-c', '/download-mysql.sh /skywalking/oap-libs && /skywalking/docker-entrypoint.sh'] ports: - 12800 diff --git a/test/e2e-v2/cases/alarm/postgres/docker-compose.yml b/test/e2e-v2/cases/alarm/postgres/docker-compose.yml index 98c8c258e1..1dc4ae7775 100644 --- a/test/e2e-v2/cases/alarm/postgres/docker-compose.yml +++ b/test/e2e-v2/cases/alarm/postgres/docker-compose.yml @@ -39,7 +39,7 @@ services: SW_STORAGE: postgresql SW_JDBC_URL: "jdbc:postgresql://postgres:5432/skywalking" SW_SEARCHABLE_ALARM_TAG_KEYS: level,receivers - SW_BASELINE_SERVICE_HOST: baseline-server + SW_API_PIPELINE_BASELINE_SERVICE_HOST: baseline-server ports: - 12800 depends_on: diff --git a/test/e2e-v2/cases/mqe/docker-compose.yml b/test/e2e-v2/cases/mqe/docker-compose.yml index 337189fe47..457fd337b7 100644 --- a/test/e2e-v2/cases/mqe/docker-compose.yml +++ b/test/e2e-v2/cases/mqe/docker-compose.yml @@ -23,7 +23,7 @@ services: volumes: - ./oal/core.oal:/skywalking/config/oal/core.oal environment: - SW_BASELINE_SERVICE_HOST: baseline-server + SW_API_PIPELINE_BASELINE_SERVICE_HOST: baseline-server depends_on: banyandb: condition: service_healthy