APM概述

APM 系统(Application Performance Monitor,即应用性能监控)。
微服务兴起之后,系统功能被模块化,再加上k8s与容器化的兴起及应用数量的爆炸式增长,各模块和服务之的调用链路、响应时间、负载等越来越不好通过传统的工具进行监控和统计,此时APM系统诞生了(应运而生)。

APM特点:

  1. 收集应用程序的性能:
    APM系统的核心作用是收集并展示应用程序接收请求和构建响应的性能,从而掌握整条链路的途径和性能,通过APM可以帮助运维人员快速统计出应用程序中访问量最多的URL、响应最慢的URL以及应用程序需要优化的URL等。
  2. 监控应用程序调用的中间件的性能(依赖调用):
    应用程序也可能由于其依赖的中间件或者其它的API的性能有问题、例如被调用的数据库、缓存、Web 服务器、第三方服务等响应慢而导致应用程序变慢,因此不仅要监控应用程序自身,还要监控其所有的外部依赖项。
  3. 在代码级别实现性能分析:
    通过在代码级别分析应用程序中的class等,APM工具可以深入了解并分析导致应用程序性能较低的代码
  4. 监控应用程序资源使用情况:
    监控资源使用情况尤其是CPU和内存的使用情况至关重要(如java程序的内存使用等),尤其是想根据资源利用率实现自动弹性伸缩应用程序。
  5. 统一展示监控数据和日志:
    应用程序的性能统计、访问和错误日志在统一的平台进行展示,方便快速查询与故障定位

APM项目

  1. CAT: 由国内美团点评开源的,基于Java语言开发,目前提供Java、C/C++、Node.js、Python、Go等语言的客户端,监控数据会全量统计,国内很多公司在用,例如美团点评、携程、拼多多等,CAT需要开发人员手动在应用程序中埋点,对代码侵入性比较强。
  2. Zipkin: 由Twitter公司开发并开源,基于Java 语言实现,侵入性相对于CAT要低一点,需要对web.xml等相关配置文件进行修改,但依然对系统有一定的侵入性,Zipkin可以轻松与Spring Cloud进行集成,也是Spring Cloud推荐的APM系统。
  3. Jaeger: 是Uber推出的一款开源分布式追踪系统,主要使用go语言开发,对业务代码侵入性较少。
  4. Pinpoint: 韩国团队开源的APM产品,运用了字节码增强技术,只需要在启动时添加启动参数即可实现APM功能,对代码无侵入,目前支持Java和 PHP语言,底层采用HBase来存储数据,探针收集的数据粒度非常细,但性能损耗较大,因其出现的时间较长,完成度也很高,文档也较为丰富,应用的公司较多。
  5. SkyWalking: Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的开源项目,2017年12月SkyWalking成为Apache国内首个个人孵化项目,2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目,目前SkyWalking支持Java、.Net、Node.js、go、python等探针,数据存储支持MySQL、ElasticSearch等,SkyWalking与Pinpoint相同,对业务代码无侵入,不过探针采集数据粒度相较于Pinpoint来说略粗,但性能表现优秀,目前SkyWalking增长势头强劲,社区活跃,中文文档齐全,没有语言障碍,支持多语言探针,这些都是 SkyWalking的优势所在,还有就是SkyWalking支持很多框架,包括很多国产框架,例如,Dubbo、gRPC、SOFARPC 等等,同时也有很多开发者正在不断向社区提供更多插件以支持更多组件无缝接入SkyWalking。

APM对比

全链路监控 Java 以及log覆盖 starter apm全链路监控_java

skywalking 简介以及特性

  1. 实现从请求跟踪、指标收集和日志记录的完整信息记录。
  2. 多语言自动探针,支持Java、GO、Python、PHP、NodeJS、LUA、Rust等客户端。
  3. 内置服务网格可观察性,支持从Istio+Envoy Service Mesh收集和分析数据。
  4. 模块化架构,存储、集群管理、使用插件集合都可以进行自由选择。
  5. 支持告警。

skywalking组件介绍

全链路监控 Java 以及log覆盖 starter apm全链路监控_skywalking_02

  • OAP平台(Observability Analysis Platform,可观测性分析平台)或OAP Server,它是一个高度组件化的轻量级分析程序,由兼容各种探针Receiver、流式分析内核和查询内核三部分构成。
  • 探针:基于无侵入式的收集,并通过HTTP或者gRPC方式发送数据到OAP Server。
  • 存储实现(Storage Implementors),SkyWalking OAP Server支持多种存储实现并且提供了标准接口,可支持不同的存储后端。
  • UI模块(SkyWalking),通过标准的GraphQL(Facebook在2012年开源)协议进行统计数据查询和展示 。

部署skywalking

二进制部署

部署规划:

  • skywalking-ui: 前端服务,端口号8080
  • skywalking-oap(Observability Analysis Platform):可观测性分析平台,11800为gRPC数据端口,12800为http数据端口。
  • es7:9200为elasticsearch的数据读写端口,skywalking支持的存储有elasticsearch、h2、mysql、tidb、influxdb、postgresql等。
  • agent: app服务器部署skywalking agent,用于收集app中的访问请求。
cd /app
wget https://www.apache.org/dyn/closer.cgi/skywalking/9.2.0/apache-skywalking-apm-9.2.0.tar.gz
tar -xvf apache-skywalking-apm-9.2.0.tar.gz
ln -sv apache-skywalking-apm-bin skywalking
vim /app/skywalking/config/application.yml #一般选择es做为后端存储数据库
storage:
  selector: ${SW_STORAGE:elasticsearch}

sh /app/skywalking/bin/startup.sh #

实战案例

java应用实例

  1. 准备jdk环境
apt install openjdk-11-jdk
  1. 准备java agent
cd /app
wget https://dlcdn.apache.org/skywalking/java-agent/8.12.0/apache-skywalking-java-agent-8.12.0.tgz --no-check-certificate 
tar -xvf  apache-skywalking-java-agent-8.12.0.tgz
vim skywalking-agent/config/agent.config
agent.namespace=${SW_AGENT_NAMESPACE:halo}
agent.service_name=${SW_AGENT_NAME:halo}
agent.cluster=${SW_AGENT_CLUSTER:halo}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.2.130:11800}
  1. 准备halo包
wget https://dl.halo.run/release/halo-1.4.17.jar
  1. 启动服务
java -javaagent:./skywalking-agent/skywalking-agent.jar -jar halo-1.4.17.jar

全链路监控 Java 以及log覆盖 starter apm全链路监控_应用程序_03


全链路监控 Java 以及log覆盖 starter apm全链路监控_skywalking_04


全链路监控 Java 以及log覆盖 starter apm全链路监控_应用程序_05

skywalking仪表盘简介

Overview: 显示服务的全局统计详情。

服务(Service):表示对请求提供相同行为的一系列或一组工作负载(服务名称),在使用Agent或SDK的时候,可以自定义服务的名字。
服务实例(Instance)-上述的一组工作负载中的每一个工作负载称为一个实例(一个服务运行的节点),一个服务实例可以是一个kubernetes中的pod或者是一个虚拟机甚至是物理机 。

端点(Endpoint) :对于特定服务所接收的请求路径, 如HTTP的URI路径和gRPC服务的类 +方法签名,如/api/v1/

Topology: 查看服务拓扑结构

前端vue项目实战案例

需要引入skywalking-client-js探针

npm install skywalking-client-js --save

main.js文件中添加如下代码:

router.afterEach(() => { // skywalking 前端检测探针
  ClientMonitor.setPerformance({ service: 'browser-app', serviceVersion:
  '1.0.0', pagePath: location.href, useFmp: true, vue:'Vue' }); });

vue.config.js文件中添加如下代码:

devServer:{
    proxy: {
      '/browser': {
      target: "http://192.168.2.130:12800",//注意,这里填写skywalking的地址,http端口一定要填写12800
changeOrigin: true }}
  }

至此,项目配置完成,发送前端请求即可看到前端的性能指标

全链路监控 Java 以及log覆盖 starter apm全链路监控_skywalking_06


全链路监控 Java 以及log覆盖 starter apm全链路监控_skywalking_07


全链路监控 Java 以及log覆盖 starter apm全链路监控_分布式_08