目录
前言
一、什么是应用用性能管理
二、如何搭建 APM 系统
三、什么是Skywalking
一、Skywalking原理数据库
二、为什么Skywalking侵入性小
三、Skywalking Agent原理
四、Skywalking登录地址
五、Skyworking oap原理
六、Skywalking mysql
七、Skywalking版本选取
总结
前言
在生产环境中,经常有用户反馈创建订单失败,但是从服务端的监控报表来看,并没有什么明显的性能波动,从存储在Elasticsearch 里的原始日志中,甚至没有找到这次创建订单的请求。这有可能是客户端有Bug,或者网络抖动导致创建订单的请求并没有发送到服务端。
再比如,有些用户会反馈,使用长城宽带打开商品详情页面特别慢,甚至出现 DNS 解析失败的情况。那么,当我们遇到这类问题时,要如何排查和优化呢?
这里面涉及一个概念叫应用性能管理(Application Performance Management,简称APM),它的含义是:对应用各个层面做全方位的监测,期望及时发现可能存在的问题,并加以解决,从而提升系统的性能和可用性。
一、什么是应用性能管理
应用性能管理(Application Performance Management)是一个比较新的网络管理方向,APM 或应用程序性能监控使组织能够监控其关键业务应用程序的性能指标,在出现性能问题时及时接收警报,并生成定期性能分析报告。
APM 提供对应用程序性能的上下文洞察,使 IT 和 DevOps 管理员能够在应用程序与最终用户交互时管理可用性、性能和控制应用程序的行为。APM 工具还可以通过快速识别任何问题来帮助减少停机时间。这反过来又使您能够维护快速响应的软件,从而改善最终用户体验。
由于现代应用程序具有复杂且动态的结构,因此 APM 对于让您的应用程序保持最佳运行和运行至关重要。这很关键,因为应用程序通常代表品牌。如果没有 APM 工具,定位和解决问题可能会很费劲,这增加了最终用户体验不佳的可能性。它还可以降低运营成本,增加收入和销售额。
根据软件分析公司 Gartner 的说法,APM 工具应满足三个主要功能维度:
- 前端监控
- 应用程序发现、跟踪和诊断 (ADTD)
- 分析
二、如何搭建 APM 系统
与搭建服务端监控系统类似,在搭建端到端的,应用性能管理系统时,我们也可以从数据的采集、存储和展示几个方面来思考。
首先,在数据采集方面,我们可以采用类似 Agent 的方式,在客户端上植入 SDK,由SDK 负责采集信息,并且经过采样之后,通过一个固定的接口,定期发送给服务端。这个固定接口和服务端,我们可以称为 APM 通道服务。
虽然客户端需要监控的指标很多,比如监控网络情况,监控客户端卡顿情况、垃圾收集数据等等,但我们可以定义一种通用的数据采集格式。
比如,在我之前的公司里,采集的数据包含下面几个部分,SDK 将这几部分数据转换成JSON 格式后,就可以发送给 APM 通道服务了。这几部分数据格式,你可以在搭建自己的APM 系统时,直接拿来参考。
系统部分:包括数据协议的版本号,以及下面提到的消息头、端消息体、业务消息体的长度;
消息头:主要包括应用的标识(appkey),消息生成的时间戳,消息的签名以及消息体加密的秘钥;
端消息体:主要存储客户端的一些相关信息,主要有客户端版本号、SDK 版本号、IDFA、IDFV、IMEI、机器型号、渠道号、运营商、网络类型、操作系统类型、国家、地区、经纬度等等。由于这些信息有些比较敏感,所以我们一般会对信息加密;业务消息体:也就是真正要采集的数据,这些数据也需要加密。
加密的方法是这样的:我们首先会分配给这个应用,一对 RSA 公钥和私钥,然后 SDK 在启动的时候,先请求一个策略服务,获取 RSA 公钥。在加密时,客户端会随机生成一个对称加密的秘钥 Key,端消息体和业务消息体,都会使用这个秘钥来加密。那么数据发到APM 通道服务后,要如何解密呢?
客户端会使用 RSA 的公钥对秘钥加密,存储在消息头里面(也就是上面提到的,消息体加密秘钥),然后 APM 通道服务使用 RSA 秘钥,解密得到秘钥,就可以解密得到端消息体和业务消息体的内容了。
package com.xinwu.advert.test;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
public class RSATest {
public static void main(String[] args) {
KeyPair keyPair = SecureUtil.generateKeyPair("RSA", 512);
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
RSA rsa = new RSA(privateKey, publicKey);
String text = "hello world !";
//公钥加密,私钥解密
String encryptByPublic = rsa.encryptBase64(text, KeyType.PublicKey);
System.out.println("公钥加密:" + encryptByPublic);
String decryptByPrivate = rsa.decryptStr(encryptByPublic,KeyType.PrivateKey);
System.out.println("私钥解密:" + decryptByPrivate);
}
}
最后,我们把消息头、端消息体、业务消息体还有消息头中的时间戳组装起来,用 MD5 生成摘要后,存储在消息头中(也就是消息的签名)。这样,APM 通道服务在接收到消息后,可以使用同样的算法生成摘要,并且与发送过来的摘要比对,以防止消息被篡改。数据被采集到 APM 通道服务之后,我们先对 JSON 消息做解析,得到具体的数据,然后发送到消息队列里面。从消息队列里面消费到数据之后,会写一份数据到 Elasticsearch中,作为原始数据保存起来,再写一份到统计平台,以形成客户端的报表。
有了这套 APM 通道服务,我们就可以将从客户端上采集到的信息,通过统一的方式上报到服务端做集中处理。这样一来,你就可以收集到客户端上的性能数据和业务数据,能够及时地发现问题了。
三、什么是Skywalking
Skywalking是基于APM (Application Performance Management) 原理的一款开源项目,它利用监控数据分析分布式系统,在生产环境中发现和排除分布式系统故障。
Skywalking利用trace分析技术实现对请求链路的跟踪追踪。在实际运行过程中,针对整个分布式系统,Skywalking会把调用链路上的详细信息(调用者、被调用者、调用方法等等)记录下来,并基于此生成事务 trace视图,实现了对整个分布式系统的全链路跟踪、检索与可视化。
Skywalking的核心原理就是代码追踪,它的原理是利用字节码注入技术实现对JVM运行时的监控和收集,通过分析trace信息,将分布式系统中所有的请求串起来形成事务和调用链路。
一、Skywalking原理数据库
Skywalking采用ElasticSearch作为存储引擎。实时分析与查询这些信息,有助于快速诊断并修复当期应用程序中的性能问题。
Skywalking在ElasticSearch中存储了很多的指标,其中包括:应用程序组、应用程序、实例、端点、服务以及调用链的元数据。使用ElasticSearch索引和集群技术,可以轻松地查询和聚合这些指标,让开发人员可以更好地理解他们的应用程序目前的状态。
二、为什么Skywalking侵入性小
Skywalking采用了字节码注入的技术,可以在不修改原代码的情况下实现代码追踪。Skywalking侵入性小,是因为它在JVM层面进行监控,不需要在代码中加入Skywalking监控的相关代码。同时也可以通过配置文件很方便地进行全局控制,很容易地管理和升级。
三、Skywalking Agent原理
Skywalking Agent作为Skywalking的核心部分,是一个Java应用,它托管在应用程序内部,与应用程序代码同步运行。
Skywalking将收集到的埋点信息以日志的方式输出(采集到的各种 trace 信息),然后由Agent组件对这些信息进行格式化整理后发送到Skywalking的Collector组件中,最终将整理后的数据存储到ElasticSearch中。
四、Skywalking登录地址
Skywalking的控制台可以查看各种分析数据,通过图形化方式展示每一层的性能信息,便于分析和排查问题。组件精细,支持分别快速进行数据查询,是一个极具价值的应用。
默认情况下,Skywalking的登录地址为:http://localhost:8080/。
五、Skyworking oap原理
Skywalking OAP(Open Analytics Platform)是Skywalking的另一个核心部件,支持自定义的指标聚合和关联,将监测数据进行处理、聚合和存储。
Skywalking OAP支持分布式存储,在写入ElasticSearch时,可以将数据同时写入其他数据存储系统,比如 H2、Cassandra、MySQL、TiDB、Postgres 等,保证数据的备份和稳定性。
六、Skywalking mysql
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-protocol/apm-mysql-plugin</artifactId>
<version>8.4.0</version>
</dependency>
Skywalking的Mysql插件可以帮助我们追踪和监控分布式的Mysql访问请求,采集有用的数据,如数据库访问状态和性能分析结果,并在Skywalking控制台上呈现。
七、Skywalking版本选取
选择合适的Skywalking版本,需要考虑系统的实际需求和场景,可以先搭建一个简单的Skywalking系统,并在测试环境进行测试。根据测试结果,进行版本选取和相关配置调整
在这里,我们推荐使用最新版本,因为最新版本往往能兼容更多的应用和技术,并能解决之前一些版本存在的问题。
总结
Skywalking是一个非常优秀的全链路监控系统,它的原理为基于字节码注入的方式实现,侵入性小,且对于分布式系统的监控能力也很强大,对于应用程序的运行状况进行了全方位的监测和分析。