@azure/monitor-opentelemetry
Version:
Azure Monitor OpenTelemetry (Node.js)
94 lines • 7.09 kB
JavaScript
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
Object.defineProperty(exports, "__esModule", { value: true });
exports.getInstance = getInstance;
const types_js_1 = require("../types.js");
const index_js_1 = require("../shared/logging/index.js");
let instance;
class StatsbeatConfiguration {
constructor() {
// Initial Statsbeat options
this.initializedByShim = false;
this.currentStatsbeatInstrumentations = {};
this.currentStatsbeatFeatures = {};
this.setStatsbeatFeatures = (statsbeatInstrumentations, statsbeatFeatures) => {
let statsbeatEnv;
try {
statsbeatEnv = JSON.parse(process.env[types_js_1.AZURE_MONITOR_STATSBEAT_FEATURES] || "{}");
}
catch (error) {
index_js_1.Logger.getInstance().error("Failed to parse statsbeat config environment variable.", error);
}
this.currentStatsbeatInstrumentations = Object.assign(Object.assign({}, this.currentStatsbeatInstrumentations), statsbeatInstrumentations);
this.currentStatsbeatFeatures = Object.assign(Object.assign({}, this.currentStatsbeatFeatures), statsbeatFeatures);
// Set the statsbeat options for community instrumentations based on the environment variable
statsbeatInstrumentations = Object.assign(Object.assign({}, this.currentStatsbeatInstrumentations), { amqplib: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.AMQPLIB ? true : false, cucumber: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.CUCUMBER ? true : false, dataloader: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.DATALOADER ? true : false, fs: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.FS ? true : false, lruMemoizer: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.LRU_MEMOIZER ? true : false, mongoose: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.MONGOOSE ? true : false, runtimeNode: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.RUNTIME_NODE ? true : false, socketIo: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.SOCKET_IO ? true : false, tedious: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.TEDIOUS ? true : false, undici: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.UNDICI ? true : false, cassandra: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.CASSANDRA ? true : false, connect: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.CONNECT ? true : false, dns: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.DNS ? true : false, express: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.EXPRESS ? true : false, fastify: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.FASTIFY ? true : false, genericPool: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.GENERIC_POOL ? true : false, graphql: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.GRAPHQL ? true : false, hapi: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.HAPI ? true : false, ioredis: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.IOREDIS ? true : false, knex: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.KNEX ? true : false, koa: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.KOA ? true : false, memcached: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.MEMCACHED ? true : false, mysql2: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.MYSQL2 ? true : false, nestjsCore: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.NESTJS_CORE ? true : false, net: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.NET ? true : false, pino: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.PINO ? true : false, restify: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.RESTIFY ? true : false, router: statsbeatEnv.instrumentation & types_js_1.StatsbeatInstrumentation.ROUTER ? true : false });
let instrumentationBitMap = types_js_1.StatsbeatInstrumentation.NONE;
const instrumentationArray = Object.entries(statsbeatInstrumentations).map((entry) => {
return { option: entry[0], value: entry[1] };
});
// Map the instrumentation options to a bit map
for (let i = 0; i < instrumentationArray.length; i++) {
if (instrumentationArray[i].value) {
instrumentationBitMap |= 2 ** i;
}
}
// Create feature bit map
let featureBitMap = types_js_1.StatsbeatFeature.NONE;
if (this.initializedByShim) {
this.currentStatsbeatFeatures.shim = true;
}
else {
this.currentStatsbeatFeatures.distro = true;
}
if (statsbeatFeatures.liveMetrics) {
this.currentStatsbeatFeatures.liveMetrics = true;
}
const featureArray = Object.entries(this.currentStatsbeatFeatures).map((entry) => {
return { option: entry[0], value: entry[1] };
});
// Map the feature options to a bit map
for (let i = 0; i < featureArray.length; i++) {
if (featureArray[i].value) {
featureBitMap |= types_js_1.StatsbeatFeaturesMap.get(featureArray[i].option);
}
}
// Merge old statsbeat options with new statsbeat options overriding any common properties
try {
const currentFeaturesBitMap = Number(process.env[types_js_1.AZURE_MONITOR_STATSBEAT_FEATURES]);
if (!isNaN(currentFeaturesBitMap)) {
featureBitMap |= currentFeaturesBitMap;
}
process.env[types_js_1.AZURE_MONITOR_STATSBEAT_FEATURES] = JSON.stringify({
instrumentation: instrumentationBitMap,
feature: featureBitMap,
});
}
catch (error) {
index_js_1.Logger.getInstance().error("Failed call to JSON.stringify.", error);
}
};
// Check for shim initialization upon construction
try {
if (JSON.parse(process.env[types_js_1.AZURE_MONITOR_STATSBEAT_FEATURES] || "{}").feature &
types_js_1.StatsbeatFeature.SHIM) {
this.initializedByShim = true;
}
}
catch (error) {
index_js_1.Logger.getInstance().error("Failed to parse statsbeat config environment variable.", error);
}
}
}
/**
* Singleton Statsbeat instance.
* @internal
*/
function getInstance() {
if (!instance) {
instance = new StatsbeatConfiguration();
}
return instance;
}
//# sourceMappingURL=statsbeat.js.map
;