一、项目背景

近几年,信也科技的研发技术伴随着业务的快速增长逐步演化为微服务化的分布式体系架构,但随之带来的系统间的上下游依赖关系的复杂度也呈指数级上升,已有的烟囱式的监控产品(CAT、ELK等)存在数据散落、指标覆盖度低的特点,用户定位、分析异常故障需要切换多个监控产品,并且经常需要上下游多人协作定位,定位问题的效率非常低下,甚至会出现找不到问题根源等难题,同时监控数据的价值也没有有效挖掘与使用。为了解决这些问题,谛听全链路监控平台应运而生。

、产品介绍

谛听全链路监控平台通过自动化埋点、收集、存储、分析分布式系统中的指标数据、链路数据和日志数据,将流转在上下游站点间的信息串联起来,形成全链路跟踪,通过多维指标、链路与日志的关联分析与计算,提供统一告警、信息检索和展示等功能,极大的提升了定位故障的效率。目前线上已接入300多个应用,每日产生近百亿条数据,支撑公司多个重要项目(测试多环境、OneID、应用水位线、风险模型变量监控、AlarmBox等)的实施。

、设计理念

监控系统本质是海量数据的采集、处理、分析、存储及展示,平台设计的难点在于我们不仅要知道“有没有问题”,还要知道“是什么原因”导致的问题,以及发现问题如何快速修复。目前我们主要对系统的运行状态(请求量、响应时间、异常数、出错率等)、事件状态(配置变更、发版、重启、告警等)及内部状态(健康状态、连接池情况、线程池情况、队列积压数、GC次数以及时长等)等数据进行多维度监测,从面到线再到点逐步排除过滤,进而发现故障根因,支撑开发快速排障,这是当初设计谛听监控高效排障的思路。

进一步,我们是否可以利用应用的实时运行的数据,通过检测算法和模型,提前发现问题避免故障的发生,这是我们后续努力尝试探索的一个方向。

举个典型的例子来说,用户收到一条应用响应慢的告警信息,大致的排障流程如下:

  1. 收到告警信息后,首先查看应用概览页并结合拓扑关系图分析是自身问题(异常、慢查询等情况)还是外部服务(DB、缓存、三方服务等)依赖问题。

  2. 查看事件中心分析是否是近期系统发版或者容器自动重启导致的系统异常,是否有其它告警事件发生。

  3. 在应用监控指标页查看接口列表定位具体慢的接口,按时间区间查询链路日志,发现是慢SQL导致的问题。

  4. 查看慢SQL对应的日志报文信息,发现是参数传递错误,导致接口变慢。

  5. 查看接口上游,分析定位到调用方应用及接口与应用负责人沟通修复问题。

目前我们已在积极探索将一些标准化定位问题的流程通过自动化分析手段,将诊断结果附加到告警消息中(例如应用异常的堆栈摘要推送到异常类告警中),帮助开发人员进一步提升定位问题的效率。

四、总体架构

信也根据内部现有的监控系统及基础设施并结合开源系统为基础,打通日志Logging、指标(时序)Metrics和链路Tracing数据,经过近1年的逐步演化实践形成以下架构:

该架构主要有以下几个特点:

  1. 高吞吐量:监控平台每日处理近百亿条TB级数据,整个处理过程全异步,服务端实时无状态方式,支持大流量增长下数据采样及机器扩容。

  2. 实时性:采用flink实时计算,对于复杂的监控规则,每分钟的检测窗口,分钟级的告警推送;利用客户端Agent秒级检测任务,对应用的紧急异常事件(死锁、OOM等)达到秒级检测,实时推送告警。

  3. 低成本接入:使用主流的Agent无侵入的方式接入,容器接入应用无感知,降低应用接入及运维成本,功能比jar包方式功能更强大。

  4. 高可用:集群化部署,无单点问题,即使监控服务组件出现问题对应用也无影响,监控组件(kafka、flink、influxdb-proxy、elk等)从设计上具有多副本和数据恢复能力。

  5. 适应性强:与业界很多开源系统及组件做了良好的适配,且与公司多个系统进行数据关联,提升定位问题的效率。

五、设计及实现

1. 客户端设计

1.1 插件开发

Java Agent(Instrumentation)是JDK1.5引入的技术,基于JVM TI机制,使得开发者可以构建一个独立于应用程序的代理(Agent),用来监测运行在 JVM 上的程序或者替换和修改某些类的定义。

谛听Agent主要使用基于AspectJ在类加载期切面织入方式对各种组件代码进行AOP拦截,通过–javaagent 参数指定一个特定的 jar 文件(包含 Instrumentation 代理)来启动相应的代理程序,植入我们扩展的Plugin代码以实现监控功能。

目前谛听已支持近20种常用插件主要包括sofa-plugin,httpclient3-plugin,httpclient4-plugin,okhttp2-plugin,okhttp3-plugin,mysql-plugin,redis-plugin,resttemplate-plugin,feign-plugin, xxljob-plugin, tomcat-plugin,jetty-plugin等。

1.2 指标收集

为了保证数据的准确性,谛听Agent实现了通过从操作系统内核文件、MBean、组件自带监控扩展点以及AOP拦截等多种方式结合获取数据,不但可以根据指标的重要性进行分级,而且支持动态设置不同的指标上报频率,并且设计上支持推和拉两种方式(目前使用的是推的模式)。

值得说明的是,使用Linux内核文件的监控数据相比较其它方式,数据的准确度及完整度更高,例如读取/proc/stat收集cpu信息与我们日常使用的TOP命令获取的数据方式一致,经测试比JVM的收集的CPU数据准确性高很多,而且可以进一步了解CPU消耗的原因是系统、用户还是IO等待导致的。

目前谛听支持CPU、内存、磁盘、网络、文件句柄、内存区、垃圾回收、堆与非堆、thread、tomcat、jetty、sofa、netty、sentinel、rabbitMQ、druid、tomcatJDBC、hakari等200多个系统及中间件指标。

同时收集了60多个维度200多个性能指标,全部使用预计算的模式,充分保证数据的精确性。

另外,通过定时清理无请求的多余指标、指标分级、动态启停指标收集、高基维度指标防呆设计等多种方式防止指标收集对应用的影响。

1.3 日志收集

日志使用自研的日志组件,日志输出时自动与链路关联,并支持MDC方式自定义扩展,并根据应用的重要程度进行集群分离、冷热分离,热数据使用SSD存储,提升查询性能。

另外,通过谛听平台查询日志,谛听后台根据用户查询条件自动分析精准定位,另提供关键词高亮,线程查询,链路查询,IP查询,上下文查询等多种条件组合查询,查询效率比原有的Kibana查询效率提升5倍以上,用户体验更佳。

1.4 链路设计

数据主要使用公司已有的CAT的CAL数据模型,并在CAT的服务端定制链路分析器将CAT的模型清洗成类OpenTracing的模型,存储到elasticsearch中,解决了CAT无法根据条件查询链路的问题,并保留了与CAT系统的链路兼容,方便互相连接,谛听支持10多种条件链路查询,并支持手动打点及从请求或者响应报文中规则匹配将业务信息与链路自动关联,提升查询及定位问题的效率。

链路系统中另外一个有挑战的问题是,如何在各种技术栈调用情况下保证不丢失Trace信息、不破坏链路的完整性?

这里就涉及到数据透传的功能,分为应用内和应用间Trace信息的传播,有同步和异步两种调用情况,还有可能遇到池化复用线程(ExecutorService)的场景,谛听主要使用TransmittableThreadLocal(阿里开源的库)技术,TTL继承了InheritableThreadLocal,优化了在使用线程池等会池化复用线程的情况下传递ThreadLocal的使用(我们使用TTL Agent方式,应用无侵入,透明实现线程池的传递,进一步说明了Agent功能非常强大),在数据透传实现层根据协议的不同有不同的设置方式,比如目前广泛使用的rpc调用使用的http协议,我们首先将上下文中的信息取出放到Request Header中,服务端再从Request Header中取出放到上下文中,完成透传工作,对于其它的协议比如sofa,kafka等协议也有类似于header方式,传递流程类似,以上这一系列工作由Agent内部插件自动埋点实现。

2. 计算层设计

数据分区处理方式让同一个应用的维度数据进入同一个Partition,利用Flink的广播流+State+Checkpoint等机制实现。我们对计算逻辑进行高度抽象化,具体处理流程如下:

如图所示,这种机制有如下优点:

通过广播流在每个节点都保存了一份完整的规则数据,当规则发生变化时,每个节点都会获取到最新的规则,这保证了整体逻辑的一致性。

将数据流时间设置为EventTime,同时利用Flink的TimeService机制解决了动态开窗、延时、乱序问题,Flink中的 state解决了数据缓存的问题,使其不用依赖于外部缓存,大大增加了吞吐量。

同时基于Flink本身的checkpoint机制,可以实现failover后状态中的规则和缓存数据的恢复。

3. 存储层设计

谛听根据监控数据的使用场景不同,使用两种存储引擎:

对于时序类的指标数据,使用高性能的开源时序数据库influxdb,目前按应用及指标维度进行拆表,明细数据保存3个月,定期rollup保证查询性能。influxdb开源版本不支持集群模式,我们通过在influxdb前面的proxy中实现故障迁移,在线扩缩容、数据恢复、监控等功能,保障系统的高可用。

对于调用链的日志类数据使用业界广泛使用的ELK架构,通过Mapping模板优化,关闭不必要的分词和存储,调整默认的字段类型、优化索引刷新时间、按小时滚动创建索引、Routing直接命中分片(不打开整个索引),冷热分离,保证实时数据的查询性能,查询时根据时间及条件精准定位路由,前台查询达到秒级返回。

六、核心功能及实践场景

以上蓝色为已完成功能,棕色为规划待开发功能

核心功能建设思路:基于底层采集的全、准、细的指标、链路与日志数据,经过一系列的关联分析,提供数字化的呈现,并与常用诊断工具与其它系统集成,为数据应用及智能化场景提供支撑,提升效率,为应用赋能:

1. 实践场景一 多维条件查询链路,多视图展示

谛听提供根据时间范围、TraceId、客户端名、服务端名、客户端IP、服务端IP、仅异常调用、接口名称、环境、耗时大于(ms)、HTTP状态码等条件进行组合查询。

支持查看链路中请求报文、响应报文、SQL语句、redis命令、异常堆栈信息、业务主键等信息展示。

Agent自动在服务的响应报文中添加traceId,服务接收方可以通过页面、异常对话框、日志、数据库等存储,出现异常时可以快速通过TraceID进行链路重放,现场溯源。

谛听支持根据业务信息(报文提取及手工打点方式)查询链路,实时追踪用户轨迹,以业务的角度去排查异常问题。

谛听提供拓扑视图、调用树视图、混合视图及日志视图,多种角度展示链路信息,并提供系统指标、应用信息帮助开发更快速地找出性能瓶颈。

2. 实践场景二 多维指标分析,快速定位根因

谛听监控平台提供应用上下游拓扑、慢调用、慢SQL、异常统计、CPU高、GC问题、线程问题等多种常见问题的多维分析能力,代替传统的人肉命令行(例:top,jstack,netstat,iostat,jmap,jinfo等)定位问题的方式,帮助开发人员快速找到故障的根因。

3. 实践场景三 实时告警,多种报表,提前发现问题

提供6套默认告警模板,应用无需配置,告警功能自动生效,另外提供可视化的告警规则定制能力以及规则化配置触发容器的能力(重启、拉出流量等行为),帮助应用自愈。

支持告警消息的分组、抑制、静默、聚合减少告警噪声干扰,支持邮件、短信、企微、WebHook、MQ等多种通道告警消息的推送。

提供日报表、周报表、健康分等多种报表,帮助开发人员提前发现系统问题。

七、未来展望

(1) 目前CAT异步链路问题还未完全解决,后续逐步脱离CAT,兼容云原生OpenTelemetry标准。

(2) Cat指标监控维度单一,不能满足业务需求,后续开放客户端的metrics,支持业务监控,完善整体监控告警体系。

(3) 完善全链路监控体系,向用户体验端监控、业务监控和中间件监控进一步拓展。

(4) 利用收集的多维度的监控数据进行挖掘,结合应用场景,利用算法模型及专家经验,使应用更加智能更加高效。

八、致谢

感谢翔哥和丰哥及各位总监的指导,感谢运维团队性能优化方面的支持,感谢实时数据团队告警计算支持,感谢质量部前端的技术支持,同时感谢技术小伙伴提出许多宝贵建议。

九、参考资料

  1. https://www.kernel.org/doc/Documentation/filesystems/proc.txt
  2. https://bigbully.github.io/Dapper-translation/
  3. https://opentracing.io/
  4. http://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html
  5. https://opentelemetry.io/
  6. https://github.com/dianping/cat
  7. https://access.redhat.com/solutions/406773
  8. https://skywalking.apache.org/
  9. https://github.com/alibaba/transmittable-thread-local

作者介绍

haydenzhu, 信也科技资深架构师

cat全链路监控_谛听全链路监控平台实践与思考相关推荐

  1. 链路聚合_配置EthTrunk链路聚合

    点击蓝字 关注我们 原理概述 在没有使用Eth-Trunk 前,百兆以太网的双绞线在两个互连的网络设备间的带宽仅为100Mbits.若想达到更高的数据传输速率,则需要更换传输媒介,使用千兆光纤或升级成 ...

  2. aida64副屏监控_“遥信”在电力监控系统中的重要作用

    监控系统是变电站综合自动化的核心系统."四遥"也就是我们经常说的:遥测.遥信.遥控.遥调."四遥"是电力监控系统中最基本.最重要的功能,今天我们主要说一说&qu ...

  3. mysql pt监控_技术分享 | MySQL 监控利器之 Pt-Stalk

    作者:xuty 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 一.概述 之前在社区发了一篇[有效解决 MySQL 行锁等待超时问题]文档,主要介绍 ...

  4. mysql异地多活方案_对于异地多活的实践与思考

    对于异地多活的实践与思考 发布时间:2019-01-26 10:47, 浏览次数:707 在此抛砖引玉,希望有不同意见.观点或者建议的朋友留言. <>一.引 异地多活是近几年比较热门的一个 ...

  5. mac 思科 链路聚合_交换技术链路聚合配置

    所谓链路聚合是指两个或更多的数据信道合成为一个,这样的这个信道就可以提供更高带宽的逻辑链路,这样也为网络的可靠性做出了保护如果其中一条信道出现问题那么还有一条信道可以运行.当交换机检测到其中一个成员端 ...

  6. mysql 去除全角空格_去掉全角空格

    有时候复制网上的代码会出现编译不通过的问题,报类似这样的一个问题:error: stray '\161' in program.在网上查了一下,就是全角空格的问题.借助于网上的一段Java代码,把它转 ...

  7. 京东css3动画全屏海报_京东全屏CSS3动态海报抖动效果代码生成,海报上透明图片自动上下抖动带动感...

    京东全屏CSS3动态海报抖动效果代码生成,海报上透明图片自动上下抖动带动感 分享到: 作者:陈俊    日期:2018-1-10 15:54   人气:4482   分类:装修助手教程 重要提示:生成 ...

  8. 为什么用链路聚合_不宜使用链路聚合的场景

    最近碰到的一个诡异的案例,让我对链路聚合有了更深入的理解,可能对你也会有所启发. 问题 需要从多台相机采集图片传给电脑,总流速超过千兆,但在4千兆以下.考虑到万兆网卡和(万兆上行端口的)交换机都还太贵 ...

  9. mysql 表结构监控_性能测试之mysql监控、优化

    共享表空间还有一个缺点就是不能自动收缩,自动收缩是什么意思呢,刚建表的时候,表里面数据很少,就1条数据,可能占用空间就几kb,到后来数据多了,占用了10个G的空间,然后发现有一些数据都是垃圾数据,删了 ...

最新文章

  1. ab -压测模拟并发的工具
  2. linux的nvme驱动需要关心的统计项
  3. 在阿里云服务器(Ubuntu系统)下使用WordPress搭建博客网站教程
  4. 针对应用开发者的几点建议
  5. 从零开始做一个SLG游戏(三):用unity绘制图形
  6. 禾川触摸屏编程软件_汇川PLC编程PLC代写程序
  7. 红帽 jboss_红帽JBoss BRMS和BPMS富客户端框架展示了与GWT / Errai / UberFire和AngularJS的多语言集成...
  8. Spring Boot端口从默认更改为自定义或新端口
  9. 学习笔记(1):uni-app实战社区交友类app开发-引入自定义图标库
  10. hbase hfile java_通过生成HFile导入HBase
  11. python 英语培训_英语学习与Python编程语言学习相辅相成(三十一)
  12. 编程语言_JavaScript_面试题003
  13. opencv︱图像的色彩空間cvtColor(HSV、HSL、HSB )及相关色彩学
  14. MongoDB学习(黑马教程)-3-数据库MongoDB的删除文档操作
  15. 知乎网软件测试和识,扩容检测工具_闪迪东芝内存卡_金士顿内存卡 知乎
  16. mysql 二次方函数_MySQL SQRT函数:求二次方根
  17. 获取头条小程序分享二维码
  18. Elasticsearch设置账号密码
  19. win10计算机删除了怎么恢复,Win10系统删除的文件怎么恢复?
  20. python+pands+matplotlib分析Excel表格

热门文章

  1. Jenkins【环境搭建 01】两种方式+两种环境部署最新版本 Jenkins v2.303.2 WAR包(直接使用 java -jar+使用Tomcat的Web端部署)
  2. oracle进城有哪些,oracle主要进程详解
  3. 子类重写父类虚函数_C/C++编程笔记:关于C++的虚函数和多态,你真的了解吗?...
  4. 【LeetCode】LeetCode之跳跃游戏——动态规划+贪心算法
  5. 两只塔姆沃斯牛 The Tamworth Two
  6. Web服务必须要知道的几个概念
  7. 计算机组成原理 第三章【存储系统】课后作业解析【MOOC答案】
  8. 数学建模清风第二次直播:模拟退火算法
  9. Java06-day06【Debug(概述、操作流程)、Debug查看偶数求和、Debug查看方法调用】
  10. 源码学习【HashMap第二篇】hashMap为什么size 是2的 n次方倍