[toc]
一、分布式链路追踪
1.1 分布式链路追踪系统起源
在比较大型的web集群和微服务环境中,客户端的一次请求可能需要经过多个不通的模块,多个中间件,多台主机一起相互协作才能处理完成客户端的骑牛,而在这一系列的请求过程之中,处理流程可能是串行也可能是并行,要清晰的了解客户端的一次请求到结束的背后调用了哪些应用以及哪些模块并经过了哪些节点,且么个模块的调用先后顺序是怎么的,每个模块的处理相应性能如何,就需要一套链路追踪(Trace)来分析各个环节的业务处理状况,从而让运维人员对整个业务系统一目了然
分布式服务跟踪系统是整个分布式系统中跟踪一个用户请求的完整过程,包括数据采集、数据传输、数据存储、数据分析和数据可视化,获取并存储和分享此类跟踪可以让运维清晰了解用户请求也业务系统交互背后的这个调用链的调用关系,链路追踪系统是针对调试和监控微服务不可或缺的好帮手
- 业务环境
业务系统是使用复杂的、大规模的分布式集群实现,并且由很多服务组成,每个服务可能是使用不通的软件模块或开发框架,也可能是使用不同的编程语言开发,服务可能运行在数千台服务器,并且分步在不同的数据中心运行,对管理和监控产生挑战;因此需要链路追踪跟踪请求,查看整体系统的瓶颈和实时的状况,分析出响应慢或存在问题的环节
一个前端服务作为访问入口,用户的请求可能会被转发至多个后端服务处理,当出现系统响应慢的时候,运维工程师很难对各个请求链路了如指掌,因为服务开发和维护可能是由不同的团队维护的,而且不通的后端服务还可能被不同的前端进行调用,因此人工疏理和排错会变得耗时且艰难
- Dapper
Dapper是google公司在2008年就开始内部使用经过生产环境验证的链路追踪系统。2010年google发布的Dapper论文,《Dapper,a Large-Sacle Distributed Systems Tracing Infrastructure(2010)》
原文链接:https://www.researchgate.net/publication/239595848_Dapper_a_Large-Scale_Distributed_Systems_Tracing_Infrastructure
- 针对Dapper设计要求
无处不在的部署:任何服务都应该被监控到,出问题都要做到有据可查
持续的监控:做到7*24小时监控,任何时候出问题都要基于监控数据追踪问题根源
- 针对Dapper设计目标
低消耗:dapper跟踪系统对服务的影响应该做到最小,在一些高并发的场合,即使很小的影响也可能会导致服务出现延迟、负载变高或不可用,从而导致业务团队可能会停掉dapper系统
对应用透明:应用程序对dapper系统无感知深知不知道dapper系统的存在,假如一个跟踪系统必须依赖于应用的开发者配合才能实现跟踪,需要在应用中植入跟踪代码,那么可能会因为植入代码而产生bug或导致应用出问题
可伸缩性:针对未来众多的服务和大规模业务集群,dapper系统应该满足未来在性能的压力和功能上的需求
- Dapper请求链路
如下图是一个有五台服务器相关的服务,包括前端(A),两个中间层(B和C),以及两个后端(D和E),当一个用户(User)发起一个请求时,首先到达前端(A),然后发送两个RPC到服务器B和C,B收到请求后马上做出响应,但是C需要和后盾的D和E交互之后再返回给A,由A来响应最初的客户请求,对于这样一个请求,简单实用的分布式跟踪的实现,就是为服务器上每一次发送和接收动作来收集跟踪标识符(message identifiers)和时间戳(timestamp events)
- Dapper数据采集
分布式追踪的设计方案主要可以分为两类:黑盒(black-box)和标记(annotation-based)
黑盒法:无需任何侵入性代码,它的优势在于无需修改代码,缺点在于记录不是很准确,且需要大量数据才能够推导出服务间的关系
标记法:需要为每个请求打标记,并通过一个全局标识符将请求途径的所有服务信息串联,复盘整个链路,标记法记录准确,缺点是需要将标记代码注入到每个服务中
在google内部,几乎所有应用都使用相同的threading model、control flow和RPC systems,因此可以将打标记的工作集中在少量的公共库中,同样能够达到对应用透明的效果
- Dapper跟踪树和span
span代表系统中具有开始时间和执行时长的请求跨度,span之间通过嵌套或者顺序排列建立逻辑因果关系,在dapper跟踪树结构中,树节点是整个框架的基本单元,是请求从前端到后端不同应用之间层级机构,而每一个节点又是对span的引用,节点之间的连线表示span和它的父span直接的关系;下图说明了span在一个跟踪过程中的示例,dapper记录了span名称,以及每个span的ID和父ID,以重建在一次追踪过程中不同span之间的关系,如果一个span没有父ID,则称之为root span,所有span都挂载一个特定的跟踪上,也共用一个跟踪id,所有这些ID用全局唯一的64位整数表示,在一个典型的dapper跟踪中,每一个RPC对应到一个span上,而且每一个额外的组件层都对应一个跟踪树型结构的层级
任何一个span可以包含来自不同的主机信息,这些也要记录下来,事实上每一个RPC span可以包含客户端和服务器两个过程的注释,使得连接两个主机的span会成为图中的span,由于客户端和服务器上的时间戳来自不同的主机,还必须考虑到时间偏差,在分析工具中,就利用了时间偏差,即RPC客户端发送一个请求后,服务器端才能接收到,对于响应也是一样的(服务器先响应,然后客户端才能接收到这个响应),这样一来,服务器端的RPC就有一个时间戳的一个开始和结束,然后就可以计算出时间损耗。
对于traceid,在一个请求中,traceid从始至终都是一样的
- Dapper植入点
dapper可以实现对应用开发者近乎零侵入的成本对分布式请求链路进行跟踪,主要通过通用组件库实现;当一个线程在处理跟踪请求链路的过程中,dapper把这次跟踪的上下文的信息在ThreadLocal中进行存储,追踪上下文是一个小而且容易复制的空间,其中记录了Scan的属性信息,比如跟踪ID和Span ID;当用户的请求处理过程是延迟调用的或是异步的。大多数google开发者通过线程池或其他执行器,使用一个通用的控制流库来回调,dapper确保所有这样的回调可以存储这次跟踪的上下文,而当回调函数被触发时,这次跟踪的上下文会与适当的线程关联上,在这种方式下,dapper可以使用trace ID和span ID来辅助构建异步调用的路径;几乎所有的google进程间通信都是建立在一个C++和Java开发的RPC框架上,我们把跟踪植入该框架来定义RPC中所有的span,span ID和跟踪ID会从客户端发送到服务端,像那样基于RPC的系统被广泛使用在google中,这是一个重要的植入点,当那些非rpc通信框架发展成熟并找到了自己的用户群之后,会计划对RPC通信框架进行植入。
- Dapper添加Annotation
dapper还允许应用程序开发人员在Dapper跟踪的过程中添加额外的信息,以监控更高级别的系统行为,或帮助调试问题,dapper允许用户通过一个简单的API定义时间戳的Annotation,这些Annotation可以添加任意内容,为了保护dapper的用户过分热衷于日志的记录,每一个跟踪span有一个可配置的总Annotation量的上线,但是,应用程序级别的Annotation是不能替代用于表示span结构的信息和记录着RPC相关的信息;除了简单的文本Annotation,dapper也支持key-value映射的Annotation,提供给开发人员更强的跟踪能力,如持续的计数器,二进制消息记录和在一个进程上跑着的任意的用户数据,键值对的Annotation方式用来在分布式追踪的上下文中定义某个特定应用程序的相关类型
- Dapper采样率
低损耗是dapper的一个关键设计目标,因为如果这个工具价值未被证实并对性能有影响,那么服务运营人员就不愿意部署,并且,我们像让开发人员使用Annotation的API,而不用担心额外的开销,另外某些类型的web服务对植入带来的性能损耗确实非常敏感,因此,除了把dapper的收集工作对基本组件的性能损耗限制尽可能小之外,还有进一步控制损耗的办法,那就是遇到大量请求时只记录其中的一小部分
- Dapper跟踪收集实现步骤
dapper的跟踪记录和收集管道的过程分为三个阶段
- span数据写入本地日志文件中
- 守护进程和收集组件从主机中读取数据
- 写到dapper的数据仓库中
一次跟踪被设计成Bigtable中的一行,每一列相当于一个span,Bigtable支持稀疏表格布局正适合这种情况,因为每一个跟踪可以有任意多个span
- Dapper跟踪的代价
在生产环境的跟踪数据处理中,dapper的守护进程从来没有超过0.3%的单核cpu使用率,而且只有很少量的内存使用,另外还限制了dapper守护进程为内核scheduler最低的优先级,以防止在一台高负载的服务器上发生cpu竞争,dapper也是一个宽带资源的轻量级的消费者,每一个span在我们的仓库中传输只占用了平均426字节(byte),作为网络行为中的极小部分,dapper的数据收集在google的生产环境中只占用了0.01%的网络资源
创建root span:204纳秒,创建一般的span:176纳秒
建立一个annotation:40纳秒
写到本地磁盘
dapper本地进程:<0.3% CPU,< 0.01% 网络
- Dapper应用场景
性能分析:开发人员针对请求延迟的目标进行跟踪,并对容易优化的地方进行定位
正确性分析:发现一些只读请求应该是访问从库但是却访问了主库类似的业务场景
理解系统:全局优化系统,理解每个查询的整体代价
测试新版本:发现新版本的bug和性能问题
解决依赖关系:找到服务之间的依赖关系
1.2 分布式链路追踪系统简介
- APM概述
APM(Application Performance Management,应用性能管理)
早期APM工具功能比较单一,主要以监控CPU使用率、I/O、内存资源、网速等网络基础设施为主(cacti、nagios),随着中间件技术的不断发展,APM也开始监控缓存、数据库、MQ等各种基础组件的性能(zabbix、prometheus);微服务兴起之后,系统功能被模块化,再加上k8s与容器化的兴起及应用数量的爆炸式增长,各模块和服务之间的链路调用、响应时间、负载等越来越不好通过传统的工具进行监控和统计,此时APM系统应运而生
- APM项目
- CAT:由国内美团点评开源的,基于Java语言开发,目前提供Java、C/C++、Nodejs、Python、Go等语言的客户端,监控数据会全量统计,国内公司在用的有美团点评、携程、拼多多等,CAT需要开发人员手动在应用程序总埋点,对代码侵入性较强
- Zipkin:由Twitter公司开发并开源,基于Java语言实现,侵入性相对于CAT低一些,需要对web.xml等相关配置文件进行修改,但依然对系统有一定的侵入性,Zipkin可以轻松与Spring Cloud进行集成,也是Spring Cloud推荐的APM系统
- Jaeger:是Uber推出的一款开源分布式链路追踪系统,主要使用go语言开发,对业务代码侵入性较少
- Pinpoint:韩国团队开源的APM产品,运用了字节码增强技术,只需要在启动时添加启动参数即可实现APM功能,对代码无侵入,目前支持Java和PHP语言,底层采用HBase来存储数据,探针收集的数据粒度非常细,但性能损耗较大,因其出现的时间较长,完成度也很高,文档较为丰富,应用的公司较多
- SkyWalking:SkyWalking是有国内开源爱好者吴晟开源并提交到Apache孵化器的开源项目,2017年12月SkyWalking成为Apache国内首个个人孵化项目,2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目,目前SkyWalking支持Java、.Net、Nodejs、Go、Python等探针,数据存储支持MySQL、Elasticsearch等,SkyWalking与Pinpoint相同,对业务代码无侵入,不过探针采集数据粒度相较于Pinpoint来说略粗,但性能表现优秀,目前SkyWalking增长势头强劲,社区活跃,中文文档齐全,没有语言障碍,支持多语言探针,这些都是SkyWalking的优势所在,还有就是SkyWalking支持很多框架,包括国产框架,例如,Dubbo、gRPC、SOFARPC等,同时也有很多开发者正在不断向社区提供更多插件以支持更多组件无缝接入SkyWalking
- 开源的:piwik等
- 商业的:百度统计、growingio等
- OpenTracing规范
官方网址:https://opentracing.io/
由于以上APM系统较多,各个分布式链路追踪产品的API并不兼容,如果用户在各个产品之间进行切换,成本非常高,因此社区成立了OpenTracing组织,通过指定统一个API标准和数据结构模型,从而帮助开发人员和用户能够方便地使用或更换追踪系统
- OpenTracing数据模型trace
一个Trace代表一个事物、请求或是流程在分布式系统中的执行过程,OpenTracing中的一个Trace被认为是一个由多个Span组成的有向无环图( Directed Acyclic Graph,DAG图),一个Span代表系统中具有开始时间和执行时长的逻辑单元,一条Trace中Span是首尾连接的(从请求开始到响应结束)
- OpenTracing数据模型span
span代表系统中具有开始时间和执行长度的请求跨度,span之间通过嵌套或者顺序排列建立逻辑因果关系,每个span中可以包含以下的信息:
操作名称:例如访问的具体RPC服务,访问的URL地址等;起始时间;结束时间;span tag:一组键值对构成的span标签集合,其中键必须为字符串类型,值可以是字符串、bool类型或者数据;span log:一组span的日志集合;spanContext:trace的全局上下文信息;references:span之间的引用关系,下图详细说明span之间的引用关系,span的请求会产生logs,logs会携带一个时间戳以及一个可选的附加信息
- OpenTracing数据模型tags
每个span可以有多个键值对形式的tags,tags是没有时间戳的,只是为span添加一些简单解释和补充信息
- APM对比
Pinpoint | Zipkin | Jaeger | SkyWalking | |
---|---|---|---|---|
OpenTracing兼容 | 否 | 是 | 是 | 是 |
客户端支持语言 | java,php | java,c#,go,php等 | java,c#,go,php等 | java, .net core,nodejs,php |
存储 | hbase | es,mysql,Cassandra,内存 | es,mysql,Cassandra,内存 | es,h2,msyql,tidb,sharding sphere |
传输协议支持 | thrift | http,MQ | udp,http | gRPC,http |
UI丰富程度 | 高 | 低 | 中 | 中 |
实现方式 | 字节码注入,无侵入 | 拦截请求,侵入 | 拦截请求,侵入 | 字节码注入,无侵入 |
扩展性 | 低 | 高 | 高 | 中 |
Trace查询 | 不支持 | 支持 | 支持 | 支持 |
告警支持 | 支持 | 不支持 | 不支持 | 支持 |
JVM监控 | 支持 | 不支持 | 不支持 | 支持 |
性能损失 | 高 | 中 | 中 | 低 |
二、SkyWalking
2.1 SkyWalking简介
官方网址:https://skywalking.apache.org/
实现从请求跟踪,指标收集和日志记录的完整信息记录,多语言自动探针,支持Java、Go、Python、PHP、NodeJS、Lua、Rust等客户端;内置服务网格可观察性,支持从Istio+Envoy Service Mesh收集和分析数据,模块化架构,存储,集群管理,使用插件集合都可以进行自由选择;支持告警,优秀的可视化效果
- OAP
OAP(Observability Analysis Platform,可观测性分析平台)或OAP Server,是一个高度组件化的轻量级分析程序,由兼容各种探针Receiver、流式分析内核和查询内核三部分构成
探针:基于无侵入式的收集,并通过http或者gRPC方式发送数据到OAP Server
存储实现(Storage Implementors):SkyWalking OAP Server支持多种存储实现并且提供了标准接口,可支持不通的后端存储
UI模块(SkyWalking):通过标准的GraphQL(Facebook在2012年开源)协议进行统计数据查询和展示
GraphQL官方网址:https://graphql.cn/
- 设计模式
面向协议设计:是SkyWalking从5.x开始严格遵守的首要设计原则,组件之间使用标准的协议进行数据交互,协议分为探针协议和查询协议
- 探针协议
探针上报协议:协议包括语言探针的注册、Metrics数据上报、Tracing数据上报等标准,Java、Go等探针都需要严格遵守此协议的标准
探针交互协议:因为分布式追踪环境,探针间需要借助http header、MQ header在应用之间进行通信和交互,探针交互协议就定义了交互的数据格式
Service Mesh协议:是SkyWalking对Service Mesh抽象的专有协议,任何Mesh类的服务都可以通过此协议直接上传指标数据,用于计算服务的指标数据和绘制拓扑图
第三方协议:对大型的第三方开源项目,尤其是Service Mesh核心平台Istio和Envoy,提供核心协议适配,支持针对Istion+Envoy Service Mesh进行无缝对接
- 数据查询协议
元数据查询:查询在SkyWalking注册的服务、服务实例、Endpoint等元数据信息
拓扑关系查询:查询全局、单个服务、Endpoint的拓扑图及依赖关系
Metrics指标查询:查询指标数据
聚合指标查询:区间范围均值查询及Top N排名数据查询等
Trace查询:追踪数据的明细查询
告警查询:基于表达式,判断指标数据是否超出阈值
- skywalking设计
模块化设计:负责收集数据,前端负责展示数据,OAP Server负责从后端存储读写数据,后端存储负责持久化数据
轻量化设计:skywalking在设计之初就提出了轻量化的设计理念,使用最轻量级的jar包模式,实现强大的数据处理和分析能力、可扩展能力和模块化能力
- skywalking优势
兼容性好:支持传统的部署架构dubbo和spring cloud,也支持云原生中的Istio和Envoy
易于部署和后期维护:组件化,可以自动以部署,后期横向扩容简单
高性能:每天数T的数据无压力
易于二次开发:标准的http和grpc协议,开源的项目,企业可以自主二次开发
2.2 部署SkyWalking
2.2.1 二进制部署
skywalking-ui:前端服务,端口号8080
skywalking-oap(Observability Analysis Platform):可观测性分析平台,11800作为数据写入端口,12800作为查询端口
es7:9200为elasticsearch的数据读写端口,skywalking支持的存储有elasticsearch、h2、mysql、tidb、influxdb、postgresql等
agent:app服务器部署skywalking agent,用于收集app中的访问请求
- 部署elasticsearch
# 下载
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.1-amd64.deb
# 安装
dpkg -i elasticsearch-7.10.1-amd64.deb
# 修改配置文件 ...
# 重启并设计为开机启动
systemctl restart elasticsearch.service
systemctl enable elasticsearch.service
- 部署skywalking server
# 安装openjdk-11-java
apt install -y openjdk-11-java
# 下载
wget https://archive.apache.org/dist/skywalking/8.6.0/apache-skywalking-apm-es7-8.6.0.tar.gz
# 解压
tar xvf apache-skywalking-apm-es7-8.6.0.tar.gz
# 修改配置文件
vim config/application.yml
storage:
selector: ${SW_STORAGE:elasticsearch7} # 112行指定存储为es7
elasticsearch7:
nameSpace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:ES_IP:9200} # 141行指定es7地址
# 启动
./bin/startup.sh
# 查看日志是否启动成功
tail -f logs/skywalking-oap-server.log
- 验证
注意右下角服务器时区,一定要跟主机时区对应上,不然展示不出来数据
2.2.2 docker-compose部署
version: '3.3'
services:
es7:
image: elasticsearch:7.16.1
container_name: elasticsearch7
ports:
- 9200:9200
- 9300:9300
environment:
- discovery.type=single-node
- TZ=Asia/Shanghai
ulimits:
memlock:
soft: -1
hard: -1
skywalking-oap:
image: apache/skywalking-oap-server:8.6.0-es7
container_name: skywalking-oap
restart: always
depends_on:
- elasticsearch7
links:
- elasticsearch7
ports:
- 11800:11800
- 12800:12800
environment:
TZ: Asia/Shanghai
SW_STORAGE: elasticsearch7
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch7:9200
skywalking-ui:
image: apache/skywalking-ui:8.6.0
container_name: skywalking-ui
restart: always
depends_on:
- skywalking-oap
links:
- skywalking-oap
ports:
- 8080:8080
environment:
TZ: Asia/Shanghai
SW_OAP_ADDRESS: skywalking-oap:12800
主机需要先安装docker和docker-compose
- 启动
docker-compose up -d
虚拟机的内存需要多分配一些,如果在启动的时候指定分配内容,虚拟机内存又不够,es就会耗时好几分钟才能启动起来,然后再过几分钟,skywalking-ui才能启动
2.3 追踪实例
2.3.1 halo博客
官方网址:https://halo.run/
- 下载skywalking的java agent
# 下载
wget https://archive.apache.org/dist/skywalking/java-agent/8.8.0/apache-skywalking-java-agent-8.8.0.tgz
# 解压
tar xvf apache-skywalking-java-agent-8.8.0.tgz
# 配置
cd skywalking-agent
vim config/agent.config
agent.namespace=${SW_AGENT_NAMESPACE:myapp}
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:IP:11800} # skywalking server地址
- 下载halo
wget https://dl.halo.run/release/halo-1.4.17.jar -O halo.jar
- 启动halo并配置链路跟踪
apt install -y openjdk-11-jdk
java -javaagent:/data/skywalking-agent/skywalking-agent.jar -jar /apps/halo/halo.jar
默认监听端口8090
halo 目前运行 Halo 的最低依赖要求为 JRE 11,请务必确保在进行下面操作之前已经正确安装了 JRE
官方网址安装指导:https://docs.halo.run/getting-started/install/linux
- halo页面验证
- skywalking页面验证
注意时间选择最近15分钟,注意时区,需要跟服务器时区保持一致
- skywalking仪表盘
Apdex全称是(Application Performance Index,应用性能指数),是由Apdex联盟开放的用于评估应用性能的标准,Apdex联盟起源于2004年,Apdex标准是从用户的角度触发,提供一个统一的测量和报告用户体验的方法,将其量化为范围是0~1的满意度评价,把最终用户的体验和应用性能作为一个完整的指标进行统一度量;在网络中运行的任何一个应用(web服务),它的响应时间决定了用户的满意程度,用户等待所有交互完成时间的长短直接影响了用户对应用的满意程度,这才是对用户有真正意义的“响应时间”,Apdex把完成这样一个任务所用的时长称为应用的“响应性“
Apdex定义了应用响应时间的最优门槛为T,另外根据应用响应时间结合T定义了三种不通的性能表现:
Satisfied(满意):应用响应时间小于或等于Apdex阈值,比如Apdex阈值为1s,则一个耗时小于1s的响应结果则认为是满意的
Tolerating(可容忍):应用响应时间大于Apdex阈值,但同时小于或等于4倍的Apdex阈值,若阈值为1s,则4*1=4s为响应时间的容忍上限
Frustrated(烦躁期):应用响应时间大于4倍的Apdex阈值
服务(Service):表示对请求提供相同行为的一系列或一组工作负载(服务名称),在使用Agent或SDK的时候,可以自定义服务的名字,如果不定义,SkyWalking将会使用在平台(例如Istio)上定义的名字
服务实例(Instance):一组工作负载中的每一个工作称为一个实例(一个服务运行的节点),一个服务实例可以是一个kubernetes中的pod或者是一个虚拟机或是物理机
端点(Endpoint):对于特定服务所接收的请求路径,如HTTP的URI路径和gRPC服务的类+方法签名,如/api/v1
- skywalking拓扑图
- skywalking追踪图
2.3.2 tomcat运行jenkins
- 启动jenkins
# 下载
wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.37/bin/apache-tomcat-8.5.37.tar.gz
# 解压
tar xvf apache-tomcat-8.5.37.tar.gz
# 配置tomcat加载war包路径
vim apache-tomcat-8.5.37/conf/server.xml
# 配置tomcat启动脚本 添加如下参数
vim apache-tomcat-8.5.37/bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/data/skywalking-agent/skywalking-agent.jar";export CATALINA_OPTS
# 启动tomcat
./apache-tomcat-8.5.37/bin/startup.sh
- jenkins页面
- skywalking页面
2.3.3 微服务追踪
- zookeeper安装
# 下载
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
# 解压
tar xvf apache-zookeeper-3.6.3-bin.tar.gz
# 配置
cp conf/zoo_sample.cfg conf/zoo.cfg
# 启动zookeeper
./bin/zkServer.sh start
- 生产者
# 配置
vim dubbo-demo-provider-2.1.5/conf/dubbo.properties
dubbo.registry.address=zookeeper://IP:2181
# 启动生产者
java -javaagent:/data/skywalking-agent/skywalking-agent.jar -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC -classpath /apps/dubbo/dubbo-demo-provider-2.1.5/conf:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/cache-api-0.4.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/commons-codec-1.4.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/commons-logging-1.1.1.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/commons-pool-1.5.5.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/dubbo-2.1.5.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/dubbo-demo-2.1.5.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/dubbo-demo-provider-2.1.5.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/fastjson-1.1.8.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/gmbal-api-only-3.0.0-b023.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/grizzly-core-2.1.4.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/grizzly-framework-2.1.4.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/grizzly-portunif-2.1.4.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/grizzly-rcm-2.1.4.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/hessian-4.0.7.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/hibernate-validator-4.2.0.Final.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/httpclient-4.1.2.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/httpcore-4.1.2.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/javassist-3.15.0-GA.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/jedis-2.0.0.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/jetty-6.1.26.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/jetty-util-6.1.26.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/jline-0.9.94.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/log4j-1.2.16.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/management-api-3.0.0-b012.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/mina-core-1.1.7.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/netty-3.2.5.Final.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/servlet-api-2.5-20081211.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/slf4j-api-1.6.2.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/spring-2.5.6.SEC03.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/validation-api-1.0.0.GA.jar:/apps/dubbo/dubbo-demo-provider-2.1.5/lib/zookeeper-3.3.3.jar: com.alibaba.dubbo.container.Main
- 消费者
# 配置
vim dubbo-demo-consumer-2.1.5/conf/dubbo.properties
dubbo.registry.address=zookeeper://192.168.204.96:2181
# 启动
java -javaagent:/data/skywalking-agent/skywalking-agent.jar -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC -classpath /apps/dubbo/dubbo-demo-consumer-2.1.5/conf:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/cache-api-0.4.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/commons-codec-1.4.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/commons-logging-1.1.1.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/commons-pool-1.5.5.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/dubbo-2.1.5.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/dubbo-demo-2.1.5.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/dubbo-demo-consumer-2.1.5.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/fastjson-1.1.8.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/gmbal-api-only-3.0.0-b023.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/grizzly-core-2.1.4.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/grizzly-framework-2.1.4.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/grizzly-portunif-2.1.4.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/grizzly-rcm-2.1.4.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/hessian-4.0.7.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/hibernate-validator-4.2.0.Final.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/httpclient-4.1.2.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/httpcore-4.1.2.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/javassist-3.15.0-GA.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/jedis-2.0.0.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/jetty-6.1.26.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/jetty-util-6.1.26.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/jline-0.9.94.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/log4j-1.2.16.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/management-api-3.0.0-b012.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/mina-core-1.1.7.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/netty-3.2.5.Final.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/servlet-api-2.5-20081211.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/slf4j-api-1.6.2.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/spring-2.5.6.SEC03.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/validation-api-1.0.0.GA.jar:/apps/dubbo/dubbo-demo-consumer-2.1.5/lib/zookeeper-3.3.3.jar: com.alibaba.dubbo.container.Main
- skywalking验证
2.3.4 python服务追踪
python agent官方网址:https://pypi.org/project/apache-skywalking/0.7.0/
- 安装pip
apt install -y python3-pip
- 安装skywalking
pip3 install "apache-skywalking"
python3
>>> from skywalking import agent, config
>>> config.init(collector_address='IP:11800', service_name='python-app-test')
>>> agent.start()
- Django验证
- skywalking验证
2.4 告警
告警规则github地址:https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/backend-alarm.md
- 告警指标
service_resp_time:服务响应时间
service_sla:服务的http请求成功率SLA,比如99%等
service_cpm:每分钟的吞吐量
service_apdex:应用性能指数(0.8或0.x)
service_percentile:指定最近多少数据范围内的响应时间百分比,即p99,p95在内的数据统计结果
skywalking-oap的/skywalking/config/oal/core.oal配置文件字段
- 配置alert-setting.yml文件
rules: # 定义rule规则
service_cpm_rule: # 唯一的规则名称,必须以_rule结尾
# Metrics value need tom long, double or int
metrics-name: service_cpm # 指标名称
op: ">" # 操作符,>=,==,<,<=
threshold: 1 # 指标阈值
# The length of time to evaluate the metrics
period: 2 # 评估指标的间隔周期
# How many times after the metrics match the condition, will trigger alarm.
count: 1 # 匹配成功多少次会触发告警
# How many times of checks, the alarm keeps silence after alarm triggered, default as same sa period.
silence-period: 2 # 触发告警后的静默时间
message: dubbo-provider service_cpm 大于1 # 告警信息
dingtalkHooks:
textTemplate: |-
{
"msgtype": "text",
"text": {
"content": "Apache SkyWalking Alarm sen: \n %s."
}
}
webhooks:
- url: https://oapi.dingtalk.com/robot/send?access_token=TOKEN
dingtalk告警在github网址上有
- skywalking验证
- 钉钉截图验证
以生产者消费者示例