express.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const core_1 = require("@opencensus/core");
  4. const shimmer = require("shimmer");
  5. const semver = require("semver");
  6. exports.kMiddlewareStack = Symbol('express-middleware-stack');
  7. class ExpressPlugin extends core_1.BasePlugin {
  8. constructor(moduleName) {
  9. super(moduleName);
  10. this.kPatched = Symbol('express-layer-patched');
  11. }
  12. applyPatch() {
  13. this.logger.debug('Patched express');
  14. if (!semver.satisfies(this.version, '^4.0.0')) {
  15. this.logger.debug('express version %s not supported - aborting...', this.version);
  16. return this.moduleExports;
  17. }
  18. if (this.moduleExports) {
  19. const routerProto = semver.satisfies(this.version, '^5')
  20. ? (this.moduleExports.Router && this.moduleExports.Router.prototype)
  21. : this.moduleExports.Router;
  22. const plugin = this;
  23. this.logger.debug('patching express.Router.prototype.route');
  24. shimmer.wrap(routerProto, 'route', (original) => {
  25. return function route_trace(path) {
  26. const route = original.apply(this, arguments);
  27. const layer = this.stack[this.stack.length - 1];
  28. plugin.applyLayerPatch(layer, path);
  29. return route;
  30. };
  31. });
  32. this.logger.debug('patching express.Router.prototype.use');
  33. shimmer.wrap(routerProto, 'use', (original) => {
  34. return function use(path) {
  35. const route = original.apply(this, arguments);
  36. const layer = this.stack[this.stack.length - 1];
  37. plugin.applyLayerPatch(layer, path);
  38. return route;
  39. };
  40. });
  41. this.logger.debug('patching express.Application.use');
  42. shimmer.wrap(this.moduleExports.application, 'use', (original) => {
  43. return function use(path) {
  44. const route = original.apply(this, arguments);
  45. const layer = this._router.stack[this._router.stack.length - 1];
  46. plugin.applyLayerPatch(layer, path);
  47. return route;
  48. };
  49. });
  50. }
  51. return this.moduleExports;
  52. }
  53. applyUnpatch() {
  54. if (!semver.satisfies(this.version, '^4.0.0')) {
  55. return this.moduleExports;
  56. }
  57. const routerProto = semver.satisfies(this.version, '^5')
  58. ? (this.moduleExports.Router && this.moduleExports.Router.prototype)
  59. : this.moduleExports.Router;
  60. shimmer.unwrap(routerProto, 'use');
  61. shimmer.unwrap(routerProto, 'route');
  62. shimmer.unwrap(this.moduleExports.application, 'use');
  63. }
  64. applyLayerPatch(layer, layerPath) {
  65. const plugin = this;
  66. if (layer[this.kPatched] === true)
  67. return;
  68. layer[this.kPatched] = true;
  69. plugin.logger.debug('patching express.Router.Layer.handle');
  70. shimmer.wrap(layer, 'handle', function (original) {
  71. if (original.length !== 4) {
  72. return function (req, res, next) {
  73. plugin.safePush(req, exports.kMiddlewareStack, layerPath);
  74. let spanName = `Middleware - ${layer.name}`;
  75. if (layer.route) {
  76. spanName = `Route - ${layer.route.path}`;
  77. }
  78. else if (layer.name === 'router') {
  79. spanName = `Router - ${layerPath}`;
  80. }
  81. const span = plugin.tracer.startChildSpan(spanName, core_1.SpanKind.CLIENT);
  82. if (span === null)
  83. return original.apply(this, arguments);
  84. arguments[2] = function () {
  85. if (!(req.route && arguments[0] instanceof Error)) {
  86. req[exports.kMiddlewareStack].pop();
  87. }
  88. return plugin.patchEnd(span, next)();
  89. };
  90. return original.apply(this, arguments);
  91. };
  92. }
  93. return function (_err, req, res, next) {
  94. return original.apply(this, arguments);
  95. };
  96. });
  97. }
  98. safePush(obj, prop, value) {
  99. if (!obj[prop])
  100. obj[prop] = [];
  101. obj[prop].push(value);
  102. }
  103. patchEnd(span, callback) {
  104. const plugin = this;
  105. const patchedEnd = function (err) {
  106. if (plugin.options.detailedCommands === true && err instanceof Error) {
  107. span.addAttribute('error', err.message);
  108. }
  109. if (span.ended === false) {
  110. span.end();
  111. }
  112. return callback.apply(this, arguments);
  113. };
  114. return this.tracer.wrap(patchedEnd);
  115. }
  116. }
  117. exports.ExpressPlugin = ExpressPlugin;
  118. const plugin = new ExpressPlugin('express');
  119. exports.plugin = plugin;
  120. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jZW5zdXMvcGx1Z2lucy9leHByZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLFlBQVksQ0FBQTs7QUFFWiwyQ0FBNkQ7QUFDN0QsbUNBQWtDO0FBQ2xDLGlDQUFnQztBQUduQixRQUFBLGdCQUFnQixHQUFHLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO0FBR2xFLE1BQWEsYUFBYyxTQUFRLGlCQUFVO0lBSzNDLFlBQWEsVUFBa0I7UUFDN0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBSlgsYUFBUSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO0lBS2xELENBQUM7SUFLUyxVQUFVO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFFcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsRUFBRTtZQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7WUFDakYsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFBO1NBQzFCO1FBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLE1BQU0sV0FBVyxHQUFtQixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDO2dCQUN0RSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3BFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQTtZQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUE7WUFFbkIsSUFBSSxDQUFDLE1BQU0sQ0FB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