Apache SkyWalking
1、SkyWalking是什么
官网地址:http://skywalking.apache.org/
SkyWalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8S、Mesos)架构而设计;
SkyWalking是观察性分析平台和应用性能管理系统。提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案;
2、SkyWalking功能
SkyWalking是一个开源APM系统,包括对Cloud Native体系结构中的分布式系统的监视,跟踪,诊断功能。 核心功能如下。
- 服务,服务实例,端点指标分析
- 根本原因分析
- 服务拓扑图分析
- 服务,服务实例和端点依赖关系分析
- 检测到慢速服务和端点
- 性能优化
- 分布式跟踪和上下文传播
- 数据库访问指标。 检测慢速数据库访问语句(包括SQL语句)。
- 报警
- SkyWalking支持从多种来源和多种格式收集遥测(跟踪和度量)数据,包括
- SkyWalking格式的Java,.NET Core,NodeJS和PHP自动仪器代理
- SkyWalking格式的手动仪器Go代理。
- Istio遥测格式
- 由Istio控制的服务网格中的Envoy gRPC访问日志服务(ALS)格式
- 特使指标服务格式
- Zipkin v1 / v2格式
- Jaeger gRPC格式
3、整体架构
整个架构,分成上、下、左、右四部分:
考虑到让描述更简单,我们舍弃掉 Metric 指标相关,而着重在 Tracing 链路相关功能。
- 上部分 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而我们目前采用的是,SkyWalking Agent 收集 SkyWalking Tracing 数据,传递给服务器。
- 下部分 SkyWalking OAP :负责接收 Agent 发送的 Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query )功能。
- 右部分 Storage :Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而我们目前采用的是 ES ,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主。
- 左部分 SkyWalking UI :负责提供控台,查看链路等等。
SkyWalking 的中文文档: https://github.com/SkyAPM/document-cn-translation-of-skywalking
4、SkyWalking实战
我们实战搭建一下SkyWalking单机环境
4.1 ElasticSearch搭建
SkyWalking数据持久化支持多种数据源,这里数据源选择使用ElasticSearch,版本为V7.4.0。
【注】如果项目中也使用ElasticSearch,不建议SkyWalking与项目使用同一个ElasticSearch。因为SkyWalking会在ES中创建大量索引并且比较消耗内存。
ES搭建建议大家使用Docker进行安装
1、配置参数
sysctl -w vm.max_map_count=262144 &&
grep vm.max_map_count /etc/sysctl.conf
2、下载镜像
docker pull elasticsearch:7.4.0
3、启动容器
docker run --name elasticsearch -d \
-v /home/elk/elasticsearch/data:/usr/share/elasticsearch/data \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.4.0
4、配置目录权限
由于容器目录映射到宿主机目录,需要给宿主机目录授权。我这里就省事配置777了。
chmod 777 /home/elk/elasticsearch/data
5、验证
curl http://127.0.0.1:9200
看到如下结果证明安装成功
{
"name": "0a50cb561c04",
"cluster_name": "docker-cluster",
"cluster_uuid": "DFu_C31fQwqhzLyTko6wGg",
"version": {
"number": "7.4.0",
"build_flavor": "default",
"build_type": "docker",
"build_hash": "b7e28a7",
"build_date": "2019-04-05T22:55:32.697037Z",
"build_snapshot": false,
"lucene_version": "8.0.0",
"minimum_wire_compatibility_version": "6.7.0",
"minimum_index_compatibility_version": "6.0.0-beta1"
},
"tagline": "You Know, for Search"
}
4.2 安装配置SkyWalking
官方下载地址:http://skywalking.apache.org/downloads/
【注】需要注意版本,我开始使用SkyWalking7.0.0版本,发现无法监控到我的服务,后来我切换到最新 的8.0.1解决了问题。
下载最新版本V8.0.1的Binary Distribution for ElasticSearch 7版本
wget https://mirror.bit.edu.cn/apache/skywalking/8.0.1/apache-skywalking-apm-es7-8.0.1.tar.gz
修改/apache-skywalking-apm-bin-es7/config/application.yml配置文件中的数据源,默认使用H2,我们切换成ES。
storage:
# 切换数据源
selector: ${SW_STORAGE:elasticsearch7}
elasticsearch:
nameSpace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}
trustStorePass: ${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:1} # The index shards number is for store metrics data rather than basic segment record
superDatasetIndexShardsFactor: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5} # Super data set has been defined in the codes, such as trace segments. This factor provides more shards for the super data set, shards number = indexShardsNumber * superDatasetIndexShardsFactor. Also, this factor effects Zipkin and Jaeger traces.
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:
# 配置自己安装ES的nameSpace
nameSpace: ${SW_NAMESPACE:"docker-cluster"}
# 配置ES的连接信息
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.0.4:9200}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
#trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}
#trustStorePass: ${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:1} # The index shards number is for store metrics data rather than basic segment record
superDatasetIndexShardsFactor: ${SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR:5} # Super data set has been defined in the codes, such as trace segments. This factor provides more shards for the super data set, shards number = indexShardsNumber * superDatasetIndexShardsFactor. Also, this factor effects Zipkin and Jaeger traces.
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:""}
由于SkyWalking UI的默认地址是8080,与很多中间件有冲突,建议大家修改一下
修改apache-skywalking-apm-bin-es7/webapp/webapp.yml
server:
port: 18080
修改agent配置,apache-skywalking-apm-bin-es7/agent/config/agent.config
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.0.4:11800}
agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:1}
**
采样率修改
agent.sample_n_per_3_secs配置详解:
在访问量较少时,链路全量收集不会对系统带来多少负担,同时能够完整的观测到系统的运行状况。但是在访问量较大时,全量的链路收集,对链路收集的客户端(应用)、服务端(例如说 SkyWalking OAP Collector)、存储器(例如说 Elastcsearch)都会带来较大的性能开销,甚至会影响应用的正常运行。
因此,在访问量级较大的情况下,我们往往会选择抽样采样,只选择收集部分链路信息。SkyWalking Agent 在 agent/config/agent.config 配置文件中,定义了 agent.sample_n_per_3_secs 配置项,设置每 3 秒可收集的链路数据的数量。
启动SkyWalking
apache-skywalking-apm-bin-es7/bin/startup.sh
访问:http://127.0.0.1:18080 看到下图内容代表搭建完成。由于还没有配置服务,因为没有服务的监控信息。
5、服务添加至SkyWalking
搭建完成SkyWalking,我们需要将我们的应用服务添加到SkyWalking中。这个也非常简单。对代码无任何侵入性。
Idea 配置
如果我们是本地启动的项目,开发工具使用的IDEA,我们只需要在如下图所示地方配置启动附加信息即可。
javaagent配置的是agent对应的jar位置。
service_name配置建议使用服务的spring.application.name方便区分。
-javaagent:D:\Develop\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=leimingtech-admin-api
jar启动配置
我们的应用最终肯定是部署在服务器上的,因为我们需要在jar启动的时候配置SkyWalking连接信息。
java -javaagent:/opt/skywalking/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=leimingtech-operation-api -Xms256m -Xmx256m -Xmn250m -jar leimingtech-operation-api.jar
一般生产环境多个服务肯定是部署在不同机器上,这时候可能会有疑问,我是需要在全部机器上都搭建SkyWalking么?肯定不是的!我们只需要把SkyWalking中的agent模块复制到另一台机器即可。
6、SkyWalking UI查看
启动完成项目,由于SkyWalking采用懒加载收集模式,我们需要先请求接口才能被SkyWalking监控到。
任意访问一个接口地址。查看SkyWalking UI。
APM视图:
拓扑图
链路追踪
链路追踪-SQL查看
参考文献