ARTICLE DETAIL

资讯详情

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

Telegraf varnish 输入插件实战:从配置、权限到 V1/V2 双解析模式的源码解析

Telegraf varnish 输入插件实战:从配置、权限到 V1/V2 双解析模式的源码解析 Telegraf varnish 输入插件实战从配置、权限到 V1/V2 双解析模式的源码解析【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf本文围绕 Telegraf 的 varnish 输入插件 展开覆盖该插件的完整配置项、三种权限授予方案用户组、ACL、sudo、Metric Version 1 与 2 两种解析模式的工作原理并结合 varnish.go 源码与 varnish_test.go 测试用例说明指标如何从varnishstat/varnishadm的命令输出映射为 Telegraf metric。读完后你可以为本地 Varnish HTTP Cache 实例完成一套可落地的采集配置并理解metric_version2模式下非活动 VCL 指标被自动过滤的底层机制。插件定位与运行前提varnish 插件通过调用本地命令行工具varnishstat从本地 Varnish HTTP Cache 实例中采集统计信息。从 varnish.go 源码可以看到插件的默认行为默认varnishstat二进制路径为/usr/bin/varnishstatdefaultStatBinary默认varnishadm二进制路径为/usr/bin/varnishadmdefaultAdmBinary默认命令超时为 1 秒defaultTimeout默认仅采集 3 个指标MAIN.cache_hit、MAIN.cache_miss、MAIN.uptimedefaultStats默认测量名measurement固定为varnishmeasurementNamespace。有两个硬性前提源码的构建标签也印证了这一点系统上必须安装varnishstat可执行文件且运行 Telegraf 的用户有权限执行它metric_version2还额外依赖varnishadm。metric_version2要求 Varnish 6.0.2 及以上版本因为该模式依赖varnishstat -j的 JSON 输出与varnishadm vcl.list -j。该插件不支持 Windows主实现文件 varnish.go 带有//go:build !windows标签而 varnish_windows.go 只是一个空壳——Init()会打印current platform is not supported警告Gather()直接返回 nil不产生任何指标。完整配置说明以下配置取自插件的 sample.conf每个配置项均在 varnish.go 的Varnish结构体中有对应字段# A plugin to collect stats from Varnish HTTP Cache # This plugin ONLY supports non-Windows [[inputs.varnish]] ## If running as a restricted user you can prepend sudo for additional access: #use_sudo false ## The default location of the varnishstat binary can be overridden with: binary /usr/bin/varnishstat ## Additional custom arguments for the varnishstat command # binary_args [-f, MAIN.*] ## The default location of the varnishadm binary can be overridden with: adm_binary /usr/bin/varnishadm ## Custom arguments for the varnishadm command # adm_binary_args [] ## Metric version defaults to metric_version1, use metric_version2 for removal of nonactive vcls ## Varnish 6.0.2 and newer is required for metric_version2. metric_version 1 ## Additional regexps to override builtin conversion of varnish metrics into telegraf metrics. ## Regexp group _vcl is used for extracting the VCL name. Metrics that contain nonactive VCLs are skipped. ## Regexp group _field overrides the field name. Other named regexp groups are used as tags. # regexps [^XCNT\.(?P_vcl[\w\-]*)(\.)*(?Pgroup[\w\-.]*)\.(?P_field[\w\-.]*)\.val] ## By default, telegraf gather stats for 3 metric points. ## Setting stats will override the defaults shown below. ## Glob matching can be used, ie, stats [MAIN.*] ## stats may also be set to [*], which will collect all stats stats [MAIN.cache_hit, MAIN.cache_miss, MAIN.uptime] ## Optional name for the varnish instance (or working directory) to query ## Usually append after -n in varnish cli # instance_name instanceName ## Timeout for varnishstat command # timeout 1s参数逐项说明配置项类型默认值说明use_sudoboolfalse是否以sudo -n前缀方式执行命令用于受限用户提权见下文 Sudo 方案binarystring/usr/bin/varnishstatvarnishstat可执行文件路径binary_args[]string空自定义varnishstat参数设置后会完全覆盖插件自动生成的参数adm_binarystring/usr/bin/varnishadmvarnishadm可执行文件路径仅metric_version2使用adm_binary_args[]string空自定义varnishadm参数同样会覆盖默认参数metric_versionint1解析模式版本2需要 Varnish 6.0.2可过滤非活动 VCL 指标regexps[]string空自定义正则覆盖内置的“指标名 → 字段/标签”转换规则stats[]string[MAIN.cache_hit, MAIN.cache_miss, MAIN.uptime]指标过滤列表支持 glob 匹配[*]采集全部instance_namestring空Varnish 实例工作目录名等价于 varnish CLI 的-n参数timeoutduration1svarnishstat/varnishadm命令执行超时两个容易踩坑的点从源码中可以确认binary_args是“覆盖”而非“追加”。prepareCmdArgs 中先按metric_version组装基础参数V1 为-1V2 为-j再拼接-n instance_name最后若配置了binary_args/adm_binary_args则整组替换。所以自定义参数时必须把 JSON 输出参数-j或-1和实例名-n也一起带上否则解析会失败。stats支持遗留写法。Gather中有一段兼容逻辑如果stats[0] all会被改写为*varnish.go#L129-L132旧配置的stats [all]依然可用。权限配置三种方案varnishstat需要访问 Varnish 的共享内存统计文件通常是/var/lib/varnish/hostname/_.vsm默认属主为 root 且权限收紧因此运行 Telegraf 的用户往往没有读取权限。README 给出了三种方案按推荐程度排列。方案一加入 varnish 用户组推荐$ groups telegraf telegraf : telegraf $ usermod -a -G varnish telegraf $ groups telegraf telegraf : telegraf varnish将telegraf用户追加到varnish组即可通过组权限访问统计文件改动最小、最易审计。方案二扩展文件系统 ACL$ getfacl /var/lib/varnish/hostname/_.vsm # file: var/lib/varnish/hostname/_.vsm # owner: root # group: root user::rw- group::r-- other::--- $ setfacl -m u:telegraf:r /var/lib/varnish/hostname/_.vsm $ getfacl /var/lib/varnish/hostname/_.vsm # file: var/lib/varnish/hostname/_.vsm # owner: root # group: root user::rw- user:telegraf:r-- group::r-- mask::r-- other::---用setfacl给telegraf用户单独授予只读权限无需改动用户组。注意_.vsm中的hostname需替换为实际主机名Varnish 会为每个实例目录生成对应的统计文件。方案三sudo 提权在 Telegraf 配置中开启[[inputs.varnish]] use_sudo true并编辑 sudoersvisudo添加Cmnd_Alias VARNISHSTAT /usr/bin/varnishstat telegraf ALL(ALL) NOPASSWD: VARNISHSTAT Defaults!VARNISHSTAT !logfile, !syslog, !pam_session从 varnishRunner 源码可以看到该选项的实际生效方式当UseSudo为 true 时插件会将命令改写为sudo -n cmd args...-n表示非交互模式无密码提示这与 sudoers 中的NOPASSWD相配合。若 sudo 配置不当采集将直接失败因此三种方案中该方案的安全边界要求最高建议优先使用前两种。Metric Version 1文本行解析metric_version1默认时插件执行varnishstat -1单次输出、文本格式然后在 processMetricsV1 中逐行解析按空白切分每行取前两列——指标全名如MAIN.uptime和数值用stats编译出的 glob 过滤器filter.Compile做匹配不匹配的跳过以第一个.为界拆分前缀MAIN、MGT、MEMPOOL、SMA、VBE、LCK作为section标签剩余部分作为字段名注意MEMPOOL.vbc.live这类多段名称会保留为vbc.live数值统一按uint64解析解析失败会通过acc.AddError上报而不是丢弃整次采集同一 section 的所有字段合并为一条varnishmeasurement标签为section前缀。stats为空时回退到默认 3 项[*]则采集全部指标。varnish_test.go 中的TestFieldConfig验证了这一点对一份包含 293 个字段的完整 varnishstat 输出stats [*]得到 293 个字段stats [MAIN.uptime]得到 1 个stats [MGT.*, VBE.*]得到 16 个stats留空则不产出任何指标因为默认列表与测试样本不重合的场景下即为 0。V1 模式的完整指标清单按 section 分组在 README 中列出涵盖MAIN会话sess_conn、sess_drop、sess_fail、客户端请求client_req_400/411/413/417、client_req、缓存cache_hit、cache_miss、cache_hitpass、后端连接backend_conn/fail/reuse/recycle/retry、fetch 各子类fetch_head/length/chunked/eof/bad/...、线程threads、threads_created/destroyed/failed、thread_queue_len、对象与 LRUn_object、n_lru_nuked、n_lru_moved、bans 全家族、vsm_*共享内存统计等MGT管理进程统计uptime、child_start/exit/stop/died/dump/panicMEMPOOL各内存池vbc、busyobj、req0/1、sess0/1的live/pool/sz_wanted/sz_needed/allocs/frees/recycle/timeout/toosmall/surplus/randry十个子指标SMA共享内存分配器s0、Transient的c_req/c_fail/c_bytes/c_freed/g_alloc/g_bytes/g_spaceVBE按后端如VBE.default(127.0.0.1,,8080)统计的vcls、happy、bereq_*、beresp_*、pipe_*LCK约 29 类锁sms、smp、sma、ban、lru等的creat/destroy/locks三个子指标。所有字段均为uint64, count类型。Metric Version 2JSON 解析与 VCL 过滤metric_version2是 Varnish 6.0.2 上的增强模式解决两个问题指标命名更精细counter/gauge 语义、位图字段、自动排除非活动 VCL 产生的指标。其工作流程在 Gather 中执行varnishstat -jprepareCmdArgs中 V2 的statsArgs为[-j]获得 JSON 输出执行varnishadm vcl.list -j获取当前活动 VCL 名称由 getActiveVCLJson 解析遍历 JSON 数组找到status active的条目并返回其name如boot-123。这里还有一个针对 Varnish 6.6.1 已知缺陷的 workaround——输出开头会多出200字样导致 JSON 非法代码用strings.TrimPrefix(output, 200)剥除对应 varnishadm-200.json 测试样本若varnishadm不可用activeVcl回退为boot解析计数器。processMetricsV2 解码 JSON兼容 Varnish 6.5 前后的 schema 变化旧版顶层有counters包装对象新版直接平铺getCountersJSON 做了分支处理按 flag 区分语义JSON 中每个计数器带flag字段ccounter与aaccumulate调用AddCounterggauge及其余情况调用AddGauge数值类型上flag b位图按uint64解析其余先尝试int64失败再尝试float64字符串值原样保留——TestJsonTypes 用 4 个构造样本float/string/int/uint 位图逐一验证了这些分支过滤非活动 VCL。每个指标名先经parseMetricV2提取出_vcl组若提取到的 VCL 名既不等于活动 VCL 也不为空该指标被跳过。这就是 README 中 “Metrics that are related to the nonactive VCL are excluded from monitoring” 的实现。V2 测试数据test_data/ 目录覆盖了 Varnish 4.4、6.2.1含 VCL reload 场景和 6.6 三个版本的真实 JSON 输出。TestVersions 断言给定活动 VCL 前缀reload_20210623_170621_31083时产出 374 条指标给定空前缀不过滤时产出 434 条差值即为被排除的非活动 VCL 指标同时断言任何字段名或标签中都不含reload_前缀防止旧 VCL 名称泄漏进指标名。内置正则与自定义 regexpsV2 模式下指标全名如VBE.boot.default.fail需要被拆解成字段与标签parseMetricV2 按“第一个匹配即生效”的策略遍历正则列表。默认正则varnish.go#L37-L56依次为动态 director 后端VBE.vcl.goto.serial.(ip).(server).(ttl:...)→ 提取backendIP、server完整地址两个标签静态后端VBE.vcl.backend.field→ 提取backend标签KVSTOREKVSTORE.id.vcl.field→ 提取id标签XCNT 自定义计数器XCNT.vcl.group.field.val→ 提取group标签字段名取_field组兜底规则取最后一段为字段名其余段并入字段名如MEMPOOL.req1.allocs→ 字段req1.allocs。正则的命名分组有约定_vcl组提取 VCL 名用于活动性过滤_field组覆盖字段名其余命名组非空时作为标签。用户可通过regexps配置项注入自定义正则Init 会把它们编译后置于内置正则之前从而优先匹配。TestV2ParseVarnishNames 提供了 12 个真实命名场景的拆解断言包括自定义正则同时提取serial、backend、server、ttl四组标签的用法是编写regexps配置的最佳参照。输出示例V1 模式输出每个 section 一条多字段 metricvarnish,hostrpercy-VirtualBox,sectionMAIN cache_hit0i,cache_miss0i,uptime8416i 1462765437090957980V2 模式输出VBE 指标额外带backend标签varnish,hostkozel.local,sectionMAIN n_vampireobject0i 1631121567000000000 varnish,backendserver_test1,hostkozel.local,sectionVBE fail_eacces0i 1631121567000000000 varnish,backenddefault,hostkozel.local,sectionVBE req0i 1631121567000000000 varnish,hostkozel.local,sectionMAIN client_req_4000i 1631121567000000000 varnish,hostkozel.local,sectionMAIN shm_cycles10i 1631121567000000000 varnish,backenddefault,hostkozel.local,sectionVBE pipe_hdrbytes0i 1631121567000000000用 merge 聚合器合并指标V2 模式下每个字段单独成一条 metricstats [*]时单周期可产生数百条测试数据中约为 300430 条。README 建议使用 aggregators.merge 将同 seriesmeasurement 标签集合 时间戳的 metric 合并为多字段 metric降低传输与存储开销[[aggregators.merge]] drop_original true配置后 MAIN section 的所有字段会合并为一条超长多字段 metric每个后端各一条 VBE metricvarnish,hostkozel.local,sectionMAIN backend_busy0i,backend_conn19i,backend_fail0i,backend_recycle8i,backend_req19i,...,cache_hit643999i,...,cache_miss1i,client_req644000i,...,uptime4416326i,... 1631121675000000000 varnish,backenddefault,hostkozel.local,sectionVBE bereq_bodybytes0i,bereq_hdrbytes0i,beresp_bodybytes0i,beresp_hdrbytes0i,busy0i,conn0i,fail0i,...,happy9223372036854775807i,...,req0i,unhealthy0i 1631121675000000000 varnish,backendserver1,hostkozel.local,sectionVBE ...,fail_econnrefused30609i,...,helddown3i,... 1631121675000000000drop_original true丢弃合并前的原始 metric只输出合并结果merge 聚合器还支持period默认30s与round_timestamp_to对齐时间戳容忍合并目标之间的微小时间差两个通用参数详见其 README。验证与测试要点排查采集问题时可以先手工执行插件将要运行的命令来定位失败层varnishstat -1 # V1 模式使用的输出 varnishstat -j # V2 模式使用的 JSON 输出 varnishadm vcl.list -j # V2 模式的活动 VCL 查询 varnishstat -n 实例名 # 指定 instance_name 时插件的单元测试 varnish_test.go 用fakeVarnishRunner注入固定的命令输出test_data/ 下还保存了多版本 varnishstat/varnishadm 的真实 JSON 样本覆盖解析、过滤、VCL 过滤等全部关键路径。对照这些测试用例的输入输出可以快速确认是自己环境中的命令失败权限/超时/参数还是配置层面的过滤stats、binary_args问题。小结varnish 插件以“shell out 输出解析”的方式把 Varnish 命令行统计接入 Telegraf 指标流水线V1 模式解析varnishstat -1文本行按 section 前缀聚合为 6 类多字段 metricV2 模式解析varnishstat -jJSON结合varnishadm vcl.list -j的活动 VCL 过滤旧 VCL 指标并依据计数器 flag 区分 counter/gauge 语义。落地时按“用户组 → ACL → sudo”的顺序选择权限方案用stats控制指标范围必要时用regexps定制字段/标签拆解再配合aggregators.merge压缩传输量即可得到一套稳定、可维护的 Varnish 监控采集链路。【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表