可观测性在灰度发布中的应用
前言
随着云计算的发展、云原生时代的来临,企业数字化转型进程不断深入,应用开发也越来越多地基于微服务化模式,快速迭代的能力使得应用开发更高效、更灵活。同时,也不得不面临应用版本快速升级所带来的的巨大挑战。
传统的发布方式是通过新版本全量替换旧版本,这种模式存在停机时间较长的问题,业务端的压力愈发明显。同时,在新版本发布时,如果直接将应用程序从当前版本全量升级到新版本,风险存在的可能性和严重性也不容忽视。传统发布方式存在如下一些典型的弊端:
- 影响用户体验:如果新版本存在功能或性能问题,那么,所有新版本服务实例都会存在同样问题,从而影响所有用户的使用。
- 影响服务可用性:全量发布一般需要做停机升级(要么同时都为新版本,要么同时都为老版本),导致业务中断,影响服务可用性。
所以,尽可能降低发布对业务造成的影响就变得越来越重要,“业务无感知”的灰度发布策略就大众的视野中。
灰度发布概述
灰度发布,是一种软件部署策略。常规做法是将新版本的应用程序投入生产环境,保留当前版本,并将一小部分流量重定向到新版本中。在此过程中,所有发送到新版本的请求都将被监测,确认新版本可用后,将逐渐将越来越多的流量引导到新版本中。
通过灰度发布,有助于识别可能存在的潜在错误、性能问题或其他问题,以便在全面部署之前及时解决这些问题,从而极大地减少对更广大用户的使用影响,提高用户体验和满意度,加速迭代速度。
可观测性对于灰度发布的成功非常重要,能够为团队提供实时的服务运行状态的数据支持,从而更好地观测和分析新版本的性能、稳定性和用户反馈等指标,更快地发现和解决问题,提高发布的成功率和用户体验。
可观测性在灰度发布的使用价值
在灰度发布过程中,需要对发布的新版本具备评估分析能力,包括对新版本的性能、稳定性和用户反馈等指标进行分析。可观测性可以帮助团队更好地观测和分析这些指标,从而更快地发现和解决问题。具体来说,可观测性可以帮助团队实现以下目标:
- 监控应用程序的性能和稳定性:通过监控应用程序的指标,例如响应时间、错误率、CPU 使用率等,可以及时发现性能和稳定性问题,并采取相应的措施。
- 实现快速故障排除:通过可观测性工具,可以快速定位和解决问题,减少对用户的影响。
- 支持数据驱动的决策:通过可观测性工具,可以收集和分析大量的数据,为团队提供数据支持,支持数据驱动的决策。
因此,可观测性对于灰度发布的成功非常重要,能够帮助团队更好地监控和分析新版本的性能、稳定性和用户反馈等指标,从而更快地发现和解决问题,提高发布的成功率和用户体验。
可观测性在灰度发布中的应用
要评估灰度发布中不同版本的性能及故障,需要收集和分析运行数据。通过观测云的 one agent 数据采集和标签化能力,能够快速、方便地采集不同服务版本中的运行数据,从而加以分析后,对新版本做出评估。
4.1 测试环境应用部署说明
测试环境中的所有服务是部署在 K8s 中。部署结构如下图所示:

前端 Web 页面请求通过 Gateway 网关访问后端的Auth和System服务,前端 Web 是 Vue 开发的,后端服务是 Java 开发。
4.2 服务版本发布说明
测试将通过对System服务进行灰度发布。发布示意图说明如下:



4.3 服务链路的接入和数据标签化
4.3.1 服务链路的接入配置说明
在接入 Java 应用 APM 时,需要使用到dd-java-agent.jar包。在 Kubernetes 的环境中,为了不侵入应用的镜像,常用的方式是在部署应用的 yaml 中使用 initContainers,利用相同 Pod 中的容器共享存储的方式来使用dd-java-agent.jar。
观测云提供 DataKit Operator 的方式向特殊 Pod 提供注入 dd-lib 文件和 environment ,这种方式可以更方便、更快捷地接入应用链路。
4.3.2 标签化说明
标签可以帮助对数据进行分类和组织,通过对服务运行的监控数据打标签,我们可以更好地了解数据的来源、类型、状态等信息,从而更好地进行数据分析。这里,我们就是通过对System服务发布的不同版本打上对应的标签,来实现后续对不同版本运行情况进行观测和分析。
该文中的测试环境中,在服务对应 pod 部署的 yaml 文件中,原始运行服务的版本通过-Ddd.tag参数,打上版本为 version:v1.0的标签。如下图所示:

对新发布的服务版本通过-Ddd.tag参数,打上版本为v2.0 的标签。如下图所示:

通过上述的标签配置,服务对应的所有链路中都会带有对应的版本信息。对应效果如下图所示:

在服务运行的过程中,可以通过对不同版本进行分组来做实时对比观测和分析。
4.4 对服务灰度发布的观测和分析
通过对比新旧两个版本的 QPS、服务执行耗时、服务错误率等指标数据进行实时监测,可以帮助快速发现问题和异常。
4.4.1 看板感知能力
首先,可以通过观测云的「场景」功能,配置针对相关服务灰度发布的观测看板。如下图所示:

通过看板,我们能够实时感知两个服务版本在运行过程中的状态,包括对应的请求数据量、服务错误率、以及服务的响应时间等关键指标。
4.4.2 服务运行状态分析
4.4.2.1 请求数量分析
通过「服务请求数」图表,我们能够清晰知道不同服务版本上的请求量。同时,当新版本做全量切换后,也可以通过该视图来观测全部请求流量是否路由到了正确的服务版本上。
4.4.2.2 服务性能分析
从上图的性能指标中(P75、P90 和 P99),能够直观看到System服务的新版本v2.0比起v1.0存在明显的响应时间长的问题。为了进一步分析该问题,我们可以通过在对应图表上做进一步的下钻,去查看链路的执行详细情况。如下图所示:

当跳转到「链路」详情页后,可以看到在对应时间段链路的耗时信息。这里也可以通过「持续时间」排序来找到耗时比较长的链路。如下图所示:

点开其中「执行时间」较长的链路,打开服务执行的「火焰图」详情,如下图所示:

从「火焰图」中,能清晰地看到v2.0版本中的SysRoleController.list这个调用消耗了比较长的时间为 6.04 秒。虽然,该方法调用了 MySQL,但是,从图中可以看到 MySQL 本身执行比较快。所以,问题点并不在数据库侧,需要对代码做进一步分析。
这里将不再做进一步的分析。因为为了模拟性能问题,在v2.0的相关代码中简单加了 5s 的 sleep,整体执行时间也和上面的火焰图对得上。

4.4.2.3 服务错误率分析
通过看板中的「服务错误率」图表,可以感知同一服务的不同版本在运行过程的错误发生情况。对错误率较高的服务版本,同样可以通过图表的下钻能力去查看对应错误的链路情况。如下图所示:

通过链路的详情页面,可以查看更进一步的执行错误信息。如下图所示:

不仅如此,也可以在链路详情中关联应用日志、主机资源使用、网络和 JVM 运行情况等数据做关联分析,提高问题定位和根因溯源的效率。
相关文章:
可观测性在灰度发布中的应用
前言 随着云计算的发展、云原生时代的来临,企业数字化转型进程不断深入,应用开发也越来越多地基于微服务化模式,快速迭代的能力使得应用开发更高效、更灵活。同时,也不得不面临应用版本快速升级所带来的的巨大挑战。 传统的发布方…...
vscode开发油猴插件环境配置指南
文章目录 一、环境配置1.1油猴插件开始编写代码1.2油猴插件配置1.2.1浏览器插件权限1.2.2插件自身权限 2. 油猴脚本API学习2.1 头文件2.2 油猴API 一、环境配置 1.1油猴插件开始编写代码 在vscode 中写入如下代码‘ // UserScript // name cds_test // namespace …...
网站不收录没排名降权怎么处理-紧急措施可恢复网站
网站降权对于SEO人员来说是非常致命的打击,因为网站一旦被搜索引擎降权,排名会严重地下降,网站的流量也会大幅下降,直接影响到收益。而且处理不好的话会导致恢复的时间周期无限拉长,所以网站被降权后我们要第一时间采取…...
C++vector模拟实现
vector模拟实现 1.构造函数2.拷贝构造3.析构赋值运算符重载4.iterator5.modifiers5.1push_back5.2pop_back5.3empty5.4insert5.5erase5.6swap 6.Capacity6.1size6.2capacity6.3reserve6.4resize6.5empty 7.Element access7.1operator[]7.2at 8.在谈reserve vector官方库实现的是…...
《DATASET DISTILLATION》
这篇文章提出了数据浓缩的办法,在前面已有的知识浓缩(压缩模型)的经验上,提出了不压缩模型,转而压缩数据集的办法,在压缩数据集上训练模型得到的效果尽可能地接近原始数据集的效果。 摘要 模型蒸馏的目的是…...
GDPU 数据结构 天码行空1
1. 病历信息管理 实现病历查询功能。具体要求如下: 定义一个结构体描述病人病历信息(病历号,姓名,症状);完成功能如下: 输入功能:输入5个病人的信息; 查询功能:输入姓名,在5个病历中进行查找,如果找到则显示该人的信息,…...
【C++】红黑树的模拟实现
🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风…...
【多线程】Thread 类 详解
Thread 类 详解 一. 创建线程1. 继承 Thread 类2. 实现 Runnable 接口3. 其他变形4. 多线程的优势-增加运行速度 二. Thread 类1. 构造方法2. 常见属性3. 启动线程-start()4. 中断线程-interrupt()5. 线程等待-join()6. 线程休眠-sleep()7. 获取当前线程引用 三. 线程的状态1. …...
LINUX 网络管理
目录 一、NetworkManager的特点 二、配置网络 1、使用ip命令临时配置 1)查看网卡在网络层的配置信息 2)查看网卡在数据链路层的配置信息 3)添加或者删除临时的网卡 4)禁用和启动指定网卡 2、修改配置文件 3、nmcli命令行…...
refresh rate
1920 x 1080 显卡刷新率 60...
使用 NGINX Unit 实施应用隔离
原文作者:Artem Konev - Senior Technical Writer 原文链接:使用 NGINX Unit 实施应用隔离 转载来源:NGINX 中文官网 NGINX 唯一中文官方社区 ,尽在 nginx.org.cn NGINX Unit 特性集的最新动态之一是支持应用隔离,该特…...
2023/09/12 qtc++
实现一个图形类(Shape) ,包含受保护成员属性:周长、面积, 公共成员函数:特殊成员函数书写 定义一个圆形类(Circle) ,继承自图形类,包含私有属性:半径 公共成员函数:特殊成员函数…...
全科医学科常用评估量表汇总,建议收藏!
根据全科医学科医生的量表使用情况,笔者整理了10个常用的全科医学科量表,可在线评测直接出结果,可转发使用,可生成二维码使用,可创建项目进行数据管理,有需要的小伙伴赶紧收藏! 日常生活能力量表…...
了解消息中间件的基础知识
为什么要使用消息中间件? 解耦:消息中间件可以使不同的应用程序通过解耦的方式进行通信,减少系统间的依赖关系提供异步通信:消息中间件可以实现异步消息传递,提高系统的响应性能。流量削峰:消息中间件可以…...
【linux】Linux wps字体缺失、加粗乱码解决
解决wps字体缺失问题 1、下载字体包 git clone https://github.com/iamdh4/ttf-wps-fonts.git2、创建单独放置字体的目录 mkdir /usr/share/fonts/wps-fonts3、复制字体到系统目录下 cp ttf-wps-fonts/* /usr/share/fonts/wps-fonts4、修改字体权限 chmod 644 /usr/share/f…...
每日两题 103二叉树的锯齿形层序遍历(数组) 513找树左下角的值(队列)
103 题目 103 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。 示例 1: 输入:root [3,9,…...
ROS2报错:ImportError: cannot import name ‘Log‘ from ‘rosgraph_msgs.msg‘
在使用ros2的bag命令查看数据集信息时报错 Traceback (most recent call last):File "/opt/ros/noetic/bin/rosbag", line 34, in <module>import rosbagFile "/opt/ros/noetic/lib/python3/dist-packages/rosbag/__init__.py", line 33, in <mo…...
【Vue】Vue中的代码分为哪几种类型?
在 Vue 中的代码可以分为以下几种类型: 1.模板代码 模板代码是 Vue 中用来生成 HTML 的一种语法,可以通过 Vue 的模板语法和指令来动态渲染页面。模板代码一般写在 Vue 组件的 template 标签中。 2.JavaScript 代码 JavaScript 代码是 Vue 组件中用来…...
es6中includes用法
js中的includes用法 1.数组 includes 可以判断一个数组中是否包含某一个元素,并返回true 或者false [a,b,c].includes(a) true [a,b,c].includes(1) false includes可以包含两个参数,第二个参数表示判断的起始位置 起始位置第一个数字是0。 2.字符串 …...
QT中QRadioButton实现分组C++
通过对QRadioButton组件进行分组可解决QRadioButton组件的互斥性 实现如下。 假设已设计好UI并且有UI代码情况: 头文件引用: #include <QButtonGroup> 分组功能 ,cpp文件代码实现: Your_Project::Your_Project(QWidge…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
