skywalking扩展实现 —— 监控数据的动态上报
把标题名整高大上一些,来掩盖需求的奇葩。
0. 目录
- 1. 需求背景
- 2. 需求描述
- 3. 优势
- 4. 实现
- 4.1 扩展点
- 4.2 配置项
- 5. 优化
- 6. 提醒
- 7. 补充 - 关于微服务
- 8. 参考
1. 需求背景
过去一段时间,接手了一个迭代了数年的"基于微服务架构"搭建的产品。
自介入开始,我就不断尝试给系统增加可观测性,包括但不限于:
- 为原有的日志框架输出增加traceId,以实现最基础的"人肉链路追踪"功能。
- 基于SpringBoot的Actuator特性来对外提供符合我们内部规范的日志级别切换接口。
- 基于linux命令awk, sed等实现的日志精确查询功能。
- 为以上功能提供前端操作页面,最大化避免需要登录服务器进行问题排查这一耗时耗神的上世纪操作习惯。
以上方案在逐步推进过程中,我们发现落地效果不及预期,究其原因:
- 在宣传和推广上投入的时间和精力不足。
- 相关人员的旧有习惯作祟。(不过这也说明上面方式带来的好处,在当事人看到还没有达到让其主动脱离舒适区的程度)
基于以上现状,我们决定再进一步,重新捡起过往曾经动过,但受限于"思路过于新奇"而主动选择回避的念头:“扩展skywalking,实现对于系统进行链路追踪功能的动态开启和关闭”。
之所以存在这么听上去很"神奇"的念头,当然是有着其现实原因:
- 该产品的大部分业务场景,其体量远远未达到需要上微服务架构的情况。
- 但现有的系统架构已经是微服务的模式。
- 于是矛盾就出现了:业务体量不是必须得微服务,那么用户势必不愿意在日常运维上投入太多的成本;但微服务架构经过多年的争论,终于用残酷的现实教育了所有将它当作马良神笔的从业者——别以为复杂度消失了。微服务只是将复杂度转移到基础设施上。CI/CD你没有,遭罪的是你自己,打碎牙你能自己咽;但链路追踪你要是没有,客户报告问题一般都是火急火燎赶deadline的时候,你猜他会不会和颜悦色跟你这演练"和人交流要讲礼貌"。
所以,如何在这个现状面前,找到那个平衡? 而不是直接把锅砸了,起一口新的。
截止写下此文的当下,我们交出的答卷如标题所示:通过skywalking提供的扩展,来增加我们自己的自定义逻辑,主动控制Agent端向Server端推送监控数据的方式,最小化监控这一块的运维成本,进而增加监控在团队里的落地范围和深度,尽可能地让其能够被绝大部分人作为日常工作中的一部分。
2. 需求描述
让我们用专门的小节描述下需求细节,也算是目标达成之后的操作流程。
- 默认情况下,Server端不启动,Agent端正常开启。不过Agent端基于我们的扩展配置,默认会直接丢弃所收集来的监控数据,不进行上报(毕竟你上报也没地方接收)。
- 发现问题时,开启Server端和开启agent端自定义配置,进入正常的链路追踪排错流程。
- 解决问题之后,关闭Server和Agent端自定义配置。(这一步为了确保执行,可在第二步的准备阶段,启动一个一次性定时任务)。
注意:
Server端启动时采用的存储是默认的h2数据库,这是为了减少在Server维护上的成本。也是因为使用h2数据库,注定了Server端不能常驻,或者说不能接收大量Agent端上报的数据,这就回到了本文出现的缘由。
3. 优势
我们过往在【CAT魔改】独立化cat-client的优势里所陈述的一系列诸如"站在巨人的肩膀上,更大的灵活性"等优势同样适合于这里。
除此之外,本次我们之所以接受这个魔改,根本目的是为了让团队尽早开始积累使用Skywalking的经验。一个产品想要长远发展,其所依赖的基础设施最好是稳固,经过千锤百炼的。毕竟你没有那么多的资源来将你的依赖项全部从零开发一遍;尽早确定一个稳定的基础依赖,不断对其精研,好过从零开始自己摸,也好过"看见这个觉得不错,看见那个好像更好"的狗熊掰棒子式地尝鲜式技术选型。
4. 实现
得益于Skywalking其所提供的强大扩展性,本次扩展功能实现过程异常地顺利。在没有系统阅读完Skywalking主体流程逻辑的前提下,只是通过借鉴Skywalking自身内置针对各个第三方组件的插件实现,编写个自定义Agent插件,就完成了本次需求。
不得不说Skywalking的扩展性确实好太多了。在以上实现自定义Agent插件过程中,笔者脑海里不时会回想起那句本以遗忘的经典教导 —— “对扩展开放,对修改关闭”。相较于笔者在过往迫不得已最终还是构建了分支版本的【CAT魔改】CAT-LOCAL项目的诞生,Skywalking真正做到了完全没有修改既有代码,真正采用扩展的方式实现。果然社区强大才是一切。
4.1 扩展点
以下直接列出需要被扩展的类型,具体的实现细节可以参见底部给出的gitee仓库。
| 扩展点 | 说明 |
|---|---|
TraceSegmentServiceClient | Skywalking在其中进行收集来的监控链路数据上报。 |
GRPCChannelManager | Skywalking在其中进行Server端的grpc验活。默认间隔30秒。 |
LogReportServiceClient | Skywalking在其中进行收集来的监控日志数据上报。 |
JVMService | Skywalking在其中实现定期地JVM状态数据上报。 |
EventReportServiceClient | Skywalking在其中实现Java应用的启停等事件的上报。 |
4.2 配置项
针对上面的扩展,我们还需要一些skywalking提供的配置项进行支持。
# 确保我们开启Server和Agent端之后, Agent端可以将监控数据正确推送到Server端
-Dskywalking.collector.backend_service={SW_IP}:11800 \
# 同上。不过推送的是日志数据。
-Dskywalking.plugin.toolkit.log.grpc.reporter.server_host={SW_IP} \
# 本次扩展的目的是最大化减轻Server端的存储压力, 所以我们需要排除诸如健康状态检查等接口.
-Dskywalking.trace.ignore_path=**/acutator/**,**/swCustomPlugin/** \
# 兼容过往无服务端时的日志链路查询. 同时该配置项对于本次扩展也提供支持, 毕竟对于本文的需求场景而言, Server端大部分时候也是不存在的.
-Dskywalking.agent.keep_tracing=true
5. 优化
- 只限制特定的链路进行上报。这一步在底部的gitee项目里也给出了相应的示例类:
TraceCaptureSpecialSamplingService。 - 提供组件的可观测性。 这一步可以参见本人的另外一个项目Gitee - dynamic-debug-runtime,其中的
DynamicEnableRuntimeInstrumentation是主要逻辑实现位置。(注意该项目不是必须,你完全可以将其中的实现迁移到Gitee - dynamic-enable-runtime项目中)
6. 提醒
- 本文这种方式下,对于Skywalking的使用就只限于可观测性三支柱的Tracing和Logging,就别奢望剩下的那条支柱的Metrics也生效了。
- 本文需求出现的前提条件是业务特点决定的。毕竟"所有的技术上的决策实际都是政治上的决策",我们必须面对这个现实。
- 我们对"系统有监控"的理解:是平时自己人排错的时候,会不会用到这些?毕竟按照产品设计的基本理念之"吃自己的狗粮",如果你自己都不用自己构建的监控体系,那这个叫做"系统有监控"吗?
- 现实的矛盾就是"最小化运维和基础设施成本,与系统微服务架构之间的矛盾"。不要说什么这个玩意搭建起来花不了多少时间。运维这个职业存在多年,区分出不同的等级,要求还越来越高,是因为把这些玩意搭建起来很难吗?
7. 补充 - 关于微服务
过往我尝试总结了微服务的一些怪现象,也收集了不少相关的讨论(具体参见下面的链接)。
这里我想再表明一下个人看法,也算是对过往总结的一个补充:
“除非系统体量达到必须微服务,否则业务方绝对不会愿意在基础设施和运维上投入成本,只希望越少越好。即使是他将微服务的要求写在了招标文件里。你有一千条,一万条理由痛诉对方多么不专业,多么坑爹;但回到现实你依然还得解决这个问题;当然相较之下有个选择更简单:**客户,**公司,劳*不伺候了。”
8. 参考
- skywalking官网
- 吴晟 - 《SkyWalking的发展之路;从无名小卒到拥抱全球》
- 专访吴晟:开源没有黑魔法,两年后泡沫将会破灭
- 【CAT魔改】CAT-LOCAL项目的诞生
- 微服务了个寂寞
- 如何做好既有产品技术架构的升级改造
- Gitee - dynamic-enable-runtime
相关文章:
skywalking扩展实现 —— 监控数据的动态上报
把标题名整高大上一些,来掩盖需求的奇葩。 0. 目录1. 需求背景2. 需求描述3. 优势4. 实现4.1 扩展点4.2 配置项5. 优化6. 提醒7. 补充 - 关于微服务8. 参考1. 需求背景 过去一段时间,接手了一个迭代了数年的"基于微服务架构"搭建的产品。 自…...
【GoF 23】23种设计模式与OOP七大原则概述
1. 什么是GoF 23? GoF 23也就是23种设计模式。1995年GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,一共收录了23种设计模式,从此梳理了软件设计模式领…...
Java 日期时间
Java 日期时间是 Java 标准库中一个非常重要的部分,它提供了丰富的 API 来处理日期、时间以及日期时间。在 Java 应用程序中,我们经常需要处理日期时间相关的操作,例如计算两个日期之间的差、将日期时间转换为不同的时区等。在本篇文章中&…...
Face Forgery Suvery
文章目录Face ForgeryFace Forgery classAttribute ManipulationExpression SwapIdentity SwapEntire Face SynthesisFace Forgery DetectionLow-levelOn the Detection of Digital Face Manipulation(CVPR2020)High-levelProtecting World Leaders Against Deep FakesDetectin…...
案例学习--016 消息队列作用和意义
简介MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,它是消费-生产者模型的一个典型的代表,producer往消息队列中不断写入消息,而另一端consumer则可以读取或者订阅队列中的消息。主要产品有:ActiveMQ、RocketMQ、Rabb…...
【MySQL】MySQL的锁机制
目录 概述 MyISAM 表锁 InnoDB行锁 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。 在数据库中,除传统的 计算资源(如 CPU、RAM、I/O 等)的争用以外,数据也是一种供许多用户共…...
HTML 背景
一个富有美感的背景会让站点看上去更加高级、更有吸引力。本篇为大家来的是 HTML 背景相关内容。 背景(Backgrounds) <body> 拥有两个配置背景的标签。背景可以是颜色或者图像。 背景颜色(Bgcolor) 背景颜色属性将背景设…...
Lombok
文章目录简介原理安装常用Getter、SetterToStringEqualsAndHashCodeNonNullNoArgsConstructor、RequiredArgsConstructor、AllArgsConstructorDATABuilderLogvalCleanup简介 Project Lombok is a java library that automatically plugs into your editor and build tools, spi…...
Koa源码学习
前言 koa是一个非常流行的Node.js http框架。本文我们来学习下它的使用和相关源码 来自官网的介绍: Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。…...
一种延迟加载自定义元素的方法
您可能实际上并不需要所有这些;通常有一个更简单的方法。如果有意使用,此处显示的技术可能仍然对您的工具集有用。 为了保持一致性,我们希望我们的自动加载器也成为一个自定义元素——这也意味着我们可以通过 HTML 轻松配置它。但首先&#…...
Pytho经典面试题荟萃:第一期
目录 一、面试题 二、参考答案 解释器和编译器的区别 解释器 编译器 Python 的解释过程 Python 内存管理 Python 内存分配 引用计数 垃圾回收 其他内存管理技术 多重继承 多重继承带来的问题 命名冲突 菱形继承问题 解决多重继承带来的问题 方法重写 调用 su…...
01背包问题(大彻大悟版)
背包问题身为一个非常经典的动态规划问题,理清思路很重要,在经过多次观看y总视频和b站解析,加上CSDN的文章辅助,我终于从很多不理解到大彻大悟,下面是我对于背包问题思路的总结,有问题的话欢迎指出。谈到背…...
【麒麟服务器操作系统忘记开机密码怎么办?---银河麒麟服务器操作系统更改用户密码】
银河麒麟服务器操作系统更改用户密码 1.启动主机进入 grub 菜单,如图 1.1 以最新版本 Kylin-Server-10-SP2-x86-Release-Build09-20210524 为例。 图 1.1 grub 菜单 2 编辑 kernel 2.1按下”e”输入,输入用户名和密码(root/Kylin123123&…...
华为OD机试(20222023)考点分类
字符串,数组,集合操作 题库分值序号题目考点 or 实现Old1001敏感字段加密字符串,数组,集合操作Old1002IPv4地址转换成整数字符串,数组,集合操作Old1006字符串分割字符串,数组,集合操作Old1007...
初级篇 3 - HTML 或 CSS 文件中不懂的标签属性详解
目录一、遇到的不懂的标签属性详解1、meta 标签的 http-equiv 属性(元标签)二、遇到的 CSS 不懂的属性详解vertical-align三、如何规避 HTML 自动换行 - 脱离文档流配置属性 display: inline-block理解 inline、inline-block、blockinline总结:四、导航栏自动弹出子…...
【C语言】每日刷题 —— 牛客语法篇(4)
🚀🚀前言 大家好,继续更新专栏 c_牛客,不出意外的话每天更新十道题,难度也是从易到难,自己复习的同时也希望能帮助到大家,题目答案会根据我所学到的知识提供最优解。 🏡个人主页&am…...
HashMap ConcurrentHashMap介绍
目录 HashMap 数据结构 重要成员变量 Jdk7-扩容死锁分析 单线程扩容 多线程扩容 Jdk8-扩容 ConcurrentHashMap 数据结构 并发安全控制 源码原理分析 重要成员变量 协助扩容helpTransfer 扩容transfer 总结 CopyOnWrite机制 源码原理 HashMap 数据结构 数组…...
C++语法规则3(C++面向对象)
多态 C多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数; 形成多态必须具备三个条件: 必须存在继承关系;继承关系必须有同名虚函数(其中虚函数是在基类中使用关键字 virtual 声明的函数&#…...
Python tkinter 如何实现网站下载工具?将所有数据一键获取
前言 铁汁们有没有想过,如何把几个代码的功能结合到一起呢? 有想过的话,有没有实现过呢? 其实很简单的啊,咱就写一个界面就好了,想要哪个代码运行,鼠标轻轻一点就行 开发环境 python 3.8: 解…...
第六章:C语言数据结构与算法初阶之栈
系列文章目录 文章目录系列文章目录前言一、栈二、栈的实现三、接口函数的实现1、初始化2、销毁栈3、压栈与出栈4、判空5、元素个数6、返回栈顶元素四、栈中元素的访问总结前言 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 一、…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
