pg.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const EventEmitter = require("events");
  4. const core_1 = require("@opencensus/core");
  5. const shimmer = require("shimmer");
  6. class PGPlugin extends core_1.BasePlugin {
  7. constructor(moduleName) {
  8. super(moduleName);
  9. this.internalFileList = {
  10. '6 - 7': {
  11. 'client': 'lib/client'
  12. }
  13. };
  14. }
  15. applyPatch() {
  16. this.logger.debug('Patched PG');
  17. if (this.internalFilesExports.client) {
  18. this.logger.debug('patching pq.client.prototype.query');
  19. shimmer.wrap(this.internalFilesExports.client.prototype, 'query', this.getPatchCreateQuery());
  20. }
  21. return this.moduleExports;
  22. }
  23. applyUnpatch() {
  24. shimmer.unwrap(this.internalFilesExports.client.prototype, 'query');
  25. }
  26. getPatchCreateQuery() {
  27. const plugin = this;
  28. return (original) => {
  29. return function (...args) {
  30. const span = plugin.tracer.startChildSpan('pg-query', core_1.SpanKind.CLIENT);
  31. if (span === null)
  32. return original.apply(this, arguments);
  33. let pgQuery;
  34. if (arguments.length >= 1) {
  35. const args = Array.prototype.slice.call(arguments, 0);
  36. plugin.populateLabelsFromInputs(span, args);
  37. const callback = args[args.length - 1];
  38. if (typeof callback === 'function') {
  39. args[args.length - 1] = plugin.patchCallback(callback, span);
  40. }
  41. else if (typeof args[0] === 'object') {
  42. plugin.patchSubmittable(args[0], span);
  43. }
  44. pgQuery = original.apply(this, args);
  45. }
  46. else {
  47. pgQuery = original.apply(this, arguments);
  48. }
  49. if (pgQuery) {
  50. if (pgQuery instanceof EventEmitter) {
  51. plugin.tracer.wrapEmitter(pgQuery);
  52. }
  53. else if (typeof pgQuery.then === 'function') {
  54. plugin.patchPromise(pgQuery, span);
  55. }
  56. }
  57. return pgQuery;
  58. };
  59. };
  60. }
  61. patchCallback(callback, span) {
  62. const plugin = this;
  63. return plugin.tracer.wrap((err, res) => {
  64. plugin.populateLabelsFromOutputs(span, err, res);
  65. span.end();
  66. callback(err, res);
  67. });
  68. }
  69. patchSubmittable(pgQuery, span) {
  70. const plugin = this;
  71. let spanEnded = false;
  72. if (pgQuery.handleError) {
  73. shimmer.wrap(pgQuery, 'handleError', (origCallback) => {
  74. return this.tracer.wrap(function (...args) {
  75. if (!spanEnded) {
  76. const err = args[0];
  77. plugin.populateLabelsFromOutputs(span, err);
  78. span.end();
  79. spanEnded = true;
  80. }
  81. if (origCallback) {
  82. origCallback.apply(this, args);
  83. }
  84. });
  85. });
  86. }
  87. if (pgQuery.handleReadyForQuery) {
  88. shimmer.wrap(pgQuery, 'handleReadyForQuery', (origCallback) => {
  89. return this.tracer.wrap(function (...args) {
  90. if (!spanEnded) {
  91. plugin.populateLabelsFromOutputs(span, null, this._result);
  92. span.end();
  93. spanEnded = true;
  94. }
  95. if (origCallback) {
  96. origCallback.apply(this, args);
  97. }
  98. });
  99. });
  100. }
  101. return pgQuery;
  102. }
  103. patchPromise(promise, span) {
  104. return promise = promise.then((res) => {
  105. plugin.populateLabelsFromOutputs(span, null, res);
  106. span.end();
  107. return res;
  108. }, (err) => {
  109. plugin.populateLabelsFromOutputs(span, err);
  110. span.end();
  111. throw err;
  112. });
  113. }
  114. populateLabelsFromInputs(span, args) {
  115. const queryObj = args[0];
  116. if (typeof queryObj === 'object') {
  117. if (queryObj.text) {
  118. span.addAttribute('query', queryObj.text);
  119. }
  120. if (plugin.options.detailedCommands === true && queryObj.values) {
  121. span.addAttribute('values', queryObj.values);
  122. }
  123. }
  124. else if (typeof queryObj === 'string') {
  125. span.addAttribute('query', queryObj);
  126. if (plugin.options.detailedCommands === true && args.length >= 2 && typeof args[1] !== 'function') {
  127. span.addAttribute('values', args[1]);
  128. }
  129. }
  130. }
  131. populateLabelsFromOutputs(span, err, res) {
  132. if (plugin.options.detailedCommands !== true)
  133. return;
  134. if (err) {
  135. span.addAttribute('error', err.toString());
  136. }
  137. if (res) {
  138. span.addAttribute('row_count', res.rowCount);
  139. span.addAttribute('oid', res.oid);
  140. span.addAttribute('rows', res.rows);
  141. span.addAttribute('fields', res.fields);
  142. }
  143. }
  144. }
  145. exports.PGPlugin = PGPlugin;
  146. const plugin = new PGPlugin('pg');
  147. exports.plugin = plugin;
  148. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2Vuc3VzL3BsdWdpbnMvcGcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFlQSx1Q0FBc0M7QUFFdEMsMkNBQTZEO0FBQzdELG1DQUFrQztBQVVsQyxNQUFhLFFBQVMsU0FBUSxpQkFBVTtJQVV0QyxZQUFhLFVBQWtCO1FBQzdCLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQVJBLHFCQUFnQixHQUFHO1lBQ3BDLE9BQU8sRUFBRTtnQkFDUCxRQUFRLEVBQUUsWUFBWTthQUN2QjtTQUNGLENBQUE7SUFLRCxDQUFDO0lBS1MsVUFBVTtRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUUvQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUU7WUFDcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQTtZQUN2RCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFBO1NBQzlGO1FBRUQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFBO0lBQzNCLENBQUM7SUFHRCxZQUFZO1FBQ1YsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUNyRSxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQTtRQUNuQixPQUFPLENBQUMsUUFBa0IsRUFBRSxFQUFFO1lBQzVCLE9BQU8sVUFBVSxHQUFHLElBQVc7Z0JBQzdCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxlQUFRLENB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