From a10e04493272a88931d6916662b30d0a320287bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=99=9F=20Wu=20Sheng?= Date: Wed, 20 May 2020 22:50:22 +0800 Subject: [PATCH] Group Parameterized Endpoints (#4802) * Group Parameterized Endpoints. Configure the grouping rules for parameterized endpoints, to improve the meaning of the metrics. --- apm-dist-es7/src/main/assembly/binary-es7.xml | 1 + apm-dist/src/main/assembly/binary.xml | 1 + docs/en/setup/backend/backend-setup.md | 2 + docs/en/setup/backend/dynamic-config.md | 3 +- .../setup/backend/endpoint-grouping-rules.md | 23 ++++ .../alarm/provider/AlarmRulesWatcher.java | 2 +- oap-server/server-bootstrap/pom.xml | 1 + .../main/resources/endpoint_name_grouping.yml | 29 +++++ .../oap/server/core/CoreModule.java | 4 +- .../oap/server/core/CoreModuleProvider.java | 19 ++- ...gLengthControl.java => NamingControl.java} | 13 +- .../config/group/EndpointGroupingRule.java | 56 +++++++++ .../group/EndpointGroupingRuleReader.java | 78 ++++++++++++ .../config/group/EndpointNameGrouping.java | 46 +++++++ .../EndpointNameGroupingRuleWatcher.java | 61 ++++++++++ .../core/config/group/StringFormatGroup.java | 96 +++++++++++++++ .../group/EndpointGroupingRuleReaderTest.java | 44 +++++++ .../EndpointNameGroupingRuleWatcherTest.java | 114 ++++++++++++++++++ .../test/resources/endpoint_name_grouping.yml | 29 +++++ .../CLRMetricReportServiceHandler.java | 14 +-- .../JVMMetricReportServiceHandler.java | 14 +-- .../v8/grpc/ManagementServiceHandler.java | 18 +-- .../ManagementServiceKeepAliveHandler.java | 14 +-- ...agementServiceReportPropertiesHandler.java | 14 +-- .../mesh/TelemetryDataDispatcher.java | 8 +- .../listener/MultiScopesAnalysisListener.java | 20 +-- .../NetworkAddressAliasMappingListener.java | 20 +-- .../listener/SegmentAnalysisListener.java | 27 +++-- .../parser/listener/SourceBuilder.java | 16 +-- .../profile/core/MockCoreModuleProvider.java | 8 +- 30 files changed, 700 insertions(+), 95 deletions(-) create mode 100644 docs/en/setup/backend/endpoint-grouping-rules.md create mode 100644 oap-server/server-bootstrap/src/main/resources/endpoint_name_grouping.yml rename oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/{NamingLengthControl.java => NamingControl.java} (87%) create mode 100644 oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointGroupingRule.java create mode 100644 oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointGroupingRuleReader.java create mode 100644 oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGrouping.java create mode 100644 oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGroupingRuleWatcher.java create mode 100644 oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/StringFormatGroup.java create mode 100644 oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/config/group/EndpointGroupingRuleReaderTest.java create mode 100644 oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGroupingRuleWatcherTest.java create mode 100644 oap-server/server-core/src/test/resources/endpoint_name_grouping.yml diff --git a/apm-dist-es7/src/main/assembly/binary-es7.xml b/apm-dist-es7/src/main/assembly/binary-es7.xml index 6aa8899e6..d6be958b9 100644 --- a/apm-dist-es7/src/main/assembly/binary-es7.xml +++ b/apm-dist-es7/src/main/assembly/binary-es7.xml @@ -50,6 +50,7 @@ component-libraries.yml gateways.yml service-apdex-threshold.yml + endpoint_name_grouping.yml oal/core.oal oal/java-agent.oal oal/dotnet-agent.oal diff --git a/apm-dist/src/main/assembly/binary.xml b/apm-dist/src/main/assembly/binary.xml index 51592389b..1161c1c52 100644 --- a/apm-dist/src/main/assembly/binary.xml +++ b/apm-dist/src/main/assembly/binary.xml @@ -50,6 +50,7 @@ component-libraries.yml gateways.yml service-apdex-threshold.yml + endpoint_name_grouping.yml oal/core.oal oal/java-agent.oal oal/dotnet-agent.oal diff --git a/docs/en/setup/backend/backend-setup.md b/docs/en/setup/backend/backend-setup.md index be4dd4ea9..47a72ffc4 100755 --- a/docs/en/setup/backend/backend-setup.md +++ b/docs/en/setup/backend/backend-setup.md @@ -105,6 +105,8 @@ or 3rd party configuration management system. 1. [Uninstrumented Gateways](uninstrumented-gateways.md). Configure gateways/proxies that are not supported by SkyWalking agent plugins, to reflect the delegation in topology graph. 1. [Apdex threshold](apdex-threshold.md). Configure the thresholds for different services if Apdex calculation is activated in the OAL. +1. [Group Parameterized Endpoints](endpoint-grouping-rules.md). Configure the grouping rules for parameterized endpoints, +to improve the meaning of the metrics. ## Telemetry for backend OAP backend cluster itself underlying is a distributed streaming process system. For helping the Ops team, diff --git a/docs/en/setup/backend/dynamic-config.md b/docs/en/setup/backend/dynamic-config.md index 858ef12d1..b9ce01edc 100755 --- a/docs/en/setup/backend/dynamic-config.md +++ b/docs/en/setup/backend/dynamic-config.md @@ -1,6 +1,6 @@ # Dynamic Configuration SkyWalking Configurations mostly are set through `application.yml` and OS system environment variables. -But some of them are supporting dynamic settings from upstream management system. +At the same time, some of them are supporting dynamic settings from upstream management system. Right now, SkyWalking supports following dynamic configurations. @@ -10,6 +10,7 @@ Right now, SkyWalking supports following dynamic configurations. |receiver-trace.default.uninstrumentedGateways| The uninstrumented gateways, override `gateways.yml`. | same as [`gateways.yml`](uninstrumented-gateways.md#configuration-format) | |alarm.default.alarm-settings| The alarm settings, will override `alarm-settings.yml`. | same as [`alarm-settings.yml`](backend-alarm.md) | |core.default.apdexThreshold| The apdex threshold settings, will override `service-apdex-threshold.yml`. | same as [`service-apdex-threshold.yml`](apdex-threshold.md) | +|core.default.endpoint-name-grouping| The endpoint name grouping setting, will override `endpoint_name_grouping.yml`. | same as [`endpoint_name_grouping.yml`](endpoint-grouping-rules.md) | This feature depends on upstream service, so it is **DISABLED** by default. diff --git a/docs/en/setup/backend/endpoint-grouping-rules.md b/docs/en/setup/backend/endpoint-grouping-rules.md new file mode 100644 index 000000000..e44e6df70 --- /dev/null +++ b/docs/en/setup/backend/endpoint-grouping-rules.md @@ -0,0 +1,23 @@ +# Group Parameterized Endpoints +In most cases, the endpoint should be detected automatically through the language agents, service mesh observability solution, +or configuration of meter system. + +There are some special cases, especially when people use REST style URI, the application codes put the parameter in the endpoint name, +such as putting order id in the URI, like `/prod/ORDER123` and `/prod/ORDER123`. But logically, people expect they could +have an endpoint name like `prod/{order-id}`. This is the feature of parameterized endpoint grouping designed for. + +Current, user could set up grouping rules through the static YAML file, named `endpoint_name_grouping.yml`, +or use [Dynamic Configuration](dynamic-config.md) to initial and update the endpoint grouping rule. + +## Configuration Format +No matter in static local file or dynamic configuration value, they are sharing the same YAML format. + +```yaml +grouping: + # Endpoint of the service would follow the following rules + - service-name: serviceA + rules: + # Logic name when the regex expression matched. + - endpoint-name: /prod/{id} + regex: \/prod\/.+ +``` \ No newline at end of file diff --git a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRulesWatcher.java b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRulesWatcher.java index aeb1e2374..af4f3ae1e 100644 --- a/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRulesWatcher.java +++ b/oap-server/server-alarm-plugin/src/main/java/org/apache/skywalking/oap/server/core/alarm/provider/AlarmRulesWatcher.java @@ -56,7 +56,7 @@ public class AlarmRulesWatcher extends ConfigChangeWatcher { @Override public void notify(ConfigChangeEvent value) { - if (value.getEventType() == EventType.DELETE) { + if (value.getEventType().equals(EventType.DELETE)) { settingsString = Const.EMPTY_STRING; notify(new Rules()); } else { diff --git a/oap-server/server-bootstrap/pom.xml b/oap-server/server-bootstrap/pom.xml index 3ebda8d2b..20b25f83e 100644 --- a/oap-server/server-bootstrap/pom.xml +++ b/oap-server/server-bootstrap/pom.xml @@ -242,6 +242,7 @@ component-libraries.yml gateways.yml service-apdex-threshold.yml + endpoint_name_grouping.yml oal/core.oal oal/java-agent.oal oal/dotnet-agent.oal diff --git a/oap-server/server-bootstrap/src/main/resources/endpoint_name_grouping.yml b/oap-server/server-bootstrap/src/main/resources/endpoint_name_grouping.yml new file mode 100644 index 000000000..9695ba7f0 --- /dev/null +++ b/oap-server/server-bootstrap/src/main/resources/endpoint_name_grouping.yml @@ -0,0 +1,29 @@ +# 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. + +# Endpoint name grouping rules. +# In most cased, endpoint name should be detected by agents or service mesh automatically, and aggregate the metrics based +# on the name. +# But, in some cases, application puts the parameter in the endpoint name, such as putting order id in the URI, like +# /prod/ORDER123, /prod/ORDER456. +# This grouping file provides the regex based definition capability to merge those endpoints into a group by better and +# more meaningful aggregation metrics. + +#grouping: +# # Endpoint of the service would follow the following rules +# - service-name: serviceA +# rules: +# - endpoint-name: /prod/{id} +# regex: \/prod\/.+ \ No newline at end of file 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 10282fefb..dc74e59a7 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 @@ -27,7 +27,7 @@ import org.apache.skywalking.oap.server.core.command.CommandService; import org.apache.skywalking.oap.server.core.config.ConfigService; import org.apache.skywalking.oap.server.core.config.DownSamplingConfigService; import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService; -import org.apache.skywalking.oap.server.core.config.NamingLengthControl; +import org.apache.skywalking.oap.server.core.config.NamingControl; import org.apache.skywalking.oap.server.core.oal.rt.OALEngineLoaderService; import org.apache.skywalking.oap.server.core.profile.ProfileTaskMutationService; import org.apache.skywalking.oap.server.core.query.AggregationQueryService; @@ -67,7 +67,7 @@ public class CoreModule extends ModuleDefine { List classes = new ArrayList<>(); classes.add(ConfigService.class); classes.add(DownSamplingConfigService.class); - classes.add(NamingLengthControl.class); + classes.add(NamingControl.class); classes.add(IComponentLibraryCatalogService.class); classes.add(IWorkerInstanceGetter.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 fcef1b02a..cd6430b49 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 @@ -18,6 +18,7 @@ package org.apache.skywalking.oap.server.core; +import java.io.FileNotFoundException; import java.io.IOException; import java.nio.file.Paths; import org.apache.skywalking.oap.server.configuration.api.ConfigurationModule; @@ -41,7 +42,9 @@ import org.apache.skywalking.oap.server.core.config.ComponentLibraryCatalogServi import org.apache.skywalking.oap.server.core.config.ConfigService; import org.apache.skywalking.oap.server.core.config.DownSamplingConfigService; import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService; -import org.apache.skywalking.oap.server.core.config.NamingLengthControl; +import org.apache.skywalking.oap.server.core.config.NamingControl; +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.oal.rt.OALEngineLoaderService; import org.apache.skywalking.oap.server.core.profile.ProfileTaskMutationService; import org.apache.skywalking.oap.server.core.query.AggregationQueryService; @@ -104,6 +107,7 @@ public class CoreModuleProvider extends ModuleProvider { private final StorageModels storageModels; private final SourceReceiverImpl receiver; private ApdexThresholdConfig apdexThresholdConfig; + private EndpointNameGroupingRuleWatcher endpointNameGroupingRuleWatcher; public CoreModuleProvider() { super(); @@ -133,11 +137,19 @@ public class CoreModuleProvider extends ModuleProvider { if (moduleConfig.isActiveExtraModelColumns()) { DefaultScopeDefine.activeExtraModelColumns(); } - this.registerServiceImplementation(NamingLengthControl.class, new NamingLengthControl( + EndpointNameGrouping endpointNameGrouping = new EndpointNameGrouping(); + this.registerServiceImplementation(NamingControl.class, new NamingControl( moduleConfig.getServiceNameMaxLength(), moduleConfig.getInstanceNameMaxLength(), - moduleConfig.getEndpointNameMaxLength() + moduleConfig.getEndpointNameMaxLength(), + endpointNameGrouping )); + try { + endpointNameGroupingRuleWatcher = new EndpointNameGroupingRuleWatcher( + this, endpointNameGrouping); + } catch (FileNotFoundException e) { + throw new ModuleStartException(e.getMessage(), e); + } StreamAnnotationListener streamAnnotationListener = new StreamAnnotationListener(getManager()); @@ -283,6 +295,7 @@ public class CoreModuleProvider extends ModuleProvider { .getService( DynamicConfigurationService.class); dynamicConfigurationService.registerConfigChangeWatcher(apdexThresholdConfig); + dynamicConfigurationService.registerConfigChangeWatcher(endpointNameGroupingRuleWatcher); } @Override diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/NamingLengthControl.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/NamingControl.java similarity index 87% rename from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/NamingLengthControl.java rename to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/NamingControl.java index 9bb338385..928f46125 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/NamingLengthControl.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/NamingControl.java @@ -20,18 +20,20 @@ package org.apache.skywalking.oap.server.core.config; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.skywalking.oap.server.core.config.group.EndpointNameGrouping; import org.apache.skywalking.oap.server.library.module.Service; /** - * NamingLengthControl provides the service to make the names of service, instance and endpoint following the length - * rules. + * NamingControl provides the service to make the names of service, instance and endpoint following the rules or + * patterns, including length control, grouping, etc. */ @RequiredArgsConstructor @Slf4j -public class NamingLengthControl implements Service { +public class NamingControl implements Service { private final int serviceNameMaxLength; private final int instanceNameMaxLength; private final int endpointNameMaxLength; + private final EndpointNameGrouping endpointNameGrouping; /** * Format endpoint name by using the length config in the core module. This is a global rule, every place including @@ -88,10 +90,11 @@ public class NamingLengthControl implements Service { * endpoint as the {@link org.apache.skywalking.oap.server.core.source.Source} should follow this for any core * module implementation. * + * @param serviceName the service of the given endpoint. * @param endpointName raw data, literal string. * @return the string, which length less than or equals {@link #endpointNameMaxLength}; */ - public String formatEndpointName(String endpointName) { + public String formatEndpointName(String serviceName, String endpointName) { if (endpointName.length() > endpointNameMaxLength) { final String rename = endpointName.substring(0, endpointNameMaxLength); if (log.isDebugEnabled()) { @@ -102,7 +105,7 @@ public class NamingLengthControl implements Service { serviceNameMaxLength ); } - return rename; + return endpointNameGrouping.format(serviceName, rename); } else { return endpointName; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointGroupingRule.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointGroupingRule.java new file mode 100644 index 000000000..a50f44378 --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointGroupingRule.java @@ -0,0 +1,56 @@ +/* + * 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.core.config.group; + +import java.util.HashMap; +import java.util.Map; +import org.apache.skywalking.apm.util.StringFormatGroup; + +/** + * Endpoint group rule hosts all group rules of all services. + */ +public class EndpointGroupingRule { + private Map rules = new HashMap<>(); + + /** + * Add a new rule to the context. + * + * @param serviceName of the new rule + * @param endpointGroupName represents the logic endpoint name. + * @param ruleRegex match the endpoints which should be in the group name. + */ + void addRule(String serviceName, String endpointGroupName, String ruleRegex) { + final StringFormatGroup formatGroup = rules.computeIfAbsent(serviceName, name -> new StringFormatGroup()); + formatGroup.addRule(endpointGroupName, ruleRegex); + } + + /** + * @param service of the given endpoint belonged. + * @param endpointName to do group checking. + * @return group result and new endpoint name if rule matched. + */ + public StringFormatGroup.FormatResult format(String service, String endpointName) { + final StringFormatGroup stringFormatGroup = rules.get(service); + if (stringFormatGroup != null) { + return stringFormatGroup.format(endpointName); + } else { + return new StringFormatGroup.FormatResult(false, endpointName, endpointName); + } + } +} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointGroupingRuleReader.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointGroupingRuleReader.java new file mode 100644 index 000000000..6bad22ea5 --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointGroupingRuleReader.java @@ -0,0 +1,78 @@ +/* + * 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.core.config.group; + +import java.io.InputStream; +import java.io.Reader; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.apache.skywalking.apm.util.StringUtil; +import org.yaml.snakeyaml.Yaml; + +/** + * Read the input stream including the default endpoint grouping rules. And trans + */ +public class EndpointGroupingRuleReader { + private Map yamlData; + + public EndpointGroupingRuleReader(InputStream inputStream) { + Yaml yaml = new Yaml(); + yamlData = yaml.loadAs(inputStream, Map.class); + } + + public EndpointGroupingRuleReader(Reader io) { + Yaml yaml = new Yaml(); + yamlData = yaml.loadAs(io, Map.class); + } + + /** + * @return the loaded rules. + */ + EndpointGroupingRule read() { + EndpointGroupingRule endpointGroupingRule = new EndpointGroupingRule(); + + if (Objects.nonNull(yamlData)) { + List rulesData = (List) yamlData.get("grouping"); + if (rulesData != null) { + rulesData.forEach(ruleObj -> { + final Map rule = (Map) ruleObj; + final String serviceName = (String) rule.get("service-name"); + if (StringUtil.isEmpty(serviceName)) { + throw new IllegalArgumentException("service-name can't be empty"); + } + final List endpointRules = (List) rule.get("rules"); + if (endpointRules != null) { + endpointRules.forEach(endpointRuleObj -> { + final Map endpointRule = (Map) endpointRuleObj; + final String endpointLogicGroupName = (String) endpointRule.get("endpoint-name"); + final String groupRegex = (String) endpointRule.get("regex"); + if (StringUtil.isEmpty(endpointLogicGroupName) || StringUtil.isEmpty(groupRegex)) { + return; + } + endpointGroupingRule.addRule(serviceName, endpointLogicGroupName, groupRegex); + }); + } + }); + } + } + + return endpointGroupingRule; + } +} 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 new file mode 100644 index 000000000..da952d67d --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGrouping.java @@ -0,0 +1,46 @@ +/* + * 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.core.config.group; + +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.apache.skywalking.apm.util.StringFormatGroup; + +@Slf4j +public class EndpointNameGrouping { + @Setter + private volatile EndpointGroupingRule endpointGroupingRule; + + public String format(String serviceName, String endpointName) { + if (endpointGroupingRule == null) { + return endpointName; + } + final StringFormatGroup.FormatResult formatResult = endpointGroupingRule.format(serviceName, endpointName); + if (log.isDebugEnabled() || log.isTraceEnabled()) { + if (formatResult.isMatch()) { + log.debug("Endpoint {} of Service {} has been renamed in group {}", + endpointName, serviceName, formatResult.getName() + ); + } else { + log.trace("Endpoint {} of Service {} keeps unchanged.", endpointName, serviceName); + } + } + return formatResult.getName(); + } +} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGroupingRuleWatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGroupingRuleWatcher.java new file mode 100644 index 000000000..19b27ee09 --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGroupingRuleWatcher.java @@ -0,0 +1,61 @@ +/* + * 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.core.config.group; + +import java.io.FileNotFoundException; +import java.io.StringReader; +import lombok.extern.slf4j.Slf4j; +import org.apache.skywalking.oap.server.configuration.api.ConfigChangeWatcher; +import org.apache.skywalking.oap.server.library.module.ModuleProvider; +import org.apache.skywalking.oap.server.library.util.ResourceUtils; + +/** + * The config change watcher for endpoint name grouping rule. + */ +@Slf4j +public class EndpointNameGroupingRuleWatcher extends ConfigChangeWatcher { + private final EndpointNameGrouping grouping; + private volatile String ruleSetting; + + public EndpointNameGroupingRuleWatcher(ModuleProvider provider, + EndpointNameGrouping grouping) throws FileNotFoundException { + super(provider.module().getName(), provider, "endpoint-name-grouping"); + this.grouping = grouping; + // This is just a place holder text representing the original text. + ruleSetting = "SkyWalking endpoint rule"; + grouping.setEndpointGroupingRule(new EndpointGroupingRuleReader( + ResourceUtils.read("endpoint_name_grouping.yml")).read()); + } + + @Override + public void notify(final ConfigChangeEvent value) { + if (value.getEventType().equals(EventType.DELETE)) { + ruleSetting = ""; + grouping.setEndpointGroupingRule(new EndpointGroupingRule()); + } else { + ruleSetting = value.getNewValue(); + grouping.setEndpointGroupingRule(new EndpointGroupingRuleReader(new StringReader(ruleSetting)).read()); + } + } + + @Override + public String value() { + return ruleSetting; + } +} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/StringFormatGroup.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/StringFormatGroup.java new file mode 100644 index 000000000..a0602fb98 --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/group/StringFormatGroup.java @@ -0,0 +1,96 @@ +/* + * 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.core.config.group; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.ToString; + +/** + * Group patterns use {@link java.util.regex.Pattern} as core, could group the input strings to matched group or return + * original string. + */ +@ToString +public class StringFormatGroup { + private final List rules; + + public StringFormatGroup() { + rules = new ArrayList<>(); + } + + /** + * Add a new match rule. The rule will follow the order of being added. + * + * @param name will be used when ruleRegex matched. + * @param ruleRegex to match target string. + */ + public void addRule(String name, String ruleRegex) { + for (PatternRule rule : rules) { + if (rule.name.equals(name)) { + return; + } + } + PatternRule rule = new PatternRule(name, ruleRegex); + rules.add(rule); + } + + /** + * Format the string based on rules. + * + * @param string to be formatted + * @return matched rule name, or original string. + */ + public StringFormatGroup.FormatResult format(String string) { + for (PatternRule rule : rules) { + if (rule.getPattern().matcher(string).matches()) { + return new FormatResult(true, rule.getName()); + } + } + return new FormatResult(false, string); + } + + @Override + public String toString() { + return "StringFormatGroup{" + + "rules=" + rules + + '}'; + } + + @RequiredArgsConstructor + @Getter + public static class FormatResult { + private final boolean match; + private final String name; + } + + @Getter + @ToString + private static class PatternRule { + private String name; + private Pattern pattern; + + private PatternRule(String name, String ruleRegex) { + this.name = name; + pattern = Pattern.compile(ruleRegex); + } + } +} diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/config/group/EndpointGroupingRuleReaderTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/config/group/EndpointGroupingRuleReaderTest.java new file mode 100644 index 000000000..93b482513 --- /dev/null +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/config/group/EndpointGroupingRuleReaderTest.java @@ -0,0 +1,44 @@ +/* + * 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.core.config.group; + +import org.apache.skywalking.apm.util.StringFormatGroup; +import org.junit.Assert; +import org.junit.Test; + +public class EndpointGroupingRuleReaderTest { + @Test + public void testReadingRule() { + EndpointGroupingRuleReader reader = new EndpointGroupingRuleReader(this.getClass() + .getClassLoader() + .getResourceAsStream( + "endpoint_name_grouping.yml")); + final EndpointGroupingRule rule = reader.read(); + + StringFormatGroup.FormatResult formatResult = rule.format("serviceA", "/prod/123"); + Assert.assertTrue(formatResult.isMatch()); + Assert.assertEquals("/prod/{id}", formatResult.getName()); + + formatResult = rule.format("serviceA", "/prod/"); + Assert.assertFalse(formatResult.isMatch()); + + formatResult = rule.format("serviceB", "/prod/123"); + Assert.assertFalse(formatResult.isMatch()); + } +} diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGroupingRuleWatcherTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGroupingRuleWatcherTest.java new file mode 100644 index 000000000..f74ee5d1f --- /dev/null +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/config/group/EndpointNameGroupingRuleWatcherTest.java @@ -0,0 +1,114 @@ +/* + * 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.core.config.group; + +import java.io.FileNotFoundException; +import org.apache.skywalking.oap.server.configuration.api.ConfigChangeWatcher; +import org.apache.skywalking.oap.server.core.CoreModule; +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; +import org.junit.Assert; +import org.junit.Test; + +public class EndpointNameGroupingRuleWatcherTest { + @Test + public void testWatcher() throws FileNotFoundException { + EndpointNameGrouping endpointNameGrouping = new EndpointNameGrouping(); + + EndpointNameGroupingRuleWatcher watcher = new EndpointNameGroupingRuleWatcher( + new ModuleProvider() { + @Override + public String name() { + return "test"; + } + + @Override + public Class module() { + return CoreModule.class; + } + + @Override + public ModuleConfig createConfigBeanIfAbsent() { + return null; + } + + @Override + public void prepare() throws ServiceNotProvidedException, ModuleStartException { + + } + + @Override + public void start() throws ServiceNotProvidedException, ModuleStartException { + + } + + @Override + public void notifyAfterCompleted() throws ServiceNotProvidedException, ModuleStartException { + + } + + @Override + public String[] requiredModules() { + return new String[0]; + } + }, endpointNameGrouping); + Assert.assertEquals("/prod/{id}", endpointNameGrouping.format("serviceA", "/prod/123")); + + watcher.notify(new ConfigChangeWatcher.ConfigChangeEvent( + "# Licensed to the Apache Software Foundation (ASF) under one or more\n" + + "# contributor license agreements. See the NOTICE file distributed with\n" + + "# this work for additional information regarding copyright ownership.\n" + + "# The ASF licenses this file to You under the Apache License, Version 2.0\n" + + "# (the \"License\"); you may not use this file except in compliance with\n" + + "# the License. You may obtain a copy of the License at\n" + + "#\n" + + "# http://www.apache.org/licenses/LICENSE-2.0\n" + + "#\n" + + "# Unless required by applicable law or agreed to in writing, software\n" + + "# distributed under the License is distributed on an \"AS IS\" BASIS,\n" + + "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n" + + "# See the License for the specific language governing permissions and\n" + + "# limitations under the License.\n" + + "\n" + + "# Endpoint name grouping rules.\n" + + "# In most cased, endpoint name should be detected by agents or service mesh automatically, and aggregate the metrics based\n" + + "# on the name.\n" + + "# But, in some cases, application put the parameter in the endpoint name, such as putting order id in the URI, like\n" + + "# /prod/ORDER123, /prod/ORDER123.\n" + + "# This grouping file provides the regex based definition capability to merge those endpoints into a group by better and\n" + + "# more meaningful aggregation metrics.\n" + + "\n" + + "grouping:\n" + + " # Endpoint of the service would follow the following rules\n" + + " - service-name: serviceA\n" + + " rules:\n" + + " - endpoint-name: /prod/order-id\n" + + " regex: \\/prod\\/.+" + , ConfigChangeWatcher.EventType.MODIFY + )); + + Assert.assertEquals("/prod/order-id", endpointNameGrouping.format("serviceA", "/prod/123")); + + watcher.notify(new ConfigChangeWatcher.ConfigChangeEvent("", ConfigChangeWatcher.EventType.DELETE)); + Assert.assertEquals("/prod/123", endpointNameGrouping.format("serviceA", "/prod/123")); + } +} diff --git a/oap-server/server-core/src/test/resources/endpoint_name_grouping.yml b/oap-server/server-core/src/test/resources/endpoint_name_grouping.yml new file mode 100644 index 000000000..63bddcba2 --- /dev/null +++ b/oap-server/server-core/src/test/resources/endpoint_name_grouping.yml @@ -0,0 +1,29 @@ +# 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. + +# Endpoint name grouping rules. +# In most cased, endpoint name should be detected by agents or service mesh automatically, and aggregate the metrics based +# on the name. +# But, in some cases, application puts the parameter in the endpoint name, such as putting order id in the URI, like +# /prod/ORDER123, /prod/ORDER456. +# This grouping file provides the regex based definition capability to merge those endpoints into a group by better and +# more meaningful aggregation metrics. + +grouping: + # Endpoint of the service would follow the following rules + - service-name: serviceA + rules: + - endpoint-name: /prod/{id} + regex: \/prod\/.+ \ No newline at end of file diff --git a/oap-server/server-receiver-plugin/skywalking-clr-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/clr/provider/handler/CLRMetricReportServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-clr-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/clr/provider/handler/CLRMetricReportServiceHandler.java index dea57b586..a416b2262 100644 --- a/oap-server/server-receiver-plugin/skywalking-clr-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/clr/provider/handler/CLRMetricReportServiceHandler.java +++ b/oap-server/server-receiver-plugin/skywalking-clr-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/clr/provider/handler/CLRMetricReportServiceHandler.java @@ -25,20 +25,20 @@ import org.apache.skywalking.apm.network.language.agent.v3.CLRMetricCollection; import org.apache.skywalking.apm.network.language.agent.v3.CLRMetricReportServiceGrpc; import org.apache.skywalking.oap.server.core.CoreModule; import org.apache.skywalking.oap.server.core.analysis.TimeBucket; -import org.apache.skywalking.oap.server.core.config.NamingLengthControl; +import org.apache.skywalking.oap.server.core.config.NamingControl; import org.apache.skywalking.oap.server.library.module.ModuleManager; import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler; @Slf4j public class CLRMetricReportServiceHandler extends CLRMetricReportServiceGrpc.CLRMetricReportServiceImplBase implements GRPCHandler { private final CLRSourceDispatcher clrSourceDispatcher; - private final NamingLengthControl namingLengthControl; + private final NamingControl namingControl; public CLRMetricReportServiceHandler(ModuleManager moduleManager) { clrSourceDispatcher = new CLRSourceDispatcher(moduleManager); - this.namingLengthControl = moduleManager.find(CoreModule.NAME) - .provider() - .getService(NamingLengthControl.class); + this.namingControl = moduleManager.find(CoreModule.NAME) + .provider() + .getService(NamingControl.class); } @Override @@ -48,8 +48,8 @@ public class CLRMetricReportServiceHandler extends CLRMetricReportServiceGrpc.CL } final CLRMetricCollection.Builder builder = request.toBuilder(); - builder.setService(namingLengthControl.formatServiceName(builder.getService())); - builder.setServiceInstance(namingLengthControl.formatInstanceName(builder.getServiceInstance())); + builder.setService(namingControl.formatServiceName(builder.getService())); + builder.setServiceInstance(namingControl.formatInstanceName(builder.getServiceInstance())); request.getMetricsList().forEach(metrics -> { long minuteTimeBucket = TimeBucket.getMinuteTimeBucket(metrics.getTime()); diff --git a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricReportServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricReportServiceHandler.java index 3b874f4fe..ebcb5afb8 100644 --- a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricReportServiceHandler.java +++ b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricReportServiceHandler.java @@ -24,20 +24,20 @@ import org.apache.skywalking.apm.network.common.v3.Commands; import org.apache.skywalking.apm.network.language.agent.v3.JVMMetricCollection; import org.apache.skywalking.apm.network.language.agent.v3.JVMMetricReportServiceGrpc; import org.apache.skywalking.oap.server.core.CoreModule; -import org.apache.skywalking.oap.server.core.config.NamingLengthControl; +import org.apache.skywalking.oap.server.core.config.NamingControl; import org.apache.skywalking.oap.server.library.module.ModuleManager; import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler; @Slf4j public class JVMMetricReportServiceHandler extends JVMMetricReportServiceGrpc.JVMMetricReportServiceImplBase implements GRPCHandler { private final JVMSourceDispatcher jvmSourceDispatcher; - private final NamingLengthControl namingLengthControl; + private final NamingControl namingControl; public JVMMetricReportServiceHandler(ModuleManager moduleManager) { this.jvmSourceDispatcher = new JVMSourceDispatcher(moduleManager); - this.namingLengthControl = moduleManager.find(CoreModule.NAME) - .provider() - .getService(NamingLengthControl.class); + this.namingControl = moduleManager.find(CoreModule.NAME) + .provider() + .getService(NamingControl.class); } @Override @@ -50,8 +50,8 @@ public class JVMMetricReportServiceHandler extends JVMMetricReportServiceGrpc.JV ); } final JVMMetricCollection.Builder builder = request.toBuilder(); - builder.setService(namingLengthControl.formatServiceName(builder.getService())); - builder.setServiceInstance(namingLengthControl.formatInstanceName(builder.getServiceInstance())); + builder.setService(namingControl.formatServiceName(builder.getService())); + builder.setServiceInstance(namingControl.formatInstanceName(builder.getServiceInstance())); builder.getMetricsList().forEach(jvmMetric -> { jvmSourceDispatcher.sendMetric(builder.getService(), builder.getServiceInstance(), jvmMetric); diff --git a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/grpc/ManagementServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/grpc/ManagementServiceHandler.java index 344184bd7..66f31ae18 100644 --- a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/grpc/ManagementServiceHandler.java +++ b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/grpc/ManagementServiceHandler.java @@ -33,7 +33,7 @@ import org.apache.skywalking.oap.server.core.analysis.IDManager; import org.apache.skywalking.oap.server.core.analysis.NodeType; import org.apache.skywalking.oap.server.core.analysis.TimeBucket; import org.apache.skywalking.oap.server.core.analysis.manual.instance.InstanceTraffic; -import org.apache.skywalking.oap.server.core.config.NamingLengthControl; +import org.apache.skywalking.oap.server.core.config.NamingControl; import org.apache.skywalking.oap.server.core.source.ServiceInstanceUpdate; import org.apache.skywalking.oap.server.core.source.ServiceMeta; import org.apache.skywalking.oap.server.core.source.SourceReceiver; @@ -42,21 +42,21 @@ import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler; public class ManagementServiceHandler extends ManagementServiceGrpc.ManagementServiceImplBase implements GRPCHandler { private final SourceReceiver sourceReceiver; - private final NamingLengthControl namingLengthControl; + private final NamingControl namingControl; public ManagementServiceHandler(ModuleManager moduleManager) { this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); - this.namingLengthControl = moduleManager.find(CoreModule.NAME) - .provider() - .getService(NamingLengthControl.class); + this.namingControl = moduleManager.find(CoreModule.NAME) + .provider() + .getService(NamingControl.class); } @Override public void reportInstanceProperties(final InstanceProperties request, final StreamObserver responseObserver) { ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate(); - final String serviceName = namingLengthControl.formatServiceName(request.getService()); - final String instanceName = namingLengthControl.formatInstanceName(request.getServiceInstance()); + final String serviceName = namingControl.formatServiceName(request.getService()); + final String instanceName = namingControl.formatInstanceName(request.getServiceInstance()); serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal)); serviceInstanceUpdate.setName(instanceName); @@ -82,8 +82,8 @@ public class ManagementServiceHandler extends ManagementServiceGrpc.ManagementSe @Override public void keepAlive(final InstancePingPkg request, final StreamObserver responseObserver) { final long timeBucket = TimeBucket.getTimeBucket(System.currentTimeMillis(), DownSampling.Minute); - final String serviceName = namingLengthControl.formatServiceName(request.getService()); - final String instanceName = namingLengthControl.formatInstanceName(request.getServiceInstance()); + final String serviceName = namingControl.formatServiceName(request.getService()); + final String instanceName = namingControl.formatInstanceName(request.getServiceInstance()); ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate(); serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal)); diff --git a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceKeepAliveHandler.java b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceKeepAliveHandler.java index 70bc41e3a..7d9b45f80 100644 --- a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceKeepAliveHandler.java +++ b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceKeepAliveHandler.java @@ -29,7 +29,7 @@ import org.apache.skywalking.oap.server.core.analysis.DownSampling; import org.apache.skywalking.oap.server.core.analysis.IDManager; import org.apache.skywalking.oap.server.core.analysis.NodeType; import org.apache.skywalking.oap.server.core.analysis.TimeBucket; -import org.apache.skywalking.oap.server.core.config.NamingLengthControl; +import org.apache.skywalking.oap.server.core.config.NamingControl; import org.apache.skywalking.oap.server.core.source.ServiceInstanceUpdate; import org.apache.skywalking.oap.server.core.source.ServiceMeta; import org.apache.skywalking.oap.server.core.source.SourceReceiver; @@ -40,14 +40,14 @@ import org.apache.skywalking.oap.server.library.util.ProtoBufJsonUtils; public class ManagementServiceKeepAliveHandler extends JettyJsonHandler { private final SourceReceiver sourceReceiver; - private final NamingLengthControl namingLengthControl; + private final NamingControl namingControl; private final Gson gson = new Gson(); public ManagementServiceKeepAliveHandler(ModuleManager moduleManager) { this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); - this.namingLengthControl = moduleManager.find(CoreModule.NAME) - .provider() - .getService(NamingLengthControl.class); + this.namingControl = moduleManager.find(CoreModule.NAME) + .provider() + .getService(NamingControl.class); } @Override @@ -60,8 +60,8 @@ public class ManagementServiceKeepAliveHandler extends JettyJsonHandler { final InstanceProperties.Builder request = InstanceProperties.newBuilder(); ProtoBufJsonUtils.fromJSON(getJsonBody(req), request); - final String serviceName = namingLengthControl.formatServiceName(request.getService()); - final String instanceName = namingLengthControl.formatInstanceName(request.getServiceInstance()); + final String serviceName = namingControl.formatServiceName(request.getService()); + final String instanceName = namingControl.formatInstanceName(request.getServiceInstance()); final long timeBucket = TimeBucket.getTimeBucket(System.currentTimeMillis(), DownSampling.Minute); ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate(); diff --git a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceReportPropertiesHandler.java b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceReportPropertiesHandler.java index 3801e0c39..2f2442f97 100644 --- a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceReportPropertiesHandler.java +++ b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/rest/ManagementServiceReportPropertiesHandler.java @@ -34,7 +34,7 @@ import org.apache.skywalking.oap.server.core.analysis.IDManager; import org.apache.skywalking.oap.server.core.analysis.NodeType; import org.apache.skywalking.oap.server.core.analysis.TimeBucket; import org.apache.skywalking.oap.server.core.analysis.manual.instance.InstanceTraffic; -import org.apache.skywalking.oap.server.core.config.NamingLengthControl; +import org.apache.skywalking.oap.server.core.config.NamingControl; import org.apache.skywalking.oap.server.core.source.ServiceInstanceUpdate; import org.apache.skywalking.oap.server.core.source.SourceReceiver; import org.apache.skywalking.oap.server.library.module.ModuleManager; @@ -44,14 +44,14 @@ import org.apache.skywalking.oap.server.library.util.ProtoBufJsonUtils; public class ManagementServiceReportPropertiesHandler extends JettyJsonHandler { private final SourceReceiver sourceReceiver; - private final NamingLengthControl namingLengthControl; + private final NamingControl namingControl; private final Gson gson = new Gson(); public ManagementServiceReportPropertiesHandler(ModuleManager moduleManager) { this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); - this.namingLengthControl = moduleManager.find(CoreModule.NAME) - .provider() - .getService(NamingLengthControl.class); + this.namingControl = moduleManager.find(CoreModule.NAME) + .provider() + .getService(NamingControl.class); } @Override @@ -64,8 +64,8 @@ public class ManagementServiceReportPropertiesHandler extends JettyJsonHandler { final InstanceProperties.Builder request = InstanceProperties.newBuilder(); ProtoBufJsonUtils.fromJSON(getJsonBody(req), request); - final String serviceName = namingLengthControl.formatServiceName(request.getService()); - final String instanceName = namingLengthControl.formatInstanceName(request.getServiceInstance()); + final String serviceName = namingControl.formatServiceName(request.getService()); + final String instanceName = namingControl.formatInstanceName(request.getServiceInstance()); ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate(); serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal)); diff --git a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java index 7305398ee..f98097713 100644 --- a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java +++ b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/TelemetryDataDispatcher.java @@ -26,7 +26,7 @@ import org.apache.skywalking.oap.server.core.CoreModule; import org.apache.skywalking.oap.server.core.analysis.IDManager; import org.apache.skywalking.oap.server.core.analysis.NodeType; import org.apache.skywalking.oap.server.core.analysis.TimeBucket; -import org.apache.skywalking.oap.server.core.config.NamingLengthControl; +import org.apache.skywalking.oap.server.core.config.NamingControl; import org.apache.skywalking.oap.server.core.source.All; import org.apache.skywalking.oap.server.core.source.DetectPoint; import org.apache.skywalking.oap.server.core.source.Endpoint; @@ -50,7 +50,7 @@ import org.apache.skywalking.oap.server.telemetry.api.MetricsTag; @Slf4j public class TelemetryDataDispatcher { private static SourceReceiver SOURCE_RECEIVER; - private static NamingLengthControl NAME_LENGTH_CONTROL; + private static NamingControl NAME_LENGTH_CONTROL; private static HistogramMetrics MESH_ANALYSIS_METRICS; private TelemetryDataDispatcher() { @@ -63,7 +63,7 @@ public class TelemetryDataDispatcher { .getService(MetricsCreator.class); NAME_LENGTH_CONTROL = moduleManager.find(CoreModule.NAME) .provider() - .getService(NamingLengthControl.class); + .getService(NamingControl.class); MESH_ANALYSIS_METRICS = metricsCreator.createHistogramMetric( "mesh_analysis_latency", "The process latency of service mesh telemetry", MetricsTag.EMPTY_KEY, MetricsTag.EMPTY_VALUE @@ -86,7 +86,7 @@ public class TelemetryDataDispatcher { data.setDestServiceInstance(NAME_LENGTH_CONTROL.formatInstanceName(data.getDestServiceInstance())); } if (data.getEndpoint() != null) { - data.setEndpoint(NAME_LENGTH_CONTROL.formatEndpointName(data.getEndpoint())); + data.setEndpoint(NAME_LENGTH_CONTROL.formatEndpointName(data.getDestServiceName(), data.getEndpoint())); } doDispatch(data); diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListener.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListener.java index 7391d4eb1..2aa2923f6 100755 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListener.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/MultiScopesAnalysisListener.java @@ -35,7 +35,7 @@ import org.apache.skywalking.oap.server.core.analysis.NodeType; import org.apache.skywalking.oap.server.core.analysis.TimeBucket; import org.apache.skywalking.oap.server.core.analysis.manual.networkalias.NetworkAddressAlias; import org.apache.skywalking.oap.server.core.cache.NetworkAddressAliasCache; -import org.apache.skywalking.oap.server.core.config.NamingLengthControl; +import org.apache.skywalking.oap.server.core.config.NamingControl; import org.apache.skywalking.oap.server.core.source.DatabaseSlowStatement; import org.apache.skywalking.oap.server.core.source.DetectPoint; import org.apache.skywalking.oap.server.core.source.EndpointRelation; @@ -61,7 +61,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA private final SourceReceiver sourceReceiver; private final TraceServiceModuleConfig config; private final NetworkAddressAliasCache networkAddressAliasCache; - private final NamingLengthControl namingLengthControl; + private final NamingControl namingControl; @Override public boolean containsPoint(Point point) { @@ -87,7 +87,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA if (span.getRefsCount() > 0) { for (int i = 0; i < span.getRefsCount(); i++) { SegmentReference reference = span.getRefs(i); - SourceBuilder sourceBuilder = new SourceBuilder(namingLengthControl); + SourceBuilder sourceBuilder = new SourceBuilder(namingControl); if (StringUtil.isEmpty(reference.getParentEndpoint())) { sourceBuilder.setSourceEndpointName(Const.USER_ENDPOINT_NAME); @@ -117,7 +117,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA entrySourceBuilders.add(sourceBuilder); } } else { - SourceBuilder sourceBuilder = new SourceBuilder(namingLengthControl); + SourceBuilder sourceBuilder = new SourceBuilder(namingControl); sourceBuilder.setSourceServiceName(Const.USER_SERVICE_NAME); sourceBuilder.setSourceServiceInstanceName(Const.USER_INSTANCE_NAME); sourceBuilder.setSourceEndpointName(Const.USER_ENDPOINT_NAME); @@ -144,7 +144,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA return; } - SourceBuilder sourceBuilder = new SourceBuilder(namingLengthControl); + SourceBuilder sourceBuilder = new SourceBuilder(namingControl); final String networkAddress = span.getPeer(); if (StringUtil.isEmpty(networkAddress)) { @@ -297,22 +297,22 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA public static class Factory implements AnalysisListenerFactory { private final SourceReceiver sourceReceiver; private final NetworkAddressAliasCache networkAddressAliasCache; - private final NamingLengthControl namingLengthControl; + private final NamingControl namingControl; public Factory(ModuleManager moduleManager) { this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); this.networkAddressAliasCache = moduleManager.find(CoreModule.NAME) .provider() .getService(NetworkAddressAliasCache.class); - this.namingLengthControl = moduleManager.find(CoreModule.NAME) - .provider() - .getService(NamingLengthControl.class); + this.namingControl = moduleManager.find(CoreModule.NAME) + .provider() + .getService(NamingControl.class); } @Override public AnalysisListener create(ModuleManager moduleManager, TraceServiceModuleConfig config) { return new MultiScopesAnalysisListener( - sourceReceiver, config, networkAddressAliasCache, namingLengthControl); + sourceReceiver, config, networkAddressAliasCache, namingControl); } } } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/NetworkAddressAliasMappingListener.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/NetworkAddressAliasMappingListener.java index 533f1cff2..d949b9d3e 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/NetworkAddressAliasMappingListener.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/NetworkAddressAliasMappingListener.java @@ -27,7 +27,7 @@ import org.apache.skywalking.apm.network.language.agent.v3.SpanObject; import org.apache.skywalking.oap.server.core.CoreModule; import org.apache.skywalking.oap.server.core.analysis.NodeType; import org.apache.skywalking.oap.server.core.analysis.TimeBucket; -import org.apache.skywalking.oap.server.core.config.NamingLengthControl; +import org.apache.skywalking.oap.server.core.config.NamingControl; import org.apache.skywalking.oap.server.core.source.NetworkAddressAliasSetup; import org.apache.skywalking.oap.server.core.source.SourceReceiver; import org.apache.skywalking.oap.server.library.module.ModuleManager; @@ -46,7 +46,7 @@ import org.apache.skywalking.oap.server.receiver.trace.provider.TraceServiceModu public class NetworkAddressAliasMappingListener implements EntryAnalysisListener { private final SourceReceiver sourceReceiver; private final TraceServiceModuleConfig config; - private final NamingLengthControl namingLengthControl; + private final NamingControl namingControl; @Override public void parseEntry(SpanObject span, SegmentObject segmentObject) { @@ -59,7 +59,7 @@ public class NetworkAddressAliasMappingListener implements EntryAnalysisListener if (!span.getSpanLayer().equals(SpanLayer.MQ)) { span.getRefsList().forEach(segmentReference -> { if (RefType.CrossProcess.equals(segmentReference.getRefType())) { - final String networkAddressUsedAtPeer = namingLengthControl.formatServiceName( + final String networkAddressUsedAtPeer = namingControl.formatServiceName( segmentReference.getNetworkAddressUsedAtPeer()); if (config.getUninstrumentedGatewaysConfig().isAddressConfiguredAsGateway( networkAddressUsedAtPeer)) { @@ -68,8 +68,8 @@ public class NetworkAddressAliasMappingListener implements EntryAnalysisListener */ return; } - final String serviceName = namingLengthControl.formatServiceName(segmentObject.getService()); - final String instanceName = namingLengthControl.formatInstanceName( + final String serviceName = namingControl.formatServiceName(segmentObject.getService()); + final String instanceName = namingControl.formatInstanceName( segmentObject.getServiceInstance()); final NetworkAddressAliasSetup networkAddressAliasSetup = new NetworkAddressAliasSetup(); @@ -97,18 +97,18 @@ public class NetworkAddressAliasMappingListener implements EntryAnalysisListener public static class Factory implements AnalysisListenerFactory { private final SourceReceiver sourceReceiver; - private final NamingLengthControl namingLengthControl; + private final NamingControl namingControl; public Factory(ModuleManager moduleManager) { this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); - this.namingLengthControl = moduleManager.find(CoreModule.NAME) - .provider() - .getService(NamingLengthControl.class); + this.namingControl = moduleManager.find(CoreModule.NAME) + .provider() + .getService(NamingControl.class); } @Override public AnalysisListener create(ModuleManager moduleManager, TraceServiceModuleConfig config) { - return new NetworkAddressAliasMappingListener(sourceReceiver, config, namingLengthControl); + return new NetworkAddressAliasMappingListener(sourceReceiver, config, namingControl); } } } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/SegmentAnalysisListener.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/SegmentAnalysisListener.java index bd148c62c..414b2ca08 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/SegmentAnalysisListener.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/SegmentAnalysisListener.java @@ -28,7 +28,7 @@ import org.apache.skywalking.oap.server.core.CoreModule; import org.apache.skywalking.oap.server.core.analysis.IDManager; import org.apache.skywalking.oap.server.core.analysis.NodeType; import org.apache.skywalking.oap.server.core.analysis.TimeBucket; -import org.apache.skywalking.oap.server.core.config.NamingLengthControl; +import org.apache.skywalking.oap.server.core.config.NamingControl; import org.apache.skywalking.oap.server.core.source.Segment; import org.apache.skywalking.oap.server.core.source.SourceReceiver; import org.apache.skywalking.oap.server.library.module.ModuleManager; @@ -43,10 +43,11 @@ import org.apache.skywalking.oap.server.receiver.trace.provider.TraceServiceModu public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnalysisListener, SegmentListener { private final SourceReceiver sourceReceiver; private final TraceSegmentSampler sampler; - private final NamingLengthControl namingLengthControl; + private final NamingControl namingControl; private final Segment segment = new Segment(); private SAMPLE_STATUS sampleStatus = SAMPLE_STATUS.UNKNOWN; + private String serviceName = Const.EMPTY_STRING; private String serviceId = Const.EMPTY_STRING; private String endpointId = Const.EMPTY_STRING; private String endpointName = Const.EMPTY_STRING; @@ -67,8 +68,9 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal } if (StringUtil.isEmpty(serviceId)) { + serviceName = namingControl.formatServiceName(segmentObject.getService()); serviceId = IDManager.ServiceID.buildId( - namingLengthControl.formatServiceName(segmentObject.getService()), + serviceName, NodeType.Normal ); } @@ -79,7 +81,7 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal segment.setServiceId(serviceId); segment.setServiceInstanceId(IDManager.ServiceInstanceID.buildId( serviceId, - namingLengthControl.formatInstanceName(segmentObject.getServiceInstance()) + namingControl.formatInstanceName(segmentObject.getServiceInstance()) )); segment.setLatency(duration); segment.setStartTime(startTimestamp); @@ -89,7 +91,7 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal segment.setDataBinary(segmentObject.toByteArray()); segment.setVersion(3); - endpointName = namingLengthControl.formatEndpointName(span.getOperationName()); + endpointName = namingControl.formatEndpointName(serviceName, span.getOperationName()); endpointId = IDManager.EndpointID.buildId( serviceId, endpointName @@ -100,8 +102,9 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal @Override public void parseEntry(SpanObject span, SegmentObject segmentObject) { if (StringUtil.isEmpty(serviceId)) { + serviceName = namingControl.formatServiceName(segmentObject.getService()); serviceId = IDManager.ServiceID.buildId( - segmentObject.getService(), NodeType.fromSpanLayerValue(span.getSpanLayer())); + serviceName, NodeType.fromSpanLayerValue(span.getSpanLayer())); } endpointId = IDManager.EndpointID.buildId( @@ -109,7 +112,7 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal span.getOperationName() ); - endpointName = namingLengthControl.formatEndpointName(span.getOperationName()); + endpointName = namingControl.formatEndpointName(serviceName, span.getOperationName()); endpointId = IDManager.EndpointID.buildId( serviceId, endpointName @@ -169,19 +172,19 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal public static class Factory implements AnalysisListenerFactory { private final SourceReceiver sourceReceiver; private final TraceSegmentSampler sampler; - private final NamingLengthControl namingLengthControl; + private final NamingControl namingControl; public Factory(ModuleManager moduleManager, TraceServiceModuleConfig config) { this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); this.sampler = new TraceSegmentSampler(config.getSampleRate()); - this.namingLengthControl = moduleManager.find(CoreModule.NAME) - .provider() - .getService(NamingLengthControl.class); + this.namingControl = moduleManager.find(CoreModule.NAME) + .provider() + .getService(NamingControl.class); } @Override public AnalysisListener create(ModuleManager moduleManager, TraceServiceModuleConfig config) { - return new SegmentAnalysisListener(sourceReceiver, sampler, namingLengthControl); + return new SegmentAnalysisListener(sourceReceiver, sampler, namingControl); } } } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/SourceBuilder.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/SourceBuilder.java index d0880a238..8c23eb317 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/SourceBuilder.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/SourceBuilder.java @@ -23,7 +23,7 @@ import lombok.RequiredArgsConstructor; import lombok.Setter; import org.apache.skywalking.apm.util.StringUtil; import org.apache.skywalking.oap.server.core.analysis.NodeType; -import org.apache.skywalking.oap.server.core.config.NamingLengthControl; +import org.apache.skywalking.oap.server.core.config.NamingControl; import org.apache.skywalking.oap.server.core.source.All; import org.apache.skywalking.oap.server.core.source.DatabaseAccess; import org.apache.skywalking.oap.server.core.source.DetectPoint; @@ -38,13 +38,13 @@ import org.apache.skywalking.oap.server.core.source.ServiceRelation; @RequiredArgsConstructor class SourceBuilder { - private final NamingLengthControl namingLengthControl; + private final NamingControl namingControl; @Getter private String sourceServiceName; public void setSourceServiceName(final String sourceServiceName) { - this.sourceServiceName = namingLengthControl.formatServiceName(sourceServiceName); + this.sourceServiceName = namingControl.formatServiceName(sourceServiceName); } @Getter @@ -54,21 +54,21 @@ class SourceBuilder { private String sourceServiceInstanceName; public void setSourceServiceInstanceName(final String sourceServiceInstanceName) { - this.sourceServiceInstanceName = namingLengthControl.formatInstanceName(sourceServiceInstanceName); + this.sourceServiceInstanceName = namingControl.formatInstanceName(sourceServiceInstanceName); } @Getter private String sourceEndpointName; public void setSourceEndpointName(final String sourceEndpointName) { - this.sourceEndpointName = namingLengthControl.formatEndpointName(sourceEndpointName); + this.sourceEndpointName = namingControl.formatEndpointName(sourceServiceName, sourceEndpointName); } @Getter private String destServiceName; public void setDestServiceName(final String destServiceName) { - this.destServiceName = namingLengthControl.formatServiceName(destServiceName); + this.destServiceName = namingControl.formatServiceName(destServiceName); } @Getter @@ -78,14 +78,14 @@ class SourceBuilder { private String destServiceInstanceName; public void setDestServiceInstanceName(final String destServiceInstanceName) { - this.destServiceInstanceName = namingLengthControl.formatServiceName(destServiceInstanceName); + this.destServiceInstanceName = namingControl.formatServiceName(destServiceInstanceName); } @Getter private String destEndpointName; public void setDestEndpointName(final String destEndpointName) { - this.destEndpointName = namingLengthControl.formatEndpointName(destEndpointName); + this.destEndpointName = namingControl.formatEndpointName(destServiceName, destEndpointName); } @Getter diff --git a/oap-server/server-tools/profile-exporter/tool-profile-snapshot-server-mock/src/main/java/org/apache/skywalking/oap/server/tool/profile/core/MockCoreModuleProvider.java b/oap-server/server-tools/profile-exporter/tool-profile-snapshot-server-mock/src/main/java/org/apache/skywalking/oap/server/tool/profile/core/MockCoreModuleProvider.java index 00d241d59..2e60292d1 100755 --- a/oap-server/server-tools/profile-exporter/tool-profile-snapshot-server-mock/src/main/java/org/apache/skywalking/oap/server/tool/profile/core/MockCoreModuleProvider.java +++ b/oap-server/server-tools/profile-exporter/tool-profile-snapshot-server-mock/src/main/java/org/apache/skywalking/oap/server/tool/profile/core/MockCoreModuleProvider.java @@ -31,7 +31,8 @@ import org.apache.skywalking.oap.server.core.command.CommandService; import org.apache.skywalking.oap.server.core.config.ConfigService; import org.apache.skywalking.oap.server.core.config.DownSamplingConfigService; import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService; -import org.apache.skywalking.oap.server.core.config.NamingLengthControl; +import org.apache.skywalking.oap.server.core.config.NamingControl; +import org.apache.skywalking.oap.server.core.config.group.EndpointNameGrouping; import org.apache.skywalking.oap.server.core.oal.rt.OALEngineLoaderService; import org.apache.skywalking.oap.server.core.profile.ProfileTaskMutationService; import org.apache.skywalking.oap.server.core.query.AggregationQueryService; @@ -97,7 +98,10 @@ public class MockCoreModuleProvider extends CoreModuleProvider { @Override public void prepare() throws ServiceNotProvidedException, ModuleStartException { - this.registerServiceImplementation(NamingLengthControl.class, new NamingLengthControl(50, 50, 150)); + this.registerServiceImplementation( + NamingControl.class, + new NamingControl(50, 50, 150, new EndpointNameGrouping()) + ); MockStreamAnnotationListener streamAnnotationListener = new MockStreamAnnotationListener(getManager()); annotationScan.registerListener(streamAnnotationListener);