最近在看分布式性能监控,调用追踪功能的系统。看了网上各位大佬的分析,选择了skywalking。
为啥选它:适合当前的需求,无侵入,粒度正好满足需求,性能消耗低
一:介绍
-
基本信息
SkyWalking:是一个APM(应用程序性能监视器)系统,专门为微服务,云原生和基于容器(Docker,Kubernetes,Mesos)的体系结构而设计,包括针对Cloud Native体系结构中的分布式系统的监视,跟踪,诊断功能。
其核心功能如下。- 服务,服务实例,端点指标分析
- 根本原因分析
- 服务拓扑图分析
- 服务,服务实例和端点依赖性分析
- 检测到慢速服务和端点
- 性能优化
- 分布式跟踪和上下文传播
- 数据库访问指标。检测慢速数据库访问语句(包括SQL语句)。
- 报警
性能好:针对单实例5000tps的应用,在全量采集的情况下,只增加 10% 的CPU开销
支持多语言探针
支持自动及手动探针:其中手动探针通过OpenTrackingApi、@Trace注解、trackId集成到日志中。
2.架构
- SkyWalking的主要部分及其功能
SkyWalking主要由三大部分组成:Agent(探针),Collector(收集器),Web;
Agent:作用是使用JavaAgent字节码增强技术将Agent的代码织入程序中,完成Agent无代码侵入地获取程序内方法的上下文并进行增强和收集信息并发送给Collector;与Collector进行心跳,表明Agent客户端的存活。
Collector:作用是维护存活的Agent实例,并收集从Agent发送至Collector的数据,进行处理及持久化;
web:作用是将Collector收集的参数进行不同维度的展示
二:使用
1:下载SkyWalking后解压,目录如下(6.4版本):
agent:探针工具里面包含可支持的插件,探针的配置等,里面文件目录不可改变
config:收集器配置
wabapp:webui配置
2:配置修改
不修改任何配置可直接启动,默认单节点,如想修改配置或集群:
application.yml 收集器配置文件修改
collector的集群我是拷贝了一份skywalking项目,然后修改通信端口
cluster:
# 单节点模式
standalone:
# zk用于管理collector集群协作.
# zookeeper:
# 多个zk连接地址用逗号分隔.
# hostPort: localhost:2181
# sessionTimeout: 100000
# 分布式 kv 存储设施,类似于zk,但没有zk重型(除了etcd,consul、Nacos等都是类似功能)
# etcd:
# serviceName: ${SW_SERVICE_NAME:"SkyWalking_OAP_Cluster"}
# 多个节点用逗号分隔, 如: 10.0.0.1:2379,10.0.0.2:2379,10.0.0.3:2379
# hostPort: ${SW_CLUSTER_ETCD_HOST_PORT:localhost:2379}
core:
default:
# 混合角色:接收代理数据,1级聚合、2级聚合
# 接收者:接收代理数据,1级聚合点
# 聚合器:2级聚合点
role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator
# rest 服务地址和端口
restHost: ${SW_CORE_REST_HOST:localhost}
restPort: ${SW_CORE_REST_PORT:12800}
restContextPath: ${SW_CORE_REST_CONTEXT_PATH:/}
# gRPC 服务地址和端口
gRPCHost: ${SW_CORE_GRPC_HOST:localhost}
gRPCPort: ${SW_CORE_GRPC_PORT:11800}
downsampling:
- Hour
- Day
- Month
# 设置度量数据的超时。超时过期后,度量数据将自动删除.
# 单位分钟
recordDataTTL: ${SW_CORE_RECORD_DATA_TTL:90}
# 单位分钟
minuteMetricsDataTTL: ${SW_CORE_MINUTE_METRIC_DATA_TTL:90}
# 单位小时
hourMetricsDataTTL: ${SW_CORE_HOUR_METRIC_DATA_TTL:36}
# 单位天
dayMetricsDataTTL: ${SW_CORE_DAY_METRIC_DATA_TTL:45}
# 单位月
monthMetricsDataTTL: ${SW_CORE_MONTH_METRIC_DATA_TTL:18}
storage:
elasticsearch:
# elasticsearch 的集群名称
nameSpace: ${SW_NAMESPACE:"local-ES"}
# elasticsearch 集群节点的地址及端口
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.2.10:9200}
# elasticsearch 的用户名和密码
user: ${SW_ES_USER:""}
password: ${SW_ES_PASSWORD:""}
# 设置 elasticsearch 索引分片数量
indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
# 设置 elasticsearch 索引副本数
indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
# 批量处理配置
# 每2000个请求执行一次批量
bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:2000}
# 每 20mb 刷新一次内存块
bulkSize: ${SW_STORAGE_ES_BULK_SIZE:20}
# 无论请求的数量如何,每10秒刷新一次堆
flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10}
# 并发请求的数量
concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2}
# elasticsearch 查询的最大数量
metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
# elasticsearch 查询段最大数量
segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
mysql:
properties:
jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://127.0.0.1:3306/skywalking"}
dataSource.user: ${SW_DATA_SOURCE_USER:root}
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}
...
#使用mysql时,我是把datasource-settings.properties里的配置拷贝到这儿。引入的方式遇到问题没找到没有解决。
metadataQueryMaxSize: ${SW_STORAGE_H2_QUERY_MAX_SIZE:5000}
修改\webapp\webapp.yml
server:
#访问端口
port: 8080
collector:
path: /graphql
ribbon:
ReadTimeout: 10000
# 指向所有后台的restHost:restPort,如果集群了,分割
listOfServers: 127.0.0.1:12800,127.0.0.1:12801
\agent\config\agent.config
# 服务名指定,多服务情况下通过传参的方式来指定,后面说
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
# 后台收集器地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800,127.0.0.1:11801}
alarm-settings.yml 告警规则配置文件
#发送告警到指定的服务器地址
webhooks
#http://127.0.0.1/notify/
#http://127.0.0.1/go-wechat/
3.启动
windows下直接启动bin下startup.bat,可启动一个collector和一个webui,集群下模式,我是再启动拷贝项的oapService.bat。collector和webui也启动了
启动项目
java -javaagent:D:\\project\\apache-skywalking-apm-bin\\agent\\skywalking-agent.jar -Dskywalking.agent.service_name=service-product -jar service-product.jar
-javaagent:#标识后面是一个代理工具
D:\project\apache-skywalking-apm-bin\agent\skywalking-agent.jar :#探针jar的位置
-Dskywalking.agent.service_name:#给参数赋值,传入启动的项目名为:service-product
进入webapp.yml指定的port
三:总结
看到界面内容很丰富,要学习东西还是挺多的,比如,如何指定监控规则,如何过滤出需要发送到邮件或钉钉的日志等,这些都可以后续在实际项目中通过需求来做
出现错误,一定查看logs文件下日志,过程中也遇到了很多问题。由于当时没有记录下来,映像比较深的有:
配置es后,es启动正常,启动Collector报错,日志提示用要存入数据到es需要指定类型什么的,大致这样的
"caused\_by": { "type": "x\_content\_parse\_exception", "reason": "\[5:9\] \[alias\_action\] failed to parse field \[remove\]"
,大概意思是入库数据格式有误,mapping无法解析,用的es7.,说7.不支持,降版本吧,下了6.8,也不支持,换了6.5后可以了。
collector不能自动发现agent的,注意要先启动collector。如果单节点collector挂了再启动,就搜集不到agent了。这个问题还没搞懂。所以建议做collector集群