概述

微服务系统监控三要素

现在系统基本都是微服务架构,对于复杂微服务链路调用如下问题如何解决?

  • 一个请求经过了这些服务后其中出现了一个调用失败的问题,如何定位问题发生的地方?
  • 如何计算每个节点访问流量?
  • 流量波动的时候,增加哪些节点集群服务?

为了解决分布式应用、微服务系统面临的这些挑战,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。

OpenTracing GitHub地址 https://github.com/opentracing

OpenTracing 官方地址 https://opentracing.io/

开源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:\commoms\skywalking-agent\skywalking-agent.jar
-Dskywalking_config=F:\dev\simple-ecommerce\ecom-storage-service\src\main\resources\agent.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:\commoms\skywalking-agent\skywalking-agent.jar
-Dskywalking_config=F:\dev\simple-ecommerce\ecom-order-service\src\main\resources\agent.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

SkyWalking分布式系统应用程序性能监控工具-上的更多相关文章

  1. SkyWalking分布式系统应用程序性能监控工具-中

    其他功能 性能剖析 在系统性能监控方法上,Skywalking 提出了代码级性能剖析这种在线诊断方法.这种方法基于一个高级语言编程模型共性,即使再复杂的系统,再复杂的业务逻辑,都是基于线程去进行执行的 ...

  2. [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上)

    [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上) 本节导读: 随着硬件和网络的高速发展,为多线程(Multithreading) ...

  3. Java程序性能监控工具

    系统性能监控: 确定系统运行的整体状态,基本定位问题所在 uptime命令 [root@localhost ~]# uptime23:19:38 up 244 days, 3:39, 34 users ...

  4. JVM-Java程序性能监控-初级篇

    前篇 - 小伙们都知道,java程序的性能监控主要是针对jvm中heap的监控~ 那么在做压力测试时如何对heap.线程等一系列的指标进行的监控的呢? 首先-你若不懂命令,那么就需要了解一套Java程 ...

  5. CentOS 7上的性能监控工具

    Linux中基于命令行的性能监控工具:dstat.top.netstat.vmstat.htop.ss.glances 1.dstat – 多类型资源统计工具(需配置epel源) 该命令整合了vmst ...

  6. 五大最佳开源java性能监控工具

    如果你正在寻找性能监控工具,不妨看看以下推荐的这五款开源工具,这些工具目前已经可以替代付费工具了,你可以看看是否是你的最佳选择.本文推荐的五款开源工具目前是开源社区中最受欢迎的. 1. Stagemo ...

  7. 你值得拥有:25个Linux性能监控工具

    一.基于命令行的性能监控工具 1.dstat - 多类型资源统计工具 该命令整合了vmstat,iostat和ifstat三种命令.同时增加了新的特性和功能可以让你能及时看到各种的资源使用情况,从而能 ...

  8. 深入理解JVM—性能监控工具

    (转自:http://yhjhappy234.blog.163.com/blog/static/31632832201222691738865/) 我们知道,在JVM编译期和加载器,甚至运行期已经做了 ...

  9. 25个Linux性能监控工具

    一段时间以来,我们在网上向读者介绍了如何为Linux以及类Linux操作系统配置多种不同的性能监控工具.在这篇文章中我们将罗列一系列使用最频繁的性能监控工具,并对介绍到的每一个工具提供了相应的简介链接 ...

随机推荐

  1. 从旧金山到上海, HTTP/3 非常快!

    HTTP/3 是超文本传输协议 (HTTP) 的第三个版本,它对 Web 性能来说意义重大, 让我们看看HTTP/3 如何让网站的速度变得更快! 等等,HTTP/2 发生了什么? 不是几年前才开始推广 ...

  2. numpy学习Ⅱ

    今天有空再把numpy看一下,补充点不会的,再去看matplotlib 回顾之前笔记,发现之前的numpy学习Ⅰ中关于numpy的行.列.维可能表述有点不清晰,这里再叙述一下 import numpy ...

  3. Web Api源码(路由注册)

    这篇文章只是我学习Web API框架的输出,学习方法还是输出倒逼输入比较行得通,所以不管写的好不好,坚持下去,肯定有收获.篇幅比较长,仔细思考阅读下来大约需要几分钟. 做.NET开发有好几年时间了,从 ...

  4. k8s docker 中部署think php 并搭建php websocket

    不得不说php 对云原生有点不够友好,之前用java .net打包docker镜像 一下就ok了,php倒腾了好久才算部署成功. 场景:使用阿里云ack(k8s) 部署采用thinkPHP框架的php ...

  5. linux篇-linux数据库mysql的安装

    1数据库文件放到opt下面 2赋予权限775 3运行脚本 4运行成功 5数据库操作 密码修改并刷新 权限修改,允许外部设备访问 6工具连接 7附录 1.显示当前数据库服务器中的数据库列表: mysql ...

  6. 个人作业——体温上报app(二阶段)

    Code.java package com.example.helloworld; import android.graphics.Bitmap; import android.graphics.Ca ...

  7. python之三元表达式与生成式与匿名与内置函数(部分)

    目录 三元表达式 各种生成式 列表生成式(可同样作用于集合) 字典生成式 匿名函数 重要内置函数 map() zip() filter() reduce() 常见内置函数(部分) 三元表达式 三元表达 ...

  8. MySQL数据库和Oracle数据库的区别

    Mysql数据库 由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司.是一种中小型的关系型数据库. MySQL 数据库体积小.速度快.总体拥有成本低.开放源代码,其有着广泛的应用,一般中 ...

  9. 架构师必备:系统容量现状checklist

    正如飞机在起飞前,机长.副机长要过一遍checklist检查,确认没问题了才能起飞.楼主也整理了一个系统容量现状checklist,方便对照检查.本文搭配架构师必备:如何做容量预估和调优,食用更佳. ...

  10. 基于SqlSugar的开发框架循序渐进介绍(8)-- 在基类函数封装实现用户操作日志记录

    在我们对数据进行重要修改调整的时候,往往需要跟踪记录好用户操作日志.一般来说,如对重要表记录的插入.修改.删除都需要记录下来,由于用户操作日志会带来一定的额外消耗,因此我们通过配置的方式来决定记录那些 ...