Set up restrict length rules for service, instance and endpoint (#4633)

* Set up restrict length rules for service, instance and endpoint

* Adjust two env names.
This commit is contained in:
吴晟 Wu Sheng 2020-04-10 17:59:21 +08:00 committed by GitHub
parent 6fe2041b47
commit 44cae97c25
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 413 additions and 588 deletions

View File

@ -62,10 +62,10 @@ public class StringFormatGroup {
public FormatResult format(String string) { public FormatResult format(String string) {
for (PatternRule rule : rules) { for (PatternRule rule : rules) {
if (rule.getPattern().matcher(string).matches()) { 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 @Getter
@ -73,6 +73,7 @@ public class StringFormatGroup {
public static class FormatResult { public static class FormatResult {
private final boolean match; private final boolean match;
private final String name; private final String name;
private final String replacedName;
} }
@Getter @Getter

View File

@ -39,7 +39,6 @@
<outputDirectory>/config</outputDirectory> <outputDirectory>/config</outputDirectory>
<includes> <includes>
<include>log4j2.xml</include> <include>log4j2.xml</include>
<include>application.yml</include>
<include>alarm-settings.yml</include> <include>alarm-settings.yml</include>
<include>alarm-settings-sample.yml</include> <include>alarm-settings-sample.yml</include>
</includes> </includes>
@ -47,6 +46,7 @@
<fileSet> <fileSet>
<directory>${project.basedir}/../oap-server/server-bootstrap/src/main/resources</directory> <directory>${project.basedir}/../oap-server/server-bootstrap/src/main/resources</directory>
<includes> <includes>
<include>application.yml</include>
<include>component-libraries.yml</include> <include>component-libraries.yml</include>
<include>official_analysis.oal</include> <include>official_analysis.oal</include>
<include>gateways.yml</include> <include>gateways.yml</include>

View File

@ -39,7 +39,6 @@
<outputDirectory>/config</outputDirectory> <outputDirectory>/config</outputDirectory>
<includes> <includes>
<include>log4j2.xml</include> <include>log4j2.xml</include>
<include>application.yml</include>
<include>alarm-settings.yml</include> <include>alarm-settings.yml</include>
<include>alarm-settings-sample.yml</include> <include>alarm-settings-sample.yml</include>
</includes> </includes>
@ -47,6 +46,7 @@
<fileSet> <fileSet>
<directory>${project.basedir}/../oap-server/server-bootstrap/src/main/resources</directory> <directory>${project.basedir}/../oap-server/server-bootstrap/src/main/resources</directory>
<includes> <includes>
<include>application.yml</include>
<include>component-libraries.yml</include> <include>component-libraries.yml</include>
<include>official_analysis.oal</include> <include>official_analysis.oal</include>
<include>gateways.yml</include> <include>gateways.yml</include>

View File

@ -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}

View File

@ -41,7 +41,7 @@ storage:
# other configurations # 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. **`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. **`default`** is the default implementor of core module.
1. `driver`, `url`, ... `metadataQueryMaxSize` are all setting items of the implementor. 1. `driver`, `url`, ... `metadataQueryMaxSize` are all setting items of the implementor.

View File

@ -72,13 +72,13 @@ This is the properties list supported in `agent/config/agent.config`.
property key | Description | Default | property key | Description | Default |
----------- | ---------- | --------- | ----------- | ---------- | --------- |
`agent.namespace` | Namespace isolates headers in cross process propagation. The HEADER name will be `HeaderName:Namespace`. | Not set | `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.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.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.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.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.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.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.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`| `agent.force_reconnection_period `|Force reconnection period of grpc, based on grpc_channel_check_interval.|`1`|

View File

@ -231,7 +231,6 @@
<exclude>log4j2.xml</exclude> <exclude>log4j2.xml</exclude>
<exclude>alarm-settings.yml</exclude> <exclude>alarm-settings.yml</exclude>
<exclude>component-libraries.yml</exclude> <exclude>component-libraries.yml</exclude>
<exclude>endpoint_naming_rules.properties</exclude>
<exclude>official_analysis.oal</exclude> <exclude>official_analysis.oal</exclude>
<exclude>gateways.yml</exclude> <exclude>gateways.yml</exclude>
<exclude>service-apdex-threshold.yml</exclude> <exclude>service-apdex-threshold.yml</exclude>

View File

@ -81,9 +81,11 @@ core:
# and it will cause more load for memory, network of OAP and storage. # 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. # 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} activeExtraModelColumns: ${SW_CORE_ACTIVE_EXTRA_MODEL_COLUMNS:false}
# The max length of the endpoint name. # The max length of service + instance names should be less than 200
# In the current practice, we don't recommend the length over 190. serviceNameMaxLength: ${SW_SERVICE_NAME_MAX_LENGTH:70}
endpointNameMaxLength: ${SW_CORE_ENDPOINT_NAME_MAX_LENGTH:150} instanceNameMaxLength: ${SW_INSTANCE_NAME_MAX_LENGTH:70}
# The max length of service + endpoint names should be less than 240
endpointNameMaxLength: ${SW_ENDPOINT_NAME_MAX_LENGTH:150}
storage: storage:
selector: ${SW_STORAGE:h2} selector: ${SW_STORAGE:h2}
elasticsearch: elasticsearch:
@ -248,19 +250,19 @@ configuration:
# Nacos Configuration namespace # Nacos Configuration namespace
namespace: '' namespace: ''
# Unit seconds, sync period. Default fetch every 60 seconds. # 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. # the name of current cluster, set the name if you want to upstream system known.
clusterName: "default" clusterName: "default"
zookeeper: 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 nameSpace: /default
hostPort: localhost:2181 hostPort: localhost:2181
# Retry Policy # Retry Policy
baseSleepTimeMs: 1000 # initial amount of time to wait between retries baseSleepTimeMs: 1000 # initial amount of time to wait between retries
maxRetries: 3 # max number of times to retry maxRetries: 3 # max number of times to retry
etcd: etcd:
period : 60 # Unit seconds, sync period. Default fetch every 60 seconds. period: 60 # Unit seconds, sync period. Default fetch every 60 seconds.
group : 'skywalking' group: 'skywalking'
serverAddr: localhost:2379 serverAddr: localhost:2379
clusterName: "default" clusterName: "default"
consul: consul:

View File

@ -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/.*

View File

@ -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.ConfigService;
import org.apache.skywalking.oap.server.core.config.DownSamplingConfigService; 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.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.profile.ProfileTaskMutationService;
import org.apache.skywalking.oap.server.core.query.AggregationQueryService; import org.apache.skywalking.oap.server.core.query.AggregationQueryService;
import org.apache.skywalking.oap.server.core.query.AlarmQueryService; 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 class CoreModule extends ModuleDefine {
public static final String NAME = "core"; public static final String NAME = "core";
private static int ENDPOINT_NAME_MAX_LENGTH = 150;
public CoreModule() { public CoreModule() {
super(NAME); super(NAME);
@ -64,6 +64,7 @@ public class CoreModule extends ModuleDefine {
List<Class> classes = new ArrayList<>(); List<Class> classes = new ArrayList<>();
classes.add(ConfigService.class); classes.add(ConfigService.class);
classes.add(DownSamplingConfigService.class); classes.add(DownSamplingConfigService.class);
classes.add(NamingLengthControl.class);
classes.add(IComponentLibraryCatalogService.class); classes.add(IComponentLibraryCatalogService.class);
classes.add(IWorkerInstanceGetter.class); classes.add(IWorkerInstanceGetter.class);
@ -81,26 +82,6 @@ public class CoreModule extends ModuleDefine {
return classes.toArray(new Class[] {}); 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) { private void addProfileService(List<Class> classes) {
classes.add(ProfileTaskMutationService.class); classes.add(ProfileTaskMutationService.class);
classes.add(ProfileTaskQueryService.class); classes.add(ProfileTaskQueryService.class);

View File

@ -21,72 +21,55 @@ package org.apache.skywalking.oap.server.core;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import lombok.Getter; import lombok.Getter;
import lombok.Setter;
import org.apache.skywalking.oap.server.core.source.ScopeDefaultColumn; import org.apache.skywalking.oap.server.core.source.ScopeDefaultColumn;
import org.apache.skywalking.oap.server.library.module.ModuleConfig; import org.apache.skywalking.oap.server.library.module.ModuleConfig;
@Getter @Getter
public class CoreModuleConfig extends ModuleConfig { public class CoreModuleConfig extends ModuleConfig {
@Setter
private String role = "Mixed"; private String role = "Mixed";
@Setter
private String nameSpace; private String nameSpace;
@Setter
private String restHost; private String restHost;
@Setter
private int restPort; private int restPort;
@Setter
private int jettySelectors = 1; private int jettySelectors = 1;
@Setter
private String restContextPath; private String restContextPath;
@Setter
private String gRPCHost; private String gRPCHost;
@Setter
private int gRPCPort; private int gRPCPort;
@Setter
private boolean gRPCSslEnabled = false; private boolean gRPCSslEnabled = false;
@Setter
private String gRPCSslKeyPath; private String gRPCSslKeyPath;
@Setter
private String gRPCSslCertChainPath; private String gRPCSslCertChainPath;
@Setter
private String gRPCSslTrustedCAPath; private String gRPCSslTrustedCAPath;
@Setter
private int maxConcurrentCallsPerConnection; private int maxConcurrentCallsPerConnection;
@Setter
private int maxMessageSize; private int maxMessageSize;
@Setter
private boolean enableDatabaseSession; private boolean enableDatabaseSession;
@Setter
private int topNReportPeriod; private int topNReportPeriod;
private final List<String> downsampling; private final List<String> downsampling;
/** /**
* The period of doing data persistence. Unit is second. * The period of doing data persistence. Unit is second.
*/ */
@Setter
private long persistentPeriod = 3; private long persistentPeriod = 3;
@Setter
private boolean enableDataKeeperExecutor = true; private boolean enableDataKeeperExecutor = true;
@Setter
private int dataKeeperExecutePeriod = 5; private int dataKeeperExecutePeriod = 5;
/** /**
* The time to live of all metrics data. Unit is day. * The time to live of all metrics data. Unit is day.
*/ */
@Setter
private int metricsDataTTL = 3; private int metricsDataTTL = 3;
/** /**
* The time to live of all record data, including tracing. Unit is Day. * The time to live of all record data, including tracing. Unit is Day.
*/ */
@Setter
private int recordDataTTL = 7; private int recordDataTTL = 7;
@Setter
private int gRPCThreadPoolSize; private int gRPCThreadPoolSize;
@Setter
private int gRPCThreadPoolQueueSize; private int gRPCThreadPoolQueueSize;
/** /**
* Timeout for cluster internal communication, in seconds. * Timeout for cluster internal communication, in seconds.
*/ */
@Setter
private int remoteTimeout = 20; private int remoteTimeout = 20;
/** /**
* The size of network address alias. * The size of network address alias.
@ -113,6 +96,14 @@ public class CoreModuleConfig extends ModuleConfig {
* tool, such as Kibana->ES, to query the data by themselves. * tool, such as Kibana->ES, to query the data by themselves.
*/ */
private boolean activeExtraModelColumns = false; 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. * The max length of the endpoint name.
* *

View File

@ -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.ConfigService;
import org.apache.skywalking.oap.server.core.config.DownSamplingConfigService; 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.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.OALEngine;
import org.apache.skywalking.oap.server.core.oal.rt.OALEngineLoader; import org.apache.skywalking.oap.server.core.oal.rt.OALEngineLoader;
import org.apache.skywalking.oap.server.core.profile.ProfileTaskMutationService; import org.apache.skywalking.oap.server.core.profile.ProfileTaskMutationService;
@ -131,9 +132,11 @@ public class CoreModuleProvider extends ModuleProvider {
if (moduleConfig.isActiveExtraModelColumns()) { if (moduleConfig.isActiveExtraModelColumns()) {
DefaultScopeDefine.activeExtraModelColumns(); DefaultScopeDefine.activeExtraModelColumns();
} }
if (moduleConfig.getEndpointNameMaxLength() > 0) { this.registerServiceImplementation(NamingLengthControl.class, new NamingLengthControl(
CoreModule.setEndpointNameMaxLength(moduleConfig.getEndpointNameMaxLength()); moduleConfig.getServiceNameMaxLength(),
} moduleConfig.getInstanceNameMaxLength(),
moduleConfig.getEndpointNameMaxLength()
));
StreamAnnotationListener streamAnnotationListener = new StreamAnnotationListener(getManager()); StreamAnnotationListener streamAnnotationListener = new StreamAnnotationListener(getManager());

View File

@ -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;
}
}
}

View File

@ -20,8 +20,8 @@ package org.apache.skywalking.oap.server.core.source;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.util.StringUtil; 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.IDManager;
import org.apache.skywalking.oap.server.core.analysis.NodeType; 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) @ScopeDeclaration(id = ENDPOINT, name = "Endpoint", catalog = ENDPOINT_CATALOG_NAME)
@ScopeDefaultColumn.VirtualColumnDefinition(fieldName = "entityId", columnName = "entity_id", isID = true, type = String.class) @ScopeDefaultColumn.VirtualColumnDefinition(fieldName = "entityId", columnName = "entity_id", isID = true, type = String.class)
@Slf4j
public class Endpoint extends Source { public class Endpoint extends Source {
private String entityId; private String entityId;
@ -47,13 +48,9 @@ public class Endpoint extends Source {
} }
@Getter @Getter
@Setter
@ScopeDefaultColumn.DefinedByField(columnName = "name", requireDynamicActive = true) @ScopeDefaultColumn.DefinedByField(columnName = "name", requireDynamicActive = true)
private String name; private String name;
public void setName(final String name) {
this.name = CoreModule.formatEndpointName(name);
}
@Getter @Getter
@ScopeDefaultColumn.DefinedByField(columnName = "service_id") @ScopeDefaultColumn.DefinedByField(columnName = "service_id")
private String serviceId; private String serviceId;

View File

@ -20,7 +20,6 @@ package org.apache.skywalking.oap.server.core.source;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; 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.IDManager;
import org.apache.skywalking.oap.server.core.analysis.NodeType; import org.apache.skywalking.oap.server.core.analysis.NodeType;
@ -43,13 +42,10 @@ public class EndpointRelation extends Source {
} }
@Getter @Getter
@Setter
@ScopeDefaultColumn.DefinedByField(columnName = "source_endpoint_name") @ScopeDefaultColumn.DefinedByField(columnName = "source_endpoint_name")
private String endpoint; private String endpoint;
public void setEndpoint(final String endpoint) {
this.endpoint = CoreModule.formatEndpointName(endpoint);
}
@Getter @Getter
@ScopeDefaultColumn.DefinedByField(columnName = "service_id") @ScopeDefaultColumn.DefinedByField(columnName = "service_id")
private String serviceId; private String serviceId;
@ -63,13 +59,9 @@ public class EndpointRelation extends Source {
@Setter @Setter
private String serviceInstanceName; private String serviceInstanceName;
@Getter @Getter
@Setter
@ScopeDefaultColumn.DefinedByField(columnName = "child_endpoint_name") @ScopeDefaultColumn.DefinedByField(columnName = "child_endpoint_name")
private String childEndpoint; private String childEndpoint;
public void setChildEndpoint(final String childEndpoint) {
this.childEndpoint = CoreModule.formatEndpointName(childEndpoint);
}
@Getter @Getter
@ScopeDefaultColumn.DefinedByField(columnName = "child_service_id") @ScopeDefaultColumn.DefinedByField(columnName = "child_service_id")
private String childServiceId; private String childServiceId;

View File

@ -26,6 +26,6 @@ public class CoreModuleTest {
public void testOpenServiceList() { public void testOpenServiceList() {
CoreModule coreModule = new CoreModule(); CoreModule coreModule = new CoreModule();
Assert.assertEquals(26, coreModule.services().length); Assert.assertEquals(27, coreModule.services().length);
} }
} }

View File

@ -209,7 +209,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
if (downstreamService.equals(ServiceMetaInfo.UNKNOWN)) { if (downstreamService.equals(ServiceMetaInfo.UNKNOWN)) {
// Ingress -> sidecar(server side) // Ingress -> sidecar(server side)
// Mesh telemetry without source, the relation would be generated. // Mesh telemetry without source, the relation would be generated.
ServiceMeshMetric metric = ServiceMeshMetric.newBuilder() ServiceMeshMetric.Builder metric = ServiceMeshMetric.newBuilder()
.setStartTime(startTime) .setStartTime(startTime)
.setEndTime(startTime + duration) .setEndTime(startTime + duration)
.setDestServiceName(localService.getServiceName()) .setDestServiceName(localService.getServiceName())
@ -219,14 +219,13 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
.setResponseCode(Math.toIntExact(responseCode)) .setResponseCode(Math.toIntExact(responseCode))
.setStatus(status) .setStatus(status)
.setProtocol(protocol) .setProtocol(protocol)
.setDetectPoint(DetectPoint.server) .setDetectPoint(DetectPoint.server);
.build();
logger.debug("Transformed ingress->sidecar inbound mesh metric {}", metric); logger.debug("Transformed ingress->sidecar inbound mesh metric {}", metric);
forward(metric); forward(metric);
} else { } else {
// sidecar -> sidecar(server side) // sidecar -> sidecar(server side)
ServiceMeshMetric metric = ServiceMeshMetric.newBuilder() ServiceMeshMetric.Builder metric = ServiceMeshMetric.newBuilder()
.setStartTime(startTime) .setStartTime(startTime)
.setEndTime(startTime + duration) .setEndTime(startTime + duration)
.setSourceServiceName(downstreamService.getServiceName()) .setSourceServiceName(downstreamService.getServiceName())
@ -238,8 +237,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
.setResponseCode(Math.toIntExact(responseCode)) .setResponseCode(Math.toIntExact(responseCode))
.setStatus(status) .setStatus(status)
.setProtocol(protocol) .setProtocol(protocol)
.setDetectPoint(DetectPoint.server) .setDetectPoint(DetectPoint.server);
.build();
logger.debug("Transformed sidecar->sidecar(server side) inbound mesh metric {}", metric); logger.debug("Transformed sidecar->sidecar(server side) inbound mesh metric {}", metric);
forward(metric); forward(metric);
@ -251,7 +249,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
.getAddress(), upstreamRemoteAddress.getSocketAddress() .getAddress(), upstreamRemoteAddress.getSocketAddress()
.getPortValue()); .getPortValue());
ServiceMeshMetric metric = ServiceMeshMetric.newBuilder() ServiceMeshMetric.Builder metric = ServiceMeshMetric.newBuilder()
.setStartTime(startTime) .setStartTime(startTime)
.setEndTime(startTime + duration) .setEndTime(startTime + duration)
.setSourceServiceName(downstreamService.getServiceName()) .setSourceServiceName(downstreamService.getServiceName())
@ -263,8 +261,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
.setResponseCode(Math.toIntExact(responseCode)) .setResponseCode(Math.toIntExact(responseCode))
.setStatus(status) .setStatus(status)
.setProtocol(protocol) .setProtocol(protocol)
.setDetectPoint(DetectPoint.client) .setDetectPoint(DetectPoint.client);
.build();
logger.debug("Transformed sidecar->sidecar(server side) inbound mesh metric {}", metric); logger.debug("Transformed sidecar->sidecar(server side) inbound mesh metric {}", metric);
forward(metric); forward(metric);
@ -312,7 +309,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
} }
boolean status = responseCode >= 200 && responseCode < 400; boolean status = responseCode >= 200 && responseCode < 400;
ServiceMeshMetric metric = ServiceMeshMetric.newBuilder() ServiceMeshMetric.Builder metric = ServiceMeshMetric.newBuilder()
.setStartTime(startTime) .setStartTime(startTime)
.setEndTime(startTime + duration) .setEndTime(startTime + duration)
.setSourceServiceName(outside.getServiceName()) .setSourceServiceName(outside.getServiceName())
@ -324,8 +321,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
.setResponseCode(Math.toIntExact(responseCode)) .setResponseCode(Math.toIntExact(responseCode))
.setStatus(status) .setStatus(status)
.setProtocol(protocol) .setProtocol(protocol)
.setDetectPoint(DetectPoint.server) .setDetectPoint(DetectPoint.server);
.build();
logger.debug("Transformed ingress inbound mesh metric {}", metric); logger.debug("Transformed ingress inbound mesh metric {}", metric);
forward(metric); forward(metric);
@ -337,7 +333,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
long outboundStartTime = startTime + formatAsLong(properties.getTimeToFirstUpstreamTxByte()); long outboundStartTime = startTime + formatAsLong(properties.getTimeToFirstUpstreamTxByte());
long outboundEndTime = startTime + formatAsLong(properties.getTimeToLastUpstreamRxByte()); long outboundEndTime = startTime + formatAsLong(properties.getTimeToLastUpstreamRxByte());
ServiceMeshMetric outboundMetric = ServiceMeshMetric.newBuilder() ServiceMeshMetric.Builder outboundMetric = ServiceMeshMetric.newBuilder()
.setStartTime(outboundStartTime) .setStartTime(outboundStartTime)
.setEndTime(outboundEndTime) .setEndTime(outboundEndTime)
.setSourceServiceName(ingress.getServiceName()) .setSourceServiceName(ingress.getServiceName())
@ -349,8 +345,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
.setResponseCode(Math.toIntExact(responseCode)) .setResponseCode(Math.toIntExact(responseCode))
.setStatus(status) .setStatus(status)
.setProtocol(protocol) .setProtocol(protocol)
.setDetectPoint(DetectPoint.client) .setDetectPoint(DetectPoint.client);
.build();
logger.debug("Transformed ingress outbound mesh metric {}", outboundMetric); logger.debug("Transformed ingress outbound mesh metric {}", outboundMetric);
forward(outboundMetric); forward(outboundMetric);
@ -391,7 +386,7 @@ public class K8sALSServiceMeshHTTPAnalysis implements ALSHTTPAnalysis {
return ServiceMetaInfo.UNKNOWN; return ServiceMetaInfo.UNKNOWN;
} }
protected void forward(ServiceMeshMetric metric) { protected void forward(ServiceMeshMetric.Builder metric) {
TelemetryDataDispatcher.process(metric); TelemetryDataDispatcher.process(metric);
} }

View File

@ -76,12 +76,12 @@ public class K8sHTTPAnalysisTest {
Assert.assertEquals(2, analysis.metrics.size()); 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("UNKNOWN", incoming.getSourceServiceName());
Assert.assertEquals("ingress", incoming.getDestServiceName()); Assert.assertEquals("ingress", incoming.getDestServiceName());
Assert.assertEquals(DetectPoint.server, incoming.getDetectPoint()); 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("ingress", outgoing.getSourceServiceName());
Assert.assertEquals("productpage", outgoing.getDestServiceName()); Assert.assertEquals("productpage", outgoing.getDestServiceName());
Assert.assertEquals(DetectPoint.client, outgoing.getDetectPoint()); Assert.assertEquals(DetectPoint.client, outgoing.getDetectPoint());
@ -99,7 +99,7 @@ public class K8sHTTPAnalysisTest {
Assert.assertEquals(1, analysis.metrics.size()); 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("", incoming.getSourceServiceName());
Assert.assertEquals("productpage", incoming.getDestServiceName()); Assert.assertEquals("productpage", incoming.getDestServiceName());
Assert.assertEquals(DetectPoint.server, incoming.getDetectPoint()); Assert.assertEquals(DetectPoint.server, incoming.getDetectPoint());
@ -117,7 +117,7 @@ public class K8sHTTPAnalysisTest {
Assert.assertEquals(1, analysis.metrics.size()); 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("productpage", incoming.getSourceServiceName());
Assert.assertEquals("review", incoming.getDestServiceName()); Assert.assertEquals("review", incoming.getDestServiceName());
Assert.assertEquals(DetectPoint.server, incoming.getDetectPoint()); Assert.assertEquals(DetectPoint.server, incoming.getDetectPoint());
@ -135,7 +135,7 @@ public class K8sHTTPAnalysisTest {
Assert.assertEquals(1, analysis.metrics.size()); 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("productpage", incoming.getSourceServiceName());
Assert.assertEquals("detail", incoming.getDestServiceName()); Assert.assertEquals("detail", incoming.getDestServiceName());
Assert.assertEquals(DetectPoint.client, incoming.getDetectPoint()); Assert.assertEquals(DetectPoint.client, incoming.getDetectPoint());
@ -143,7 +143,7 @@ public class K8sHTTPAnalysisTest {
} }
public static class MockK8sAnalysis extends K8sALSServiceMeshHTTPAnalysis { public static class MockK8sAnalysis extends K8sALSServiceMeshHTTPAnalysis {
private List<ServiceMeshMetric> metrics = new ArrayList<>(); private List<ServiceMeshMetric.Builder> metrics = new ArrayList<>();
@Override @Override
public void init(EnvoyMetricReceiverConfig config) { public void init(EnvoyMetricReceiverConfig config) {
@ -156,7 +156,7 @@ public class K8sHTTPAnalysisTest {
} }
@Override @Override
protected void forward(ServiceMeshMetric metric) { protected void forward(ServiceMeshMetric.Builder metric) {
metrics.add(metric); metrics.add(metric);
} }
} }

View File

@ -19,37 +19,42 @@
package org.apache.skywalking.oap.server.receiver.clr.provider.handler; package org.apache.skywalking.oap.server.receiver.clr.provider.handler;
import io.grpc.stub.StreamObserver; 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.common.v3.Commands;
import org.apache.skywalking.apm.network.language.agent.v3.CLRMetricCollection; import org.apache.skywalking.apm.network.language.agent.v3.CLRMetricCollection;
import org.apache.skywalking.apm.network.language.agent.v3.CLRMetricReportServiceGrpc; 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.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler; 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 { public class CLRMetricReportServiceHandler extends CLRMetricReportServiceGrpc.CLRMetricReportServiceImplBase implements GRPCHandler {
private static final Logger logger = LoggerFactory.getLogger(CLRMetricReportServiceHandler.class);
private final CLRSourceDispatcher clrSourceDispatcher; private final CLRSourceDispatcher clrSourceDispatcher;
private final NamingLengthControl namingLengthControl;
public CLRMetricReportServiceHandler(ModuleManager moduleManager) { public CLRMetricReportServiceHandler(ModuleManager moduleManager) {
clrSourceDispatcher = new CLRSourceDispatcher(moduleManager); clrSourceDispatcher = new CLRSourceDispatcher(moduleManager);
this.namingLengthControl = moduleManager.find(CoreModule.NAME)
.provider()
.getService(NamingLengthControl.class);
} }
@Override @Override
public void collect(CLRMetricCollection request, StreamObserver<Commands> responseObserver) { public void collect(CLRMetricCollection request, StreamObserver<Commands> responseObserver) {
if (logger.isDebugEnabled()) { if (log.isDebugEnabled()) {
logger.debug("receive the clr metrics from service instance, id: {}", request.getServiceInstance()); 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 -> { request.getMetricsList().forEach(metrics -> {
long minuteTimeBucket = TimeBucket.getMinuteTimeBucket(metrics.getTime()); 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()); responseObserver.onNext(Commands.newBuilder().build());

View File

@ -117,7 +117,7 @@ public class IstioTelemetryGRPCHandler extends HandleMetricServiceGrpc.HandleMet
destServiceName = string(i, "destinationService"); destServiceName = string(i, "destinationService");
} }
ServiceMeshMetric metrics = ServiceMeshMetric.newBuilder() ServiceMeshMetric.Builder metrics = ServiceMeshMetric.newBuilder()
.setStartTime(requestTime.toEpochMilli()) .setStartTime(requestTime.toEpochMilli())
.setEndTime(responseTime.toEpochMilli()) .setEndTime(responseTime.toEpochMilli())
.setSourceServiceName(sourceServiceName) .setSourceServiceName(sourceServiceName)
@ -129,8 +129,7 @@ public class IstioTelemetryGRPCHandler extends HandleMetricServiceGrpc.HandleMet
.setResponseCode(Math.toIntExact(responseCode)) .setResponseCode(Math.toIntExact(responseCode))
.setStatus(status) .setStatus(status)
.setProtocol(netProtocol) .setProtocol(netProtocol)
.setDetectPoint(detectPoint) .setDetectPoint(detectPoint);
.build();
logger.debug("Transformed metrics {}", metrics); logger.debug("Transformed metrics {}", metrics);
TelemetryDataDispatcher.process(metrics); TelemetryDataDispatcher.process(metrics);

View File

@ -23,15 +23,21 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.network.common.v3.Commands; 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.JVMMetricCollection;
import org.apache.skywalking.apm.network.language.agent.v3.JVMMetricReportServiceGrpc; 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.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler; import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler;
@Slf4j @Slf4j
public class JVMMetricReportServiceHandler extends JVMMetricReportServiceGrpc.JVMMetricReportServiceImplBase implements GRPCHandler { public class JVMMetricReportServiceHandler extends JVMMetricReportServiceGrpc.JVMMetricReportServiceImplBase implements GRPCHandler {
private final JVMSourceDispatcher jvmSourceDispatcher; private final JVMSourceDispatcher jvmSourceDispatcher;
private final NamingLengthControl namingLengthControl;
public JVMMetricReportServiceHandler(ModuleManager moduleManager) { public JVMMetricReportServiceHandler(ModuleManager moduleManager) {
this.jvmSourceDispatcher = new JVMSourceDispatcher(moduleManager); this.jvmSourceDispatcher = new JVMSourceDispatcher(moduleManager);
this.namingLengthControl = moduleManager.find(CoreModule.NAME)
.provider()
.getService(NamingLengthControl.class);
} }
@Override @Override
@ -43,9 +49,12 @@ public class JVMMetricReportServiceHandler extends JVMMetricReportServiceGrpc.JV
request.getServiceInstance() request.getServiceInstance()
); );
} }
final JVMMetricCollection.Builder builder = request.toBuilder();
builder.setService(namingLengthControl.formatServiceName(builder.getService()));
builder.setServiceInstance(namingLengthControl.formatInstanceName(builder.getServiceInstance()));
request.getMetricsList().forEach(jvmMetric -> { builder.getMetricsList().forEach(jvmMetric -> {
jvmSourceDispatcher.sendMetric(request.getService(), request.getServiceInstance(), jvmMetric); jvmSourceDispatcher.sendMetric(builder.getService(), builder.getServiceInstance(), jvmMetric);
}); });
responseObserver.onNext(Commands.newBuilder().build()); responseObserver.onNext(Commands.newBuilder().build());

View File

@ -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.NodeType;
import org.apache.skywalking.oap.server.core.analysis.TimeBucket; 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.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.ServiceInstanceUpdate;
import org.apache.skywalking.oap.server.core.source.ServiceUpdate; import org.apache.skywalking.oap.server.core.source.ServiceUpdate;
import org.apache.skywalking.oap.server.core.source.SourceReceiver; 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 { public class ManagementServiceHandler extends ManagementServiceGrpc.ManagementServiceImplBase implements GRPCHandler {
private final SourceReceiver sourceReceiver; private final SourceReceiver sourceReceiver;
private final NamingLengthControl namingLengthControl;
public ManagementServiceHandler(ModuleManager moduleManager) { public ManagementServiceHandler(ModuleManager moduleManager) {
this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
this.namingLengthControl = moduleManager.find(CoreModule.NAME)
.provider()
.getService(NamingLengthControl.class);
} }
@Override @Override
public void reportInstanceProperties(final InstanceProperties request, public void reportInstanceProperties(final InstanceProperties request,
final StreamObserver<Commands> responseObserver) { final StreamObserver<Commands> responseObserver) {
ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate(); ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate();
serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(request.getService(), NodeType.Normal)); final String serviceName = namingLengthControl.formatServiceName(request.getService());
serviceInstanceUpdate.setName(request.getServiceInstance()); final String instanceName = namingLengthControl.formatInstanceName(request.getServiceInstance());
serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal));
serviceInstanceUpdate.setName(instanceName);
JsonObject properties = new JsonObject(); JsonObject properties = new JsonObject();
List<String> ipv4List = new ArrayList<>(); List<String> ipv4List = new ArrayList<>();
@ -75,14 +82,17 @@ public class ManagementServiceHandler extends ManagementServiceGrpc.ManagementSe
@Override @Override
public void keepAlive(final InstancePingPkg request, final StreamObserver<Commands> responseObserver) { public void keepAlive(final InstancePingPkg request, final StreamObserver<Commands> responseObserver) {
final long timeBucket = TimeBucket.getTimeBucket(System.currentTimeMillis(), DownSampling.Minute); 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 serviceInstanceUpdate = new ServiceInstanceUpdate();
serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(request.getService(), NodeType.Normal)); serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal));
serviceInstanceUpdate.setName(request.getServiceInstance()); serviceInstanceUpdate.setName(instanceName);
serviceInstanceUpdate.setTimeBucket(timeBucket); serviceInstanceUpdate.setTimeBucket(timeBucket);
sourceReceiver.receive(serviceInstanceUpdate); sourceReceiver.receive(serviceInstanceUpdate);
ServiceUpdate serviceUpdate = new ServiceUpdate(); ServiceUpdate serviceUpdate = new ServiceUpdate();
serviceUpdate.setName(request.getService()); serviceUpdate.setName(serviceName);
serviceUpdate.setNodeType(NodeType.Normal); serviceUpdate.setNodeType(NodeType.Normal);
serviceUpdate.setTimeBucket(timeBucket); serviceUpdate.setTimeBucket(timeBucket);
sourceReceiver.receive(serviceUpdate); sourceReceiver.receive(serviceUpdate);

View File

@ -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.IDManager;
import org.apache.skywalking.oap.server.core.analysis.NodeType; 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.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.ServiceInstanceUpdate;
import org.apache.skywalking.oap.server.core.source.ServiceUpdate; import org.apache.skywalking.oap.server.core.source.ServiceUpdate;
import org.apache.skywalking.oap.server.core.source.SourceReceiver; 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 { public class ManagementServiceKeepAliveHandler extends JettyJsonHandler {
private final SourceReceiver sourceReceiver; private final SourceReceiver sourceReceiver;
private final NamingLengthControl namingLengthControl;
private final Gson gson = new Gson(); private final Gson gson = new Gson();
public ManagementServiceKeepAliveHandler(ModuleManager moduleManager) { public ManagementServiceKeepAliveHandler(ModuleManager moduleManager) {
this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
this.namingLengthControl = moduleManager.find(CoreModule.NAME)
.provider()
.getService(NamingLengthControl.class);
} }
@Override @Override
@ -55,16 +60,18 @@ public class ManagementServiceKeepAliveHandler extends JettyJsonHandler {
final InstanceProperties.Builder request = InstanceProperties.newBuilder(); final InstanceProperties.Builder request = InstanceProperties.newBuilder();
ProtoBufJsonUtils.fromJSON(getJsonBody(req), request); 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); final long timeBucket = TimeBucket.getTimeBucket(System.currentTimeMillis(), DownSampling.Minute);
ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate(); ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate();
serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(request.getService(), NodeType.Normal)); serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal));
serviceInstanceUpdate.setName(request.getServiceInstance()); serviceInstanceUpdate.setName(instanceName);
serviceInstanceUpdate.setTimeBucket( serviceInstanceUpdate.setTimeBucket(timeBucket);
timeBucket);
sourceReceiver.receive(serviceInstanceUpdate); sourceReceiver.receive(serviceInstanceUpdate);
ServiceUpdate serviceUpdate = new ServiceUpdate(); ServiceUpdate serviceUpdate = new ServiceUpdate();
serviceUpdate.setName(request.getService()); serviceUpdate.setName(serviceName);
serviceUpdate.setNodeType(NodeType.Normal); serviceUpdate.setNodeType(NodeType.Normal);
serviceUpdate.setTimeBucket(timeBucket); serviceUpdate.setTimeBucket(timeBucket);
sourceReceiver.receive(serviceUpdate); sourceReceiver.receive(serviceUpdate);

View File

@ -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.CoreModule;
import org.apache.skywalking.oap.server.core.analysis.DownSampling; 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.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.TimeBucket;
import org.apache.skywalking.oap.server.core.analysis.manual.instance.InstanceTraffic; 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.ServiceInstanceUpdate;
import org.apache.skywalking.oap.server.core.source.SourceReceiver; import org.apache.skywalking.oap.server.core.source.SourceReceiver;
import org.apache.skywalking.oap.server.library.module.ModuleManager; 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 { public class ManagementServiceReportPropertiesHandler extends JettyJsonHandler {
private final SourceReceiver sourceReceiver; private final SourceReceiver sourceReceiver;
private final NamingLengthControl namingLengthControl;
private final Gson gson = new Gson(); private final Gson gson = new Gson();
public ManagementServiceReportPropertiesHandler(ModuleManager moduleManager) { public ManagementServiceReportPropertiesHandler(ModuleManager moduleManager) {
this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
this.namingLengthControl = moduleManager.find(CoreModule.NAME)
.provider()
.getService(NamingLengthControl.class);
} }
@Override @Override
@ -59,9 +64,12 @@ public class ManagementServiceReportPropertiesHandler extends JettyJsonHandler {
final InstanceProperties.Builder request = InstanceProperties.newBuilder(); final InstanceProperties.Builder request = InstanceProperties.newBuilder();
ProtoBufJsonUtils.fromJSON(getJsonBody(req), request); ProtoBufJsonUtils.fromJSON(getJsonBody(req), request);
final String serviceName = namingLengthControl.formatServiceName(request.getService());
final String instanceName = namingLengthControl.formatInstanceName(request.getServiceInstance());
ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate(); ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate();
serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(request.getService(), NodeType.Normal)); serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, NodeType.Normal));
serviceInstanceUpdate.setName(request.getServiceInstance()); serviceInstanceUpdate.setName(instanceName);
JsonObject properties = new JsonObject(); JsonObject properties = new JsonObject();
List<String> ipv4List = new ArrayList<>(); List<String> ipv4List = new ArrayList<>();

View File

@ -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);
}
}

View File

@ -42,7 +42,7 @@ public class MeshGRPCHandler extends ServiceMeshMetricServiceGrpc.ServiceMeshMet
logger.debug("Received mesh metrics: {}", metrics); logger.debug("Received mesh metrics: {}", metrics);
} }
TelemetryDataDispatcher.process(metrics); TelemetryDataDispatcher.process(metrics.toBuilder());
} }
@Override @Override

View File

@ -21,12 +21,12 @@ package org.apache.skywalking.aop.server.receiver.mesh;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.network.servicemesh.v3.Protocol; import org.apache.skywalking.apm.network.servicemesh.v3.Protocol;
import org.apache.skywalking.apm.network.servicemesh.v3.ServiceMeshMetric; 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.apm.util.StringUtil;
import org.apache.skywalking.oap.server.core.CoreModule; 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.IDManager;
import org.apache.skywalking.oap.server.core.analysis.NodeType; 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.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.All;
import org.apache.skywalking.oap.server.core.source.DetectPoint; 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.Endpoint;
@ -50,7 +50,7 @@ import org.apache.skywalking.oap.server.telemetry.api.MetricsTag;
@Slf4j @Slf4j
public class TelemetryDataDispatcher { public class TelemetryDataDispatcher {
private static SourceReceiver SOURCE_RECEIVER; private static SourceReceiver SOURCE_RECEIVER;
private static NamingLengthControl NAME_LENGTH_CONTROL;
private static HistogramMetrics MESH_ANALYSIS_METRICS; private static HistogramMetrics MESH_ANALYSIS_METRICS;
private TelemetryDataDispatcher() { private TelemetryDataDispatcher() {
@ -61,25 +61,32 @@ public class TelemetryDataDispatcher {
MetricsCreator metricsCreator = moduleManager.find(TelemetryModule.NAME) MetricsCreator metricsCreator = moduleManager.find(TelemetryModule.NAME)
.provider() .provider()
.getService(MetricsCreator.class); .getService(MetricsCreator.class);
NAME_LENGTH_CONTROL = moduleManager.find(CoreModule.NAME)
.provider()
.getService(NamingLengthControl.class);
MESH_ANALYSIS_METRICS = metricsCreator.createHistogramMetric( MESH_ANALYSIS_METRICS = metricsCreator.createHistogramMetric(
"mesh_analysis_latency", "The process latency of service mesh telemetry", MetricsTag.EMPTY_KEY, "mesh_analysis_latency", "The process latency of service mesh telemetry", MetricsTag.EMPTY_KEY,
MetricsTag.EMPTY_VALUE MetricsTag.EMPTY_VALUE
); );
} }
public static void process(ServiceMeshMetric data) { public static void process(ServiceMeshMetric.Builder data) {
HistogramMetrics.Timer timer = MESH_ANALYSIS_METRICS.createTimer(); HistogramMetrics.Timer timer = MESH_ANALYSIS_METRICS.createTimer();
try { try {
String service = data.getDestServiceName(); if (data.getSourceServiceName() != null) {
String endpointName = data.getEndpoint(); data.setSourceServiceName(NAME_LENGTH_CONTROL.formatServiceName(data.getSourceServiceName()));
StringFormatGroup.FormatResult formatResult = EndpointNameFormater.format(service, endpointName);
if (formatResult.isMatch()) {
data = data.toBuilder().setEndpoint(formatResult.getName()).build();
} }
if (log.isDebugEnabled()) { if (data.getSourceServiceInstance() != null) {
if (formatResult.isMatch()) { data.setSourceServiceInstance(NAME_LENGTH_CONTROL.formatInstanceName(data.getSourceServiceInstance()));
log.debug("Endpoint {} is renamed to {}", endpointName, data.getEndpoint()); }
} 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 (data.getEndpoint() != null) {
data.setEndpoint(NAME_LENGTH_CONTROL.formatEndpointName(data.getEndpoint()));
} }
doDispatch(data); 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()); long minuteTimeBucket = TimeBucket.getMinuteTimeBucket(metrics.getStartTime());
heartbeat(metrics, minuteTimeBucket); 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 // source
final String sourceServiceName = metrics.getSourceServiceName(); final String sourceServiceName = metrics.getSourceServiceName();
final String sourceServiceInstance = metrics.getSourceServiceInstance(); 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 all = new All();
all.setTimeBucket(minuteTimeBucket); all.setTimeBucket(minuteTimeBucket);
all.setName(metrics.getDestServiceName()); all.setName(metrics.getDestServiceName());
@ -148,7 +155,7 @@ public class TelemetryDataDispatcher {
SOURCE_RECEIVER.receive(all); 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 service = new Service();
service.setTimeBucket(minuteTimeBucket); service.setTimeBucket(minuteTimeBucket);
service.setName(metrics.getDestServiceName()); service.setName(metrics.getDestServiceName());
@ -163,7 +170,7 @@ public class TelemetryDataDispatcher {
SOURCE_RECEIVER.receive(service); 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 serviceRelation = new ServiceRelation();
serviceRelation.setTimeBucket(minuteTimeBucket); serviceRelation.setTimeBucket(minuteTimeBucket);
serviceRelation.setSourceServiceName(metrics.getSourceServiceName()); serviceRelation.setSourceServiceName(metrics.getSourceServiceName());
@ -183,7 +190,7 @@ public class TelemetryDataDispatcher {
SOURCE_RECEIVER.receive(serviceRelation); 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 serviceInstance = new ServiceInstance();
serviceInstance.setTimeBucket(minuteTimeBucket); serviceInstance.setTimeBucket(minuteTimeBucket);
serviceInstance.setName(metrics.getDestServiceInstance()); serviceInstance.setName(metrics.getDestServiceInstance());
@ -198,7 +205,7 @@ public class TelemetryDataDispatcher {
SOURCE_RECEIVER.receive(serviceInstance); 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(); ServiceInstanceRelation serviceRelation = new ServiceInstanceRelation();
serviceRelation.setTimeBucket(minuteTimeBucket); serviceRelation.setTimeBucket(minuteTimeBucket);
serviceRelation.setSourceServiceInstanceName(metrics.getSourceServiceInstance()); serviceRelation.setSourceServiceInstanceName(metrics.getSourceServiceInstance());
@ -218,7 +225,7 @@ public class TelemetryDataDispatcher {
SOURCE_RECEIVER.receive(serviceRelation); 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 endpoint = new Endpoint();
endpoint.setTimeBucket(minuteTimeBucket); endpoint.setTimeBucket(minuteTimeBucket);
endpoint.setName(metrics.getEndpoint()); endpoint.setName(metrics.getEndpoint());

View File

@ -43,9 +43,9 @@ public class MeshDataMock {
meshObserver.onNext(ServiceMeshMetric.newBuilder() meshObserver.onNext(ServiceMeshMetric.newBuilder()
.setSourceServiceName("e2e-test-source-service") .setSourceServiceName("e2e-test-source-service")
.setSourceServiceInstance("e2e-test-source-service-instance") .setSourceServiceInstance("e2e-test-source-service-instance")
.setDestServiceName("e2e-test-dest-service") .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("e2e-test-dest-service-instance") .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("e2e/test") .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) .setStartTime(System.currentTimeMillis() - 1000L)
.setEndTime(System.currentTimeMillis() - 500L + i) .setEndTime(System.currentTimeMillis() - 500L + i)
.setLatency(2000) .setLatency(2000)

View File

@ -45,6 +45,7 @@ public class TraceModuleProvider extends ModuleProvider {
private final TraceServiceModuleConfig moduleConfig; private final TraceServiceModuleConfig moduleConfig;
private DBLatencyThresholdsAndWatcher thresholds; private DBLatencyThresholdsAndWatcher thresholds;
private UninstrumentedGatewaysConfig uninstrumentedGatewaysConfig; private UninstrumentedGatewaysConfig uninstrumentedGatewaysConfig;
private SegmentParserServiceImpl segmentParserService;
public TraceModuleProvider() { public TraceModuleProvider() {
this.moduleConfig = new TraceServiceModuleConfig(); this.moduleConfig = new TraceServiceModuleConfig();
@ -74,8 +75,8 @@ public class TraceModuleProvider extends ModuleProvider {
moduleConfig.setDbLatencyThresholdsAndWatcher(thresholds); moduleConfig.setDbLatencyThresholdsAndWatcher(thresholds);
moduleConfig.setUninstrumentedGatewaysConfig(uninstrumentedGatewaysConfig); moduleConfig.setUninstrumentedGatewaysConfig(uninstrumentedGatewaysConfig);
this.registerServiceImplementation( segmentParserService = new SegmentParserServiceImpl(getManager(), moduleConfig);
ISegmentParserService.class, new SegmentParserServiceImpl(getManager(), listenerManager(), moduleConfig)); this.registerServiceImplementation(ISegmentParserService.class, segmentParserService);
} }
@Override @Override
@ -93,6 +94,7 @@ public class TraceModuleProvider extends ModuleProvider {
dynamicConfigurationService.registerConfigChangeWatcher(thresholds); dynamicConfigurationService.registerConfigChangeWatcher(thresholds);
dynamicConfigurationService.registerConfigChangeWatcher(uninstrumentedGatewaysConfig); dynamicConfigurationService.registerConfigChangeWatcher(uninstrumentedGatewaysConfig);
segmentParserService.setListenerManager(listenerManager());
grpcHandlerRegister.addHandler( grpcHandlerRegister.addHandler(
new TraceSegmentReportServiceHandler(getManager(), listenerManager(), moduleConfig)); new TraceSegmentReportServiceHandler(getManager(), listenerManager(), moduleConfig));
@ -118,10 +120,10 @@ public class TraceModuleProvider extends ModuleProvider {
private SegmentParserListenerManager listenerManager() { private SegmentParserListenerManager listenerManager() {
SegmentParserListenerManager listenerManager = new SegmentParserListenerManager(); SegmentParserListenerManager listenerManager = new SegmentParserListenerManager();
if (moduleConfig.isTraceAnalysis()) { if (moduleConfig.isTraceAnalysis()) {
listenerManager.add(new MultiScopesAnalysisListener.Factory()); listenerManager.add(new MultiScopesAnalysisListener.Factory(getManager()));
listenerManager.add(new NetworkAddressAliasMappingListener.Factory()); listenerManager.add(new NetworkAddressAliasMappingListener.Factory(getManager()));
} }
listenerManager.add(new SegmentAnalysisListener.Factory(moduleConfig.getSampleRate())); listenerManager.add(new SegmentAnalysisListener.Factory(getManager(), moduleConfig));
return listenerManager; return listenerManager;
} }

View File

@ -18,6 +18,8 @@
package org.apache.skywalking.oap.server.receiver.trace.provider.parser; 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.apm.network.language.agent.v3.SegmentObject;
import org.apache.skywalking.oap.server.library.module.ModuleManager; import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.receiver.trace.provider.TraceServiceModuleConfig; 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. * The open service to the receivers.
*/ */
@RequiredArgsConstructor
public class SegmentParserServiceImpl implements ISegmentParserService { public class SegmentParserServiceImpl implements ISegmentParserService {
private ModuleManager moduleManager; private final ModuleManager moduleManager;
private final TraceServiceModuleConfig config;
@Setter
private SegmentParserListenerManager listenerManager; private SegmentParserListenerManager listenerManager;
private TraceServiceModuleConfig config;
public SegmentParserServiceImpl(ModuleManager moduleManager,
SegmentParserListenerManager listenerManager,
TraceServiceModuleConfig config) {
this.moduleManager = moduleManager;
this.listenerManager = listenerManager;
this.config = config;
}
@Override @Override
public void send(SegmentObject segment) { public void send(SegmentObject segment) {

View File

@ -19,6 +19,8 @@
package org.apache.skywalking.oap.server.receiver.trace.provider.parser; package org.apache.skywalking.oap.server.receiver.trace.provider.parser;
public class SpanTags { public class SpanTags {
public static final String STATUS_CODE = "status_code";
public static final String DB_STATEMENT = "db.statement"; public static final String DB_STATEMENT = "db.statement";
public static final String DB_TYPE = "db.type"; public static final String DB_TYPE = "db.type";

View File

@ -19,8 +19,8 @@
package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener; package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair; import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair;
import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject; 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.TimeBucket;
import org.apache.skywalking.oap.server.core.analysis.manual.networkalias.NetworkAddressAlias; 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.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.DatabaseSlowStatement;
import org.apache.skywalking.oap.server.core.source.DetectPoint; import org.apache.skywalking.oap.server.core.source.DetectPoint;
import org.apache.skywalking.oap.server.core.source.EndpointRelation; 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. * This listener traverses the whole segment.
*/ */
@Slf4j @Slf4j
@RequiredArgsConstructor
public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitAnalysisListener { 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 SourceReceiver sourceReceiver;
private final List<SourceBuilder> entrySourceBuilders;
private final List<SourceBuilder> exitSourceBuilders;
private final List<DatabaseSlowStatement> slowDatabaseAccesses;
private final TraceServiceModuleConfig config; private final TraceServiceModuleConfig config;
private final NetworkAddressAliasCache networkAddressAliasCache; private final NetworkAddressAliasCache networkAddressAliasCache;
private final NamingLengthControl namingLengthControl;
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;
}
@Override @Override
public boolean containsPoint(Point point) { public boolean containsPoint(Point point) {
@ -95,7 +87,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
if (span.getRefsCount() > 0) { if (span.getRefsCount() > 0) {
for (int i = 0; i < span.getRefsCount(); i++) { for (int i = 0; i < span.getRefsCount(); i++) {
SegmentReference reference = span.getRefs(i); SegmentReference reference = span.getRefs(i);
SourceBuilder sourceBuilder = new SourceBuilder(); SourceBuilder sourceBuilder = new SourceBuilder(namingLengthControl);
if (StringUtil.isEmpty(reference.getParentEndpoint())) { if (StringUtil.isEmpty(reference.getParentEndpoint())) {
sourceBuilder.setSourceEndpointName(Const.USER_ENDPOINT_NAME); sourceBuilder.setSourceEndpointName(Const.USER_ENDPOINT_NAME);
@ -125,7 +117,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
entrySourceBuilders.add(sourceBuilder); entrySourceBuilders.add(sourceBuilder);
} }
} else { } else {
SourceBuilder sourceBuilder = new SourceBuilder(); SourceBuilder sourceBuilder = new SourceBuilder(namingLengthControl);
sourceBuilder.setSourceServiceName(Const.USER_SERVICE_NAME); sourceBuilder.setSourceServiceName(Const.USER_SERVICE_NAME);
sourceBuilder.setSourceServiceInstanceName(Const.USER_INSTANCE_NAME); sourceBuilder.setSourceServiceInstanceName(Const.USER_INSTANCE_NAME);
sourceBuilder.setSourceEndpointName(Const.USER_ENDPOINT_NAME); sourceBuilder.setSourceEndpointName(Const.USER_ENDPOINT_NAME);
@ -152,7 +144,7 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
return; return;
} }
SourceBuilder sourceBuilder = new SourceBuilder(); SourceBuilder sourceBuilder = new SourceBuilder(namingLengthControl);
final String networkAddress = span.getPeer(); final String networkAddress = span.getPeer();
if (StringUtil.isEmpty(networkAddress)) { if (StringUtil.isEmpty(networkAddress)) {
@ -235,6 +227,16 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
sourceBuilder.setTimeBucket(TimeBucket.getMinuteTimeBucket(span.getStartTime())); sourceBuilder.setTimeBucket(TimeBucket.getMinuteTimeBucket(span.getStartTime()));
sourceBuilder.setLatency((int) latency); sourceBuilder.setLatency((int) latency);
sourceBuilder.setResponseCode(Const.NONE); 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()); sourceBuilder.setStatus(!span.getIsError());
switch (span.getSpanLayer()) { switch (span.getSpanLayer()) {
@ -293,9 +295,24 @@ public class MultiScopesAnalysisListener implements EntryAnalysisListener, ExitA
} }
public static class Factory implements AnalysisListenerFactory { 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 @Override
public AnalysisListener create(ModuleManager moduleManager, TraceServiceModuleConfig config) { public AnalysisListener create(ModuleManager moduleManager, TraceServiceModuleConfig config) {
return new MultiScopesAnalysisListener(moduleManager, config); return new MultiScopesAnalysisListener(
sourceReceiver, config, networkAddressAliasCache, namingLengthControl);
} }
} }
} }

View File

@ -18,6 +18,7 @@
package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener; package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.network.language.agent.v3.RefType; import org.apache.skywalking.apm.network.language.agent.v3.RefType;
import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject; 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.CoreModule;
import org.apache.skywalking.oap.server.core.analysis.NodeType; 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.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.NetworkAddressAliasSetup;
import org.apache.skywalking.oap.server.core.source.SourceReceiver; import org.apache.skywalking.oap.server.core.source.SourceReceiver;
import org.apache.skywalking.oap.server.library.module.ModuleManager; 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. * This is a key point of SkyWalking header propagation protocol.
*/ */
@Slf4j @Slf4j
@RequiredArgsConstructor
public class NetworkAddressAliasMappingListener implements EntryAnalysisListener { public class NetworkAddressAliasMappingListener implements EntryAnalysisListener {
private final TraceServiceModuleConfig config;
private final SourceReceiver sourceReceiver; private final SourceReceiver sourceReceiver;
private final TraceServiceModuleConfig config;
public NetworkAddressAliasMappingListener(ModuleManager moduleManager, TraceServiceModuleConfig config) { private final NamingLengthControl namingLengthControl;
this.config = config;
this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
}
@Override @Override
public void parseEntry(SpanObject span, SegmentObject segmentObject) { public void parseEntry(SpanObject span, SegmentObject segmentObject) {
@ -60,7 +59,8 @@ public class NetworkAddressAliasMappingListener implements EntryAnalysisListener
if (!span.getSpanLayer().equals(SpanLayer.MQ)) { if (!span.getSpanLayer().equals(SpanLayer.MQ)) {
span.getRefsList().forEach(segmentReference -> { span.getRefsList().forEach(segmentReference -> {
if (RefType.CrossProcess.equals(segmentReference.getRefType())) { if (RefType.CrossProcess.equals(segmentReference.getRefType())) {
final String networkAddressUsedAtPeer = segmentReference.getNetworkAddressUsedAtPeer(); final String networkAddressUsedAtPeer = namingLengthControl.formatServiceName(
segmentReference.getNetworkAddressUsedAtPeer());
if (config.getUninstrumentedGatewaysConfig().isAddressConfiguredAsGateway( if (config.getUninstrumentedGatewaysConfig().isAddressConfiguredAsGateway(
networkAddressUsedAtPeer)) { networkAddressUsedAtPeer)) {
/* /*
@ -68,11 +68,15 @@ public class NetworkAddressAliasMappingListener implements EntryAnalysisListener
*/ */
return; return;
} }
final String serviceName = namingLengthControl.formatServiceName(segmentObject.getService());
final String instanceName = namingLengthControl.formatInstanceName(
segmentObject.getServiceInstance());
final NetworkAddressAliasSetup networkAddressAliasSetup = new NetworkAddressAliasSetup(); final NetworkAddressAliasSetup networkAddressAliasSetup = new NetworkAddressAliasSetup();
networkAddressAliasSetup.setAddress(networkAddressUsedAtPeer); networkAddressAliasSetup.setAddress(networkAddressUsedAtPeer);
networkAddressAliasSetup.setRepresentService(segmentObject.getService()); networkAddressAliasSetup.setRepresentService(serviceName);
networkAddressAliasSetup.setRepresentServiceNodeType(NodeType.Normal); networkAddressAliasSetup.setRepresentServiceNodeType(NodeType.Normal);
networkAddressAliasSetup.setRepresentServiceInstance(segmentObject.getServiceInstance()); networkAddressAliasSetup.setRepresentServiceInstance(instanceName);
networkAddressAliasSetup.setTimeBucket(TimeBucket.getMinuteTimeBucket(span.getStartTime())); networkAddressAliasSetup.setTimeBucket(TimeBucket.getMinuteTimeBucket(span.getStartTime()));
sourceReceiver.receive(networkAddressAliasSetup); sourceReceiver.receive(networkAddressAliasSetup);
@ -92,10 +96,19 @@ public class NetworkAddressAliasMappingListener implements EntryAnalysisListener
} }
public static class Factory implements AnalysisListenerFactory { 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 @Override
public AnalysisListener create(ModuleManager moduleManager, TraceServiceModuleConfig config) { public AnalysisListener create(ModuleManager moduleManager, TraceServiceModuleConfig config) {
return new NetworkAddressAliasMappingListener(moduleManager, config); return new NetworkAddressAliasMappingListener(sourceReceiver, config, namingLengthControl);
} }
} }
} }

View File

@ -18,6 +18,7 @@
package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener; package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject; import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject;
import org.apache.skywalking.apm.network.language.agent.v3.SpanObject; 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.IDManager;
import org.apache.skywalking.oap.server.core.analysis.NodeType; 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.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.Segment;
import org.apache.skywalking.oap.server.core.source.SourceReceiver; import org.apache.skywalking.oap.server.core.source.SourceReceiver;
import org.apache.skywalking.oap.server.library.module.ModuleManager; 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. * SegmentSpanListener forwards the segment raw data to the persistence layer with the query required conditions.
*/ */
@Slf4j @Slf4j
@RequiredArgsConstructor
public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnalysisListener, SegmentListener { public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnalysisListener, SegmentListener {
private final SourceReceiver sourceReceiver; private final SourceReceiver sourceReceiver;
private final TraceSegmentSampler sampler; private final TraceSegmentSampler sampler;
private final NamingLengthControl namingLengthControl;
private final Segment segment = new Segment(); private final Segment segment = new Segment();
private SAMPLE_STATUS sampleStatus = SAMPLE_STATUS.UNKNOWN; private SAMPLE_STATUS sampleStatus = SAMPLE_STATUS.UNKNOWN;
private String serviceId = Const.EMPTY_STRING; private String serviceId = Const.EMPTY_STRING;
@ -50,11 +55,6 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal
private int duration; private int duration;
private boolean isError; private boolean isError;
private SegmentAnalysisListener(ModuleManager moduleManager, TraceSegmentSampler sampler) {
this.sampler = sampler;
this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
}
@Override @Override
public boolean containsPoint(Point point) { public boolean containsPoint(Point point) {
return Point.First.equals(point) || Point.Entry.equals(point) || Point.Segment.equals(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)) { if (StringUtil.isEmpty(serviceId)) {
serviceId = IDManager.ServiceID.buildId( serviceId = IDManager.ServiceID.buildId(
segmentObject.getService(), NodeType.Normal); namingLengthControl.formatServiceName(segmentObject.getService()),
NodeType.Normal
);
} }
long timeBucket = TimeBucket.getRecordTimeBucket(startTimestamp); long timeBucket = TimeBucket.getRecordTimeBucket(startTimestamp);
@ -77,7 +79,7 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal
segment.setServiceId(serviceId); segment.setServiceId(serviceId);
segment.setServiceInstanceId(IDManager.ServiceInstanceID.buildId( segment.setServiceInstanceId(IDManager.ServiceInstanceID.buildId(
serviceId, serviceId,
segmentObject.getServiceInstance() namingLengthControl.formatInstanceName(segmentObject.getServiceInstance())
)); ));
segment.setLatency(duration); segment.setLatency(duration);
segment.setStartTime(startTimestamp); segment.setStartTime(startTimestamp);
@ -87,11 +89,12 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal
segment.setDataBinary(segmentObject.toByteArray()); segment.setDataBinary(segmentObject.toByteArray());
segment.setVersion(3); segment.setVersion(3);
endpointName = namingLengthControl.formatEndpointName(span.getOperationName());
endpointId = IDManager.EndpointID.buildId( endpointId = IDManager.EndpointID.buildId(
serviceId, serviceId,
span.getOperationName() endpointName
); );
endpointName = span.getOperationName();
} }
@Override @Override
@ -106,7 +109,11 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal
span.getOperationName() span.getOperationName()
); );
endpointName = span.getOperationName(); endpointName = namingLengthControl.formatEndpointName(span.getOperationName());
endpointId = IDManager.EndpointID.buildId(
serviceId,
endpointName
);
} }
@Override @Override
@ -160,15 +167,21 @@ public class SegmentAnalysisListener implements FirstAnalysisListener, EntryAnal
} }
public static class Factory implements AnalysisListenerFactory { public static class Factory implements AnalysisListenerFactory {
private final SourceReceiver sourceReceiver;
private final TraceSegmentSampler sampler; private final TraceSegmentSampler sampler;
private final NamingLengthControl namingLengthControl;
public Factory(int segmentSamplingRate) { public Factory(ModuleManager moduleManager, TraceServiceModuleConfig config) {
this.sampler = new TraceSegmentSampler(segmentSamplingRate); 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 @Override
public AnalysisListener create(ModuleManager moduleManager, TraceServiceModuleConfig config) { public AnalysisListener create(ModuleManager moduleManager, TraceServiceModuleConfig config) {
return new SegmentAnalysisListener(moduleManager, sampler); return new SegmentAnalysisListener(sourceReceiver, sampler, namingLengthControl);
} }
} }
} }

View File

@ -19,45 +19,74 @@
package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener; package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter; import lombok.Setter;
import org.apache.skywalking.apm.util.StringUtil; 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.All;
import org.apache.skywalking.oap.server.core.source.DatabaseAccess; 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.DetectPoint;
import org.apache.skywalking.oap.server.core.source.Endpoint; 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.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.RequestType;
import org.apache.skywalking.oap.server.core.source.Service; 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.ServiceInstance;
import org.apache.skywalking.oap.server.core.source.ServiceInstanceRelation; import org.apache.skywalking.oap.server.core.source.ServiceInstanceRelation;
import org.apache.skywalking.oap.server.core.source.ServiceRelation; import org.apache.skywalking.oap.server.core.source.ServiceRelation;
@RequiredArgsConstructor
class SourceBuilder { class SourceBuilder {
private final NamingLengthControl namingLengthControl;
@Getter @Getter
@Setter
private String sourceServiceName; private String sourceServiceName;
public void setSourceServiceName(final String sourceServiceName) {
this.sourceServiceName = namingLengthControl.formatServiceName(sourceServiceName);
}
@Getter @Getter
@Setter @Setter
private NodeType sourceNodeType; private NodeType sourceNodeType;
@Getter @Getter
@Setter
private String sourceServiceInstanceName; private String sourceServiceInstanceName;
public void setSourceServiceInstanceName(final String sourceServiceInstanceName) {
this.sourceServiceInstanceName = namingLengthControl.formatInstanceName(sourceServiceInstanceName);
}
@Getter @Getter
@Setter
private String sourceEndpointName; private String sourceEndpointName;
public void setSourceEndpointName(final String sourceEndpointName) {
this.sourceEndpointName = namingLengthControl.formatEndpointName(sourceEndpointName);
}
@Getter @Getter
@Setter
private String destServiceName; private String destServiceName;
public void setDestServiceName(final String destServiceName) {
this.destServiceName = namingLengthControl.formatServiceName(destServiceName);
}
@Getter @Getter
@Setter @Setter
private NodeType destNodeType; private NodeType destNodeType;
@Getter @Getter
@Setter
private String destServiceInstanceName; private String destServiceInstanceName;
public void setDestServiceInstanceName(final String destServiceInstanceName) {
this.destServiceInstanceName = namingLengthControl.formatServiceName(destServiceInstanceName);
}
@Getter @Getter
@Setter
private String destEndpointName; private String destEndpointName;
public void setDestEndpointName(final String destEndpointName) {
this.destEndpointName = namingLengthControl.formatEndpointName(destEndpointName);
}
@Getter @Getter
@Setter @Setter
private int componentId; private int componentId;

View File

@ -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.ConfigService;
import org.apache.skywalking.oap.server.core.config.DownSamplingConfigService; 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.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.profile.ProfileTaskMutationService;
import org.apache.skywalking.oap.server.core.query.AggregationQueryService; import org.apache.skywalking.oap.server.core.query.AggregationQueryService;
import org.apache.skywalking.oap.server.core.query.AlarmQueryService; import org.apache.skywalking.oap.server.core.query.AlarmQueryService;
@ -92,6 +93,8 @@ public class MockCoreModuleProvider extends CoreModuleProvider {
@Override @Override
public void prepare() throws ServiceNotProvidedException, ModuleStartException { public void prepare() throws ServiceNotProvidedException, ModuleStartException {
this.registerServiceImplementation(NamingLengthControl.class, new NamingLengthControl(50, 50, 150));
MockStreamAnnotationListener streamAnnotationListener = new MockStreamAnnotationListener(getManager()); MockStreamAnnotationListener streamAnnotationListener = new MockStreamAnnotationListener(getManager());
annotationScan.registerListener(streamAnnotationListener); annotationScan.registerListener(streamAnnotationListener);