APM简介:

APM 系统(Application Performance Monitor,即应用性能监控)

  • user experience: 用户体验
  • bandwidth consumption: 带宽消耗
  • application architecture discovery:应用架构发现
  • application transactions tracing: 应用程序事务跟踪
  • application diagnostics:应用程序诊断
  • analytics:分析
  • notifications & reports: 通知和报告
  • deep-dive component monitoring:深入组件监控
    APM简介

APM概述

  • 早期监控工具功能比较单一,主要以监控CPU使用率、I/O、内存资源、网速等网络基础设施为主(cacti、nagios)
  • 后来随着中间件技术的不断发展,APM也开始监控缓存、数据库、MQ等各种基础组件的性能(zabbix、prometheus)
  • 微服务兴起之后,系统功能被模块化,再加上k8s与容器化的兴起及应用数量的爆炸式增长,各模块和服务之的调用链路、响应时间、负载等越来越不好通过传统的工具进行监控和统计,此时APM系统诞生了(应运而生)。

APM核心功能

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

APM项目

  • CAT: 由国内美团点评开源的,基于Java语言开发,目前提供Java、C/C++、Node.js、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、Node.js、go、python等探针,数据存储支持 MySQL、ElasticSearch等,SkyWalking与Pinpoint相同,对业务代码无侵入,不过探针采集数据粒度相较于Pinpoint来说略粗,但性能表现优秀,目前 SkyWalking增长势头强劲,社区活跃,中文文档齐全,没有语言障碍,支持多语言探针,这些都是 SkyWalking的优势所在,还有就是SkyWalking支持很多框架,包括很多国产框架,例如,Dubbo、gRPC、SOFARPC 等等,同时也有很多开发者正在不断向社区提供更多插件以支持更多组件无缝接入SkyWalking。

APM对比:

APM对比图

APM-OpenTracing规范:

由于APM系统较多,各个分布式链路追踪产品的 API 并不兼容,用户在各个产品之间进行切换,成本非常高,因此社区成立了OpenTracing组织,OpenTracing 通过制定统一的API标准和数据结构模型,从而帮助开发人员和用户能够方便地使用或更换追踪系统。

https://opentracing.io/

APM-OpenTracing规范图

开放式跟踪数据模型跟踪(OpenTracing Data Model-Trace)

一个 Trace 代表一个事务、请求或是流程在分布式系统中的执行过程。 OpenTracing 中的一条 Trace 被认 为是一个由多个 Span 组成的有向无环图( DAG 图),一个 Span 代表系统中具有开始时间和执行时长的逻辑单元,Span一般会有一个名称, 一条 Trace 中 Span 是首尾连接的(从请求开始到响应结束)。
开放式跟踪数据模型跟踪图

开放式跟踪数据模型跨度(OpenTracing Data Model-Span)

Span 代表系统中具有开始时间和执行时长的请求跨度,Span之间通过嵌套或者顺序排列建立逻辑因果关系,每个Span中可以包含以下的信息:

  • 操作名称:例如访问的具体 RPC 服务,访问的 URL 地址等;
  • 起始时间;
  • 结束时间;
  • Span Tag:一组键值对构成的 Span 标签集合,其中键必须为字符串类型,值可以是字符串、bool 值或者数字;
  • Span Log:一组 Span 的日志集合;
  • SpanContext:Trace 的全局上下文信息;
  • References:Span 之间的引用关系,下面详细说明 Span 之间的引用关系;
  • Span的请求会产生logs,logs会携带一个时间戳以及一个可选的附加信息。
    开放式跟踪数据模型跨度图

开放式跟踪数据模型标记(Open Tracing Data Model Tags)

每个 Span 可以有多个键值对形式的 Tags,Tags 是没有时间戳的,只是为 Span 添加一些简单解释和补充信息:

开放式跟踪数据模型标记展示图

SkyWalking介绍:

SkyWalking功能:

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

SkyWalking 组件:

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

SkyWalking-设计模式:

  • 面向协议设计:面向协议设计是SkyWalking从5.x开始严格遵守的首要设计原则,组件之间使用标准的协议进行数据交互。
  • 协议有探针协议和查询协议
    SkyWalking 组件

SkyWalking-探针协议:

  • 探针上报协议:协议包括语言探针的注册、Metrics数据上报、Tracing数据据上报等标准,Java、Go等探针都需要严格遵守此协议的标准。
  • 探针交互协议:因为分布式追踪环境,探针间需要借助HTTP Header、MQ Header在应用之间进行通信和交互,探针交互协议就定义了交互的数据格式。
  • Service Mesh协议:是SkyWalking对Service Mesh抽象的专有协议,任何Mesh类的服务都可以通过此协议直接上传指标数据,用于计算服务的指标数据和绘制拓扑图。
  • 第三方协议: 对大型的第三方开源项目 尤其是Service Mesh核心平台Istio和Envoy,提供核心协议适配,支持针对Istio+Envoy Service Mesh进行无缝对接。

SkyWalking-数据查询协议:

  • 元数据查询:查询在SkyWalking注册的服务、服务实例、Endpoint等元数据信息。
  • 拓扑关系查询:查询全局、或者单个服务、Endpoint的拓扑图及依赖关系。
  • Metrics指标查询: 查询指标数据。
  • 聚合指标查询:区间范围均值查询及Top N排名数据查询等。
  • Trace查询:追踪数据的明细查询。
  • 告警查询:基于表达式,判断指标数据是否超出阈值。

SkyWalking-设计:

模块化设计:

  • 探针收负责集数据
  • 前端负责展示数据
  • 后端负责从后端存储读写数据
  • 后端存储负责持久化数据

轻量化设计:

  • SkyWalking在设计之初就提出了轻量化的设计理念,SkyWalking使用最轻量级的jar包模式,实现强大的数据处理和分析能力、可扩展能力和模块化能力。

SkyWalking-优势

兼容性好:

  • 支持传统的开发框架dubbo和spring cloud,也支持云原生中的Istio和envoy。
  • 易于部署和后期维护,组件化,可以自定义部署,后期横向扩容简单
  • 高性能,每天数T的数据无压力
  • 易于二次开发,标准的http和grpc协议,开源的项目,企业可以自主二次开发

SkyWalking二进制安装

环境规划:

elasticsearch01      10.2.0.12    
elasticsearch02      10.2.0.13    
elasticsearch03      10.2.0.14    
SkyWalking-Server    10.2.0.15    
SkyWalking-agent     10.2.0.16    

部署ES集群:

优化内核:

cat <<EOF> /etc/sysctl.conf 
net.ipv4.ip_forward = 1
vm.max_map_count=262144
EOF

参数解释:
net.ipv4.ip_forward = 1 表示启用 IP 转发,允许在同一台机器上运行的多个网络接口之间转发 IP 数据包。
vm.max_map_count=262144 表示最大映射数,用于限制内核可以创建的共享内存映射的数量。

使优化生效:

sysctl -p

安装elasticsearch:

rpm -ivh https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.4.1-x86_64.rpm

配置elasticsearch文件:

elasticsearch01

cat <<EOF> /etc/elasticsearch/elasticsearch.yml
cluster.name: SkyWalking-DB
node.name: SkyWalking-DB1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 10.2.0.12
http.port: 9200
discovery.seed_hosts: ["10.2.0.12", "10.2.0.13", "10.2.0.14"]
cluster.initial_master_nodes: ["10.2.0.12", "10.2.0.13", "10.2.0.14"]
EOF

elasticsearch02

cat <<EOF> /etc/elasticsearch/elasticsearch.yml
cluster.name: SkyWalking-DB
node.name: SkyWalking-DB2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 10.2.0.13
http.port: 9200
discovery.seed_hosts: ["10.2.0.12", "10.2.0.13", "10.2.0.14"]
cluster.initial_master_nodes: ["10.2.0.12", "10.2.0.13", "10.2.0.14"]

elasticsearch03

cat <<EOF> /etc/elasticsearch/elasticsearch.yml
cluster.name: SkyWalking-DB
node.name: SkyWalking-DB3
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 10.2.0.14
http.port: 9200
discovery.seed_hosts: ["10.2.0.12", "10.2.0.13", "10.2.0.14"]
cluster.initial_master_nodes: ["10.2.0.12", "10.2.0.13", "10.2.0.14"]

启动elasticsearch:

systemctl restart elasticsearch.service

验证elasticsearch是否正常:

[root@elasticsearch01 ~]# curl 10.2.0.12:9200/_cluster/health?pretty
{
"cluster_name" : "SkyWalking-DB",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}

安装JDK环境:

Ubuntu 环境

apt install openjdk-11-jdk -y

CentOS 环境

yum install java-11-openjdk -y

部署SkyWalking-Server:

SkyWalking-Server下载地址:

https://dlcdn.apache.org/skywalking/9.3.0/apache-skywalking-apm-9.3.0.tar.gz

下载软件包

wget https://dlcdn.apache.org/skywalking/9.3.0/apache-skywalking-apm-9.3.0.tar.gz

解压至/apps/并改名为skywalking:

tar xvf apache-skywalking-apm-9.3.0.tar.gz -C /apps && mv /apps/apache-skywalking-apm-bin/skywalking

修改存储类为elasticsearch:

vim /apps/skywalking/config/application.yml
storage:
selector: ${SW_STORAGE:elasticsearch}
elasticsearch:
    namespace: ${SW_NAMESPACE:""}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:10.2.0.12:9200}

加入systemctl管理:

[Unit]
Description=Apache Skywalking
After=network.target

[Service]
Type=oneshot
User=root
WorkingDirectory=/apps/skywalking/bin/
ExecStart=/bin/bash /apps/skywalking/bin/startup.sh
RemainAfterExit=yes
RestartSec=5

[Install]
WantedBy=multi-user.target

启动Skywalking

systemctl daemon-reload && systemctl restart skywalking && systemctl enable skywalking

验证skywalking web界面:

root@SkyWalking-Server:/apps/skywalking# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:12800         :::*                    LISTEN      7955/java 
tcp6       0      0 :::8080                 :::*                    LISTEN      7855/java  
tcp6       0      0 :::11800                :::*                    LISTEN      7655/java  

浏览器访问:

http://SkyWalking-ServerIP:8080

SkyWalking-web

查看Elasticsearch集群

SkyWalking-es

最后修改:2023 年 10 月 13 日
如果觉得我的文章对你有用,请随意赞赏