Current File : //lib/node_modules/pm2/node_modules/@pm2/io/build/main/src/metrics/transaction.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const util = require("util");
const proxy_1 = require("../utils/proxy");
const httpWrapper_1 = require("../wrapper/httpWrapper");
const debug_1 = require("debug");
const debug = debug_1.default('axm:tracing');
const configuration_1 = require("../configuration");
const metricConfig_1 = require("../utils/metricConfig");
const serviceManager_1 = require("../serviceManager");
class Transaction {
    constructor(metricFeature) {
        this.defaultConf = {
            http: true
        };
        this.metricFeature = metricFeature;
        serviceManager_1.ServiceManager.set('wrapper', {});
    }
    init(config) {
        config = metricConfig_1.default.getConfig(config, this.defaultConf);
        if (config.http) {
            const opts = typeof config.http === 'object' ? config.http : {};
            this.http(opts);
        }
        if (config.tracing) {
            const opts = typeof config.tracing === 'object' ? config.tracing : {};
            this.tracing(opts);
        }
    }
    destroy() {
        debug('Transaction destroyed !');
    }
    tracing(opts) {
        if (Array.isArray(opts.ignore_routes) && opts.ignore_routes.length > 0) {
            opts.ignoreFilter = { url: opts.ignore_routes };
        }
        // we should never enable tracing agent two time
        if (require('vxx').get().isActive())
            return;
        this.tracer = require('vxx').start(opts);
        configuration_1.default.configureModule({
            tracing_enabled: true
        });
        // broadcast to pm2 aggregator
        this.tracer.getBus().on('transaction', (data) => {
            serviceManager_1.ServiceManager.get('transport').send('axm:trace', data);
        });
    }
    http(opts) {
        const Module = require('module');
        debug('Wrapping HTTP routes');
        if (Array.isArray(opts)) {
            const routes = JSON.parse(JSON.stringify(opts));
            opts = {
                http: true,
                http_latency: 200,
                http_code: 500,
                ignore_routes: routes
            };
        }
        opts = util['_extend']({
            http: true,
            http_latency: 200,
            http_code: 500,
            ignore_routes: []
        }, opts);
        const self = this;
        proxy_1.default.wrap(Module, '_load', (load) => {
            if (load.__axm_original) {
                debug('HTTP routes have already been wrapped before');
                configuration_1.default.configureModule({
                    latency: opts.http
                });
                if (opts.http === false) {
                    return function (file) {
                        return load.__axm_original.apply(this, arguments);
                    };
                }
                else {
                    return function (file) {
                        if (file === 'http' || file === 'https') {
                            // initialize transaction metrics only once
                            if (!serviceManager_1.ServiceManager.get('wrapper')[file]) {
                                opts.name = file;
                                serviceManager_1.ServiceManager.get('wrapper')[file] = new httpWrapper_1.default(self.metricFeature).init(opts, load.__axm_original.apply(this, arguments));
                            }
                            return serviceManager_1.ServiceManager.get('wrapper')[file];
                        }
                        else {
                            return load.__axm_original.apply(this, arguments);
                        }
                    };
                }
            }
            return function (file) {
                if (opts.http &&
                    (file === 'http' || file === 'https')) {
                    debug('http module being required');
                    configuration_1.default.configureModule({
                        latency: true
                    });
                    // initialize transaction metrics only once
                    if (!serviceManager_1.ServiceManager.get('wrapper')[file]) {
                        opts.name = file;
                        serviceManager_1.ServiceManager.get('wrapper')[file] = new httpWrapper_1.default(self.metricFeature).init(opts, load.apply(this, arguments));
                    }
                    return serviceManager_1.ServiceManager.get('wrapper')[file];
                }
                else {
                    return load.apply(this, arguments);
                }
            };
        });
    }
}
exports.default = Transaction;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbWV0cmljcy90cmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLDZCQUE0QjtBQUM1QiwwQ0FBa0M7QUFDbEMsd0RBQW1EO0FBQ25ELGlDQUF5QjtBQUN6QixNQUFNLEtBQUssR0FBRyxlQUFLLENBQUMsYUFBYSxDQUFDLENBQUE7QUFDbEMsb0RBQTRDO0FBRTVDLHdEQUFnRDtBQUNoRCxzREFBa0Q7QUFFbEQ7SUFTRSxZQUFhLGFBQTZCO1FBSmxDLGdCQUFXLEdBQUc7WUFDcEIsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFBO1FBR0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsK0JBQWMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQ25DLENBQUM7SUFFRCxJQUFJLENBQUUsTUFBTztRQUNYLE1BQU0sR0FBRyxzQkFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRXpELElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtZQUNmLE1BQU0sSUFBSSxHQUFHLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUMvRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ2hCO1FBRUQsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2xCLE1BQU0sSUFBSSxHQUFHLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtZQUNyRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ25CO0lBQ0gsQ0FB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