概述
微服务系统监控三要素
现在系统基本都是微服务架构,对于复杂微服务链路调用如下问题如何解决?
- 一个请求经过了这些服务后其中出现了一个调用失败的问题,如何定位问题发生的地方?
- 如何计算每个节点访问流量?
- 流量波动的时候,增加哪些节点集群服务?
为了解决分布式应用、微服务系统面临的这些挑战,APM系统(Application Performance Management,即应用性能管理,简单来说就是应用监控)为之诞生,核心满足微服务系统监控的三要素如下:
- Logging : 就是记录系统行为的离散事件,例如,服务在处理某个请求时打印的错误日志,我们可以将这些日志信息记录到 ElasticSearch 或是其他存储中,然后通过 Kibana 或是其他工具来分析这些日志了解服务的行为和状态。大多数情况下,日志记录的数据很分散,并且相互独立,比如错误日志、请求处理过程中关键步骤的日志等等
- Metrics :是系统在一段时间内某一方面的某个度量,例如,电商系统在一分钟内的请求次数。我们常见的监控系统中记录的数据都属于这个范畴,例如 Promethus、Open-Falcon 等,这些监控系统最终给运维人员展示的是一张张二维的折线图。Metrics 是可以聚合的,例如,为电商系统中每个 HTTP 接口添加一个计数器,计算每个接口的 QPS,之后我们就可以通过简单的加和计算得到系统的总负载情况。
- Tracing :即我们常说的分布式链路追踪。在微服务架构系统中一个请求会经过很多服务处理,调用链路会非常长,要确定中间哪个服务出现异常是非常麻烦的一件事。通过分布式链路追踪,运维人员就可以构建一个请求的视图,这个视图上展示了一个请求从进入系统开始到返回响应的整个流程。这样,就可以从中了解到所有服务的异常情况、网络调用,以及系统的性能瓶颈等。
OpenTracing
早在在 2010 年 4 月谷歌发表了一篇论文《Dapper, a Large-Scale Distributed Systems TracingInfrastructure》阐述分布式追踪的概念,OpenTracing用于分布式跟踪和上下文传播的一致的、表达的、提供了一个标准的与供应商无关的api框架,这意味着如果开发者想要尝试一种不同的分布式追踪系统,开发者只需要简单地修改Tracer配置即可,而不需要替换整个分布式追踪系统;OpenTracing API目前也支持众多语言。了解OpenTracing API可以有利于更好学习本篇的主角SkyWalking。
开源APM系统
目前市面上开源的APM系统主要有CAT、Zipkin、Pinpoint,大都是参考Google的Dapper实现的
- CAT: 是由国内美团点评开源的,基于Java语言开发,目前提供Java、C/C++、Node.js、Python、Go等语言的客户端,监控数据会全量统计,国内很多公司在用,例如美团点评、携程、拼多多等,CAT跟下边要介绍的Zipkin都需要在应用程序中埋点,对代码侵入性强,我们倾向于选择对代码无侵入的产品,所以淘汰了CAT
- Zipkin: 由Twitter公司开发并开源,Java语言实现,侵入性相对于CAT要低一点,需要对web.xml之类的配置文件做修改,但依然对代码有侵入,也没有选择
- Pinpoint: 一个韩国团队开源的产品,运用了字节码增强技术,只需要在启动时添加启动参数即可,对代码无侵入,目前支持Java和PHP语言,底层采用HBase来存储数据,探针收集的数据粒度非常细,但性能损耗大,因其出现的时间较长,完成度也很高,应用的公司较多。
SkyWalking介绍
Apache SkyWalking 官网地址 https://skywalking.apache.org/ 最新版本9.1.0
Apache SkyWalking 文档地址 https://skywalking.apache.org/docs/
Apache SkyWalking v9.1.0文档地址 https://skywalking.apache.org/docs/main/v9.1.0/readme/
Apache SkyWalking GitHub源码地址 https://github.com/apache/skywalking
Apache SkyWalking用于分布式系统的应用程序性能监控工具,特别为微服务、云本地和基于容器(Kubernetes)架构设计。Service Mesh和FaaS已就绪,内置服务网格和FaaS可观察性,收集和分析Istio + Envoy Service Mesh和OpenFunction作为FaaS平台的数据。
SkyWalking基本可以满足对于分布式系统APM的所有需要的功能,功能非常强大、性能表现优秀、对业务代码无侵入, 增长势头强劲,社区活跃,中文文档齐全,支持多语言探针, SkyWalking 支持Dubbo、gRPC、SOFARPC 等很多框架,包含了云原生架构下的分布式系统的监控、跟踪、诊断、日志记录功能,可以在浏览器上观察分布式系统应用程序发生的一切。
-
核心功能
- 服务、服务实例、端点(URI)指标分析
- 根本原因分析。在运行时上分析由进程内代理和ebpf分析器支持的代码。
- 业务拓扑图分析
- 服务实例和端点(URI)依赖关系分析
- 服务和端点检测速度慢
- 性能优化
- 分布式跟踪和上下文传播
- 数据库访问指标。检测慢速数据库访问语句(包括SQL语句)
- 消息队列性能和消耗延迟监视
- 浏览器性能监控
- 基础设施(虚拟机、网络、磁盘等)监控
- 跨指标、跟踪和日志的协作
- 告警
-
特点
- 多语言支持,符合技术栈的Agent包括net Core、PHP、NodeJS、Golang、LUA、Rust和c++代理,积极开发和维护。用于C、c++、Golang和Rust的eBPF分析器作为附加。
- 为多种开源项目提供了插件,为 Tomcat、 HttpClient、Spring、RabbitMQ、MySQL 等常见基础设施和组件提供了自动探针。
- 微内核 + 插件的架构,存储、集群管理、使用插件集合都可以进行自由选择。
- 优秀的可视化效果。
基本概念
SkyWalking是一个开源的可观测平台的APM系统,用于收集、分析、聚合和可视化来自服务和云原生基础设施的数据。SkyWalking提供了一种简单的方式来维护分布式系统的清晰视图,甚至跨云。它是一个现代化的APM,专门为本地云、基于容器的分布式系统设计。
- 服务:表示一组/一组工作负载,它们为传入请求提供相同的行为,如一个微服务。在使用仪器代理或sdk时自定义服务名称。SkyWalking也可以使用你在Istio等平台中定义的名称。
- 服务实例:Service组中的每个工作负载都被称为一个实例,如运行某个微服务实例。
- 端点:服务中用于传入请求的路径,例如HTTP URI路径或gRPC服务类+方法签名。
- 进程:操作系统进程,在某些场景中,某个服务实例运行多个进程。
SkyWalking涵盖了所有3个可观察性领域,包括跟踪、指标和日志:
- 跟踪:SkyWalking原生数据格式,包括Zipkin v1和v2,以及Jaeger。
- 指标:SkyWalking集成了服务网格平台,如Istio、Envoy和Linkerd,将可观测性构建到数据平面或控制平面。此外,SkyWalking本机代理可以在度量模式下运行,这大大提高了性能。
- 日志记录:包括从磁盘或网络收集的日志。本机代理可以自动将跟踪上下文与日志绑定,或者使用skywalk通过文本内容绑定跟踪和日志。
架构
使用skywalk,用户可以了解服务和端点之间的拓扑关系,查看每个服务/服务实例/端点的指标,设置告警规则。SkyWalking逻辑上分为四个部分:探针、平台后端、存储和UI。
- Agent(探针):探针收集数据并根据SkyWalking的要求对数据进行重新格式化(不同的探测器支持不同的来源);Agent 运行在各个服务实例中,负责采集服务实例的 Trace 、Metrics 等数据,然后通过 gRPC 方式上报给 SkyWalking 后端。
- OAP:SkyWalking 的后端服务,支持数据聚合、分析和流处理,包括跟踪、指标和日志。
- 接收 Agent 上报上来的 Trace、Metrics 等数据,交给 Analysis Core (涉及SkyWalking OAP 中的多个模块)进行流式分析,最终将分析得到的结果写入持久化存储中。
- 响应 SkyWalking UI 界面发送来的查询请求,将前面持久化的数据查询出来,组成正确的响应结果返回给 UI 界面进行展示。
- 存储:SkyWalking数据可以选择存储在已实现的ElasticSearch, H2, MySQL, TiDB, InfluxDB的持久化系统,一般线上使用ElasticSearch 集群作为其后端存储。
- UI:可视化和管理SkyWalking 数据,前后端分离,该 UI 界面负责将用户的查询操作封装为 GraphQL 请求提交给 OAP 后端触发后续的查询操作,待拿到查询结果之后会在前端负责展示。
部署
下载
# 官网下载最新版本9.1.0 wget https://dlcdn.apache.org/skywalking/9.1.0/apache-skywalking-apm-9.1.0.tar.gz # 接下文件 tar -xvf apache-skywalking-apm-9.1.0.tar.gz # 进入目录 cd apache-skywalking-apm-bin/
部署ES
持久化存储我们选择ES,由于前面有两篇文章都讲过ES部署,一篇使用docker部署,一篇使用二进制文件部署,有兴趣可以前往去看。这里我们就直接使用
部署SkyWalking
SkyWalk部署很简单,部署方式有很多,官方提供二进制、Docker、K8S的部署指引,Docker和K8s部署详细可以查阅官网
# oap-server docker run --name oap --restart always -d -e SW_STORAGE=elasticsearch -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 apache/skywalking-oap-server:9.1.0 # UI docker run --name oap --restart always -d -e SW_OAP_ADDRESS=http://oap:12800 apache/skywalking-ui:9.1.0
学习则选择二进制部署方式,默认配置可以直接运行,但使用的存储是H2内存数据库,重启后数据丢失,修改oap-server配置文件中存储模式即可, vi config/application.yml
SkyWalk的webapp也即是UI默认的8080端口,这里就不修改
# 启动 sh ./bin/startup.sh # 启动后skywalking-oap-server会先判断是否有相应的表,没有则创建,创建的表也比较多,需要稍等一会,下面日志已经使用elasticsearch做持久化存储 2022-07-23 10:46:17,966 - org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoader - 118 [main] INFO [] - Provider=elasticsearch config=clusterNodes has been set as 192.168.5.52:9200
访问http://192.168.5.52:8080/ ,出现UI界面,当然9.x比8.x多出很多功能,包括服务网格、函数,可视化能力也是越来越强
Agent应用
下载
# 选择目前最新版本8.11.0 wget https://dlcdn.apache.org/skywalking/java-agent/8.11.0/apache-skywalking-java-agent-8.11.0.tgz # 解压后skywalk-agent.jar在根目录下,agent.config在config目录下
说明
- Agent可用于JDK 8 - 17。
- 在config/agent.config service_name。可以是英文中的任何字符串。
- agent在config/agent.config backend_service。默认点为127.0.0.1:11800,仅适用于本地后端,如果是远程配置远程地址。
- 将-javaagent:/path/to/skywalk -package/agent/skywalk-agent.jar添加到JVM参数。并确保将它添加到-jar参数之前。
Agent包目录如下:
配置
使用前面的库存微服务和订单微服务模块,将agent.config 拷贝到两个项目的resources目录下
库存微服务修改agent.config下面两个配置
agent.service_name=${SW_AGENT_NAME:ecom-storage-service} # Backend service addresses. collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.5.52:11800}
启动jvm参数增加
-javaagent:F:commomsskywalking-agentskywalking-agent.jar -Dskywalking_config=F:devsimple-ecommerceecom-storage-servicesrcmainresourcesagent.config
订单微服务修改agent.config下面两个配置
agent.service_name=${SW_AGENT_NAME:ecom-order-service} # Backend service addresses. collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.5.52:11800}
启动jvm参数增加
-javaagent:F:commomsskywalking-agentskywalking-agent.jar -Dskywalking_config=F:devsimple-ecommerceecom-order-servicesrcmainresourcesagent.config
启动库存微服务和订单微服务,启动日志中加载agent.config和使用skywalk-agent.jar
访问订单接口,http://localhost:4070/order/create/1000/1001/2 ,访问库存接口http://localhost:4080/list ,在普通服务的Service 页面中查看到两个微服务
在Topology查看微服务之间拓扑关系,可以设置查询的深度
在跟Trace查看跟踪列表信息,选择查询条件,可以切换树结构、表格、统计
点进列表的记录后还可以查看到详细信息,包括使用那个组件都有,但识别不一定很准确
普通服务的Service 页面选择服务如订单服务,显示订单服务的各项概览信息,可切换到实例、断点、拓扑、追踪、性能分析、日志等功能页面
自定义SkyWalking链路追踪
如果想要对项目里的业务方法实现链路追踪,方便排查问题,做法如下,先引入依赖
<dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-trace</artifactId> <version>8.11.0</version> </dependency>
然后在业务方法加上@Trace+@Tags注解,如果只需要一个Tag也可以直接@Trace+@Tag
@Override @GlobalTransactional @Trace @Tags({@Tag(key = "order",value = "returnedObj"), @Tag(key = "param1", value = "arg[0]"), @Tag(key = "param2", value = "arg[1]")}) public Order create(String userId, String commodityCode, int orderCount) { String xid = RootContext.getXID(); log.info("order xid:{}",xid); storageFeignService.deduct(commodityCode,orderCount); // int i = 1/0; Order order = new Order(); order.setUserId(userId); order.setCommodityCode(commodityCode); order.setCount(orderCount); order.setMoney(orderCount*10); orderMapper.insert(order); return order; }
重新启动库存和订单微服务,再次访问订单接口,http://localhost:4070/order/create/1000/1001/2
选择服务后再选择相应的功能页面
点击查询详细,这时候就可以查看业务方法的参数值和返回值信息
**本人博客网站 **IT小神 www.itxiaoshen.com