本文基于java agent(8.7.0),服务端(9.2.0),不同版本之间可能会有差异。
SkyWalking是什么
SkyWalking是一个开源的可观测性平台,对服务和云原生基础设施数据收集、分析、聚合和可视化。它是现代的APM,专门为云原生设计。
基础术语
- Service:提供共同行为的一组工作负载,对应cmdb里的应用名。
- Service Instance:同一个Service下的一个工作负载,比如某个java应用的一个实例进程。
- Endpoint:服务的接口或者方法名,或者是http uri。
架构
- Agent:收集观测性数据,这些数据包含metrics,traces,logs,events,支持多种语言的数据上报,可通过grpc,kafka,http协议将数据收集上来。
- Webapp:前端,用于查看数据和排障。
- OAP-Recevier:数据接收和解析,并进行当前OAP节点内的L1数据聚合
- OAP-Aggregator:分布式聚合,根据路由规则将经过Receiver聚合后的数据路由到指定节点进行L2聚合,并写入数据库。
- 存储:支持多种存储方式,生产采样elasticsearch。
- Exporter:将数据导出到其他系统,比如TSDB,结合grafana进行展示。
- Alarm:自带的报警工具,会在前端展示alarm信息。
生产部署架构图
需要注意的配置
Agent需要注意的配置
agent.namespace |
隔离trace数据,非必要不设置 |
agent.service_name |
服务名,通过环境变量注入 |
collector.backend_service |
Receiver的地址,通过环境变量注入 |
plugin.kafka.bootstrap_servers |
kafka地址,通过环境变量注入 |
plugin.kafka.namespace |
使用同一个kafka时用于隔离数据,非必要不设置 |
plugin.kafka.producer_config |
kafka的producer配置,可以把retries设置为3 |
Server需要注意的配置
cluster |
集群管理,通过nacos管理 |
core |
定义OAP角色和数据保存时间,当拆分角色时,一定要注意restHost和gRPCHost不能是0.0.0.0 |
storage |
数据存储,使用ES |
kafka-fetcher |
从kafka获取数据,可以优化consumerconfig |
问题及优化
问题:启动变慢
部分服务接入后,服务启动明显变慢,原先健康检查超时10s,接入后健康检查超时20s才行。
优化:
- 排查定位到kafka reporter会导致服务启动变慢,优化reporter
- 优化类匹配和增强环节后,应用启动耗时在预期内
问题:UI首页Topolopy打开慢
打开首页时,点击Topolopy时,响应很慢,会直接导致不可用。
优化:
- 通过页面编辑功能把这个页面删除了。
问题:trace不串联
在实际使用过程中,java sdk设置了agent namespace。当其他语言接入时,发现并不支持namespace设置,比如nodejs,这样导致nodejs调用java时链路串联不起来。
优化:
- 取消java sdk的namespace设置,使用默认配置。
问题:kafka积压
随着服务接入越来多,OAP消费kafka明显变慢,导致kafka堆积很多数据。
优化:
- 将OAP集群拆分成双集群,即把Mixed角色的集群拆分为Receiver角色和Aggregator角色。
- 优化kafka ConsumerConfig配置
UI使用
首页
左边的菜单栏显示支持的仪表盘类型,我们目前只需要关注General Service,在其下面有两个子仪表盘,分别是Services和Database,目前只会用到这两个仪表盘。打开地址时默认显示的服务级别的概要数据。
服务详情数据
如果要查看某个服务的详情数据,可以搜索某个服务,然后点击进去查看详情
- Overview:显示服务各个维度的详情数据,各种指标含义如下
- Apdex:应用性能满意度指数,取值范围是[0,1],值越高应用性能满意度越好
- Successful Rate:请求成功率,对于http请求,默认返回200代表成功
- Load:服务或者方法分钟级调用量
- Response Time Percentile:百分位响应时间,包含p99, p95, p90, p75, and p50
- Message Queue Consuming:服务使用MQ的指标统计
- Message Queue Avg Consuming Latency:消息消费延迟
- Instance:实例级的分钟调用量,请求成功率,响应延时概要数据
- Endpoint:接口或者方法级的分钟调用量,请求成功率,响应延时概要数据
- Topology:服务的依赖拓扑图
- Trace:服务的调用链路详情,可以快速地定位问题
Trace
链路追踪是SkyWalking关键的功能,通过trace可以定位问题出在哪里。SkyWalking通过一个全局ID串联各个分布式服务调用来形成一个追踪链路,这个全局ID是TraceID。
- 上游服务:被调用者是上游服务,最上游服务是数据库,比如A--->B,A依赖B服务,B是上游服务。
- 数据采样:采样针对的是trace采样,并不会对metric进行采样,设置采样率只会影响trace的数据,一般只在服务端设置采样率。
- Trace Segment List:一个Trace包含多个Trace Segment,一个Segment包含多个Span,每个Segment属于不同的服务. 通过traceid查询会显示多个Segment
- Segment:它是Skywalking中提出的概念,表示一次请求在某个应用内的执行链路片段合集,一个请求在多个服务中先后产生的Segment串联起来构成一个完整的Trace
- Span:调用链使用树型结构,每个树节点称为span,代表一次调用,所有span都会根据trace id和父span id串联成一个调用链。
- EntrySpan:代表服务提供方(server,MQ-consumer)
- LocalSpan:代表本地方法调用
- ExitSpan:代表服务调用方(client,MQ-producer)
- Trace Views:提供了trace不同的可视化格式
- TotalDuration = SelfDuration + Duration(s) of child spans
- Query Conditions:通过Status可以过滤有问题的请求
Topology
点击服务出现以下展示
- Inspect:点击显示该服务的对应拓扑图
- Alarm:点击显示服务对应的报警
- Service Dashboard:点击显示服务详情数据
- Service Instance Dashboard:点击显示实例级数据
- Endpoint Dashboard:点击显示接口或者方法级数据
- Service Relationship Metrics:点击图中圆点,显示2个服务的指标交互关系,这个可以定位到网络是否有延迟,当client段延迟明显高于server端,说明网络延迟高
参考
- 官网
- 平安千亿级实践
- 平安直播分享
- 知乎skywalking分享
- 采样详解
- Dapper翻译文章