灰度发布难以追踪?你可能用错了工具

灰度发布进行可观测性的主要方式是通过收集和分析用户在使用新版本产品或服务时的数据,以此来评估新版本的性能、稳定性和用户满意度。这个过程通常包括以下几个步骤:

  1. 定义观测指标:首先,需要定义一套合适的观测指标(Metrics),这些指标应该能够全面反映新版本的性能、稳定性和用户满意度。常见的观测指标可能包括错误率、响应时间、用户活跃度、用户反馈等。
  2. 收集数据:在灰度发布期间,需要收集目标用户群在使用新版本产品或服务时产生的数据。这些数据可以通过各种方式收集,例如通过日志记录、用户反馈系统、第三方监控工具等。
  3. 分析数据:收集到数据后,需要对其进行分析,以评估新版本的性能和用户满意度。这个过程可能涉及到数据清洗、数据可视化、统计分析等多个步骤。
  4. 决策调整:基于数据分析的结果,产品团队可以决定是否需要对新版本进行调整或优化。如果需要调整,可以通过修改代码、调整配置等方式进行。
  5. 持续监控:灰度发布期间,需要持续监控新版本的性能和用户满意度,以确保其稳定运行。如果发现任何问题或风险,需要及时进行处理。

在这个过程中,灰度发布和可观测性相辅相成。灰度发布使得产品团队可以将新版本的产品或服务逐步推向目标用户群,而可观测性则帮助团队实时了解新版本的性能和用户满意度,从而做出正确的决策和调整。通过这种方式,产品团队可以更好地控制发布风险,提高产品质量和用户满意度。

通常情况下,一般采用添加 header 方式来设置灰度标识,不同的接口标记为不同的 header,但实际上,header 本身不具备透传。在较为复杂的业务当中,由于请求链条过长,涉及组件较多,过程则表现为难以追溯,耗时耗力,效果堪忧。为了解决这一问题,一般 APM 厂商都会提供类似 Baggage功能,让特定的 tag 无限的传递下去,从而实现全链路追踪。

场景

现在有一个 java 语言编写的服务接口需要做升级优化,为了确保原来的接口有用,也需要保证新的接口也可以使用,故需要做一次灰度发布。

场景设置

  • 让一部分用户正常访问接口(端口 8091 )
  • 让一部分用户访问新的接口(端口 8092 )
  • 并设置相应的 header( test-flag ),以便业务追踪

准备工作

  • 免费注册观测云帐号,注册后会有免费的使用额度。
  • 安装 DataKit,安装成功后,大概一两分钟在观测云就可以看到主机相关信息。
  • DDTrace Agent 下载地址
  • 准备灰度发布的应用,实践 Demo
  • 开启 DDTrace 采集器

DDTrace 采集器用于采集链路信息,进入到 DataKit 安装目录下,执行 conf.d/ddtrace/ ,复制 ddtrace.conf.sample 并重命名为 ddtrace.conf ,在 ddtrace.conf 配置新增 customer_tags=["test_flag"] ,将对应的 Baggage 转化为 tag 。

应用

调整应用的启动命令,假设端口 8091 为旧的接口应用。

java \
-javaagent:/home/liurui/agent/dd-java-agent-1.30.1-guance.jar \
-Ddd.service.name=server \
-Ddd.trace.header.baggage=test-flag:test_flag \
-Dserver.port=8091 \
-jar springboot-server.jar

端口 8092 为优化后的接口应用。

java \
-javaagent:/home/liurui/agent/dd-java-agent-1.30.1-guance.jar \
-Ddd.service.name=server \
-Ddd.trace.header.baggage=test-flag:test_flag \
-Dserver.port=8092 \
-jar springboot-server.jar --client=true

启动参数上基本上没啥区别。8092 添加了 --client=true ,会对请求造成异常,假设这个是新的代码调整。

Nginx 配置

采用 nginx 来实现业务分流操作,比如 user_agent 为 curl 的,让请求新的接口,其他的走原来的通道。同时追加 header,方便进行追踪。如 user_agent 为 curl 的相关请求,将自定义 header 值设置为 20240306 ,其他默认值为 normal 。

map $http_user_agent $custom_header {  ~*curl "20240306";default "normal";  
}  

将 user_agent 为 curl 的请求分流到 backend2 ,默认分流到 backend1 。

set $upstream_name 'backend1';  
if ($http_user_agent ~* "curl") {  set $upstream_name 'backend2';  
}proxy_pass http://$upstream_name;

根据不同的 upstream_name 设置不同的 header 值。

proxy_set_header   Test-Flag $custom_header; # 根据 upstream 地址设置不同的值

两个 upstream 。

    upstream backend1 {  server localhost:8091; }  upstream backend2 {  server localhost:8092;  }  

通过 nginx -s reload 重启 nginx 。至此,nginx 配置基本上完成。

root:/etc/nginx/conf.d# nginx -s reload
info: DATADOG TRACER CONFIGURATION - {"agent_url":"http://localhost:9529","analytics_enabled":false,"analytics_sample_rate":null,"date":"2024-03-06T15:30:24+0800","enabled":true,"env":"prod","lang":"cpp","lang_version":"201402","operation_name_override":"nginx.handle","report_hostname":false,"sampling_rules":"[]","service":"nginx","version":"v1.3.7"}

这里 nginx 接入了 ddtrace,非必须,如有需要,可参考文档 Nginx Tracing 。

Nginx 全文配置如下:

map $http_user_agent $custom_header {  ~*curl "20240306";default "normal";  
}  
upstream backend1 {  server localhost:8091; 
}  
upstream backend2 {  server localhost:8092;  
}  server {listen       80;server_name  www.springboot.com;client_max_body_size     100m;location ^~ / {set $upstream_name 'backend1';  if ($http_user_agent ~* "curl") {  set $upstream_name 'backend2';  }  add_header 'Access-Control-Allow-Origin' *;add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';proxy_pass http://$upstream_name;proxy_set_header X-datadog-trace-id $opentracing_context_x_datadog_trace_id;proxy_set_header X-datadog-parent-id $opentracing_context_x_datadog_parent_id;proxy_set_header   X-Real-IP         $remote_addr;proxy_set_header   Host              $http_host;proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;proxy_set_header   Test-Flag $custom_header; # 根据 upstream 地址设置不同的值}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}

测试

分别通过浏览器和 curl 请求接口 http://www.springboot.com/gateway 。其中 curl 返回结果如下:

root:/etc/nginx/conf.d# curl www.springboot.com/gateway
{"msg":"client 调用失败","code":500}

浏览器请求则返回如下信息:

{"msg":"支付成功","code":200}

从观测云上通过链路追踪,可以发现所有的 span 都有 tag 为 test_flag ,其中值为 20240306 的链路为本次新发布的接口。

红色标记代表异常,说明当前链路处于异常状态。通过查看链路详情可以查看到堆栈信息,最终根据调整的代码进行再次发布,通过同样的方式进行再追踪、再验证。

  • 对比灰度前后url请求耗时情况

  • 灰度前后的应用的请求分布

  • 灰度前后资源耗时排行

  • 灰度前后异常链路分布占比

后记

以上实践只是灰度发布的一部分,但笔者认为这是最核心、最重要的:确保业务的更新和正常使用。如何更有效率的确保发版成功,则需借助可观测性能力,让一切变得肉眼可见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Day7 常用API

文章目录 1、Arrays1.1 简述1.2 如何比较对象数组1.2.1 方法1.1.2.2 方式2 2、Lambda3、方法引用3.1 静态方法的引用3.2 实例方法引用3.3 特定类型方法引用3.4 构造器引用 1、Arrays 1.1 简述 操作数组的一个工具类 常见方法 int[] arr{10,20,30,50,40};//将 数组的内容 组…

彩色gif闪图怎么做?分享gif动画的方法

在现在的媒体时代,动态图片已经成为了最流行的分享信息的方式。能够传达动态的视觉效果。那种带有动态效果的闪动文字图片要怎么制作呢?很简单,通过使用在线制作闪字图片工具,上传多张文字内容相同,颜色、位置不同的jp…

【网络原理】使用Java基于TCP搭建简单客户端与服务器通信

目录 🎄API介绍🌸ServerSocket API🌸Socket API 🍀TCP中的长短连接🌳建立TCP回显客户端与服务器🌸TCP搭建服务器🌸TCP搭建客户端 ⭕总结 TCP服务器与客户端的搭建需要借助以下API 🎄…

C语言函数—库函数

函数是什么? 数学中我们常见到函数的概念。但是你了解C语言中的函数吗? 维基百科中对函数的定义:子程序 在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, ca…

c++初阶------类和对象(下)

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

马斯克将在本周,开源类ChatGPT产品Grok

3月11日晚,马斯克在社交平台宣布,将在本周开源生成式AI产品——Grok。 Grok是马斯克旗下公司xAI在去年11月发布的,一款类ChatGPT产品,可以提供生成文本、代码、邮件、信息检索等功能。其测试性能超过GPT-3.5、LLaMA 2 70B&#x…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的铁轨缺陷检测系统(Python+PySide6界面+训练代码)

摘要:开发铁轨缺陷检测系统对于物流行业、制造业具有重要作用。本篇博客详细介绍了如何运用深度学习构建一个铁轨缺陷检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5,展示了不同模…

Linux运维:深入了解 Linux 目录结构

Linux运维:深入了解 Linux 目录结构 一、 Linux 目录结构与 Windows之间的主要区别二、Linux根目录结构三、常见目录及其作用 💖The Begin💖点点关注,收藏不迷路💖 一、 Linux 目录结构与 Windows之间的主要区别 1、根…

vivado clock ip核的使用

clock 偶数倍分频就是进行计数器计数,奇数倍分频如果不要求占空比的话也是进行计数,如果要求0.5的占空比的话,则需要进行两个计数器, 对于实现占空比为50%的N倍奇数分频,我们可以分解为两个通道: 上升沿触…

数据拯救指南:解决文件或目录损坏且无法读取的终极策略

在日常的计算机使用中,我们经常会遇到文件或目录损坏且无法读取的困扰。当这类问题发生时,无论是重要的文档、照片还是视频文件,都可能会变得无法访问,给我们的工作和生活带来极大的不便。面对这种情况,我们首先需要了…

落地灯哪个牌子好?五款品质可靠的落地灯,各具亮点

近年来,落地灯作为最适合目前用眼人群使用的照明电器,以显著的照明效果获得了广泛认可,并成为众多学生党、上班族用眼时的必备工具。其受欢迎的程度不断攀升,促使越来越多的人都选择入手落地灯。然而,我发现市场上也有…

关于JSP的打印调试,再来一篇巩固巩固

JSP实质上就是html混入了Java,或者说是HTMLJavaScriptCSSJava的混合⽂件,那么就会牵扯到各种语言之间的变量引用问题,既然基础是html,那么就先看看html怎么引用其他内容,以及其他内容间值的互引用。 1、Html获取JavaS…

数据结构之栈详解(C语言手撕)

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…

HYBBS 表白墙网站PHP程序源码,支持封装成APP

PHP表白墙网站源码,适用于校园内或校区间使用,同时支持封装成APP。告别使用QQ空间的表白墙。 简单安装,只需PHP版本5.6以上即可。 通过上传程序进行安装,并设置账号密码,登录后台后切换模板,适配手机和PC…

如何在Linux本地搭建Tale网站并实现无公网ip远程访问

文章目录 前言1. Tale网站搭建1.1 检查本地环境1.2 部署Tale个人博客系统1.3 启动Tale服务1.4 访问博客地址 2. Linux安装Cpolar内网穿透3. 创建Tale博客公网地址4. 使用公网地址访问Tale 前言 今天给大家带来一款基于 Java 语言的轻量级博客开源项目——Tale,Tale…

JMeter 二次开发之环境准备

通过JMeter二次开发,可以充分发挥JMeter的潜力,定制化和扩展工具的能力以满足具体需求。无论是开发自定义插件、函数二次开发还是定制UI,深入学习和掌握JMeter的二次开发技术,将为接口功能测试/接口性能测试工作带来更多的便利和效…

【Linux/OS学习】基础文件控制/IO——内存文件

文章目录 一、 基础文件控制1.1 系统接口open函数1.2 Linux中文件描述符1.2 C语言FILE中的文件描述符 二、重定向1. 输出重定向2. 追加重定向3. 输入重定向 tips:fd的分配规则 一个文件要有一个唯一的文件标识,以便用户识别和引用。 文件名包含3部分:文件…

进电子厂了,感触颇多...

作者:三哥 个人网站:https://j3code.cn 本文已收录到语雀:https://www.yuque.com/j3code/me-public-note/lpgzm6y2nv9iw8ec 是的,真进电子厂了,但主人公不是我。 虽然我不是主人公,但是我经历的过程是和主…

jdk1.8下载与安装 图文版

JDK下载 首先在Oracle官网上下载jdk1.8.https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html,如下图所示,找到jdk1.8,选择对应的版本 或者 链接:https://pan.baidu.com/s/13lZy7JKE1xn-dXx_VG1QFA?pwd29wl 提取码:…

谷歌承认“窃取”OpenAI模型关键信息

什么?谷歌成功偷家OpenAI,还窃取到了gpt-3.5-turbo关键信息??? 是的,你没看错。 根据谷歌自己的说法,它不仅还原了OpenAI大模型的整个投影矩阵(projection matrix)&…