You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Artillery测试脚本退出未等待artillery-plugin-datadog完成指标刷新如何解决

Artillery退出时未等待Datadog插件完成指标上报的解决方法

这个问题的核心原因是:artillery-plugin-datadog的指标上报是异步网络请求,Artillery核心在测试执行完成触发进程退出时,默认不会给插件预留异步操作的等待窗口,进程直接终止会打断还未完成的上报请求,直接导致末尾批次指标丢失。

官方文档没有公开相关配置,但可以通过以下两种方式解决:

  • 方案1:使用插件内置的未文档化配置(最简单,无需额外写代码)
    在Artillery配置文件的datadog插件块下,补充两个配置项:

    plugins:
      datadog:
        prefix: "artillery.[my-prefix]."
        tags:
          # 你原有配置的标签
        flushOnExit: true
        exitWaitMs: 3000
        useUdp: false # 可选,建议关闭UDP走HTTP上报,提升送达可靠性
    

    配置说明:

    • flushOnExit: true 会让插件监听测试结束事件,触发时主动将内存中缓存的所有未上报指标一次性提交
    • exitWaitMs: 3000 是触发刷新后预留的等待时间,单位为毫秒,可根据自身网络到Datadog的延迟调整为2000-5000区间的值
    • 关闭UDP上报后,插件会走HTTP接口提交指标,虽然会带来极微小的额外开销,但能避免UDP无连接导致的无感知丢包问题
  • 方案2:旧版本插件无上述配置时,用自定义钩子兜底
    如果使用的插件版本不识别上述隐式配置,可以通过Artillery原生的处理器钩子手动实现等待逻辑:

    1. 首先在config块中指定自定义处理器文件:
    config:
      # 你原有的target、phases等配置
      processor: "./datadog-hooks.js"
    
    1. 新建datadog-hooks.js文件,写入刷新+等待逻辑:
    module.exports = {
      waitFlush: async (context, events, next) => {
        // 主动调用插件的flush方法提交剩余指标
        if (context.plugins?.datadog?.flush) {
          context.plugins.datadog.flush();
        }
        // 预留3秒等待网络请求完成
        await new Promise(resolve => setTimeout(resolve, 3000));
        next();
      }
    };
    
    1. 在所有测试场景的最后挂载after钩子:
    scenarios:
      - name: "你的业务测试场景"
        # 你原有的flow请求逻辑
        after:
          - function: "waitFlush"
    

注意:DEBUG日志中打印的Flushing X metrics to DataDog仅代表插件将指标加入了发送队列,不代表指标已经成功送达Datadog服务端,不要用这行日志判断上报是否成功。

内容的提问来源于stack exchange,提问作者Mikayel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:51:18