UNPKG

dd-trace

Version:

Datadog APM tracing client for JavaScript

69 lines (50 loc) 2.03 kB
'use strict' const shimmer = require('../../datadog-shimmer') const { addHook, channel, AsyncResource } = require('./helpers/instrument') const handleChannel = channel('apm:microgateway-core:request:handle') const routeChannel = channel('apm:microgateway-core:request:route') const errorChannel = channel('apm:microgateway-core:request:error') const name = 'microgateway-core' // TODO Remove " <=3.0.0" when "volos-util-apigee" module is fixed const versions = ['>=2.1 <=3.0.0'] const requestResources = new WeakMap() function wrapConfigProxyFactory (configProxyFactory) { return function () { const configProxy = configProxyFactory.apply(this, arguments) return function (req, res, next) { const requestResource = new AsyncResource('bound-anonymous-fn') requestResources.set(req, requestResource) handleChannel.publish({ req, res }) return configProxy.apply(this, arguments) } } } function wrapPluginsFactory (pluginsFactory) { return function (plugins) { const pluginsMiddleware = pluginsFactory.apply(this, arguments) return function pluginsMiddlewareWithTrace (req, res, next) { arguments[2] = wrapNext(req, res, next) return pluginsMiddleware.apply(this, arguments) } } } function wrapNext (req, res, next) { return shimmer.wrapFunction(next, next => function nextWithTrace (err) { const requestResource = requestResources.get(req) requestResource.runInAsyncScope(() => { if (err) { errorChannel.publish(err) } if (res.proxy && res.proxy.base_path) { routeChannel.publish({ req, res, route: res.proxy.base_path }) } }) return next.apply(this, arguments) }) } addHook({ name, versions, file: 'lib/config-proxy-middleware.js' }, configProxyFactory => { return shimmer.wrapFunction(configProxyFactory, wrapConfigProxyFactory) }) addHook({ name, versions, file: 'lib/plugins-middleware.js' }, pluginsFactory => { return shimmer.wrapFunction(pluginsFactory, wrapPluginsFactory) })