@azure/monitor-opentelemetry
Version:
Azure Monitor OpenTelemetry (Node.js)
127 lines • 7.14 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 {
// Initial Statsbeat options
initializedByShim = false;
currentStatsbeatInstrumentations = {};
currentStatsbeatFeatures = {};
constructor() {
// 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);
}
}
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 = {
...this.currentStatsbeatInstrumentations,
...statsbeatInstrumentations,
};
this.currentStatsbeatFeatures = { ...this.currentStatsbeatFeatures, ...statsbeatFeatures };
// Set the statsbeat options for community instrumentations based on the environment variable
statsbeatInstrumentations = {
...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);
}
};
}
/**
* Singleton Statsbeat instance.
* @internal
*/
function getInstance() {
if (!instance) {
instance = new StatsbeatConfiguration();
}
return instance;
}
//# sourceMappingURL=statsbeat.js.map