This is an automated email from the ASF dual-hosted git repository. wusheng pushed a commit to branch length-rule in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit 5f1b701ebe41c2f762161498a62a0e8ff815d011 Author: Wu Sheng <[email protected]> AuthorDate: Fri Apr 10 16:26:44 2020 +0800 Set up restrict length rules for service, instance and endpoint --- .../skywalking/apm/util/StringFormatGroup.java | 5 +- apm-dist-es7/src/main/assembly/binary-es7.xml | 2 +- apm-dist/src/main/assembly/binary.xml | 2 +- dist-material/application.yml | 277 --------------------- docs/en/setup/backend/backend-setup.md | 2 +- docs/en/setup/service-agent/java-agent/README.md | 4 +- oap-server/server-bootstrap/pom.xml | 1 - .../src/main/resources/application.yml | 16 +- .../resources/endpoint_naming_rules.properties | 18 -- .../skywalking/oap/server/core/CoreModule.java | 23 +- .../oap/server/core/CoreModuleConfig.java | 41 ++- .../oap/server/core/CoreModuleProvider.java | 9 +- .../server/core/config/NamingLengthControl.java | 110 ++++++++ .../oap/server/core/source/Endpoint.java | 9 +- .../oap/server/core/source/EndpointRelation.java | 12 +- .../skywalking/oap/server/core/CoreModuleTest.java | 2 +- .../envoy/als/K8sALSServiceMeshHTTPAnalysis.java | 27 +- .../receiver/envoy/als/K8sHTTPAnalysisTest.java | 14 +- .../handler/CLRMetricReportServiceHandler.java | 29 ++- .../provider/IstioTelemetryGRPCHandler.java | 5 +- .../handler/JVMMetricReportServiceHandler.java | 13 +- .../handler/v8/grpc/ManagementServiceHandler.java | 20 +- .../v8/rest/ManagementServiceKeepAliveHandler.java | 17 +- .../ManagementServiceReportPropertiesHandler.java | 14 +- .../server/receiver/mesh/EndpointNameFormater.java | 71 ------ .../aop/server/receiver/mesh/MeshGRPCHandler.java | 2 +- .../receiver/mesh/TelemetryDataDispatcher.java | 47 ++-- .../oap/server/receiver/mesh/MeshDataMock.java | 6 +- .../trace/provider/TraceModuleProvider.java | 12 +- .../provider/parser/SegmentParserServiceImpl.java | 16 +- .../receiver/trace/provider/parser/SpanTags.java | 2 + .../listener/MultiScopesAnalysisListener.java | 55 ++-- .../NetworkAddressAliasMappingListener.java | 33 ++- .../parser/listener/SegmentAnalysisListener.java | 41 +-- .../provider/parser/listener/SourceBuilder.java | 43 +++- .../tool/profile/core/MockCoreModuleProvider.java | 3 + 36 files changed, 414 insertions(+), 589 deletions(-) diff --git a/apm-commons/apm-util/src/main/java/org/apache/skywalking/apm/util/StringFormatGroup.java b/apm-commons/apm-util/src/main/java/org/apache/skywalking/apm/util/StringFormatGroup.java index 1350206..ab30cdb 100644 --- a/apm-commons/apm-util/src/main/java/org/apache/skywalking/apm/util/StringFormatGroup.java +++ b/apm-commons/apm-util/src/main/java/org/apache/skywalking/apm/util/StringFormatGroup.java @@ -62,10 +62,10 @@ public class StringFormatGroup { public FormatResult format(String string) { for (PatternRule rule : rules) { if (rule.getPattern().matcher(string).matches()) { - return new FormatResult(true, rule.getName()); + return new FormatResult(true, rule.getName(), string); } } - return new FormatResult(false, string); + return new FormatResult(false, string, string); } @Getter @@ -73,6 +73,7 @@ public class StringFormatGroup { public static class FormatResult { private final boolean match; private final String name; + private final String replacedName; } @Getter diff --git a/apm-dist-es7/src/main/assembly/binary-es7.xml b/apm-dist-es7/src/main/assembly/binary-es7.xml index a932784..4188b60 100644 --- a/apm-dist-es7/src/main/assembly/binary-es7.xml +++ b/apm-dist-es7/src/main/assembly/binary-es7.xml @@ -39,7 +39,6 @@ <outputDirectory>/config</outputDirectory> <includes> <include>log4j2.xml</include> - <include>application.yml</include> <include>alarm-settings.yml</include> <include>alarm-settings-sample.yml</include> </includes> @@ -47,6 +46,7 @@ <fileSet> <directory>${project.basedir}/../oap-server/server-bootstrap/src/main/resources</directory> <includes> + <include>application.yml</include> <include>component-libraries.yml</include> <include>official_analysis.oal</include> <include>gateways.yml</include> diff --git a/apm-dist/src/main/assembly/binary.xml b/apm-dist/src/main/assembly/binary.xml index 4b8e964..7d8d866 100644 --- a/apm-dist/src/main/assembly/binary.xml +++ b/apm-dist/src/main/assembly/binary.xml @@ -39,7 +39,6 @@ <outputDirectory>/config</outputDirectory> <includes> <include>log4j2.xml</include> - <include>application.yml</include> <include>alarm-settings.yml</include> <include>alarm-settings-sample.yml</include> </includes> @@ -47,6 +46,7 @@ <fileSet> <directory>${project.basedir}/../oap-server/server-bootstrap/src/main/resources</directory> <includes> + <include>application.yml</include> <include>component-libraries.yml</include> <include>official_analysis.oal</include> <include>gateways.yml</include> diff --git a/dist-material/application.yml b/dist-material/application.yml deleted file mode 100644 index 6d14e38..0000000 --- a/dist-material/application.yml +++ /dev/null @@ -1,277 +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. - -cluster: - selector: ${SW_CLUSTER:standalone} - standalone: - # Please check your ZooKeeper is 3.5+, However, it is also compatible with ZooKeeper 3.4.x. Replace the ZooKeeper 3.5+ - # library the oap-libs folder with your ZooKeeper 3.4.x library. - zookeeper: - nameSpace: ${SW_NAMESPACE:""} - hostPort: ${SW_CLUSTER_ZK_HOST_PORT:localhost:2181} - # Retry Policy - baseSleepTimeMs: ${SW_CLUSTER_ZK_SLEEP_TIME:1000} # initial amount of time to wait between retries - maxRetries: ${SW_CLUSTER_ZK_MAX_RETRIES:3} # max number of times to retry - # Enable ACL - enableACL: ${SW_ZK_ENABLE_ACL:false} # disable ACL in default - schema: ${SW_ZK_SCHEMA:digest} # only support digest schema - expression: ${SW_ZK_EXPRESSION:skywalking:skywalking} - kubernetes: - watchTimeoutSeconds: ${SW_CLUSTER_K8S_WATCH_TIMEOUT:60} - namespace: ${SW_CLUSTER_K8S_NAMESPACE:default} - labelSelector: ${SW_CLUSTER_K8S_LABEL:app=collector,release=skywalking} - uidEnvName: ${SW_CLUSTER_K8S_UID:SKYWALKING_COLLECTOR_UID} - consul: - serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"} - # Consul cluster nodes, example: 10.0.0.1:8500,10.0.0.2:8500,10.0.0.3:8500 - hostPort: ${SW_CLUSTER_CONSUL_HOST_PORT:localhost:8500} - aclToken: ${SW_CLUSTER_CONSUL_ACLTOKEN:""} - nacos: - serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"} - hostPort: ${SW_CLUSTER_NACOS_HOST_PORT:localhost:8848} - # Nacos Configuration namespace - namespace: ${SW_CLUSTER_NACOS_NAMESPACE:"public"} - etcd: - serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"} - # etcd cluster nodes, example: 10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379 - hostPort: ${SW_CLUSTER_ETCD_HOST_PORT:localhost:2379} - -core: - selector: ${SW_CORE:default} - default: - # Mixed: Receive agent data, Level 1 aggregate, Level 2 aggregate - # Receiver: Receive agent data, Level 1 aggregate - # Aggregator: Level 2 aggregate - role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator - restHost: ${SW_CORE_REST_HOST:0.0.0.0} - restPort: ${SW_CORE_REST_PORT:12800} - restContextPath: ${SW_CORE_REST_CONTEXT_PATH:/} - gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0} - gRPCPort: ${SW_CORE_GRPC_PORT:11800} - gRPCSslEnabled: ${SW_CORE_GRPC_SSL_ENABLED:false} - gRPCSslKeyPath: ${SW_CORE_GRPC_SSL_KEY_PATH:""} - gRPCSslCertChainPath: ${SW_CORE_GRPC_SSL_CERT_CHAIN_PATH:""} - gRPCSslTrustedCAPath: ${SW_CORE_GRPC_SSL_TRUSTED_CA_PATH:""} - downsampling: - - Hour - - Day - - Month - # Set a timeout on metrics data. After the timeout has expired, the metrics data will automatically be deleted. - enableDataKeeperExecutor: ${SW_CORE_ENABLE_DATA_KEEPER_EXECUTOR:true} # Turn it off then automatically metrics data delete will be close. - dataKeeperExecutePeriod: ${SW_CORE_DATA_KEEPER_EXECUTE_PERIOD:5} # How often the data keeper executor runs periodically, unit is minute - recordDataTTL: ${SW_CORE_RECORD_DATA_TTL:3} # Unit is day - metricsDataTTL: ${SW_CORE_RECORD_DATA_TTL:7} # Unit is day - # Cache metric data for 1 minute to reduce database queries, and if the OAP cluster changes within that minute, - # the metrics may not be accurate within that minute. - enableDatabaseSession: ${SW_CORE_ENABLE_DATABASE_SESSION:true} - topNReportPeriod: ${SW_CORE_TOPN_REPORT_PERIOD:10} # top_n record worker report cycle, unit is minute - # Extra model column are the column defined by in the codes, These columns of model are not required logically in aggregation or further query, - # and it will cause more load for memory, network of OAP and storage. - # But, being activated, user could see the name in the storage entities, which make users easier to use 3rd party tool, such as Kibana->ES, to query the data by themselves. - activeExtraModelColumns: ${SW_CORE_ACTIVE_EXTRA_MODEL_COLUMNS:false} - # The max length of the endpoint name. - # In the current practice, we don't recommend the length over 190. - endpointNameMaxLength: ${SW_CORE_ENDPOINT_NAME_MAX_LENGTH:150} -storage: - selector: ${SW_STORAGE:h2} - elasticsearch: - nameSpace: ${SW_NAMESPACE:""} - clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} - protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"} - trustStorePath: ${SW_SW_STORAGE_ES_SSL_JKS_PATH:""} - trustStorePass: ${SW_SW_STORAGE_ES_SSL_JKS_PASS:""} - user: ${SW_ES_USER:""} - password: ${SW_ES_PASSWORD:""} - secretsManagementFile: ${SW_ES_SECRETS_MANAGEMENT_FILE:""} # Secrets management file in the properties format includes the username, password, which are managed by 3rd party tool. - dayStep: ${SW_STORAGE_DAY_STEP:1} # Represent the number of days in the one minute/hour/day index. - indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2} - indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0} - # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html - bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requests - flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests - concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests - resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000} - metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000} - segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200} - profileTaskQueryMaxSize: ${SW_STORAGE_ES_QUERY_PROFILE_TASK_SIZE:200} - advanced: ${SW_STORAGE_ES_ADVANCED:""} - elasticsearch7: - nameSpace: ${SW_NAMESPACE:""} - clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} - protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"} - trustStorePath: ${SW_SW_STORAGE_ES_SSL_JKS_PATH:"../es_keystore.jks"} - trustStorePass: ${SW_SW_STORAGE_ES_SSL_JKS_PASS:""} - dayStep: ${SW_STORAGE_DAY_STEP:1} # Represent the number of days in the one minute/hour/day index. - user: ${SW_ES_USER:""} - password: ${SW_ES_PASSWORD:""} - secretsManagementFile: ${SW_ES_SECRETS_MANAGEMENT_FILE:""} # Secrets management file in the properties format includes the username, password, which are managed by 3rd party tool. - indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2} - indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0} - # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html - bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requests - flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests - concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests - resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000} - metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000} - segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200} - profileTaskQueryMaxSize: ${SW_STORAGE_ES_QUERY_PROFILE_TASK_SIZE:200} - advanced: ${SW_STORAGE_ES_ADVANCED:""} - h2: - driver: ${SW_STORAGE_H2_DRIVER:org.h2.jdbcx.JdbcDataSource} - url: ${SW_STORAGE_H2_URL:jdbc:h2:mem:skywalking-oap-db} - user: ${SW_STORAGE_H2_USER:sa} - metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000} - mysql: - properties: - jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/swtest"} - dataSource.user: ${SW_DATA_SOURCE_USER:root} - dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root@1234} - dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:true} - dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:250} - dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:2048} - dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:true} - metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:5000} - influxdb: - url: ${SW_STORAGE_INFLUXDB_URL:http://localhost:8086} - user: ${SW_STORAGE_INFLUXDB_USER:root} - password: ${SW_STORAGE_INFLUXDB_PASSWORD:} - database: ${SW_STORAGE_INFLUXDB_DATABASE:skywalking} - actions: ${SW_STORAGE_INFLUXDB_ACTIONS:1000} # the number of actions to collect - duration: ${SW_STORAGE_INFLUXDB_DURATION:1000} # the time to wait at most (milliseconds) - fetchTaskLogMaxSize: ${SW_STORAGE_INFLUXDB_FETCH_TASK_LOG_MAX_SIZE:5000} # the max number of fetch task log in a request - -receiver-sharing-server: - selector: ${SW_RECEIVER_SHARING_SERVER:default} - default: - authentication: ${SW_AUTHENTICATION:""} -receiver-register: - selector: ${SW_RECEIVER_REGISTER:default} - default: - -receiver-trace: - selector: ${SW_RECEIVER_TRACE:default} - default: - sampleRate: ${SW_TRACE_SAMPLE_RATE:10000} # The sample rate precision is 1/10000. 10000 means 100% sample in default. - slowDBAccessThreshold: ${SW_SLOW_DB_THRESHOLD:default:200,mongodb:100} # The slow database access thresholds. Unit ms. - -receiver-jvm: - selector: ${SW_RECEIVER_JVM:default} - default: - -receiver-clr: - selector: ${SW_RECEIVER_CLR:default} - default: - -receiver-profile: - selector: ${SW_RECEIVER_PROFILE:default} - default: - -service-mesh: - selector: ${SW_SERVICE_MESH:default} - default: - -istio-telemetry: - selector: ${SW_ISTIO_TELEMETRY:default} - default: - -envoy-metric: - selector: ${SW_ENVOY_METRIC:default} - default: - alsHTTPAnalysis: ${SW_ENVOY_METRIC_ALS_HTTP_ANALYSIS:""} - -receiver_zipkin: - selector: ${SW_RECEIVER_ZIPKIN:-} - default: - host: ${SW_RECEIVER_ZIPKIN_HOST:0.0.0.0} - port: ${SW_RECEIVER_ZIPKIN_PORT:9411} - contextPath: ${SW_RECEIVER_ZIPKIN_CONTEXT_PATH:/} - -receiver_jaeger: - selector: ${SW_RECEIVER_JAEGER:-} - default: - gRPCHost: ${SW_RECEIVER_JAEGER_HOST:0.0.0.0} - gRPCPort: ${SW_RECEIVER_JAEGER_PORT:14250} - -query: - selector: ${SW_QUERY:graphql} - graphql: - path: ${SW_QUERY_GRAPHQL_PATH:/graphql} - -alarm: - selector: ${SW_ALARM:default} - default: - -telemetry: - selector: ${SW_TELEMETRY:none} - none: - prometheus: - host: ${SW_TELEMETRY_PROMETHEUS_HOST:0.0.0.0} - port: ${SW_TELEMETRY_PROMETHEUS_PORT:1234} - so11y: - prometheusExporterEnabled: ${SW_TELEMETRY_SO11Y_PROMETHEUS_ENABLED:true} - prometheusExporterHost: ${SW_TELEMETRY_PROMETHEUS_HOST:0.0.0.0} - prometheusExporterPort: ${SW_TELEMETRY_PROMETHEUS_PORT:1234} - -receiver-so11y: - selector: ${SW_RECEIVER_SO11Y:-} - default: - -configuration: - selector: ${SW_CONFIGURATION:none} - none: - apollo: - apolloMeta: http://106.12.25.204:8080 - apolloCluster: default - apolloEnv: "" - appId: skywalking - period: 5 - nacos: - # Nacos Server Host - serverAddr: 127.0.0.1 - # Nacos Server Port - port: 8848 - # Nacos Configuration Group - group: 'skywalking' - # Nacos Configuration namespace - namespace: '' - # Unit seconds, sync period. Default fetch every 60 seconds. - period : 60 - # the name of current cluster, set the name if you want to upstream system known. - clusterName: "default" - zookeeper: - period : 60 # Unit seconds, sync period. Default fetch every 60 seconds. - nameSpace: /default - hostPort: localhost:2181 - # Retry Policy - baseSleepTimeMs: 1000 # initial amount of time to wait between retries - maxRetries: 3 # max number of times to retry - etcd: - period : 60 # Unit seconds, sync period. Default fetch every 60 seconds. - group : 'skywalking' - serverAddr: localhost:2379 - clusterName: "default" - consul: - # Consul host and ports, separated by comma, e.g. 1.2.3.4:8500,2.3.4.5:8500 - hostAndPorts: ${consul.address} - # Sync period in seconds. Defaults to 60 seconds. - period: 1 - # Consul aclToken - #aclToken: ${consul.aclToken} - -exporter: - selector: ${SW_EXPORTER:-} - grpc: - targetHost: ${SW_EXPORTER_GRPC_HOST:127.0.0.1} - targetPort: ${SW_EXPORTER_GRPC_PORT:9870} diff --git a/docs/en/setup/backend/backend-setup.md b/docs/en/setup/backend/backend-setup.md index 3543c18..b873f2e 100755 --- a/docs/en/setup/backend/backend-setup.md +++ b/docs/en/setup/backend/backend-setup.md @@ -41,7 +41,7 @@ storage: # other configurations ``` -1. **`core`** is the module. +1. **`storage`** is the module. 1. **`selector`** selects one out of the all providers listed below, the unselected ones take no effect as if they were deleted. 1. **`default`** is the default implementor of core module. 1. `driver`, `url`, ... `metadataQueryMaxSize` are all setting items of the implementor. diff --git a/docs/en/setup/service-agent/java-agent/README.md b/docs/en/setup/service-agent/java-agent/README.md index 647531d..bcb16df 100755 --- a/docs/en/setup/service-agent/java-agent/README.md +++ b/docs/en/setup/service-agent/java-agent/README.md @@ -72,13 +72,13 @@ This is the properties list supported in `agent/config/agent.config`. property key | Description | Default | ----------- | ---------- | --------- | `agent.namespace` | Namespace isolates headers in cross process propagation. The HEADER name will be `HeaderName:Namespace`. | Not set | -`agent.service_name` | Application(5.x)/Service(6.x) code is showed in sky-walking-ui. Suggestion: set a unique name for each service, service instance nodes share the same code, Max length is 50(UTF-8 char) | `Your_ApplicationName` | +`agent.service_name` | The service name to represent a logic group providing the same capabilities/logic. Suggestion: set a unique name for every logic service group, service instance nodes share the same code, Max length is 50(UTF-8 char) | `Your_ApplicationName` | `agent.sample_n_per_3_secs`|Negative or zero means off, by default.SAMPLE_N_PER_3_SECS means sampling N TraceSegment in 3 seconds tops.|Not set| `agent.authentication`|Authentication active is based on backend setting, see application.yml for more details.For most scenarios, this needs backend extensions, only basic match auth provided in default implementation.|Not set| `agent.span_limit_per_segment`|The max number of spans in a single segment. Through this config item, SkyWalking keep your application memory cost estimated.|300 | `agent.ignore_suffix`|If the operation name of the first span is included in this set, this segment should be ignored.|Not set| `agent.is_open_debugging_class`|If true, skywalking agent will save all instrumented classes files in `/debugging` folder. SkyWalking team may ask for these files in order to resolve compatible problem.|Not set| -`agent.instance_name` |Instance name is the identity of an instance, should be unique in the service. If empty, SkyWalking agent will generate an 32-bit uuid. Default rule is `ServiceName` + UUID`@`hostname` as the instance name. Max length is 50(UTF-8 char)|`""`| +`agent.instance_name` |Instance name is the identity of an instance, should be unique in the service. If empty, SkyWalking agent will generate an 32-bit uuid. Default, use `UUID`@`hostname` as the instance name. Max length is 50(UTF-8 char)|`""`| `agent.instance_properties[key]=value` | Add service instance custom properties. | Not set| `agent.cause_exception_depth`|How depth the agent goes, when log all cause exceptions.|`5`| `agent.force_reconnection_period `|Force reconnection period of grpc, based on grpc_channel_check_interval.|`1`| diff --git a/oap-server/server-bootstrap/pom.xml b/oap-server/server-bootstrap/pom.xml index 33b67c4..5247fa2 100644 --- a/oap-server/server-bootstrap/pom.xml +++ b/oap-server/server-bootstrap/pom.xml @@ -231,7 +231,6 @@ <exclude>log4j2.xml</exclude> <exclude>alarm-settings.yml</exclude> <exclude>component-libraries.yml</exclude> - <exclude>endpoint_naming_rules.properties</exclude> <exclude>official_analysis.oal</exclude> <exclude>gateways.yml</exclude> <exclude>service-apdex-threshold.yml</exclude> diff --git a/oap-server/server-bootstrap/src/main/resources/application.yml b/oap-server/server-bootstrap/src/main/resources/application.yml index a15a1e9..47cc0aa 100755 --- a/oap-server/server-bootstrap/src/main/resources/application.yml +++ b/oap-server/server-bootstrap/src/main/resources/application.yml @@ -81,9 +81,11 @@ core: # and it will cause more load for memory, network of OAP and storage. # But, being activated, user could see the name in the storage entities, which make users easier to use 3rd party tool, such as Kibana->ES, to query the data by themselves. activeExtraModelColumns: ${SW_CORE_ACTIVE_EXTRA_MODEL_COLUMNS:false} - # The max length of the endpoint name. - # In the current practice, we don't recommend the length over 190. - endpointNameMaxLength: ${SW_CORE_ENDPOINT_NAME_MAX_LENGTH:150} + # The max length of service + instance names should be less than 200 + serviceNameMaxLength: ${SW_SERVICE_NAME_MAX_LENGTH:70} + instanceNameMaxLength: ${INSTANCE_NAME_MAX_LENGTH:70} + # The max length of service + endpoint names should be less than 240 + endpointNameMaxLength: ${ENDPOINT_NAME_MAX_LENGTH:150} storage: selector: ${SW_STORAGE:h2} elasticsearch: @@ -248,19 +250,19 @@ configuration: # Nacos Configuration namespace namespace: '' # Unit seconds, sync period. Default fetch every 60 seconds. - period : 60 + period: 60 # the name of current cluster, set the name if you want to upstream system known. clusterName: "default" zookeeper: - period : 60 # Unit seconds, sync period. Default fetch every 60 seconds. + period: 60 # Unit seconds, sync period. Default fetch every 60 seconds. nameSpace: /default hostPort: localhost:2181 # Retry Policy baseSleepTimeMs: 1000 # initial amount of time to wait between retries maxRetries: 3 # max number of times to retry etcd: - period : 60 # Unit seconds, sync period. Default fetch every 60 seconds. - group : 'skywalking' + period: 60 # Unit seconds, sync period. Default fetch every 60 seconds. + group: 'skywalking' serverAddr: localhost:2379 clusterName: "default" consul: diff --git a/oap-server/server-bootstrap/src/main/resources/endpoint_naming_rules.properties b/oap-server/server-bootstrap/src/main/resources/endpoint_naming_rules.properties deleted file mode 100644 index 7fffa10..0000000 --- a/oap-server/server-bootstrap/src/main/resources/endpoint_naming_rules.properties +++ /dev/null @@ -1,18 +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. -# -# -istio.mixer.v1.Mixer=.*/istio.mixer.v1.Mixer/.* \ 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 cb1c216..37bc7c8 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 @@ -26,6 +26,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.profile.ProfileTaskMutationService; import org.apache.skywalking.oap.server.core.query.AggregationQueryService; import org.apache.skywalking.oap.server.core.query.AlarmQueryService; @@ -53,7 +54,6 @@ import org.apache.skywalking.oap.server.library.module.ModuleDefine; */ public class CoreModule extends ModuleDefine { public static final String NAME = "core"; - private static int ENDPOINT_NAME_MAX_LENGTH = 150; public CoreModule() { super(NAME); @@ -64,6 +64,7 @@ public class CoreModule extends ModuleDefine { List<Class> classes = new ArrayList<>(); classes.add(ConfigService.class); classes.add(DownSamplingConfigService.class); + classes.add(NamingLengthControl.class); classes.add(IComponentLibraryCatalogService.class); classes.add(IWorkerInstanceGetter.class); @@ -81,26 +82,6 @@ public class CoreModule extends ModuleDefine { return classes.toArray(new Class[] {}); } - /** - * Format endpoint name by using the length config in the core module. This is a global rule, every place including - * endpoint as the {@link org.apache.skywalking.oap.server.core.source.Source} should follow this for any core - * module implementation. - * - * @param endpointName raw data, literal string. - * @return the string, which length less than or equals {@link #ENDPOINT_NAME_MAX_LENGTH}; - */ - public static String formatEndpointName(String endpointName) { - if (endpointName.length() > ENDPOINT_NAME_MAX_LENGTH) { - return endpointName.substring(0, ENDPOINT_NAME_MAX_LENGTH); - } else { - return endpointName; - } - } - - public static void setEndpointNameMaxLength(final int endpointNameMaxLength) { - ENDPOINT_NAME_MAX_LENGTH = endpointNameMaxLength; - } - private void addProfileService(List<Class> classes) { classes.add(ProfileTaskMutationService.class); classes.add(ProfileTaskQueryService.class); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java index ece7ade..933024c 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleConfig.java @@ -21,72 +21,55 @@ package org.apache.skywalking.oap.server.core; import java.util.ArrayList; import java.util.List; import lombok.Getter; -import lombok.Setter; import org.apache.skywalking.oap.server.core.source.ScopeDefaultColumn; import org.apache.skywalking.oap.server.library.module.ModuleConfig; @Getter public class CoreModuleConfig extends ModuleConfig { - @Setter private String role = "Mixed"; - @Setter private String nameSpace; - @Setter private String restHost; - @Setter private int restPort; - @Setter private int jettySelectors = 1; - @Setter private String restContextPath; - @Setter private String gRPCHost; - @Setter private int gRPCPort; - @Setter private boolean gRPCSslEnabled = false; - @Setter private String gRPCSslKeyPath; - @Setter private String gRPCSslCertChainPath; - @Setter private String gRPCSslTrustedCAPath; - @Setter private int maxConcurrentCallsPerConnection; - @Setter private int maxMessageSize; - @Setter private boolean enableDatabaseSession; - @Setter private int topNReportPeriod; private final List<String> downsampling; /** * The period of doing data persistence. Unit is second. */ - @Setter + private long persistentPeriod = 3; - @Setter + private boolean enableDataKeeperExecutor = true; - @Setter + private int dataKeeperExecutePeriod = 5; /** * The time to live of all metrics data. Unit is day. */ - @Setter + private int metricsDataTTL = 3; /** * The time to live of all record data, including tracing. Unit is Day. */ - @Setter + private int recordDataTTL = 7; - @Setter + private int gRPCThreadPoolSize; - @Setter + private int gRPCThreadPoolQueueSize; /** * Timeout for cluster internal communication, in seconds. */ - @Setter + private int remoteTimeout = 20; /** * The size of network address alias. @@ -114,6 +97,14 @@ public class CoreModuleConfig extends ModuleConfig { */ private boolean activeExtraModelColumns = false; /** + * The max length of the service name. + */ + private int serviceNameMaxLength = 70; + /** + * The max length of the service instance name. + */ + private int instanceNameMaxLength = 70; + /** * The max length of the endpoint name. * * <p>NOTICE</p> 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 0523cee..c23255c 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 @@ -40,6 +40,7 @@ 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.oal.rt.OALEngine; import org.apache.skywalking.oap.server.core.oal.rt.OALEngineLoader; import org.apache.skywalking.oap.server.core.profile.ProfileTaskMutationService; @@ -131,9 +132,11 @@ public class CoreModuleProvider extends ModuleProvider { if (moduleConfig.isActiveExtraModelColumns()) { DefaultScopeDefine.activeExtraModelColumns(); } - if (moduleConfig.getEndpointNameMaxLength() > 0) { - CoreModule.setEndpointNameMaxLength(moduleConfig.getEndpointNameMaxLength()); - } + this.registerServiceImplementation(NamingLengthControl.class, new NamingLengthControl( + moduleConfig.getServiceNameMaxLength(), + moduleConfig.getInstanceNameMaxLength(), + moduleConfig.getEndpointNameMaxLength() + )); StreamAnnotationListener streamAnnotationListener = new StreamAnnotationListener(getManager()); 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/NamingLengthControl.java new file mode 100644 index 0000000..9bb3383 --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/config/NamingLengthControl.java @@ -0,0 +1,110 @@ +/* + * 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; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +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. + */ +@RequiredArgsConstructor +@Slf4j +public class NamingLengthControl implements Service { + private final int serviceNameMaxLength; + private final int instanceNameMaxLength; + private final int endpointNameMaxLength; + + /** + * Format endpoint name by using the length config in the core module. This is a global rule, every place including + * service as the {@link org.apache.skywalking.oap.server.core.source.Source} should follow this for any core module + * implementation. + * + * @param serviceName raw data, literal string. + * @return the string, which length less than or equals {@link #serviceNameMaxLength}; + */ + public String formatServiceName(String serviceName) { + if (serviceName.length() > serviceNameMaxLength) { + final String rename = serviceName.substring(0, serviceNameMaxLength); + if (log.isDebugEnabled()) { + log.debug( + "Service {} has been renamed to {} due to length limitation {}", + serviceName, + rename, + serviceNameMaxLength + ); + } + return rename; + } else { + return serviceName; + } + } + + /** + * Format endpoint name by using the length config in the core module. This is a global rule, every place including + * instance as the {@link org.apache.skywalking.oap.server.core.source.Source} should follow this for any core + * module implementation. + * + * @param instanceName raw data, literal string. + * @return the string, which length less than or equals {@link #instanceNameMaxLength}; + */ + public String formatInstanceName(String instanceName) { + if (instanceName.length() > instanceNameMaxLength) { + final String rename = instanceName.substring(0, instanceNameMaxLength); + if (log.isDebugEnabled()) { + log.debug( + "Service instance {} has been renamed to {} due to length limitation {}", + instanceName, + rename, + serviceNameMaxLength + ); + } + return rename; + } else { + return instanceName; + } + } + + /** + * Format endpoint name by using the length config in the core module. This is a global rule, every place including + * endpoint as the {@link org.apache.skywalking.oap.server.core.source.Source} should follow this for any core + * module implementation. + * + * @param endpointName raw data, literal string. + * @return the string, which length less than or equals {@link #endpointNameMaxLength}; + */ + public String formatEndpointName(String endpointName) { + if (endpointName.length() > endpointNameMaxLength) { + final String rename = endpointName.substring(0, endpointNameMaxLength); + if (log.isDebugEnabled()) { + log.debug( + "Endpoint {} has been renamed to {} due to length limitation {}", + endpointName, + rename, + serviceNameMaxLength + ); + } + return rename; + } else { + return endpointName; + } + } +} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java index a09f4e6..058db36 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Endpoint.java @@ -20,8 +20,8 @@ package org.apache.skywalking.oap.server.core.source; import lombok.Getter; import lombok.Setter; +import lombok.extern.slf4j.Slf4j; import org.apache.skywalking.apm.util.StringUtil; -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; @@ -30,6 +30,7 @@ import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.EN @ScopeDeclaration(id = ENDPOINT, name = "Endpoint", catalog = ENDPOINT_CATALOG_NAME) @ScopeDefaultColumn.VirtualColumnDefinition(fieldName = "entityId", columnName = "entity_id", isID = true, type = String.class) +@Slf4j public class Endpoint extends Source { private String entityId; @@ -47,13 +48,9 @@ public class Endpoint extends Source { } @Getter + @Setter @ScopeDefaultColumn.DefinedByField(columnName = "name", requireDynamicActive = true) private String name; - - public void setName(final String name) { - this.name = CoreModule.formatEndpointName(name); - } - @Getter @ScopeDefaultColumn.DefinedByField(columnName = "service_id") private String serviceId; diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java index c73a2fe..801b473 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/EndpointRelation.java @@ -20,7 +20,6 @@ package org.apache.skywalking.oap.server.core.source; import lombok.Getter; import lombok.Setter; -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; @@ -43,13 +42,10 @@ public class EndpointRelation extends Source { } @Getter + @Setter @ScopeDefaultColumn.DefinedByField(columnName = "source_endpoint_name") private String endpoint; - public void setEndpoint(final String endpoint) { - this.endpoint = CoreModule.formatEndpointName(endpoint); - } - @Getter @ScopeDefaultColumn.DefinedByField(columnName = "service_id") private String serviceId; @@ -63,13 +59,9 @@ public class EndpointRelation extends Source { @Setter private String serviceInstanceName; @Getter + @Setter @ScopeDefaultColumn.DefinedByField(columnName = "child_endpoint_name") private String childEndpoint; - - public void setChildEndpoint(final String childEndpoint) { - this.childEndpoint = CoreModule.formatEndpointName(childEndpoint); - } - @Getter @ScopeDefaultColumn.DefinedByField(columnName = "child_service_id") private String childServiceId; 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 4d4c6f4..0094c9a 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(); - Assert.assertEquals(26, coreModule.services().length); + Assert.assertEquals(27, coreModule.services().length); } } diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/K8sALSServiceMeshHTTPAnalysis.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/K8sALSServiceMeshHTTPAnalysis.java index eb7fdd2..caeca40 100644 --- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/K8sALSServiceMeshHTTPAnalysis.java +++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/envoy/als/K8sALSServiceMeshHTTPAnalysis.java @@ -209,7 +209,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis { if (downstreamService.equals(ServiceMetaInfo.UNKNOWN)) { // Ingress -> sidecar(server side) // Mesh telemetry without source, the relation would be generated. - ServiceMeshMetric metric = ServiceMeshMetric.newBuilder() + ServiceMeshMetric.Builder metric = ServiceMeshMetric.newBuilder() .setStartTime(startTime) .setEndTime(startTime + duration) .setDestServiceName(localService.getServiceName()) @@ -219,14 +219,13 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis { .setResponseCode(Math.toIntExact(responseCode)) .setStatus(status) .setProtocol(protocol) - .setDetectPoint(DetectPoint.server) - .build(); + .setDetectPoint(DetectPoint.server); logger.debug("Transformed ingress->sidecar inbound mesh metric {}", metric); forward(metric); } else { // sidecar -> sidecar(server side) - ServiceMeshMetric metric = ServiceMeshMetric.newBuilder() + ServiceMeshMetric.Builder metric = ServiceMeshMetric.newBuilder() .setStartTime(startTime) .setEndTime(startTime + duration) .setSourceServiceName(downstreamService.getServiceName()) @@ -238,8 +237,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis { .setResponseCode(Math.toIntExact(responseCode)) .setStatus(status) .setProtocol(protocol) - .setDetectPoint(DetectPoint.server) - .build(); + .setDetectPoint(DetectPoint.server); logger.debug("Transformed sidecar->sidecar(server side) inbound mesh metric {}", metric); forward(metric); @@ -251,7 +249,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis { .getAddress(), upstreamRemoteAddress.getSocketAddress() .getPortValue()); - ServiceMeshMetric metric = ServiceMeshMetric.newBuilder() + ServiceMeshMetric.Builder metric = ServiceMeshMetric.newBuilder() .setStartTime(startTime) .setEndTime(startTime + duration) .setSourceServiceName(downstreamService.getServiceName()) @@ -263,8 +261,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis { .setResponseCode(Math.toIntExact(responseCode)) .setStatus(status) .setProtocol(protocol) - .setDetectPoint(DetectPoint.client) - .build(); + .setDetectPoint(DetectPoint.client); logger.debug("Transformed sidecar->sidecar(server side) inbound mesh metric {}", metric); forward(metric); @@ -312,7 +309,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis { } boolean status = responseCode >= 200 && responseCode < 400; - ServiceMeshMetric metric = ServiceMeshMetric.newBuilder() + ServiceMeshMetric.Builder metric = ServiceMeshMetric.newBuilder() .setStartTime(startTime) .setEndTime(startTime + duration) .setSourceServiceName(outside.getServiceName()) @@ -324,8 +321,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis { .setResponseCode(Math.toIntExact(responseCode)) .setStatus(status) .setProtocol(protocol) - .setDetectPoint(DetectPoint.server) - .build(); + .setDetectPoint(DetectPoint.server); logger.debug("Transformed ingress inbound mesh metric {}", metric); forward(metric); @@ -337,7 +333,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis { long outboundStartTime = startTime + formatAsLong(properties.getTimeToFirstUpstreamTxByte()); long outboundEndTime = startTime + formatAsLong(properties.getTimeToLastUpstreamRxByte()); - ServiceMeshMetric outboundMetric = ServiceMeshMetric.newBuilder() + ServiceMeshMetric.Builder outboundMetric = ServiceMeshMetric.newBuilder() .setStartTime(outboundStartTime) .setEndTime(outboundEndTime) .setSourceServiceName(ingress.getServiceName()) @@ -349,8 +345,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis { .setResponseCode(Math.toIntExact(responseCode)) .setStatus(status) .setProtocol(protocol) - .setDetectPoint(DetectPoint.client) - .build(); + .setDetectPoint(DetectPoint.client); logger.debug("Transformed ingress outbound mesh metric {}", outboundMetric); forward(outboundMetric); @@ -391,7 +386,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis { return ServiceMetaInfo.UNKNOWN; } - protected void forward(ServiceMeshMetric metric) { + protected void forward(ServiceMeshMetric.Builder metric) { TelemetryDataDispatcher.process(metric); } diff --git a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/K8sHTTPAnalysisTest.java b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/K8sHTTPAnalysisTest.java index 4c7e125..e6c797f 100644 --- a/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/K8sHTTPAnalysisTest.java +++ b/oap-server/server-receiver-plugin/envoy-metrics-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/envoy/als/K8sHTTPAnalysisTest.java @@ -76,12 +76,12 @@ public class K8sHTTPAnalysisTest { Assert.assertEquals(2, analysis.metrics.size()); - ServiceMeshMetric incoming = analysis.metrics.get(0); + ServiceMeshMetric.Builder incoming = analysis.metrics.get(0); Assert.assertEquals("UNKNOWN", incoming.getSourceServiceName()); Assert.assertEquals("ingress", incoming.getDestServiceName()); Assert.assertEquals(DetectPoint.server, incoming.getDetectPoint()); - ServiceMeshMetric outgoing = analysis.metrics.get(1); + ServiceMeshMetric.Builder outgoing = analysis.metrics.get(1); Assert.assertEquals("ingress", outgoing.getSourceServiceName()); Assert.assertEquals("productpage", outgoing.getDestServiceName()); Assert.assertEquals(DetectPoint.client, outgoing.getDetectPoint()); @@ -99,7 +99,7 @@ public class K8sHTTPAnalysisTest { Assert.assertEquals(1, analysis.metrics.size()); - ServiceMeshMetric incoming = analysis.metrics.get(0); + ServiceMeshMetric.Builder incoming = analysis.metrics.get(0); Assert.assertEquals("", incoming.getSourceServiceName()); Assert.assertEquals("productpage", incoming.getDestServiceName()); Assert.assertEquals(DetectPoint.server, incoming.getDetectPoint()); @@ -117,7 +117,7 @@ public class K8sHTTPAnalysisTest { Assert.assertEquals(1, analysis.metrics.size()); - ServiceMeshMetric incoming = analysis.metrics.get(0); + ServiceMeshMetric.Builder incoming = analysis.metrics.get(0); Assert.assertEquals("productpage", incoming.getSourceServiceName()); Assert.assertEquals("review", incoming.getDestServiceName()); Assert.assertEquals(DetectPoint.server, incoming.getDetectPoint()); @@ -135,7 +135,7 @@ public class K8sHTTPAnalysisTest { Assert.assertEquals(1, analysis.metrics.size()); - ServiceMeshMetric incoming = analysis.metrics.get(0); + ServiceMeshMetric.Builder incoming = analysis.metrics.get(0); Assert.assertEquals("productpage", incoming.getSourceServiceName()); Assert.assertEquals("detail", incoming.getDestServiceName()); Assert.assertEquals(DetectPoint.client, incoming.getDetectPoint()); @@ -143,7 +143,7 @@ public class K8sHTTPAnalysisTest { } public static class MockK8sAnalysis extends K8sALSServiceMeshHTTPAnalysis { - private List<ServiceMeshMetric> metrics = new ArrayList<>(); + private List<ServiceMeshMetric.Builder> metrics = new ArrayList<>(); @Override public void init(EnvoyMetricReceiverConfig config) { @@ -156,7 +156,7 @@ public class K8sHTTPAnalysisTest { } @Override - protected void forward(ServiceMeshMetric metric) { + protected void forward(ServiceMeshMetric.Builder metric) { metrics.add(metric); } } 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 26d3aaf..dea57b5 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 @@ -19,37 +19,42 @@ package org.apache.skywalking.oap.server.receiver.clr.provider.handler; import io.grpc.stub.StreamObserver; +import lombok.extern.slf4j.Slf4j; import org.apache.skywalking.apm.network.common.v3.Commands; 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.library.module.ModuleManager; import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler; -import org.apache.skywalking.oap.server.core.analysis.TimeBucket; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -/** - * - **/ +@Slf4j public class CLRMetricReportServiceHandler extends CLRMetricReportServiceGrpc.CLRMetricReportServiceImplBase implements GRPCHandler { - - private static final Logger logger = LoggerFactory.getLogger(CLRMetricReportServiceHandler.class); - private final CLRSourceDispatcher clrSourceDispatcher; + private final NamingLengthControl namingLengthControl; public CLRMetricReportServiceHandler(ModuleManager moduleManager) { clrSourceDispatcher = new CLRSourceDispatcher(moduleManager); + this.namingLengthControl = moduleManager.find(CoreModule.NAME) + .provider() + .getService(NamingLengthControl.class); } @Override public void collect(CLRMetricCollection request, StreamObserver<Commands> responseObserver) { - if (logger.isDebugEnabled()) { - logger.debug("receive the clr metrics from service instance, id: {}", request.getServiceInstance()); + if (log.isDebugEnabled()) { + log.debug("receive the clr metrics from service instance, id: {}", request.getServiceInstance()); } + final CLRMetricCollection.Builder builder = request.toBuilder(); + builder.setService(namingLengthControl.formatServiceName(builder.getService())); + builder.setServiceInstance(namingLengthControl.formatInstanceName(builder.getServiceInstance())); + request.getMetricsList().forEach(metrics -> { long minuteTimeBucket = TimeBucket.getMinuteTimeBucket(metrics.getTime()); - clrSourceDispatcher.sendMetric(request.getService(), request.getServiceInstance(), minuteTimeBucket, metrics); + clrSourceDispatcher.sendMetric( + request.getService(), request.getServiceInstance(), minuteTimeBucket, metrics); }); responseObserver.onNext(Commands.newBuilder().build()); diff --git a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryGRPCHandler.java b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryGRPCHandler.java index 2b587e1..4299d26 100644 --- a/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryGRPCHandler.java +++ b/oap-server/server-receiver-plugin/skywalking-istio-telemetry-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/istio/telemetry/provider/IstioTelemetryGRPCHandler.java @@ -117,7 +117,7 @@ public class IstioTelemetryGRPCHandler extends HandleMetricServiceGrpc.HandleMet destServiceName = string(i, "destinationService"); } - ServiceMeshMetric metrics = ServiceMeshMetric.newBuilder() + ServiceMeshMetric.Builder metrics = ServiceMeshMetric.newBuilder() .setStartTime(requestTime.toEpochMilli()) .setEndTime(responseTime.toEpochMilli()) .setSourceServiceName(sourceServiceName) @@ -129,8 +129,7 @@ public class IstioTelemetryGRPCHandler extends HandleMetricServiceGrpc.HandleMet .setResponseCode(Math.toIntExact(responseCode)) .setStatus(status) .setProtocol(netProtocol) - .setDetectPoint(detectPoint) - .build(); + .setDetectPoint(detectPoint); logger.debug("Transformed metrics {}", metrics); TelemetryDataDispatcher.process(metrics); 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 97ec891..3b874f4 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 @@ -23,15 +23,21 @@ import lombok.extern.slf4j.Slf4j; 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.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; public JVMMetricReportServiceHandler(ModuleManager moduleManager) { this.jvmSourceDispatcher = new JVMSourceDispatcher(moduleManager); + this.namingLengthControl = moduleManager.find(CoreModule.NAME) + .provider() + .getService(NamingLengthControl.class); } @Override @@ -43,9 +49,12 @@ public class JVMMetricReportServiceHandler extends JVMMetricReportServiceGrpc.JV request.getServiceInstance() ); } + final JVMMetricCollection.Builder builder = request.toBuilder(); + builder.setService(namingLengthControl.formatServiceName(builder.getService())); + builder.setServiceInstance(namingLengthControl.formatInstanceName(builder.getServiceInstance())); - request.getMetricsList().forEach(jvmMetric -> { - jvmSourceDispatcher.sendMetric(request.getService(), request.getServiceInstance(), jvmMetric); + builder.getMetricsList().forEach(jvmMetric -> { + jvmSourceDispatcher.sendMetric(builder.getService(), builder.getServiceInstance(), jvmMetric); }); responseObserver.onNext(Commands.newBuilder().build()); 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 f41c202..f963ceb 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,6 +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.source.ServiceInstanceUpdate; import org.apache.skywalking.oap.server.core.source.ServiceUpdate; import org.apache.skywalking.oap.server.core.source.SourceReceiver; @@ -41,17 +42,23 @@ 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; public ManagementServiceHandler(ModuleManager moduleManager) { this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); + this.namingLengthControl = moduleManager.find(CoreModule.NAME) + .provider() + .getService(NamingLengthControl.class); } @Override public void reportInstanceProperties(final InstanceProperties request, final StreamObserver<Commands> responseObserver) { ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate(); - serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(request.getService(), NodeType.Normal)); - serviceInstanceUpdate.setName(request.getServiceInstance()); + final String serviceName = namingLengthControl.formatServiceName(request.getService()); + final String instanceName = namingLengthControl.formatInstanceName(request.getServiceInstance()); + serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal)); + serviceInstanceUpdate.setName(instanceName); JsonObject properties = new JsonObject(); List<String> ipv4List = new ArrayList<>(); @@ -75,14 +82,17 @@ public class ManagementServiceHandler extends ManagementServiceGrpc.ManagementSe @Override public void keepAlive(final InstancePingPkg request, final StreamObserver<Commands> responseObserver) { final long timeBucket = TimeBucket.getTimeBucket(System.currentTimeMillis(), DownSampling.Minute); + final String serviceName = namingLengthControl.formatServiceName(request.getService()); + final String instanceName = namingLengthControl.formatInstanceName(request.getServiceInstance()); + ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate(); - serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(request.getService(), NodeType.Normal)); - serviceInstanceUpdate.setName(request.getServiceInstance()); + serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal)); + serviceInstanceUpdate.setName(instanceName); serviceInstanceUpdate.setTimeBucket(timeBucket); sourceReceiver.receive(serviceInstanceUpdate); ServiceUpdate serviceUpdate = new ServiceUpdate(); - serviceUpdate.setName(request.getService()); + serviceUpdate.setName(serviceName); serviceUpdate.setNodeType(NodeType.Normal); serviceUpdate.setTimeBucket(timeBucket); sourceReceiver.receive(serviceUpdate); 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 0a18c9e..20ef0d0 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,6 +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.source.ServiceInstanceUpdate; import org.apache.skywalking.oap.server.core.source.ServiceUpdate; import org.apache.skywalking.oap.server.core.source.SourceReceiver; @@ -39,10 +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 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); } @Override @@ -55,16 +60,18 @@ 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 long timeBucket = TimeBucket.getTimeBucket(System.currentTimeMillis(), DownSampling.Minute); ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate(); - serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(request.getService(), NodeType.Normal)); - serviceInstanceUpdate.setName(request.getServiceInstance()); - serviceInstanceUpdate.setTimeBucket( - timeBucket); + serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal)); + serviceInstanceUpdate.setName(instanceName); + serviceInstanceUpdate.setTimeBucket(timeBucket); sourceReceiver.receive(serviceInstanceUpdate); ServiceUpdate serviceUpdate = new ServiceUpdate(); - serviceUpdate.setName(request.getService()); + serviceUpdate.setName(serviceName); serviceUpdate.setNodeType(NodeType.Normal); serviceUpdate.setTimeBucket(timeBucket); sourceReceiver.receive(serviceUpdate); 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 b46d1cc..3801e0c 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 @@ -31,9 +31,10 @@ import org.apache.skywalking.apm.network.management.v3.InstanceProperties; import org.apache.skywalking.oap.server.core.CoreModule; 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.analysis.manual.instance.InstanceTraffic; -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.source.ServiceInstanceUpdate; import org.apache.skywalking.oap.server.core.source.SourceReceiver; import org.apache.skywalking.oap.server.library.module.ModuleManager; @@ -43,10 +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 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); } @Override @@ -59,9 +64,12 @@ 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()); + ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate(); - serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(request.getService(), NodeType.Normal)); - serviceInstanceUpdate.setName(request.getServiceInstance()); + serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal)); + serviceInstanceUpdate.setName(instanceName); JsonObject properties = new JsonObject(); List<String> ipv4List = new ArrayList<>(); diff --git a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/EndpointNameFormater.java b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/EndpointNameFormater.java deleted file mode 100644 index 203a13c..0000000 --- a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/EndpointNameFormater.java +++ /dev/null @@ -1,71 +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.aop.server.receiver.mesh; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.ConcurrentHashMap; -import org.apache.skywalking.apm.util.StringFormatGroup; -import org.apache.skywalking.oap.server.library.util.ResourceUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class EndpointNameFormater { - private static final Logger logger = LoggerFactory.getLogger(EndpointNameFormater.class); - private static Map<String, StringFormatGroup> ALL_RULES = new ConcurrentHashMap<>(); - - private static void init(String service) { - if (ALL_RULES.containsKey(service)) { - return; - } - StringFormatGroup endpointRule = new StringFormatGroup(); - Properties properties = new Properties(); - try { - InputStream stream = ResourceUtils.class.getClassLoader() - .getResourceAsStream(service + "_endpoint_naming_rules.properties"); - if (stream == null) { - logger.info("{}_endpoint_naming_rules.properties not found. Try to find global endpoint rule file.", service); - stream = ResourceUtils.class.getClassLoader().getResourceAsStream("endpoint_naming_rules.properties"); - } - - if (stream == null) { - logger.info("endpoint_naming_rules.properties not found. No endpoint naming setup."); - } else { - properties.load(stream); - properties.forEach((key, value) -> { - endpointRule.addRule((String) key, (String) value); - logger.debug("endpoint naming rule of service {} found, name[{}] and rule[{}]", service, key, value); - }); - } - } catch (IOException e) { - logger.info("{}_endpoint_rules.properties not found. No endpoint naming setup.", service); - } - - ALL_RULES.put(service, endpointRule); - logger.debug("endpoint naming rules of service {} added. {}", service, endpointRule); - - } - - public static StringFormatGroup.FormatResult format(String service, String endpointName) { - init(service); - return ALL_RULES.get(service).format(endpointName); - } -} diff --git a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/MeshGRPCHandler.java b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/MeshGRPCHandler.java index de7c3dc..eb994a7 100644 --- a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/MeshGRPCHandler.java +++ b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/MeshGRPCHandler.java @@ -42,7 +42,7 @@ public class MeshGRPCHandler extends ServiceMeshMetricServiceGrpc.ServiceMeshMet logger.debug("Received mesh metrics: {}", metrics); } - TelemetryDataDispatcher.process(metrics); + TelemetryDataDispatcher.process(metrics.toBuilder()); } @Override 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 61b2a77..7305398 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 @@ -21,12 +21,12 @@ package org.apache.skywalking.aop.server.receiver.mesh; import lombok.extern.slf4j.Slf4j; import org.apache.skywalking.apm.network.servicemesh.v3.Protocol; import org.apache.skywalking.apm.network.servicemesh.v3.ServiceMeshMetric; -import org.apache.skywalking.apm.util.StringFormatGroup; import org.apache.skywalking.apm.util.StringUtil; 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.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 HistogramMetrics MESH_ANALYSIS_METRICS; private TelemetryDataDispatcher() { @@ -61,25 +61,32 @@ public class TelemetryDataDispatcher { MetricsCreator metricsCreator = moduleManager.find(TelemetryModule.NAME) .provider() .getService(MetricsCreator.class); + NAME_LENGTH_CONTROL = moduleManager.find(CoreModule.NAME) + .provider() + .getService(NamingLengthControl.class); MESH_ANALYSIS_METRICS = metricsCreator.createHistogramMetric( "mesh_analysis_latency", "The process latency of service mesh telemetry", MetricsTag.EMPTY_KEY, MetricsTag.EMPTY_VALUE ); } - public static void process(ServiceMeshMetric data) { + public static void process(ServiceMeshMetric.Builder data) { HistogramMetrics.Timer timer = MESH_ANALYSIS_METRICS.createTimer(); try { - String service = data.getDestServiceName(); - String endpointName = data.getEndpoint(); - StringFormatGroup.FormatResult formatResult = EndpointNameFormater.format(service, endpointName); - if (formatResult.isMatch()) { - data = data.toBuilder().setEndpoint(formatResult.getName()).build(); + if (data.getSourceServiceName() != null) { + data.setSourceServiceName(NAME_LENGTH_CONTROL.formatServiceName(data.getSourceServiceName())); + } + if (data.getSourceServiceInstance() != null) { + data.setSourceServiceInstance(NAME_LENGTH_CONTROL.formatInstanceName(data.getSourceServiceInstance())); + } + if (data.getDestServiceName() != null) { + data.setDestServiceName(NAME_LENGTH_CONTROL.formatServiceName(data.getDestServiceName())); + } + if (data.getDestServiceInstance() != null) { + data.setDestServiceInstance(NAME_LENGTH_CONTROL.formatInstanceName(data.getDestServiceInstance())); } - if (log.isDebugEnabled()) { - if (formatResult.isMatch()) { - log.debug("Endpoint {} is renamed to {}", endpointName, data.getEndpoint()); - } + if (data.getEndpoint() != null) { + data.setEndpoint(NAME_LENGTH_CONTROL.formatEndpointName(data.getEndpoint())); } doDispatch(data); @@ -88,7 +95,7 @@ public class TelemetryDataDispatcher { } } - static void doDispatch(ServiceMeshMetric metrics) { + static void doDispatch(ServiceMeshMetric.Builder metrics) { long minuteTimeBucket = TimeBucket.getMinuteTimeBucket(metrics.getStartTime()); heartbeat(metrics, minuteTimeBucket); @@ -107,7 +114,7 @@ public class TelemetryDataDispatcher { } } - private static void heartbeat(ServiceMeshMetric metrics, long minuteTimeBucket) { + private static void heartbeat(ServiceMeshMetric.Builder metrics, long minuteTimeBucket) { // source final String sourceServiceName = metrics.getSourceServiceName(); final String sourceServiceInstance = metrics.getSourceServiceInstance(); @@ -134,7 +141,7 @@ public class TelemetryDataDispatcher { } } - private static void toAll(ServiceMeshMetric metrics, long minuteTimeBucket) { + private static void toAll(ServiceMeshMetric.Builder metrics, long minuteTimeBucket) { All all = new All(); all.setTimeBucket(minuteTimeBucket); all.setName(metrics.getDestServiceName()); @@ -148,7 +155,7 @@ public class TelemetryDataDispatcher { SOURCE_RECEIVER.receive(all); } - private static void toService(ServiceMeshMetric metrics, long minuteTimeBucket) { + private static void toService(ServiceMeshMetric.Builder metrics, long minuteTimeBucket) { Service service = new Service(); service.setTimeBucket(minuteTimeBucket); service.setName(metrics.getDestServiceName()); @@ -163,7 +170,7 @@ public class TelemetryDataDispatcher { SOURCE_RECEIVER.receive(service); } - private static void toServiceRelation(ServiceMeshMetric metrics, long minuteTimeBucket) { + private static void toServiceRelation(ServiceMeshMetric.Builder metrics, long minuteTimeBucket) { ServiceRelation serviceRelation = new ServiceRelation(); serviceRelation.setTimeBucket(minuteTimeBucket); serviceRelation.setSourceServiceName(metrics.getSourceServiceName()); @@ -183,7 +190,7 @@ public class TelemetryDataDispatcher { SOURCE_RECEIVER.receive(serviceRelation); } - private static void toServiceInstance(ServiceMeshMetric metrics, long minuteTimeBucket) { + private static void toServiceInstance(ServiceMeshMetric.Builder metrics, long minuteTimeBucket) { ServiceInstance serviceInstance = new ServiceInstance(); serviceInstance.setTimeBucket(minuteTimeBucket); serviceInstance.setName(metrics.getDestServiceInstance()); @@ -198,7 +205,7 @@ public class TelemetryDataDispatcher { SOURCE_RECEIVER.receive(serviceInstance); } - private static void toServiceInstanceRelation(ServiceMeshMetric metrics, long minuteTimeBucket) { + private static void toServiceInstanceRelation(ServiceMeshMetric.Builder metrics, long minuteTimeBucket) { ServiceInstanceRelation serviceRelation = new ServiceInstanceRelation(); serviceRelation.setTimeBucket(minuteTimeBucket); serviceRelation.setSourceServiceInstanceName(metrics.getSourceServiceInstance()); @@ -218,7 +225,7 @@ public class TelemetryDataDispatcher { SOURCE_RECEIVER.receive(serviceRelation); } - private static void toEndpoint(ServiceMeshMetric metrics, long minuteTimeBucket) { + private static void toEndpoint(ServiceMeshMetric.Builder metrics, long minuteTimeBucket) { Endpoint endpoint = new Endpoint(); endpoint.setTimeBucket(minuteTimeBucket); endpoint.setName(metrics.getEndpoint()); diff --git a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/mesh/MeshDataMock.java b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/mesh/MeshDataMock.java index a3f017b..13a5927 100644 --- a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/mesh/MeshDataMock.java +++ b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/mesh/MeshDataMock.java @@ -43,9 +43,9 @@ public class MeshDataMock { meshObserver.onNext(ServiceMeshMetric.newBuilder() .setSourceServiceName("e2e-test-source-service") .setSourceServiceInstance("e2e-test-source-service-instance") - .setDestServiceName("e2e-test-dest-service") - .setDestServiceInstance("e2e-test-dest-service-instance") - .setEndpoint("e2e/test") + .setDestServiceName("Extra model column are the column defined by in the codes, These columns of model are not required logically in aggregation or further query,") + .setDestServiceInstance("Extra model column are the column defined by in the codes, These columns of model are not required logically in aggregation or further query,") + .setEndpoint("Extra model column are the column defined by in the codes, These columns of model are not required logically in aggregation or further query,") .setStartTime(System.currentTimeMillis() - 1000L) .setEndTime(System.currentTimeMillis() - 500L + i) .setLatency(2000) diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java index 9d0ef0f..664ada1 100755 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java @@ -45,6 +45,7 @@ public class TraceModuleProvider extends ModuleProvider { private final TraceServiceModuleConfig moduleConfig; private DBLatencyThresholdsAndWatcher thresholds; private UninstrumentedGatewaysConfig uninstrumentedGatewaysConfig; + private SegmentParserServiceImpl segmentParserService; public TraceModuleProvider() { this.moduleConfig = new TraceServiceModuleConfig(); @@ -74,8 +75,8 @@ public class TraceModuleProvider extends ModuleProvider { moduleConfig.setDbLatencyThresholdsAndWatcher(thresholds); moduleConfig.setUninstrumentedGatewaysConfig(uninstrumentedGatewaysConfig); - this.registerServiceImplementation( - ISegmentParserService.class, new SegmentParserServiceImpl(getManager(), listenerManager(), moduleConfig)); + segmentParserService = new SegmentParserServiceImpl(getManager(), moduleConfig); + this.registerServiceImplementation(ISegmentParserService.class, segmentParserService); } @Override @@ -93,6 +94,7 @@ public class TraceModuleProvider extends ModuleProvider { dynamicConfigurationService.registerConfigChangeWatcher(thresholds); dynamicConfigurationService.registerConfigChangeWatcher(uninstrumentedGatewaysConfig); + segmentParserService.setListenerManager(listenerManager()); grpcHandlerRegister.addHandler( new TraceSegmentReportServiceHandler(getManager(), listenerManager(), moduleConfig)); @@ -118,10 +120,10 @@ public class TraceModuleProvider extends ModuleProvider { private SegmentParserListenerManager listenerManager() { SegmentParserListenerManager listenerManager = new SegmentParserListenerManager(); if (moduleConfig.isTraceAnalysis()) { - listenerManager.add(new MultiScopesAnalysisListener.Factory()); - listenerManager.add(new NetworkAddressAliasMappingListener.Factory()); + listenerManager.add(new MultiScopesAnalysisListener.Factory(getManager())); + listenerManager.add(new NetworkAddressAliasMappingListener.Factory(getManager())); } - listenerManager.add(new SegmentAnalysisListener.Factory(moduleConfig.getSampleRate())); + listenerManager.add(new SegmentAnalysisListener.Factory(getManager(), moduleConfig)); return listenerManager; } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParserServiceImpl.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParserServiceImpl.java index 3ceda53..fe0ba12 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParserServiceImpl.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParserServiceImpl.java @@ -18,6 +18,8 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser; +import lombok.RequiredArgsConstructor; +import lombok.Setter; import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject; import org.apache.skywalking.oap.server.library.module.ModuleManager; import org.apache.skywalking.oap.server.receiver.trace.provider.TraceServiceModuleConfig; @@ -25,18 +27,12 @@ import org.apache.skywalking.oap.server.receiver.trace.provider.TraceServiceModu /** * The open service to the receivers. */ +@RequiredArgsConstructor public class SegmentParserServiceImpl implements ISegmentParserService { - private ModuleManager moduleManager; + private final ModuleManager moduleManager; + private final TraceServiceModuleConfig config; + @Setter private SegmentParserListenerManager listenerManager; - private TraceServiceModuleConfig config; - - public SegmentParserServiceImpl(ModuleManager moduleManager, - SegmentParserListenerManager listenerManager, - TraceServiceModuleConfig config) { - this.moduleManager = moduleManager; - this.listenerManager = listenerManager; - this.config = config; - } @Override public void send(SegmentObject segment) { diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SpanTags.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SpanTags.java index 0f9fef0..4f2de97 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SpanTags.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SpanTags.java @@ -19,6 +19,8 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser; public class SpanTags { + public static final String STATUS_CODE = "status_code"; + public static final String DB_STATEMENT = "db.statement"; public static final String DB_TYPE = "db.type"; 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 e6e4e97..63eaf40 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 @@ -19,8 +19,8 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair; import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject; @@ -35,6 +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.source.DatabaseSlowStatement; import org.apache.skywalking.oap.server.core.source.DetectPoint; import org.apache.skywalking.oap.server.core.source.EndpointRelation; @@ -52,24 +53,15 @@ import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SpanTags; * This listener traverses the whole segment. */ @Slf4j +@RequiredArgsConstructor public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitAnalysisListener { + private final List<SourceBuilder> entrySourceBuilders = new ArrayList<>(10); + private final List<SourceBuilder> exitSourceBuilders = new ArrayList<>(10); + private final List<DatabaseSlowStatement> slowDatabaseAccesses = new ArrayList<>(10); private final SourceReceiver sourceReceiver; - private final List<SourceBuilder> entrySourceBuilders; - private final List<SourceBuilder> exitSourceBuilders; - private final List<DatabaseSlowStatement> slowDatabaseAccesses; private final TraceServiceModuleConfig config; private final NetworkAddressAliasCache networkAddressAliasCache; - - private MultiScopesAnalysisListener(ModuleManager moduleManager, TraceServiceModuleConfig config) { - this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); - this.entrySourceBuilders = new LinkedList<>(); - this.exitSourceBuilders = new LinkedList<>(); - this.slowDatabaseAccesses = new ArrayList<>(10); - this.networkAddressAliasCache = moduleManager.find(CoreModule.NAME) - .provider() - .getService(NetworkAddressAliasCache.class); - this.config = config; - } + private final NamingLengthControl namingLengthControl; @Override public boolean containsPoint(Point point) { @@ -95,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(); + SourceBuilder sourceBuilder = new SourceBuilder(namingLengthControl); if (StringUtil.isEmpty(reference.getParentEndpoint())) { sourceBuilder.setSourceEndpointName(Const.USER_ENDPOINT_NAME); @@ -125,7 +117,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA entrySourceBuilders.add(sourceBuilder); } } else { - SourceBuilder sourceBuilder = new SourceBuilder(); + SourceBuilder sourceBuilder = new SourceBuilder(namingLengthControl); sourceBuilder.setSourceServiceName(Const.USER_SERVICE_NAME); sourceBuilder.setSourceServiceInstanceName(Const.USER_INSTANCE_NAME); sourceBuilder.setSourceEndpointName(Const.USER_ENDPOINT_NAME); @@ -152,7 +144,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA return; } - SourceBuilder sourceBuilder = new SourceBuilder(); + SourceBuilder sourceBuilder = new SourceBuilder(namingLengthControl); final String networkAddress = span.getPeer(); if (StringUtil.isEmpty(networkAddress)) { @@ -235,6 +227,16 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA sourceBuilder.setTimeBucket(TimeBucket.getMinuteTimeBucket(span.getStartTime())); sourceBuilder.setLatency((int) latency); sourceBuilder.setResponseCode(Const.NONE); + span.getTagsList().forEach(tag -> { + if (SpanTags.STATUS_CODE.equals(tag.getKey())) { + try { + sourceBuilder.setResponseCode(Integer.parseInt(tag.getValue())); + } catch (NumberFormatException e) { + log.warn("span {} has illegal status code {}", span, tag.getValue()); + } + } + }); + sourceBuilder.setStatus(!span.getIsError()); switch (span.getSpanLayer()) { @@ -293,9 +295,24 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA } public static class Factory implements AnalysisListenerFactory { + private final SourceReceiver sourceReceiver; + private final NetworkAddressAliasCache networkAddressAliasCache; + private final NamingLengthControl namingLengthControl; + + 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); + } + @Override public AnalysisListener create(ModuleManager moduleManager, TraceServiceModuleConfig config) { - return new MultiScopesAnalysisListener(moduleManager, config); + return new MultiScopesAnalysisListener( + sourceReceiver, config, networkAddressAliasCache, namingLengthControl); } } } 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 1f3cdd1..533f1cf 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 @@ -18,6 +18,7 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.skywalking.apm.network.language.agent.v3.RefType; import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject; @@ -26,6 +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.source.NetworkAddressAliasSetup; import org.apache.skywalking.oap.server.core.source.SourceReceiver; import org.apache.skywalking.oap.server.library.module.ModuleManager; @@ -40,14 +42,11 @@ import org.apache.skywalking.oap.server.receiver.trace.provider.TraceServiceModu * This is a key point of SkyWalking header propagation protocol. */ @Slf4j +@RequiredArgsConstructor public class NetworkAddressAliasMappingListener implements EntryAnalysisListener { - private final TraceServiceModuleConfig config; private final SourceReceiver sourceReceiver; - - public NetworkAddressAliasMappingListener(ModuleManager moduleManager, TraceServiceModuleConfig config) { - this.config = config; - this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); - } + private final TraceServiceModuleConfig config; + private final NamingLengthControl namingLengthControl; @Override public void parseEntry(SpanObject span, SegmentObject segmentObject) { @@ -60,7 +59,8 @@ public class NetworkAddressAliasMappingListener implements EntryAnalysisListener if (!span.getSpanLayer().equals(SpanLayer.MQ)) { span.getRefsList().forEach(segmentReference -> { if (RefType.CrossProcess.equals(segmentReference.getRefType())) { - final String networkAddressUsedAtPeer = segmentReference.getNetworkAddressUsedAtPeer(); + final String networkAddressUsedAtPeer = namingLengthControl.formatServiceName( + segmentReference.getNetworkAddressUsedAtPeer()); if (config.getUninstrumentedGatewaysConfig().isAddressConfiguredAsGateway( networkAddressUsedAtPeer)) { /* @@ -68,11 +68,15 @@ public class NetworkAddressAliasMappingListener implements EntryAnalysisListener */ return; } + final String serviceName = namingLengthControl.formatServiceName(segmentObject.getService()); + final String instanceName = namingLengthControl.formatInstanceName( + segmentObject.getServiceInstance()); + final NetworkAddressAliasSetup networkAddressAliasSetup = new NetworkAddressAliasSetup(); networkAddressAliasSetup.setAddress(networkAddressUsedAtPeer); - networkAddressAliasSetup.setRepresentService(segmentObject.getService()); + networkAddressAliasSetup.setRepresentService(serviceName); networkAddressAliasSetup.setRepresentServiceNodeType(NodeType.Normal); - networkAddressAliasSetup.setRepresentServiceInstance(segmentObject.getServiceInstance()); + networkAddressAliasSetup.setRepresentServiceInstance(instanceName); networkAddressAliasSetup.setTimeBucket(TimeBucket.getMinuteTimeBucket(span.getStartTime())); sourceReceiver.receive(networkAddressAliasSetup); @@ -92,10 +96,19 @@ public class NetworkAddressAliasMappingListener implements EntryAnalysisListener } public static class Factory implements AnalysisListenerFactory { + private final SourceReceiver sourceReceiver; + private final NamingLengthControl namingLengthControl; + + public Factory(ModuleManager moduleManager) { + this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); + this.namingLengthControl = moduleManager.find(CoreModule.NAME) + .provider() + .getService(NamingLengthControl.class); + } @Override public AnalysisListener create(ModuleManager moduleManager, TraceServiceModuleConfig config) { - return new NetworkAddressAliasMappingListener(moduleManager, config); + return new NetworkAddressAliasMappingListener(sourceReceiver, config, namingLengthControl); } } } 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 22f31e5..bd148c6 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 @@ -18,6 +18,7 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject; import org.apache.skywalking.apm.network.language.agent.v3.SpanObject; @@ -27,6 +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.source.Segment; import org.apache.skywalking.oap.server.core.source.SourceReceiver; import org.apache.skywalking.oap.server.library.module.ModuleManager; @@ -37,9 +39,12 @@ import org.apache.skywalking.oap.server.receiver.trace.provider.TraceServiceModu * SegmentSpanListener forwards the segment raw data to the persistence layer with the query required conditions. */ @Slf4j +@RequiredArgsConstructor public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnalysisListener, SegmentListener { private final SourceReceiver sourceReceiver; private final TraceSegmentSampler sampler; + private final NamingLengthControl namingLengthControl; + private final Segment segment = new Segment(); private SAMPLE_STATUS sampleStatus = SAMPLE_STATUS.UNKNOWN; private String serviceId = Const.EMPTY_STRING; @@ -50,11 +55,6 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal private int duration; private boolean isError; - private SegmentAnalysisListener(ModuleManager moduleManager, TraceSegmentSampler sampler) { - this.sampler = sampler; - this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); - } - @Override public boolean containsPoint(Point point) { return Point.First.equals(point) || Point.Entry.equals(point) || Point.Segment.equals(point); @@ -68,7 +68,9 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal if (StringUtil.isEmpty(serviceId)) { serviceId = IDManager.ServiceID.buildId( - segmentObject.getService(), NodeType.Normal); + namingLengthControl.formatServiceName(segmentObject.getService()), + NodeType.Normal + ); } long timeBucket = TimeBucket.getRecordTimeBucket(startTimestamp); @@ -77,7 +79,7 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal segment.setServiceId(serviceId); segment.setServiceInstanceId(IDManager.ServiceInstanceID.buildId( serviceId, - segmentObject.getServiceInstance() + namingLengthControl.formatInstanceName(segmentObject.getServiceInstance()) )); segment.setLatency(duration); segment.setStartTime(startTimestamp); @@ -87,11 +89,12 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal segment.setDataBinary(segmentObject.toByteArray()); segment.setVersion(3); + endpointName = namingLengthControl.formatEndpointName(span.getOperationName()); endpointId = IDManager.EndpointID.buildId( serviceId, - span.getOperationName() + endpointName ); - endpointName = span.getOperationName(); + } @Override @@ -106,7 +109,11 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal span.getOperationName() ); - endpointName = span.getOperationName(); + endpointName = namingLengthControl.formatEndpointName(span.getOperationName()); + endpointId = IDManager.EndpointID.buildId( + serviceId, + endpointName + ); } @Override @@ -160,15 +167,21 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal } public static class Factory implements AnalysisListenerFactory { + private final SourceReceiver sourceReceiver; private final TraceSegmentSampler sampler; - - public Factory(int segmentSamplingRate) { - this.sampler = new TraceSegmentSampler(segmentSamplingRate); + private final NamingLengthControl namingLengthControl; + + 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); } @Override public AnalysisListener create(ModuleManager moduleManager, TraceServiceModuleConfig config) { - return new SegmentAnalysisListener(moduleManager, sampler); + return new SegmentAnalysisListener(sourceReceiver, sampler, namingLengthControl); } } } 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 542e5d5..fcf1dc6 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 @@ -19,45 +19,74 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener; import lombok.Getter; +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.source.All; import org.apache.skywalking.oap.server.core.source.DatabaseAccess; import org.apache.skywalking.oap.server.core.source.DetectPoint; import org.apache.skywalking.oap.server.core.source.Endpoint; import org.apache.skywalking.oap.server.core.source.EndpointRelation; -import org.apache.skywalking.oap.server.core.analysis.NodeType; import org.apache.skywalking.oap.server.core.source.RequestType; import org.apache.skywalking.oap.server.core.source.Service; import org.apache.skywalking.oap.server.core.source.ServiceInstance; import org.apache.skywalking.oap.server.core.source.ServiceInstanceRelation; import org.apache.skywalking.oap.server.core.source.ServiceRelation; +@RequiredArgsConstructor class SourceBuilder { + private final NamingLengthControl namingLengthControl; + @Getter - @Setter private String sourceServiceName; + + public void setSourceServiceName(final String sourceServiceName) { + this.sourceServiceName = namingLengthControl.formatServiceName(sourceServiceName); + } + @Getter @Setter private NodeType sourceNodeType; @Getter - @Setter private String sourceServiceInstanceName; + + public void setSourceServiceInstanceName(final String sourceServiceInstanceName) { + this.sourceServiceInstanceName = namingLengthControl.formatInstanceName(sourceServiceInstanceName); + } + @Getter - @Setter private String sourceEndpointName; + + public void setSourceEndpointName(final String sourceEndpointName) { + this.sourceEndpointName = namingLengthControl.formatEndpointName(sourceEndpointName); + } + @Getter - @Setter private String destServiceName; + + public void setDestServiceName(final String destServiceName) { + this.destServiceName = namingLengthControl.formatServiceName(destServiceName); + } + @Getter @Setter private NodeType destNodeType; @Getter - @Setter private String destServiceInstanceName; + + public void setDestServiceInstanceName(final String destServiceInstanceName) { + this.destServiceInstanceName = namingLengthControl.formatServiceName(destServiceInstanceName); + } + @Getter - @Setter private String destEndpointName; + + public void setDestEndpointName(final String destEndpointName) { + this.destEndpointName = namingLengthControl.formatEndpointName(destEndpointName); + } + @Getter @Setter private int componentId; 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 218ab38..04413b9 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 @@ -30,6 +30,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.profile.ProfileTaskMutationService; import org.apache.skywalking.oap.server.core.query.AggregationQueryService; import org.apache.skywalking.oap.server.core.query.AlarmQueryService; @@ -92,6 +93,8 @@ public class MockCoreModuleProvider extends CoreModuleProvider { @Override public void prepare() throws ServiceNotProvidedException, ModuleStartException { + this.registerServiceImplementation(NamingLengthControl.class, new NamingLengthControl(50, 50, 150)); + MockStreamAnnotationListener streamAnnotationListener = new MockStreamAnnotationListener(getManager()); annotationScan.registerListener(streamAnnotationListener);
