@azure/monitor-opentelemetry
Version:
Azure Monitor OpenTelemetry (Node.js)
91 lines • 6.68 kB
JavaScript
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
import { AZURE_MONITOR_STATSBEAT_FEATURES, StatsbeatFeature, StatsbeatFeaturesMap, StatsbeatInstrumentation, } from "../types.js";
import { Logger as InternalLogger } from "../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[AZURE_MONITOR_STATSBEAT_FEATURES] || "{}");
}
catch (error) {
InternalLogger.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 & StatsbeatInstrumentation.AMQPLIB ? true : false, cucumber: statsbeatEnv.instrumentation & StatsbeatInstrumentation.CUCUMBER ? true : false, dataloader: statsbeatEnv.instrumentation & StatsbeatInstrumentation.DATALOADER ? true : false, fs: statsbeatEnv.instrumentation & StatsbeatInstrumentation.FS ? true : false, lruMemoizer: statsbeatEnv.instrumentation & StatsbeatInstrumentation.LRU_MEMOIZER ? true : false, mongoose: statsbeatEnv.instrumentation & StatsbeatInstrumentation.MONGOOSE ? true : false, runtimeNode: statsbeatEnv.instrumentation & StatsbeatInstrumentation.RUNTIME_NODE ? true : false, socketIo: statsbeatEnv.instrumentation & StatsbeatInstrumentation.SOCKET_IO ? true : false, tedious: statsbeatEnv.instrumentation & StatsbeatInstrumentation.TEDIOUS ? true : false, undici: statsbeatEnv.instrumentation & StatsbeatInstrumentation.UNDICI ? true : false, cassandra: statsbeatEnv.instrumentation & StatsbeatInstrumentation.CASSANDRA ? true : false, connect: statsbeatEnv.instrumentation & StatsbeatInstrumentation.CONNECT ? true : false, dns: statsbeatEnv.instrumentation & StatsbeatInstrumentation.DNS ? true : false, express: statsbeatEnv.instrumentation & StatsbeatInstrumentation.EXPRESS ? true : false, fastify: statsbeatEnv.instrumentation & StatsbeatInstrumentation.FASTIFY ? true : false, genericPool: statsbeatEnv.instrumentation & StatsbeatInstrumentation.GENERIC_POOL ? true : false, graphql: statsbeatEnv.instrumentation & StatsbeatInstrumentation.GRAPHQL ? true : false, hapi: statsbeatEnv.instrumentation & StatsbeatInstrumentation.HAPI ? true : false, ioredis: statsbeatEnv.instrumentation & StatsbeatInstrumentation.IOREDIS ? true : false, knex: statsbeatEnv.instrumentation & StatsbeatInstrumentation.KNEX ? true : false, koa: statsbeatEnv.instrumentation & StatsbeatInstrumentation.KOA ? true : false, memcached: statsbeatEnv.instrumentation & StatsbeatInstrumentation.MEMCACHED ? true : false, mysql2: statsbeatEnv.instrumentation & StatsbeatInstrumentation.MYSQL2 ? true : false, nestjsCore: statsbeatEnv.instrumentation & StatsbeatInstrumentation.NESTJS_CORE ? true : false, net: statsbeatEnv.instrumentation & StatsbeatInstrumentation.NET ? true : false, pino: statsbeatEnv.instrumentation & StatsbeatInstrumentation.PINO ? true : false, restify: statsbeatEnv.instrumentation & StatsbeatInstrumentation.RESTIFY ? true : false, router: statsbeatEnv.instrumentation & StatsbeatInstrumentation.ROUTER ? true : false });
let instrumentationBitMap = 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 = 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 |= StatsbeatFeaturesMap.get(featureArray[i].option);
}
}
// Merge old statsbeat options with new statsbeat options overriding any common properties
try {
const currentFeaturesBitMap = Number(process.env[AZURE_MONITOR_STATSBEAT_FEATURES]);
if (!isNaN(currentFeaturesBitMap)) {
featureBitMap |= currentFeaturesBitMap;
}
process.env[AZURE_MONITOR_STATSBEAT_FEATURES] = JSON.stringify({
instrumentation: instrumentationBitMap,
feature: featureBitMap,
});
}
catch (error) {
InternalLogger.getInstance().error("Failed call to JSON.stringify.", error);
}
};
// Check for shim initialization upon construction
try {
if (JSON.parse(process.env[AZURE_MONITOR_STATSBEAT_FEATURES] || "{}").feature &
StatsbeatFeature.SHIM) {
this.initializedByShim = true;
}
}
catch (error) {
InternalLogger.getInstance().error("Failed to parse statsbeat config environment variable.", error);
}
}
}
/**
* Singleton Statsbeat instance.
* @internal
*/
export function getInstance() {
if (!instance) {
instance = new StatsbeatConfiguration();
}
return instance;
}
//# sourceMappingURL=statsbeat.js.map