Artillery 压测指标上报 Splunk Observability Cloud 实战指南:publish-metrics 插件 Splunk 配置与 Ingest API 原理解析
性能测试接口测试CLI【免费下载链接】artilleryThe complete load testing platform. Everything you need for production-grade load tests. Serverless distributed. Load test with Playwright. Load test HTTP APIs, GraphQL, WebSocket, and more. Use any Node.js module.项目地址https://gitcode.com/gh_mirrors/ar/artillery点击查看免费下载本篇指南围绕 Artillery 官方publish-metrics插件的 Splunk 集成展开完整讲解如何通过 Splunk Observability Cloud 的 Ingest API 将压测过程中的指标Metrics与测试起止事件Events实时上报覆盖type: splunk的全部配置项、默认值、过滤机制、事件维度与属性并结合仓库内源码lib/splunk/index.js剖析数据格式化与发送的底层实现。读完本文你将能够在自己的 Artillery 压测脚本中一键接入 Splunk 可观测性平台实现指标可视化与测试事件追踪。Splunk 集成概述Artillery 的publish-metrics插件负责把压测过程中产生的统计指标和事件发送到外部监控与可观测性系统Splunk 是官方支持的接收端之一详见插件总览 README.md。该插件内置于 Artillery无需单独安装只需在脚本的config.plugins中声明即可启用。Splunk 上报走的是Ingest API数据摄取接口插件会向如下两个端点发送数据指标端点https://ingest.realm.signalfx.com/v2/datapoint事件端点https://ingest.realm.signalfx.com/v2/event从源码lib/splunk/index.js可以看到端点地址由realm动态拼接而成默认realm为us0。核心行为与计费提示默认全量上报插件默认会将 Artillery 产生的所有指标都发送到 Splunk每个 Artillery 指标都会在 Splunk 中创建一个自定义指标custom metric而自定义指标在 Splunk 中是按量计费的。因此在生产环境长期跑压测前建议认真评估指标量或通过excluded/includeOnly对上报指标做裁剪下文详述。事件需显式配置指标默认发送而测试起止事件Event默认不发送需要在配置中声明并配置event字段才会生效README 原文明确指出 To send events set and configureeventsetting。配置项详解启用 Splunk 上报需要在脚本的config.plugins.publish-metrics下添加一个type: splunk的条目。完整的配置项如下表所示与 README 原文一一对应并补充了源码中确认的默认值配置项说明默认值type设为splunk以启用 Splunk 指标/事件上报无必填accessToken你所在组织Org的INGEST类型访问令牌在 Splunk Observability Cloud 用户界面中获取无必填缺失时插件直接抛错realm覆盖默认的 Splunk 端点区域。realm 是一个自包含的部署区域托管若干组织可在用户界面个人资料页找到自己的 realm 名称us0prefix为 Artillery 创建的指标名添加前缀artillery.dimensions一组name:value字符串作为测试期间所有指标的维度Dimension。维度是以键值对形式随指标一起发送的元数据可提供额外信息如发送指标的主机名等空excluded不希望发送到 Splunk 的指标名列表空列表即全量发送includeOnly仅发送到 Splunk 的指标白名单列表之外的指标一律不发送空列表即全量发送event配置后在测试开始/结束时向 Splunk 发送事件未配置则不发event.eventType事件名称不能包含空格Artillery_io_Testevent.send设为false可关闭事件发送。默认只要配置了事件就会发送该开关便于通过环境变量等途径动态启停事件trueevent.dimensions事件维度的name:value列表。默认会附加target脚本 config 中的 target、timestamp测试起止时间戳和phaseTest-Started/Test-Finished三个维度脚本中额外配置的维度会追加在这些默认维度之后仅默认三个维度event.properties事件的属性Propertiesname:value列表与维度dimensions用途不同可用于附加更灵活的上下文信息空关于维度与属性的区别以及维度命名的要求可参考 Splunk Observability 官方文档中关于 dimensions / custom properties / tags / attributes 的说明README 原文已给出对应链接指引。缺失 accessToken 时的行为accessToken是唯一必填项。源码在构造SplunkReporter时首先检查if (!config.accessToken) { throw new Error( Splunk reporter: accessToken must be provided. More info in the docs ); }见 lib/splunk/index.js也就是说配置了type: splunk但未提供令牌插件会直接抛错中断运行因此务必把令牌注入到脚本中。完整配置示例以下示例来自 Splunk 官方 READMElib/splunk/README.md可直接放进 Artillery 脚本的config段config: plugins: publish-metrics: - type: splunk realm: eu0 # SP_ACCESS_TOKEN 是存放 API Key 的环境变量 accessToken: {{ $processEnvironment.SP_ACCESS_TOKEN }} prefix: artillery.publish_metrics_plugin. dimensions: - host:server_1 - host_id:1.2.3.4 event: eventType: Artillery_load_test dimensions: - environment:production - testId:myTest123 properties: - use:QA仓库中的真实测试配置test/config-splunk.yaml还演示了如何使用$processEnvironment引用环境变量来注入令牌和维度值例如config: plugins: publish-metrics: - type: splunk realm: eu0 accessToken: {{ $processEnvironment.SP_ACCESS_TOKEN }} prefix: artillery.publish_metrics_plugin. dimensions: - testId:{{ $processEnvironment.TEST_ID }} - reporterType:splunk-metric-ingest-api event: eventType: Splunk_reporter_test dimensions: - testId:{{ $processEnvironment.TEST_ID }} - reporterType:splunk-event-ingest-api properties: - testId:{{ $processEnvironment.TEST_ID }} - reporterType:splunk-event-ingest-api这种做法可以把密钥与动态维度如 CI 流水线的TEST_ID从脚本中剥离保持配置模板化、可复用。指标与事件的上报机制在插件主入口index.js中当遍历到config.type splunk时会加载./lib/splunk并调用createSplunkReporter(config, events, script)创建上报器同时挂载到插件的事件总线上。结合 lib/splunk/index.js 的实现可以梳理出如下完整链路1. 指标上报stats 事件驱动Artillery 在每个统计周期结束时触发stats事件SplunkReporter监听该事件源码第 42-67 行将统计数据拆分为三类并分别格式化rates速率类如http.response_rate、vusers.completed等被格式化为 gauge 数据点指标名为prefix namesummaries汇总类如http.response_time的min/max/median/p95等聚合值被格式化为 gauge且指标名会带上聚合后缀即prefix name . aggregation源码第 131-151 行counters计数类如http.codes.200、vusers.created等被格式化为 count 数据点指标名为prefix name。最终 payload 结构为const payload { gauge: rates.concat(summaries), count: counters };通过got.post()携带X-SF-Token请求头发送到指标端点源码第 168-198 行即https://ingest.realm.signalfx.com/v2/datapoint。2. 事件上报phaseStarted 驱动 cleanup 收尾当配置了event且send未被设为false时源码第 69-87 行监听phaseStarted事件在首个阶段开始时发送一次Test-Started事件用startedEventSent标志保证只发一次事件 payload 中自动带上target、timestamp、phase: Test-Started等默认维度外加脚本配置的维度与属性在插件cleanup()阶段源码第 223-234 行如果测试开始事件已发送过则再次发送Test-Finished事件phase维度变为Test-Finishedtimestamp更新为当前时间。事件 payload 的初始结构源码第 24-35 行为数组形式Ingest API 的事件端点要求请求体是对象数组this.eventOpts [ { eventType: config.event.eventType || Artillery_io_Test, dimensions: { target: script.config.target, ...this.parseDimensions(config.event.dimensions) }, properties: this.parseDimensions(config.event.properties) } ];3. 维度解析parseDimensions无论是指标维度还是事件维度/属性都会经过parseDimensions处理源码第 153-166 行把[host:server_1, host_id:1.2.3.4]形式的字符串列表按第一个:切分为键值对对象{ host: server_1, host_id: 1.2.3.4 }。注意实现细节切分时用[name, ...value] item.split(:)再把剩余部分用:重新拼接因此值本身包含冒号如host:1.2.3.4:8080也能被正确保留。4. 指标过滤shouldSendMetricexcluded与includeOnly的过滤逻辑集中在shouldSendMetric源码第 201-211 行shouldSendMetric(metricName, excluded, includeOnly) { if (excluded.includes(metricName)) { return; // 命中排除列表 → 不发送 } if (includeOnly.length 0 !includeOnly.includes(metricName)) { return; // 配置了白名单且不在其中 → 不发送 } return true; // 其余情况 → 发送 }三个格式化函数counters / rates / summaries在构造数据点前都会先调用该方法做过滤且includeOnly优先级更高只要配置了非空白名单就只有白名单内的指标会被发送。excluded与includeOnly互斥使用即可实现对自定义指标数量的精细控制进而控制 Splunk 自定义指标的计费成本。5. 发送与清理每次请求都会递增pendingRequests计数cleanup()时通过waitingForRequest()每 500ms 轮询一次调用sleep(500)见 lib/util.js确保所有指标/事件请求在测试收尾前完成落盘源码第 213-221 行插件入口的Plugin.prototype.cleanupindex.js会以串行方式async.eachSeries逐个执行所有 reporter 的 cleanup保证多上报端共存时有序收尾。调试排错上报链路涉及网络请求与认证排查问题时建议开启调试日志。插件使用debug模块命名空间为plugin:publish-metrics:splunk运行压测时设置环境变量即可打印详细日志DEBUGplugin:publish-metrics:splunk artillery run my-script.yaml开启后可以看到如下类型的输出对应源码第 2、42-47、184-195 行的debug调用收到stats事件的时间点正在向 Splunk 发送 metrics / events 的提示Splunk API 响应状态码与状态消息200为成功发送失败时的错误详情There has been an error: ...cleanup 阶段等待未完成请求的轮询日志。据此可以快速区分问题出在配置如令牌错误、realm 错误、网络端点不可达还是数据格式payload 不符合 Ingest API 要求。小结通过publish-metrics插件Artillery 用户可以零代码改动地把压测指标实时投递到 Splunk Observability Cloud指标默认全量发送、测试起止事件按需开启prefix、dimensions、excluded/includeOnly、事件维度与属性等配置项赋予了从指标命名、上下文标记到成本控制的全方位灵活性。源码实现lib/splunk/index.js则清晰展示了从stats/phaseStarted事件到 Ingest API 数据点/事件 payload 的完整转换链路配合DEBUGplugin:publish-metrics:splunk可对上报过程进行细粒度排错。将本指南的配置示例与 test/config-splunk.yaml 结合使用即可快速搭建起 Artillery 与 Splunk 的指标观测闭环。赞分享性能测试接口测试CLI【免费下载链接】artilleryThe complete load testing platform. Everything you need for production-grade load tests. Serverless distributed. Load test with Playwright. Load test HTTP APIs, GraphQL, WebSocket, and more. Use any Node.js module.项目地址https://gitcode.com/gh_mirrors/ar/artillery点击查看免费下载相关推荐go-ethereum 指标上报 InfluxDB 实战go-metrics-influxdb Reporter 原理与配置go ethereum 指标上报 InfluxDB 实战go metrics influxdb Reporter 原理与配置 导读 go ethereum 在区块链后端Pinpoint监控指标导出Splunk Metrics API程序化集成Pinpoint监控指标导出Splunk Metrics API程序化集成 在分布式系统运维中监控数据的集中分析是保障服务稳定性的关键环节。Pinpoint后端可观测性APM链路追踪微服务Apache APISIX 集成 Splunk HEC 日志采集splunk-hec-logging 插件完整配置指南Apache APISIX 集成 Splunk HEC 日志采集splunk hec logging 插件完整配置指南 导读 splunk hec loggi后端微服务云原生上一篇LedisDB为什么这个Go语言高性能NoSQL数据库正在颠覆Redis传统下一篇opcodeGUI 里管理 CLAUDE.md 的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考