ioredis.js 7.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. class IORedisPlugin extends core_1.BasePlugin {
  7. constructor(moduleName) {
  8. super(moduleName);
  9. }
  10. applyPatch() {
  11. this.logger.debug('Patched redis');
  12. if (!semver.satisfies(this.version, '>=2.0.0 <5.0.0')) {
  13. this.logger.info('disabling ioredis plugin because version isnt supported');
  14. return this.moduleExports;
  15. }
  16. if (this.moduleExports) {
  17. this.logger.debug('patching ioredis.prototype.sendCommand');
  18. shimmer.wrap(this.moduleExports.prototype, 'sendCommand', this.getPatchSendCommand());
  19. }
  20. return this.moduleExports;
  21. }
  22. applyUnpatch() {
  23. if (!semver.satisfies(this.version, '>=2.0.0 <5.0.0'))
  24. return;
  25. shimmer.unwrap(this.moduleExports.prototype, 'sendCommand');
  26. }
  27. getPatchSendCommand() {
  28. const plugin = this;
  29. const addArguments = typeof this.options === 'object'
  30. && this.options.detailedCommands === true;
  31. return function internalSendCommandWrap(original) {
  32. return function internal_send_command_trace(command) {
  33. if (!plugin.tracer.currentRootSpan) {
  34. return original.apply(this, arguments);
  35. }
  36. const span = plugin.tracer.startChildSpan(`redis-${command.name}`, core_1.SpanKind.CLIENT);
  37. if (span === null)
  38. return original.apply(this, arguments);
  39. span.addAttribute('command', command.name);
  40. if (addArguments) {
  41. span.addAttribute('arguments', JSON.stringify(command.args));
  42. }
  43. if (typeof command.reject === 'function') {
  44. command.reject = plugin.tracer.wrap(command.reject);
  45. }
  46. if (typeof command.resolve === 'function') {
  47. command.resolve = plugin.tracer.wrap(command.resolve);
  48. }
  49. if (typeof command.callback === 'function') {
  50. command.callback = plugin.patchEnd(span, command.callback);
  51. }
  52. if (typeof command.promise === 'object') {
  53. const patchedEnd = function (err) {
  54. if (plugin.options.detailedCommands === true && err instanceof Error) {
  55. span.addAttribute('error', err.message);
  56. }
  57. if (span.ended === false) {
  58. span.end();
  59. }
  60. };
  61. if (typeof command.promise.finally === 'function') {
  62. command.promise.finally(patchedEnd);
  63. }
  64. else if (typeof command.promise.then === 'function') {
  65. command.promise.then(patchedEnd).catch(patchedEnd);
  66. }
  67. }
  68. return original.apply(this, arguments);
  69. };
  70. };
  71. }
  72. patchEnd(span, resultHandler) {
  73. const plugin = this;
  74. const patchedEnd = function (err) {
  75. if (plugin.options.detailedCommands === true && err instanceof Error) {
  76. span.addAttribute('error', err.message);
  77. }
  78. if (span.ended === false) {
  79. span.end();
  80. }
  81. return resultHandler.apply(this, arguments);
  82. };
  83. return this.tracer.wrap(patchedEnd);
  84. }
  85. }
  86. exports.IORedisPlugin = IORedisPlugin;
  87. const plugin = new IORedisPlugin('ioredis');
  88. exports.plugin = plugin;
  89. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9yZWRpcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jZW5zdXMvcGx1Z2lucy9pb3JlZGlzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLFlBQVksQ0FBQTs7QUFFWiwyQ0FBNkQ7QUFDN0QsbUNBQWtDO0FBQ2xDLGlDQUFnQztBQXFCaEMsTUFBYSxhQUFjLFNBQVEsaUJBQVU7SUFLM0MsWUFBYSxVQUFrQjtRQUM3QixLQUFLLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDbkIsQ0FBQztJQUtTLFVBQVU7UUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUE7UUFFbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHlEQUF5RCxDQUFDLENBQUE7WUFDM0UsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFBO1NBQzFCO1FBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUE7WUFDM0QsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQ3RELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUE7U0FDOUI7UUFFRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUE7SUFDM0IsQ0FBQztJQUdELFlBQVk7UUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDO1lBQUUsT0FBTTtRQUU3RCxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQzdELENBQUM7SUFHTyxtQkFB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