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

2024-03-12 17:20

本文主要是介绍灰度发布难以追踪?你可能用错了工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  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.chinasem.cn/article/802007

相关文章

修复已被利用的高危漏洞! macOS Sequoia 15.6.1发布

《修复已被利用的高危漏洞!macOSSequoia15.6.1发布》苹果公司于今日发布了macOSSequoia15.6.1更新,这是去年9月推出的macOSSequoia操作... MACOS Sequoia 15.6.1 正式发布!此次更新修复了一个已被黑客利用的严重安全漏洞,并解决了部分中文用户反馈的

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

MySQL慢查询工具的使用小结

《MySQL慢查询工具的使用小结》使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询,本文就来介绍一下MySQL的慢查询工具,具有一定的参考价值,感兴趣的可以了解一下... 目录一、启用慢查询日志1.1 编辑mysql配置文件1.2 重启MySQL服务二、配置动态参数(可选)三、分析慢查

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过