ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Zeek 集群事件遥测深度指南:Cluster::Telemetry 配置、三类指标与源码原理

Zeek 集群事件遥测深度指南:Cluster::Telemetry 配置、三类指标与源码原理 网络安全网络IDS【免费下载链接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.项目地址https://gitcode.com/gh_mirrors/ze/zeek点击查看免费下载集群环境下事件在节点之间经由后端Backend序列化、发布与接收其规模、分布与流向直接影响集群的负载健康度。Cluster::Telemetry是 Zeek 为此提供的内置遥测模块它通过少量可重定义redef的配置项控制核心后端Core与 WebSocket 后端分别记录哪些维度的事件指标并借助 Zeek 的 telemetry 框架 将计数、标签与直方图暴露给 Prometheus 等监控系统。读完本文你将掌握Cluster::Telemetry::Type三种指标级别的语义与生成的指标名、四个配置项的默认值与调优方法、topic 归一化机制以及从脚本配置到 C 装配触发的完整实现链路。一、模块概览为谁记录、记录什么集群遥测解决的问题很具体在核心后端如 Broker/ZeroMQ与 WebSocket 后端上入站incoming与出站outgoing事件各自经历了多少次、多大体积、来自哪些 handler 与 topic。Cluster::Telemetry模块不负责传输本身而是在事件序列化/反序列化路径上挂接“探针”把每次发布与接收的现场信息转换成遥测指标。模块的脚本定义位于 scripts/base/frameworks/cluster/telemetry.zeek其 API 文档即本文主题位于 doc/scripts/base/frameworks/cluster/telemetry.zeek.rst。C 侧接口与实现在 src/cluster/Telemetry.h 与 src/cluster/Telemetry.cc。在 C 中遥测被建模为挂在Backend之上的一个抽象实例zeek::cluster::detail::Telemetry并通过TelemetryScope区分Core与WebSocket两种作用域见 src/cluster/Telemetry.h。核心后端与 WebSocket 后端各自维护独立的启用集合因此两者可以有不同的指标粒度。二、指标级别INFO / VERBOSE / DEBUG模块的核心类型是枚举Cluster::Telemetry::Type它决定了“记录到什么粒度”三个枚举值定义于 scripts/base/frameworks/cluster/telemetry.zeek语义如下枚举值指标形态标签典型用途INFO计数器Counter无标签只关心集群整体的事件吞吐VERBOSE计数器族CounterFamilytopic归一化后、handler分析具体事件类型/处理函数的流量分布DEBUG直方图族HistogramFamilytopic、handler、script_location仅出站诊断序列化消息体积与脚本调用位置INFO无标签计数INFO为每个后端创建两个无标签计数器指标zeek_cluster_name_outgoing_events出站事件总数zeek_cluster_name_incoming_events入站事件总数。其中name取core或websocket。对应实现见 src/cluster/Telemetry.cc指标名通过util::fmt(cluster_%s_outgoing_events, name)生成并以zeek为前缀注册到 telemetry 管理器每次事件触发时仅执行out-Inc()/in-Inc()src/cluster/Telemetry.cc开销极小因此也是默认启用的级别。VERBOSE带 topic 与 handler 的计数VERBOSE为每个后端创建带标签的计数器族zeek_cluster_name_verbose_outgoing_eventszeek_cluster_name_verbose_incoming_events标签为topic归一化后的topic 名与handler事件处理函数名见 src/cluster/Telemetry.cc。指标采用CounterFamilyGetOrAdd动态创建标签组合的方式src/cluster/Telemetry.cc因此每个不同的topic, handler组合都会产生一条独立的时间序列。DEBUG消息体积直方图DEBUG使用序列化后的消息字节数作为观测值为每个后端创建直方图族zeek_cluster_name_debug_outgoing_event_sizeszeek_cluster_name_debug_incoming_event_sizes标签为topic、handler出站指标额外携带script_location触发发布的脚本文件与行号入站指标则刻意去掉该标签因为入站事件的“来源位置”在远端无本地方言意义。实现见 src/cluster/Telemetry.cc出站通过determine_script_location()回溯脚本调用栈从CallExpr的位置信息中提取文件:行号并缓存到location_cache避免重复计算src/cluster/Telemetry.cc。直方图的桶由message_size_bounds决定见下文。三个级别通过CompositeTelemetry组合src/cluster/Telemetry.h只要某级别被启用对应子实例就被加入组合器事件触发时逐个转发互不干扰。三、配置项详解四个redef选项模块暴露四个可重定义选项全部带redef属性可被脚本层增量修改。1.core_metrics与websocket_metrics开关集合## The telemetry types to enable for the core backend. const core_metrics: set[Type] { INFO, } redef; ## The telemetry types to enable for WebSocket backends. const websocket_metrics: set[Type] { INFO, } redef;二者类型均为set[Cluster::Telemetry::Type]默认只启用INFO。core_metrics作用于核心后端例如 src/zeek-setup.cc 中的configure_backend_telemetry(*cluster::backend, core)websocket_metrics作用于 WebSocket 后端src/cluster/websocket/WebSocket.cc 中的configure_backend_telemetry(*backend, websocket, {{app, application_name}})注意 WebSocket 后端会额外附加app静态标签其值为应用名。开启更细粒度级别的典型写法是redef Cluster::Telemetry::core_metrics { Cluster::Telemetry::VERBOSE, }; redef Cluster::Telemetry::websocket_metrics { Cluster::Telemetry::DEBUG, };启用的级别越多指标基数越大尤其是在VERBOSE/DEBUG下 topic 与 handler 的组合数量可能很多需结合“指标爆炸”风险评估见第六节。2.message_size_boundsDEBUG 直方图桶## For the DEBUG metrics, the histogram buckets to use. const message_size_bounds: vector of double { 10.0, 50.0, 100.0, 500.0, 1000.0, 5000.0, 10000.0, 50000.0, } redef;类型为vector of double默认 8 个桶10.0, 50.0, 100.0, 500.0, 1000.0, 5000.0, 10000.0, 50000.0单位为字节。它仅影响DEBUG指标configure_backend_telemetry在装配DebugTelemetry时读取该向量并转换成 C 的std::vectordoublesrc/cluster/Telemetry.cc随后注册到HistogramFamilysrc/cluster/Telemetry.cc。当VERBOSE/DEBUG需要观察的消息体积区间与默认桶明显不符时例如集群普遍传输 MB 级载荷可以整体重定义redef Cluster::Telemetry::message_size_bounds { 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 10000000.0, };3.topic_normalizations归一化含随机部分的 topic## Table used for normalizing topic names that contain random parts. ## Map to an empty string to skip recording a specific metric ## completely. const topic_normalizations: table[pattern] of string { [/^zeek\/cluster\/nodeid\/.*/] zeek/cluster/nodeid/__normalized__, } ordered redef;类型为table[pattern] of string带ordered属性保证 pattern 按声明顺序匹配。它的存在是为了解决一个真实的监控问题含随机部分的 topic 会导致指标基数无限增长。例如节点 ID topiczeek/cluster/nodeid/随机ID/...每启动一个节点就产生一组新标签直接进VERBOSE/DEBUG指标必然拖垮监控系统。该表把这类 topic 归一到固定模板例如把上述随机 ID 归一为zeek/cluster/nodeid/__normalized__。两处细节值得注意匹配不上时原样返回TableTopicNormalizer通过LookupPattern查询无匹配则返回原始 topicsrc/cluster/Telemetry.cc映射为空字符串 跳过该指标文档明确说明“Map to an empty string to skip recording a specific metric completely”即把某类 topic 映射为可完全停止记录对应指标。ZeroMQ 后端的真实重定义示例由于 ZeroMQ 后端使用点分隔符dot separator构造 topic而 base 层默认表用的是斜杠分隔因此 scripts/policy/frameworks/cluster/backend/zeromq/options.zeek 用追加了对应规则redef Cluster::Telemetry::topic_normalizations { [/^zeek\.cluster\.nodeid\..*/] zeek.cluster.nodeid.__normalized__, };这正是文档中“Redefinition”一节展示的内容在加载 ZeroMQ 策略后点分式 nodeid topic 也被归一。由此可以看到该表的设计意图——不同后端、不同部署形态都可以通过redef ... 增量补充自己的归一规则且ordered保证规则顺序可控。四、指标装配从配置到后端的一次性注入脚本层的set/vector/table如何变成后端实例上的指标关键函数是configure_backend_telemetrysrc/cluster/Telemetry.cc其流程为根据namecore或websocket其他值直接FatalError拼接变量名Cluster::Telemetry::name_metrics读取对应的set遍历集合中的每个Type枚举值INFO→ 实例化InfoTelemetry无标签计数器VERBOSE→ 实例化VerboseTelemetry注入TableTopicNormalizer即读取topic_normalizations表DEBUG→ 实例化DebugTelemetry注入TableTopicNormalizer与message_size_bounds桶其他值 →FatalError把各子实例加入CompositeTelemetry最后backend.SetTelemetry(...)注入后端。两个调用点分别对应两类后端核心后端Zeek 启动流程中集群后端实例化完成后立即调用src/zeek-setup.ccWebSocket 后端WebSocket.cc内装配后端时调用并携带app静态标签src/cluster/websocket/WebSocket.cc。五、触发点事件进出后端的钩子位置遥测并不旁路事件流而是内嵌在 Backend 的默认发布/接收实现中见 src/cluster/Backend.cc出站DoPublishEvent在event_serializer-SerializeEvent(...)序列化完成后用buf.size()构造SerializationInfo并调用Telemetry().OnOutgoingEvent(topic, event.HandlerName(), ...)src/cluster/Backend.cc。这里的SerializationInfo正是 DEBUG 直方图观测值的来源入站ProcessEventMessage在UnserializeEvent成功解析后用payload.size()调用Telemetry().OnIncomingEvent(topic, r-HandlerName(), ...)src/cluster/Backend.cc。可见无论走哪个具体后端Broker/ZeroMQ/WebSocket只要继承Backend的默认序列化路径遥测钩子就自动生效指标口径天然与“实际序列化字节数”一致。指标最终经由 Zeek 的 telemetry 管理器注册到底层 Prometheus 库基于 prometheus-cppCounterInstance/CounterFamily/HistogramFamily统一使用zeek前缀并拼出完整 Prometheus 指标名src/telemetry/Manager.cc。因此所有cluster_*指标的外部名称形如zeek_cluster_core_outgoing_events、zeek_cluster_websocket_debug_incoming_event_sizes等可直接被 Prometheus 抓取。六、实战建议与验证方法监控过载的配套指标scripts/policy/frameworks/cluster/backend/zeromq/options.zeek 明确指出ZeroMQ 部署下应监控zeek_cluster_zeromq_xpub_drops_total与zeek_cluster_zeromq_onloop_drops_total任何非零值都意味着集群过载而要更深入了解“发布/接收的事件本身”则应借助Cluster::Telemetry::core_metrics/websocket_metrics打开更细粒度的事件遥测。两者配合使用drops 告诉你“有没有丢”事件遥测告诉你“在传什么、传多大”。按需启用警惕指标爆炸仅需整体吞吐 → 保持默认INFO需要区分事件类型/处理函数 → 追加VERBOSE需要诊断消息体积与脚本热点 → 追加DEBUG并根据实际负载调整message_size_bounds遇到带随机 ID 的 topic节点 ID、会话 ID 等→ 务必在topic_normalizations中补充归一规则防止标签基数失控不需要的类别可映射为空字符串以完全跳过记录。用 btest 测试验证配置行为仓库自带完整的遥测验证测试可直接作为“如何启用并读取指标”的参考testing/btest/cluster/telemetry/two-nodes.zeek双节点 ZeroMQ 集群在公共脚本中redef Cluster::Telemetry::core_metrics { Cluster::Telemetry::VERBOSE, };并在zeek_done()中用Telemetry::collect_metrics(zeek, cluster_core_*)与cluster_websocket_*前缀收集全部指标逐个打印前缀、名称、标签名、标签值与数值testing/btest/cluster/telemetry/ws.zeek同时启用core与websocket的VERBOSE通过 WebSocket 客户端发送 100 个 ping 事件并回包最后断言zeek_cluster_*指标数量并打印明细覆盖了入站/出站两个方向与 topic 标签维度。测试中的redef ... 用法与Telemetry::collect_metrics()收集方式是生产环境排查时“确认遥测已生效”的最直接手段。七、小结Cluster::Telemetry用四个redef选项把“集群事件观测”这件事收敛得非常克制默认零额外开销仅INFO计数器需要时可逐级放开到带标签计数VERBOSE乃至消息体积直方图DEBUGtopic_normalizations则从机制上防止随机 topic 拖垮指标基数。底层由 src/cluster/Telemetry.cc 的三类实现InfoTelemetry/VerboseTelemetry/DebugTelemetry挂接在Backend的序列化路径上与 Prometheus 指标体系无缝衔接。对于 Zeek 集群运维者这是一组“低门槛、高价值”的内置观测能力先盯住 drops 指标发现过载再按需打开事件遥测定位流量构成即可快速形成一套完整的事件链路可观测闭环。赞分享网络安全网络IDS【免费下载链接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.项目地址https://gitcode.com/gh_mirrors/ze/zeek点击查看免费下载相关推荐Authelia 遥测Telemetry配置指南启用 Prometheus 指标采集与监控Authelia 遥测Telemetry配置指南启用 Prometheus 指标采集与监控 本文基于 Authelia 官方配置文档系统讲解 telem后端认证鉴权单点登录身份认证应用安全Zeek Telemetry Framework 实战指南从指标类型到 Prometheus 采集Zeek Telemetry Framework 实战指南从指标类型到 Prometheus 采集 Telemetry 框架是 Zeek 内建的运行时度量体系网络安全网络IDSCoroot Cluster Agent 配置完全指南集群级遥测采集与数据库监控Coroot Cluster Agent 配置完全指南集群级遥测采集与数据库监控 Coroot 的可观测性体系由两类 Agent 组成部署在每个节点上的 c可观测性指标监控链路追踪APM上一篇如何将Pilot Shell用量数据关联Git提交成本归属分析实战下一篇Awesome Claude Skills实战指南构建企业级AI自动化工作流创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表