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:
parent
6fe2041b47
commit
44cae97c25
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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}
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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`|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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/.*
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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<>();
|
||||||
|
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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";
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue