Graphite 1.1.8 版本解析:稳定分支的关键改进、新函数与实战升级要点
可观测性数据可视化后端【免费下载链接】graphite-webA highly scalable real-time graphing system项目地址https://gitcode.com/gh_mirrors/gr/graphite-web点击查看免费下载Graphite 1.1.8 是 1.1.x 稳定分支的 bugfix 发布版本发布于 2021 年 4 月 19 日官方明确推荐用于生产环境同时从 master 分支回带了若干改进。本文基于发布说明 docs/releases/1_1_8.rst结合 graphite-web 仓库源码系统梳理该版本的亮点特性、配置要点与 Bug 修复明细帮助读者在升级前理解改动影响并在升级后正确配置新增选项。发布概况与升级指引1.1.8 定位为稳定分支维护版本涉及 Graphite 技术栈的四个组件graphite-webWeb 应用与渲染 API、carbon数据接收与缓存、whisper固定大小数据库格式、carbonatecarbon 集群管理工具。官方建议同时升级 whisper、carbon 和 graphite-web 三个核心组件因为三者都包含有价值的 bugfix 与改进单独升级某一组件可能导致行为不一致。安装方式包括源码包与 PyPI 包两种途径graphite-web、carbon、whisper、carbonate 四个组件均发布对应版本的源码包与 PyPI 包可通过pip install安装此外还提供基于 graphite-statsd 的 Docker 镜像方案。对于源码安装仓库根目录的 setup.py、requirements.txt 与 docs/install-source.rst、docs/install-pip.rst、docs/install-virtualenv.rst 给出了详细步骤。Highlights 一览发布说明列出的版本亮点可概括为五类日志可控graphite-web 与 carbon 中过度冗余的日志均可被关闭降低磁盘写入与 I/O 开销。性能改进carbon 在未使用 tagging 时可禁用相关处理路径提升非 tagged 序列的吞吐。新函数新增aggregateSeriesLists()并为diffSeriesLists()、sumSeriesLists()、multiplySeriesLists()提供了基于它的别名实现。集群支持carbonate 新增对 Aggregated-Consistent Hash聚合一致性哈希的支持。大量 bugfix尤其是 graphite-web 侧的多线程、XSS 防护、编码与参数校验问题修复。下面分别从 Graphite-Web、Carbon、Carbonate 三个组件展开。Graphite-Web 新特性与源码实现1. CarbonLink 请求的 pickle 协议可配置CarbonLink 是 graphite-web 与 carbon 缓存之间的通信通道负责 cache-query、get-metadata、set-metadata 等请求。1.1.8 之前请求序列化使用的 pickle 协议是硬编码的本版本将其提取为设置项CARBONLINK_PICKLE_PROTOCOL。源码 webapp/graphite/carbonlink.py 中请求序列化逻辑为serialized_request pickle.dumps(request, protocolsettings.CARBONLINK_PICKLE_PROTOCOL) len_prefix struct.pack(!L, len(serialized_request)) request_packet len_prefix serialized_requestsend_request与send_request_to_all两处均使用该设置。默认值定义在 webapp/graphite/settings.pyCARBONLINK_PICKLE_PROTOCOL -1-1 表示使用当前 Python 解释器支持的最高协议版本。如需固定为特定协议可在本地设置文件local_settings.py中覆盖示例见 webapp/graphite/local_settings.py.example# 使用最高可用协议默认 #CARBONLINK_PICKLE_PROTOCOL -1在实际部署中如果 graphite-web 与 carbon 运行在跨 Python 版本或跨架构的环境中将协议固定为双方都能兼容的版本如 2可避免反序列化失败。2. info.log 可以完全关闭graphite-web 默认启用性能日志settings.py 中LOG_INFO_PERFORMANCE True日志文件为info.log。在查询量大、渲染频繁的生产环境这部分日志写入会产生明显开销。1.1.8 允许通过LOG_INFO_PERFORMANCE False关闭 info 日志对应 issue #1860。实现位于 webapp/graphite/logger.pyGraphiteLogger初始化时会根据settings.LOG_INFO_PERFORMANCE决定是否为 info logger 挂载真实 handleractivate为 False 时挂载NullHandler()日志内容被直接丢弃if activate: # if want to log this one ... handler.setFormatter(formatter) logger.addHandler(handler) else: logger.addHandler(NullHandler())配置示例见 webapp/graphite/local_settings.py.example#LOG_INFO_PERFORMANCE False #LOG_FILE_INFO info.log其他日志exception.log、cache.log、rendering.log仍由LOG_FILE_EXCEPTION、LOG_FILE_CACHE、LOG_FILE_RENDERING分别控制且默认开启轮转LOG_ROTATION、LOG_ROTATION_COUNT。注意即使关闭了 info.logcache 与 rendering 性能日志仍受各自开关独立控制可按需单独调整。3. 新函数 aggregateSeriesLists() 与三个别名这是本版本函数库的核心增强#2647。aggregateSeriesLists()将两个长度相等的序列列表按位置逐对聚合list1[0]对list2[0]、list1[1]对list2[1]……从而避免了手工展开大括号通配符、为每一对编写单独aggregate()调用的繁琐写法。源码实现位于 webapp/graphite/render/functions.py关键逻辑def aggregateSeriesLists(requestContext, seriesListFirstPos, seriesListSecondPos, func, xFilesFactorNone): if len(seriesListFirstPos) ! len(seriesListSecondPos): raise InputParameterError( seriesListFirstPos and seriesListSecondPos argument must have equal length) results [] for i in range(0, len(seriesListFirstPos)): firstSeries seriesListFirstPos[i] secondSeries seriesListSecondPos[i] aggregated aggregate(requestContext, (firstSeries, secondSeries), func, xFilesFactorxFilesFactor) if not aggregated: # empty list, no data found continue result aggregated[0] result.name result.name[:result.name.find(Series()] Series(%s,%s) % (firstSeries.name, secondSeries.name) results.append(result) return results要点两列表长度必须相等否则抛出InputParameterError位置语义严格聚合发生在同名位置list1[0]与list2[0]不是笛卡尔积支持聚合函数包括averageavg、avg_zero、median、sumtotal、min、max、diff、stddev、count、rangerangeOf、multiply、lastcurrent可选xFilesFactor参数控制数据点有效比例空的输入对被跳过不会污染结果。典型用法文档示例targetaggregateSeriesLists(mining.{carbon,graphite,diamond}.extracted,mining.{carbon,graphite,diamond}.shipped, sum)等价于为每个成员分别调用?targetaggregate(mining.carbon.extracted,mining.carbon.shipped, sum) targetaggregate(mining.graphite.extracted,mining.graphite.shipped, sum) targetaggregate(mining.diamond.extracted,mining.diamond.shipped, sum)三个别名sumSeriesLists()、diffSeriesLists()、multiplySeriesLists()分别以固定聚合函数调用aggregateSeriesLists()sumSeriesListsreturn aggregateSeriesLists(requestContext, seriesListFirstPos, seriesListSecondPos, sum)diffSeriesListsreturn aggregateSeriesLists(requestContext, seriesListFirstPos, seriesListSecondPos, diff)multiplySeriesListsreturn aggregateSeriesLists(requestContext, seriesListFirstPos, seriesListSecondPos, multiply)三者均声明group Combine且aggregator True见 functions.py 中 310-316、374-379、584-589、1212-1217 行的元数据定义意味着它们可以出现在任意序列列表参数位置支持管道式组合。例如求和别名用法targetsumSeriesLists(mining.{carbon,graphite,diamond}.extracted,mining.{carbon,graphite,diamond}.shipped)在 webapp/graphite/render/functions.py 的SeriesFunctions注册表中三个别名与aggregateSeriesLists均被登记可直接在 Render URL 的target参数中使用。4. weightedAverage 的参数数量校验weightedAverage(seriesListAvg, seriesListWeight, *nodes)用于按权重计算加权平均。1.1.8 之前当平均值序列数量与权重序列数量不一致时会静默产生错误或难以排查的异常现在改为显式抛出InputParameterError#2636。源码见 webapp/graphite/render/functions.pyif len(seriesListAvg) ! len(seriesListWeight): raise InputParameterError(weightedAverage must receive the same number of series for seriesListAvg and seriesListWeight but received respectively %d and %d % (len(seriesListAvg), len(seriesListWeight)))该错误信息包含实际数量便于在渲染请求中直接定位参数问题。5. 无效输入的日志改进与右端 dip可选修复无效输入日志#2590当 Render 请求包含无法解析的输入时graphite-web 会输出更清晰、更可操作的错误日志帮助运维定位是 URL 转义、括号不匹配还是时间参数格式错误。右端 dip 可选修复#2659当某条序列的最新数据点仍停留在 carbon 缓存中、尚未落盘到 whisper 时sum类聚合结果在最右侧会出现一段明显下降dip。1.1.8 提供了可选的处理逻辑缓解因为当前分钟缺失导致求和右端凹陷的问题。该行为与 CarbonLink 缓存查询见 webapp/graphite/carbonlink.py 的query()以及渲染端数据合并逻辑相关属于渲染结果层面的修正。6. REsynthesize面向 CentOS 的安装脚本本版本新增了REsynthesize脚本#2631它是 Synthesize 安装脚本的分支版本用于在 CentOS 系发行版上安装 Graphite。相关文档可参考 docs/install-synthesize.rst该文档详细描述了 Synthesize/REsynthesize 的用途、系统要求与安装步骤。Carbon 与 Carbonate 的改进Carbon日志与 tagging 性能优化关闭丢失连接日志#900carbon 新增配置项可关闭对丢失连接lost connections的告警日志。在连接频繁抖动或大规模采集环境下这类日志会大量产生关闭后可显著减少日志 I/O。非 tagged 序列性能提升#903对于不使用 tagging 功能的部署carbon 可以跳过 tag 相关的处理路径提升普通序列的接收与写入吞吐。若你的环境没有使用 Graphite 的 tag 体系关于 tag 的用法可参考 docs/tags.rst 与 webapp/graphite/tags 模块升级后可开启该项获得性能收益。storage-aggregation 配置完善#899/#901更新了storage-aggregation.conf.example并补充更完整的聚合选项列表使 xFilesFactor 与 aggregationMethod 的配置说明更贴近实际存储需求。Carbonate聚合一致性哈希与网络容错Aggregated-Consistent Hash 支持#121/#56carbonate 新增对聚合一致性哈希算法的支持可改进多副本、多实例集群下的数据分布策略减少节点增减时的数据迁移量。临时网络故障处理与自定义 staging 目录#122carbonate 对同步过程中的瞬时网络失败做了容错处理并支持通过参数指定自定义的 staging 目录路径便于在大集群同步时灵活规划磁盘布局。Graphite-Web Bug 修复深度解析1.1.8 修复了大量 Graphite-Web 问题以下选取实现可验证的重点项展开。渲染端多线程安全grammar 改为线程安全对象修复 #2626/#2627渲染端点render endpoint在并发请求下出现多线程问题根因是共享的 target 语法解析器pyparsing grammar不是线程安全的。修复方式是在 webapp/graphite/render/grammar.py 中将 grammar 包装为ThreadSafeGrammar用互斥锁保护每次解析from threading import Lock from graphite.render.grammar_unsafe import grammar as _grammar class ThreadSafeGrammar(object): def __init__(self): self._lock Lock() def parseString(self, instring): with self._lock: return _grammar.parseString(instring) grammar ThreadSafeGrammar()该对象在渲染流水线中被 webapp/graphite/render/evaluator.py 等模块引用从源码结构看解析入口统一经过grammar.parseString后即可保证线程安全。对高并发生产环境而言这是本版本最重要的稳定性修复之一。unpickle Interval/IntervalSet 修复修复 #2692/#2693graphite-web 的本地设置与缓存数据中可能包含Interval/IntervalSet对象用于时间范围表达此前这些对象无法被pickle.loads正确还原导致缓存或会话数据加载报错。相关类定义在 webapp/graphite/intervals.pyIntervalSet基于Interval列表提供complement、intersect、union等区间运算Interval实现__eq__/__hash__/__lt__等比较与哈希接口。本版本补齐了 unpickle 路径确保时间区间对象可以安全地跨进程序列化与反序列化。参数校验与类型安全修复tag 值统一为字符串#2572确保所有 tag 值都以字符串形式存储与比较避免类型不一致导致的查询异常。validator 尝试转换参数类型#2574参数验证器对传入值尝试类型转换降低因字符串/数字类型不匹配产生的误报。seriesList 类型校验过宽的修正#2593收紧seriesList参数类型校验避免非法序列被静默接受。bc 接受弃用参数#2579保持对已弃用参数的向后兼容防止既有 dashboard 与 URL 在升级后失效。asPercent 可作为聚合器#2594asPercent现在支持出现在聚合器aggregator位置拓展了其组合能力。group by nodes 的节点变为可选#2597groupByNodes系列函数不再强制要求节点参数行为更宽容。expand braces 修复#2661大括号展开逻辑修正避免某些合法 target 被错误解析。安全与编码修复XSS 防护#2620对渲染输出中的用户可控内容进行转义防止跨站脚本注入。SVG 输出仅 encodeHeader#2584render仅对 SVG 输出进行encodeHeader()处理避免对其他输出格式引入多余编码。unpickle 的 utf-8 修复#2660修正反序列化过程中的 utf-8 编码处理#2643 回带了 unicode 修复兼容 Python 3 环境。路径与描述不匹配修复thedoc31修正指标路径与描述对不上号的问题。前端与集成修复composer 已保存图像的 target 转义#2587修复 Composer 保存图像 URL 中 target 参数转义错误。Firefox 中 dashboard 指标补全退格键#2589修复 Firefox 浏览器下删除字符时指标自动补全失效的问题。Remote render 修复#2582/render/的 remote 模式跨实例渲染相关修复。linearRegressionAnalysis 私有化#2602避免其出现在函数文档中。whitenoise 依赖版本锁定#2606锁定 whitenoise 版本避免上游变动破坏静态文件服务。Apache /static/ 文档补丁#2635修正 Apache 部署文档中静态目录的配置示例。whisper.rst Python 3 修正#2649更新 docs/whisper.rst 中的 Python 3 相关描述。其余组件修复Carbon移除已废弃四年的 carbon-client.py#890拼写修正#893Unnecessary comprehension与测试外assert的代码质量修复#909/#907。Whisper修复从低 retention 调整到高 retention 时丢失部分数据的问题#293修正 Python 2.7 下的测试#295。升级与配置实操清单升级到 1.1.8 后的推荐操作顺序同步升级三个组件分别升级 whisper、carbon、graphite-webcarbonate 视集群管理需求决定是否升级。按需关闭冗余日志在local_settings.py中设置LOG_INFO_PERFORMANCE False参考 webapp/graphite/local_settings.py.examplecarbon 侧对应关闭丢失连接日志的配置项。无需 tagging 时关闭相关路径在 carbon 配置中禁用 tagging 相关处理提升非 tagged 序列性能。按需调整 pickle 协议如跨 Python 版本环境在local_settings.py中固定CARBONLINK_PICKLE_PROTOCOL示例配置默认-1。验证渲染行为重点回归测试weightedAverage、aggregateSeriesLists及其三个别名、groupByNodes等受影响函数确认使用asPercent聚合器与bc弃用参数的既有 dashboard 仍正常。安全与稳定性回归确认高并发下 render 请求正常grammar 线程安全修复生效、SVG 输出无异常编码、tag 查询无类型错误。小结Graphite 1.1.8 作为稳定分支维护版本价值集中在三方面一是日志与性能的可控性graphite-web 与 carbon 均可关闭冗余日志carbon 可跳过 tagging 路径二是函数库能力的补齐aggregateSeriesLists及sumSeriesLists/diffSeriesLists/multiplySeriesLists别名配合weightedAverage的显式参数校验三是渲染端稳定性与安全性的系统性修复grammar 线程安全、unpickle 修复、XSS 防护、编码修正。对于仍在 1.1.x 分支的生产用户本版本是官方推荐升级目标升级时按上述清单验证既有 dashboard 与函数组合即可平滑过渡。赞分享可观测性数据可视化后端【免费下载链接】graphite-webA highly scalable real-time graphing system项目地址https://gitcode.com/gh_mirrors/gr/graphite-web点击查看免费下载相关推荐DoWhy 因果反驳Refutation体系详解causal_refuters 包的全部反驳方法、敏感性与重叠分析DoWhy 因果反驳Refutation体系详解causal_refuters 包的全部反驳方法、敏感性与重叠分析 在 DoWhy 的识别—估计—反驳可观测性数据可视化后端Graphite 1.1.10 发布指南稳定分支 Bugfix 版本的新函数、底层修复与升级实践Graphite 1.1.10 发布指南稳定分支 Bugfix 版本的新函数、底层修复与升级实践 Graphite 1.1.10 是 1.1.x 稳定分支的可观测性数据可视化后端Graphite-Web 1.1.x 版本演进全解析从 1.1.6 到 1.1.10 的关键修复、新函数与工程化改进Graphite Web 1.1.x 版本演进全解析从 1.1.6 到 1.1.10 的关键修复、新函数与工程化改进 导读 本文以当前仓库 CHANGELOG可观测性数据可视化后端上一篇D2RML终极指南5分钟掌握暗黑2重制版多开技巧告别繁琐登录流程下一篇大疆Cloud API云端集成构建专业级无人机管理平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考