首页 > 解决方案 > 当 Axios 发布错误时,DataDog 检测会破坏代码片段

问题描述

为了隔离我在使用 dd-trace 检测 ExpressJS 应用程序后看到的问题,我将一些代码从实用程序文件中移到了主线代码中。

this.client是一个 Axios 实例。

无论 POST 是否成功,此代码段都有效:

return (async (fn) => {
  try {
    return Promise.resolve(await fn())
  } catch (e) {
    return Promise.reject(e)
  }

  return Promise.reject(new Error('Unusual Error'))
})(() => this.client.post(`foo/bars`, data, opts))

如果 Axios POST 抛出错误,则 DD 检测代码使用以下代码段抛出异常并挂起。(是的,这是一个单次迭代for循环。和我一起工作。)

return (async (fn) => {
  for (let i = 0; i < 1; i++) {
    try {
      return Promise.resolve(await fn())
    } catch (e) {
      return Promise.reject(e)
    }
  }

  return Promise.reject(new Error('Unusual Error'))
})(() => this.client.post(`foo/bars`, data, opts))

IRL 代码越来越棘手,但这些片段重现了问题。

顶部片段适用于成功和错误 POST 的检测,底部片段适用于成功,失败时出错。

不知道该怎么想。记录并没有多大帮助(并且会受到无法破坏的健康 ping 启动的阻碍)。

我想我错过了一些愚蠢的东西。如果需要,我可以提供更多信息。

我在某些情况下看到的异常:

TypeError: Cannot read property 'push' of undefined
  at DatadogSpan._createContext (/app/node_modules/dd-trace/packages/dd-trace/src/opentracing/span.js:76:32)
  at new DatadogSpan (/app/node_modules/dd-trace/packages/dd-trace/src/opentracing/span.js:30:30)
  at DatadogTracer._startSpanInternal (/app/node_modules/dd-trace/packages/dd-trace/src/opentracing/tracer.js:73:18)
  at DatadogTracer._startSpan (/app/node_modules/dd-trace/packages/dd-trace/src/opentracing/tracer.js:62:17)
  at DatadogTracer.Tracer.startSpan (/app/node_modules/opentracing/lib/tracer.js:61:21)
  at Object.wrapMiddleware (/app/node_modules/dd-trace/packages/dd-trace/src/plugins/util/web.js:104:25)
  at callHandle (/app/node_modules/dd-trace/packages/datadog-plugin-router/src/index.js:111:14)
  at wrapCallHandle (/app/node_modules/dd-trace/packages/datadog-plugin-router/src/index.js:41:14)
  at Layer.handle_error (/app/node_modules/express/lib/router/layer.js:71:5)
  at trim_prefix (/app/node_modules/express/lib/router/index.js:315:13)

标签: javascriptnode.jsexpressdatadog

解决方案


推荐阅读