tracing.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const Debug = require("debug");
  4. const configuration_1 = require("../configuration");
  5. const path_1 = require("path");
  6. const httpMethodToIgnore = [
  7. 'options',
  8. 'head'
  9. ];
  10. const defaultTracingConfig = {
  11. enabled: false,
  12. outbound: false,
  13. samplingRate: 0,
  14. ignoreIncomingPaths: [],
  15. ignoreOutgoingUrls: [],
  16. detailedDatabasesCalls: false,
  17. createSpanWithNet: false
  18. };
  19. const enabledTracingConfig = {
  20. enabled: true,
  21. outbound: false,
  22. samplingRate: 0.5,
  23. ignoreIncomingPaths: [
  24. (url, request) => {
  25. const method = (request.method || 'GET').toLowerCase();
  26. return httpMethodToIgnore.indexOf(method) > -1;
  27. },
  28. /(.*).js/,
  29. /(.*).css/,
  30. /(.*).png/,
  31. /(.*).ico/,
  32. /(.*).svg/,
  33. /webpack/
  34. ],
  35. ignoreOutgoingUrls: [],
  36. detailedDatabasesCalls: false,
  37. createSpanWithNet: false
  38. };
  39. class TracingFeature {
  40. constructor() {
  41. this.logger = Debug('axm:tracing');
  42. }
  43. init(config) {
  44. this.logger('init tracing');
  45. if (config.tracing === undefined) {
  46. config.tracing = defaultTracingConfig;
  47. }
  48. else if (config.tracing === true) {
  49. config.tracing = enabledTracingConfig;
  50. }
  51. else if (config.tracing === false) {
  52. config.tracing = defaultTracingConfig;
  53. }
  54. if (config.tracing.enabled === false) {
  55. return this.logger('tracing disabled');
  56. }
  57. this.options = Object.assign(enabledTracingConfig, config.tracing);
  58. if (typeof config.apmOptions === 'object' && typeof config.apmOptions.appName === 'string') {
  59. this.options.serviceName = config.apmOptions.appName;
  60. }
  61. else if (typeof process.env.name === 'string') {
  62. this.options.serviceName = process.env.name;
  63. }
  64. if (config.tracing.ignoreOutgoingUrls === undefined) {
  65. config.tracing.ignoreOutgoingUrls = enabledTracingConfig.ignoreOutgoingUrls;
  66. }
  67. if (config.tracing.ignoreIncomingPaths === undefined) {
  68. config.tracing.ignoreIncomingPaths = enabledTracingConfig.ignoreIncomingPaths;
  69. }
  70. const B3Format = require('@opencensus/propagation-b3').B3Format;
  71. const CustomCensusExporter = require('../census/exporter').CustomCensusExporter;
  72. const Tracing = require('../census/tracer').Tracing;
  73. this.exporter = new CustomCensusExporter(this.options);
  74. if (this.tracer && this.tracer.active) {
  75. throw new Error(`Tracing was already enabled`);
  76. }
  77. this.logger('start census tracer');
  78. const tracer = Tracing.instance;
  79. const plugins = {
  80. 'http': {
  81. module: path_1.resolve(__dirname, '../census/plugins/http'),
  82. config: config.tracing
  83. },
  84. 'http2': path_1.resolve(__dirname, '../census/plugins/http2'),
  85. 'https': path_1.resolve(__dirname, '../census/plugins/https'),
  86. 'mongodb-core': {
  87. module: path_1.resolve(__dirname, '../census/plugins/mongodb'),
  88. config: { detailedCommands: config.tracing.detailedDatabasesCalls }
  89. },
  90. 'mysql': {
  91. module: path_1.resolve(__dirname, '../census/plugins/mysql'),
  92. config: { detailedCommands: config.tracing.detailedDatabasesCalls }
  93. },
  94. 'mysql2': {
  95. module: path_1.resolve(__dirname, '../census/plugins/mysql2'),
  96. config: { detailedCommands: config.tracing.detailedDatabasesCalls }
  97. },
  98. 'redis': {
  99. module: path_1.resolve(__dirname, '../census/plugins/redis'),
  100. config: { detailedCommands: config.tracing.detailedDatabasesCalls }
  101. },
  102. 'ioredis': {
  103. module: path_1.resolve(__dirname, '../census/plugins/ioredis'),
  104. config: { detailedCommands: config.tracing.detailedDatabasesCalls }
  105. },
  106. 'pg': {
  107. module: path_1.resolve(__dirname, '../census/plugins/pg'),
  108. config: { detailedCommands: config.tracing.detailedDatabasesCalls }
  109. },
  110. 'vue-server-renderer': {
  111. module: path_1.resolve(__dirname, '../census/plugins/vue'),
  112. config: {}
  113. }
  114. };
  115. if (this.options.createSpanWithNet === true) {
  116. plugins['net'] = {
  117. module: path_1.resolve(__dirname, '../census/plugins/net')
  118. };
  119. }
  120. this.tracer = tracer.start({
  121. exporter: this.exporter,
  122. plugins,
  123. propagation: new B3Format(),
  124. samplingRate: this.options.samplingRate || 0.5,
  125. logLevel: this.isDebugEnabled() ? 4 : 1
  126. });
  127. configuration_1.default.configureModule({
  128. census_tracing: true
  129. });
  130. }
  131. isDebugEnabled() {
  132. return typeof process.env.DEBUG === 'string' &&
  133. (process.env.DEBUG.indexOf('axm:*') >= 0 || process.env.DEBUG.indexOf('axm:tracing') >= 0);
  134. }
  135. getTracer() {
  136. return this.tracer ? this.tracer.tracer : undefined;
  137. }
  138. destroy() {
  139. if (!this.tracer)
  140. return;
  141. this.logger('stop census tracer');
  142. configuration_1.default.configureModule({
  143. census_tracing: false
  144. });
  145. this.tracer.stop();
  146. }
  147. }
  148. exports.TracingFeature = TracingFeature;
  149. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mZWF0dXJlcy90cmFjaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsK0JBQThCO0FBQzlCLG9EQUE0QztBQUU1QywrQkFBOEI7QUE0QzlCLE1BQU0sa0JBQWtCLEdBQUc7SUFDekIsU0FBUztJQUNULE1BQU07Q0FDUCxDQUFBO0FBQ0QsTUFBTSxvQkFBb0IsR0FBa0I7SUFDMUMsT0FBTyxFQUFFLEtBQUs7SUFDZCxRQUFRLEVBQUUsS0FBSztJQUNmLFlBQVksRUFBRSxDQUFDO0lBQ2YsbUJBQW1CLEVBQUUsRUFBRTtJQUN2QixrQkFBa0IsRUFBRSxFQUFFO0lBQ3RCLHNCQUFzQixFQUFFLEtBQUs7SUFDN0IsaUJBQWlCLEVBQUUsS0FBSztDQUN6QixDQUFBO0FBRUQsTUFBTSxvQkFBb0IsR0FBa0I7SUFDMUMsT0FBTyxFQUFFLElBQUk7SUFDYixRQUFRLEVBQUUsS0FBSztJQUNmLFlBQVksRUFBRSxHQUFHO0lBQ2pCLG1CQUFtQixFQUFFO1FBQ25CLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ2YsTUFBTSxNQUFNLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1lBQ3RELE9BQU8sa0JBQWtCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1FBQ2hELENBQUM7UUFDRCxTQUFTO1FBQ1QsVUFBVTtRQUNWLFVBQVU7UUFDVixVQUFVO1FBQ1YsVUFBVTtRQUNWLFNBQVM7S0FDVjtJQUNELGtCQUFrQixFQUFFLEVBQUU7SUFDdEIsc0JBQXNCLEVBQUUsS0FBSztJQUM3QixpQkFBaUIsRUFBRSxLQUFLO0NBQ3pCLENBQUE7QUFFRCxNQUFhLGNBQWM7SUFBM0I7UUFJVSxXQUFNLEdBQWEsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBOEdqRCxD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