@azure/monitor-opentelemetry 1.16.0 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/commonjs/generated/api/index.d.ts +4 -0
- package/dist/commonjs/generated/api/index.d.ts.map +1 -0
- package/dist/commonjs/generated/api/index.js +11 -0
- package/dist/commonjs/generated/api/index.js.map +1 -0
- package/dist/commonjs/generated/api/operations.d.ts +13 -0
- package/dist/commonjs/generated/api/operations.d.ts.map +1 -0
- package/dist/commonjs/generated/api/operations.js +107 -0
- package/dist/commonjs/generated/api/operations.js.map +1 -0
- package/dist/commonjs/generated/api/options.d.ts +31 -0
- package/dist/commonjs/generated/api/options.d.ts.map +1 -0
- package/dist/commonjs/generated/api/options.js +5 -0
- package/dist/commonjs/generated/api/options.js.map +1 -0
- package/dist/commonjs/generated/api/quickpulseContext.d.ts +17 -0
- package/dist/commonjs/generated/api/quickpulseContext.d.ts.map +1 -0
- package/dist/commonjs/generated/api/quickpulseContext.js +26 -0
- package/dist/commonjs/generated/api/quickpulseContext.js.map +1 -0
- package/dist/commonjs/generated/index.d.ts +2 -1
- package/dist/commonjs/generated/index.d.ts.map +1 -1
- package/dist/commonjs/generated/index.js +5 -10
- package/dist/commonjs/generated/index.js.map +1 -1
- package/dist/commonjs/generated/logger.d.ts +2 -0
- package/dist/commonjs/generated/logger.d.ts.map +1 -0
- package/dist/commonjs/generated/logger.js +8 -0
- package/dist/commonjs/generated/logger.js.map +1 -0
- package/dist/commonjs/generated/models/index.d.ts +1 -422
- package/dist/commonjs/generated/models/index.d.ts.map +1 -1
- package/dist/commonjs/generated/models/index.js +5 -104
- package/dist/commonjs/generated/models/index.js.map +1 -1
- package/dist/commonjs/generated/models/models.d.ts +265 -0
- package/dist/commonjs/generated/models/models.d.ts.map +1 -0
- package/dist/commonjs/generated/models/models.js +393 -0
- package/dist/commonjs/generated/models/models.js.map +1 -0
- package/dist/commonjs/generated/quickpulseClient.d.ts +16 -28
- package/dist/commonjs/generated/quickpulseClient.d.ts.map +1 -1
- package/dist/commonjs/generated/quickpulseClient.js +24 -139
- package/dist/commonjs/generated/quickpulseClient.js.map +1 -1
- package/dist/commonjs/generated/static-helpers/urlTemplate.d.ts +5 -0
- package/dist/commonjs/generated/static-helpers/urlTemplate.d.ts.map +1 -0
- package/dist/commonjs/generated/static-helpers/urlTemplate.js +203 -0
- package/dist/commonjs/generated/static-helpers/urlTemplate.js.map +1 -0
- package/dist/commonjs/index.d.ts +2 -2
- package/dist/commonjs/index.d.ts.map +1 -1
- package/dist/commonjs/index.js +13 -0
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/logs/logRecordProcessor.d.ts +3 -1
- package/dist/commonjs/logs/logRecordProcessor.d.ts.map +1 -1
- package/dist/commonjs/logs/logRecordProcessor.js +32 -1
- package/dist/commonjs/logs/logRecordProcessor.js.map +1 -1
- package/dist/commonjs/metrics/performanceCounters.d.ts.map +1 -1
- package/dist/commonjs/metrics/performanceCounters.js +4 -2
- package/dist/commonjs/metrics/performanceCounters.js.map +1 -1
- package/dist/commonjs/metrics/quickpulse/export/exporter.d.ts.map +1 -1
- package/dist/commonjs/metrics/quickpulse/export/exporter.js.map +1 -1
- package/dist/commonjs/metrics/quickpulse/export/sender.d.ts +22 -5
- package/dist/commonjs/metrics/quickpulse/export/sender.d.ts.map +1 -1
- package/dist/commonjs/metrics/quickpulse/export/sender.js +59 -18
- package/dist/commonjs/metrics/quickpulse/export/sender.js.map +1 -1
- package/dist/commonjs/metrics/quickpulse/filtering/filter.d.ts.map +1 -1
- package/dist/commonjs/metrics/quickpulse/filtering/filter.js +12 -13
- package/dist/commonjs/metrics/quickpulse/filtering/filter.js.map +1 -1
- package/dist/commonjs/metrics/quickpulse/filtering/projection.d.ts.map +1 -1
- package/dist/commonjs/metrics/quickpulse/filtering/projection.js +14 -15
- package/dist/commonjs/metrics/quickpulse/filtering/projection.js.map +1 -1
- package/dist/commonjs/metrics/quickpulse/filtering/validator.d.ts.map +1 -1
- package/dist/commonjs/metrics/quickpulse/filtering/validator.js +37 -20
- package/dist/commonjs/metrics/quickpulse/filtering/validator.js.map +1 -1
- package/dist/commonjs/metrics/quickpulse/liveMetrics.d.ts.map +1 -1
- package/dist/commonjs/metrics/quickpulse/liveMetrics.js +20 -24
- package/dist/commonjs/metrics/quickpulse/liveMetrics.js.map +1 -1
- package/dist/commonjs/metrics/quickpulse/types.d.ts +4 -3
- package/dist/commonjs/metrics/quickpulse/types.d.ts.map +1 -1
- package/dist/commonjs/metrics/quickpulse/types.js.map +1 -1
- package/dist/commonjs/metrics/quickpulse/utils.d.ts.map +1 -1
- package/dist/commonjs/metrics/quickpulse/utils.js +9 -10
- package/dist/commonjs/metrics/quickpulse/utils.js.map +1 -1
- package/dist/commonjs/metrics/standardMetrics.d.ts.map +1 -1
- package/dist/commonjs/metrics/standardMetrics.js +2 -1
- package/dist/commonjs/metrics/standardMetrics.js.map +1 -1
- package/dist/commonjs/metrics/utils.d.ts +7 -0
- package/dist/commonjs/metrics/utils.d.ts.map +1 -1
- package/dist/commonjs/metrics/utils.js +23 -0
- package/dist/commonjs/metrics/utils.js.map +1 -1
- package/dist/commonjs/shared/config.d.ts.map +1 -1
- package/dist/commonjs/shared/config.js +1 -1
- package/dist/commonjs/shared/config.js.map +1 -1
- package/dist/commonjs/shared/envConfig.d.ts +1 -1
- package/dist/commonjs/shared/envConfig.d.ts.map +1 -1
- package/dist/commonjs/shared/envConfig.js.map +1 -1
- package/dist/commonjs/shared/module.d.ts +2 -1
- package/dist/commonjs/shared/module.d.ts.map +1 -0
- package/dist/commonjs/shared/module.js +2 -1
- package/dist/commonjs/shared/module.js.map +1 -0
- package/dist/commonjs/traces/spanProcessor.d.ts +3 -1
- package/dist/commonjs/traces/spanProcessor.d.ts.map +1 -1
- package/dist/commonjs/traces/spanProcessor.js +64 -1
- package/dist/commonjs/traces/spanProcessor.js.map +1 -1
- package/dist/commonjs/tsdoc-metadata.json +1 -1
- package/dist/commonjs/types.d.ts +5 -3
- package/dist/commonjs/types.d.ts.map +1 -1
- package/dist/commonjs/types.js +3 -1
- package/dist/commonjs/types.js.map +1 -1
- package/dist/commonjs/utils/common.d.ts.map +1 -1
- package/dist/commonjs/utils/common.js +5 -0
- package/dist/commonjs/utils/common.js.map +1 -1
- package/dist/commonjs/utils/genaiAttributes.d.ts +43 -0
- package/dist/commonjs/utils/genaiAttributes.d.ts.map +1 -0
- package/dist/commonjs/utils/genaiAttributes.js +60 -0
- package/dist/commonjs/utils/genaiAttributes.js.map +1 -0
- package/dist/esm/generated/api/index.d.ts +4 -0
- package/dist/esm/generated/api/index.d.ts.map +1 -0
- package/dist/esm/generated/api/index.js +5 -0
- package/dist/esm/generated/api/index.js.map +1 -0
- package/dist/esm/generated/api/operations.d.ts +13 -0
- package/dist/esm/generated/api/operations.d.ts.map +1 -0
- package/dist/esm/generated/api/operations.js +99 -0
- package/dist/esm/generated/api/operations.js.map +1 -0
- package/dist/esm/generated/api/options.d.ts +31 -0
- package/dist/esm/generated/api/options.d.ts.map +1 -0
- package/dist/esm/generated/api/options.js +4 -0
- package/dist/esm/generated/api/options.js.map +1 -0
- package/dist/esm/generated/api/quickpulseContext.d.ts +17 -0
- package/dist/esm/generated/api/quickpulseContext.d.ts.map +1 -0
- package/dist/esm/generated/api/quickpulseContext.js +23 -0
- package/dist/esm/generated/api/quickpulseContext.js.map +1 -0
- package/dist/esm/generated/index.d.ts +2 -1
- package/dist/esm/generated/index.d.ts.map +1 -1
- package/dist/esm/generated/index.js +3 -8
- package/dist/esm/generated/index.js.map +1 -1
- package/dist/esm/generated/logger.d.ts +2 -0
- package/dist/esm/generated/logger.d.ts.map +1 -0
- package/dist/esm/generated/logger.js +5 -0
- package/dist/esm/generated/logger.js.map +1 -0
- package/dist/esm/generated/models/index.d.ts +1 -422
- package/dist/esm/generated/models/index.d.ts.map +1 -1
- package/dist/esm/generated/models/index.js +3 -103
- package/dist/esm/generated/models/index.js.map +1 -1
- package/dist/esm/generated/models/models.d.ts +265 -0
- package/dist/esm/generated/models/models.d.ts.map +1 -0
- package/dist/esm/generated/models/models.js +347 -0
- package/dist/esm/generated/models/models.js.map +1 -0
- package/dist/esm/generated/quickpulseClient.d.ts +16 -28
- package/dist/esm/generated/quickpulseClient.d.ts.map +1 -1
- package/dist/esm/generated/quickpulseClient.js +24 -138
- package/dist/esm/generated/quickpulseClient.js.map +1 -1
- package/dist/esm/generated/static-helpers/urlTemplate.d.ts +5 -0
- package/dist/esm/generated/static-helpers/urlTemplate.d.ts.map +1 -0
- package/dist/esm/generated/static-helpers/urlTemplate.js +200 -0
- package/dist/esm/generated/static-helpers/urlTemplate.js.map +1 -0
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +13 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/logs/logRecordProcessor.d.ts +3 -1
- package/dist/esm/logs/logRecordProcessor.d.ts.map +1 -1
- package/dist/esm/logs/logRecordProcessor.js +32 -1
- package/dist/esm/logs/logRecordProcessor.js.map +1 -1
- package/dist/esm/metrics/performanceCounters.d.ts.map +1 -1
- package/dist/esm/metrics/performanceCounters.js +4 -2
- package/dist/esm/metrics/performanceCounters.js.map +1 -1
- package/dist/esm/metrics/quickpulse/export/exporter.d.ts.map +1 -1
- package/dist/esm/metrics/quickpulse/export/exporter.js.map +1 -1
- package/dist/esm/metrics/quickpulse/export/sender.d.ts +22 -5
- package/dist/esm/metrics/quickpulse/export/sender.d.ts.map +1 -1
- package/dist/esm/metrics/quickpulse/export/sender.js +59 -18
- package/dist/esm/metrics/quickpulse/export/sender.js.map +1 -1
- package/dist/esm/metrics/quickpulse/filtering/filter.d.ts.map +1 -1
- package/dist/esm/metrics/quickpulse/filtering/filter.js +12 -13
- package/dist/esm/metrics/quickpulse/filtering/filter.js.map +1 -1
- package/dist/esm/metrics/quickpulse/filtering/projection.d.ts.map +1 -1
- package/dist/esm/metrics/quickpulse/filtering/projection.js +14 -15
- package/dist/esm/metrics/quickpulse/filtering/projection.js.map +1 -1
- package/dist/esm/metrics/quickpulse/filtering/validator.d.ts.map +1 -1
- package/dist/esm/metrics/quickpulse/filtering/validator.js +37 -20
- package/dist/esm/metrics/quickpulse/filtering/validator.js.map +1 -1
- package/dist/esm/metrics/quickpulse/liveMetrics.d.ts.map +1 -1
- package/dist/esm/metrics/quickpulse/liveMetrics.js +20 -24
- package/dist/esm/metrics/quickpulse/liveMetrics.js.map +1 -1
- package/dist/esm/metrics/quickpulse/types.d.ts +4 -3
- package/dist/esm/metrics/quickpulse/types.d.ts.map +1 -1
- package/dist/esm/metrics/quickpulse/types.js.map +1 -1
- package/dist/esm/metrics/quickpulse/utils.d.ts.map +1 -1
- package/dist/esm/metrics/quickpulse/utils.js +6 -7
- package/dist/esm/metrics/quickpulse/utils.js.map +1 -1
- package/dist/esm/metrics/standardMetrics.d.ts.map +1 -1
- package/dist/esm/metrics/standardMetrics.js +2 -1
- package/dist/esm/metrics/standardMetrics.js.map +1 -1
- package/dist/esm/metrics/utils.d.ts +7 -0
- package/dist/esm/metrics/utils.d.ts.map +1 -1
- package/dist/esm/metrics/utils.js +22 -0
- package/dist/esm/metrics/utils.js.map +1 -1
- package/dist/esm/shared/config.d.ts.map +1 -1
- package/dist/esm/shared/config.js +2 -2
- package/dist/esm/shared/config.js.map +1 -1
- package/dist/esm/shared/envConfig.d.ts +1 -1
- package/dist/esm/shared/envConfig.d.ts.map +1 -1
- package/dist/esm/shared/envConfig.js.map +1 -1
- package/dist/esm/traces/spanProcessor.d.ts +3 -1
- package/dist/esm/traces/spanProcessor.d.ts.map +1 -1
- package/dist/esm/traces/spanProcessor.js +64 -1
- package/dist/esm/traces/spanProcessor.js.map +1 -1
- package/dist/esm/types.d.ts +5 -3
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/types.js +3 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utils/common.d.ts.map +1 -1
- package/dist/esm/utils/common.js +5 -0
- package/dist/esm/utils/common.js.map +1 -1
- package/dist/esm/utils/genaiAttributes.d.ts +43 -0
- package/dist/esm/utils/genaiAttributes.d.ts.map +1 -0
- package/dist/esm/utils/genaiAttributes.js +57 -0
- package/dist/esm/utils/genaiAttributes.js.map +1 -0
- package/package.json +23 -27
- package/dist/commonjs/generated/models/mappers.d.ts +0 -31
- package/dist/commonjs/generated/models/mappers.d.ts.map +0 -1
- package/dist/commonjs/generated/models/mappers.js +0 -791
- package/dist/commonjs/generated/models/mappers.js.map +0 -1
- package/dist/commonjs/generated/models/parameters.d.ts +0 -16
- package/dist/commonjs/generated/models/parameters.d.ts.map +0 -1
- package/dist/commonjs/generated/models/parameters.js +0 -147
- package/dist/commonjs/generated/models/parameters.js.map +0 -1
- package/dist/commonjs/shared/module-cjs.cjs.map +0 -1
- package/dist/commonjs/shared/module-cjs.d.cts.map +0 -1
- package/dist/esm/generated/models/mappers.d.ts +0 -31
- package/dist/esm/generated/models/mappers.d.ts.map +0 -1
- package/dist/esm/generated/models/mappers.js +0 -788
- package/dist/esm/generated/models/mappers.js.map +0 -1
- package/dist/esm/generated/models/parameters.d.ts +0 -16
- package/dist/esm/generated/models/parameters.d.ts.map +0 -1
- package/dist/esm/generated/models/parameters.js +0 -144
- package/dist/esm/generated/models/parameters.js.map +0 -1
package/dist/esm/index.js
CHANGED
|
@@ -15,6 +15,12 @@ import { patchOpenTelemetryInstrumentationEnable } from "./utils/opentelemetryIn
|
|
|
15
15
|
import { isFunctionApp, parseResourceDetectorsFromEnvVar } from "./utils/common.js";
|
|
16
16
|
import { Logger } from "./shared/logging/index.js";
|
|
17
17
|
import { AZURE_MONITOR_AUTO_ATTACH } from "./types.js";
|
|
18
|
+
import { SEMRESATTRS_K8S_CLUSTER_NAME } from "@opentelemetry/semantic-conventions";
|
|
19
|
+
/**
|
|
20
|
+
* Semantic attribute for cloud resource ID, defined by \@opentelemetry/resource-detector-azure
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
const CLOUD_RESOURCE_ID_ATTRIBUTE = "cloud.resource_id";
|
|
18
24
|
process.env["AZURE_MONITOR_DISTRO_VERSION"] = AZURE_MONITOR_OPENTELEMETRY_VERSION;
|
|
19
25
|
let sdk;
|
|
20
26
|
let browserSdkLoader;
|
|
@@ -52,11 +58,18 @@ export function useAzureMonitor(options) {
|
|
|
52
58
|
bunyan: config.instrumentationOptions?.bunyan?.enabled,
|
|
53
59
|
winston: config.instrumentationOptions?.winston?.enabled,
|
|
54
60
|
};
|
|
61
|
+
// Check if the AKS resource detector successfully populated specific resource attributes
|
|
62
|
+
// (k8s.cluster.name or cloud.resource_id) beyond the basic cloud.platform/cloud.provider
|
|
63
|
+
// Derive from config.resource.attributes which already includes the AKS detector results
|
|
64
|
+
const resourceAttributes = config.resource.attributes;
|
|
65
|
+
const aksResourceDetected = SEMRESATTRS_K8S_CLUSTER_NAME in resourceAttributes ||
|
|
66
|
+
CLOUD_RESOURCE_ID_ATTRIBUTE in resourceAttributes;
|
|
55
67
|
const statsbeatFeatures = {
|
|
56
68
|
browserSdkLoader: config.browserSdkLoaderOptions.enabled,
|
|
57
69
|
aadHandling: !!config.azureMonitorExporterOptions?.credential,
|
|
58
70
|
diskRetry: !config.azureMonitorExporterOptions?.disableOfflineStorage,
|
|
59
71
|
customerSdkStats: process.env[APPLICATIONINSIGHTS_SDKSTATS_DISABLED]?.toLowerCase() === "true",
|
|
72
|
+
aksResourceDetectorPopulation: aksResourceDetected,
|
|
60
73
|
};
|
|
61
74
|
getInstance().setStatsbeatFeatures(statsbeatInstrumentations, statsbeatFeatures);
|
|
62
75
|
if (config.browserSdkLoaderOptions.enabled) {
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { metrics, trace } from \"@opentelemetry/api\";\nimport { logs } from \"@opentelemetry/api-logs\";\nimport type { NodeSDKConfiguration } from \"@opentelemetry/sdk-node\";\nimport { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport type { MetricReader, ViewOptions } from \"@opentelemetry/sdk-metrics\";\nimport { InternalConfig } from \"./shared/config.js\";\nimport { MetricHandler } from \"./metrics/index.js\";\nimport { TraceHandler } from \"./traces/handler.js\";\nimport { LogHandler } from \"./logs/index.js\";\nimport type { StatsbeatFeatures, StatsbeatInstrumentations } from \"./types.js\";\nimport {\n AZURE_MONITOR_OPENTELEMETRY_VERSION,\n AzureMonitorOpenTelemetryOptions,\n APPLICATIONINSIGHTS_SDKSTATS_DISABLED,\n InstrumentationOptions,\n BrowserSdkLoaderOptions,\n} from \"./types.js\";\nimport { BrowserSdkLoader } from \"./browserSdkLoader/browserSdkLoader.js\";\nimport { setSdkPrefix } from \"./metrics/quickpulse/utils.js\";\nimport type { SpanProcessor } from \"@opentelemetry/sdk-trace-base\";\nimport type { LogRecordProcessor } from \"@opentelemetry/sdk-logs\";\nimport { getInstance } from \"./utils/statsbeat.js\";\nimport { patchOpenTelemetryInstrumentationEnable } from \"./utils/opentelemetryInstrumentationPatcher.js\";\nimport { isFunctionApp, parseResourceDetectorsFromEnvVar } from \"./utils/common.js\";\nimport { Logger } from \"./shared/logging/index.js\";\nimport { AZURE_MONITOR_AUTO_ATTACH } from \"./types.js\";\n\nexport { AzureMonitorOpenTelemetryOptions, InstrumentationOptions, BrowserSdkLoaderOptions };\n\nprocess.env[\"AZURE_MONITOR_DISTRO_VERSION\"] = AZURE_MONITOR_OPENTELEMETRY_VERSION;\n\nlet sdk: NodeSDK;\nlet browserSdkLoader: BrowserSdkLoader | undefined;\n\n/**\n * Check if auto-attach (autoinstrumentation) is enabled and warn about double instrumentation.\n */\nfunction sendAttachWarning(): void {\n if (process.env[AZURE_MONITOR_AUTO_ATTACH] === \"true\" && !isFunctionApp()) {\n // TODO: When AKS attach is public, update this message with disablement instructions for AKS\n const message =\n \"Distro detected that automatic instrumentation may have occurred. Only use autoinstrumentation if you \" +\n \"are not using manual instrumentation of OpenTelemetry in your code, such as with \" +\n \"@azure/monitor-opentelemetry or @azure/monitor-opentelemetry-exporter. For App Service resources, disable \" +\n \"autoinstrumentation in the Application Insights experience on your App Service resource or by setting \" +\n \"the ApplicationInsightsAgent_EXTENSION_VERSION app setting to 'disabled'.\";\n // Surface in the log stream\n console.warn(message);\n // Also log via diagnostic logging\n Logger.getInstance().warn(message);\n }\n}\n\n/**\n * Initialize Azure Monitor Distro\n * @param options - Azure Monitor OpenTelemetry Options\n */\nexport function useAzureMonitor(options?: AzureMonitorOpenTelemetryOptions): void {\n const config = new InternalConfig(options);\n patchOpenTelemetryInstrumentationEnable();\n const statsbeatInstrumentations: StatsbeatInstrumentations = {\n // Instrumentations\n azureSdk: config.instrumentationOptions?.azureSdk?.enabled,\n mongoDb: config.instrumentationOptions?.mongoDb?.enabled,\n mySql: config.instrumentationOptions?.mySql?.enabled,\n postgreSql: config.instrumentationOptions?.postgreSql?.enabled,\n redis: config.instrumentationOptions?.redis?.enabled,\n bunyan: config.instrumentationOptions?.bunyan?.enabled,\n winston: config.instrumentationOptions?.winston?.enabled,\n };\n const statsbeatFeatures: StatsbeatFeatures = {\n browserSdkLoader: config.browserSdkLoaderOptions.enabled,\n aadHandling: !!config.azureMonitorExporterOptions?.credential,\n diskRetry: !config.azureMonitorExporterOptions?.disableOfflineStorage,\n customerSdkStats: process.env[APPLICATIONINSIGHTS_SDKSTATS_DISABLED]?.toLowerCase() === \"true\",\n };\n getInstance().setStatsbeatFeatures(statsbeatInstrumentations, statsbeatFeatures);\n\n if (config.browserSdkLoaderOptions.enabled) {\n browserSdkLoader = new BrowserSdkLoader(config);\n }\n // Remove global providers in OpenTelemetry, these would be overridden if present\n metrics.disable();\n trace.disable();\n logs.disable();\n\n // Clear the entire OpenTelemetry API global state to avoid version conflicts.\n // The disable() calls above remove individual providers but leave the `version` field\n // on the global object intact. If a different version of @opentelemetry/api was loaded\n // first (e.g. by a VS Code extension host or another extension), the stale version\n // causes registerGlobal() in sdk.start() to fail with \"All API registration versions\n // must match\", resulting in Noop providers. Deleting the global object forces\n // registerGlobal() to create a fresh one with the correct version.\n const globalOpentelemetryApiKey = Symbol.for(\"opentelemetry.js.api.1\");\n delete (globalThis as Record<symbol, unknown>)[globalOpentelemetryApiKey];\n\n // Create internal handlers\n const metricHandler = new MetricHandler(config);\n const traceHandler = new TraceHandler(config, metricHandler);\n const logHandler = new LogHandler(config, metricHandler);\n\n const instrumentations = traceHandler\n .getInstrumentations()\n .concat(logHandler.getInstrumentations());\n\n const resourceDetectorsList = parseResourceDetectorsFromEnvVar();\n\n // Add extra SpanProcessors, and logRecordProcessors from user configuration\n const spanProcessors: SpanProcessor[] = options?.spanProcessors || [];\n const logRecordProcessors: LogRecordProcessor[] = options?.logRecordProcessors || [];\n const customViews: ViewOptions[] = options?.views || [];\n\n // Prepare metric readers - always include Azure Monitor\n const metricReaders: MetricReader[] = [\n metricHandler.getMetricReader(),\n ...(options?.metricReaders || []),\n ];\n\n const views: ViewOptions[] = metricHandler.getViews().concat(customViews);\n\n // Initialize OpenTelemetry SDK\n const sdkConfig: Partial<NodeSDKConfiguration> = {\n autoDetectResources: true,\n metricReaders: metricReaders,\n views,\n instrumentations: instrumentations,\n logRecordProcessors: [\n logHandler.getAzureLogRecordProcessor(),\n ...logRecordProcessors,\n logHandler.getBatchLogRecordProcessor(),\n ],\n resource: config.resource,\n sampler: traceHandler.getSampler(),\n spanProcessors: [\n traceHandler.getAzureMonitorSpanProcessor(),\n ...spanProcessors,\n traceHandler.getBatchSpanProcessor(),\n ],\n resourceDetectors: resourceDetectorsList,\n };\n sdk = new NodeSDK(sdkConfig);\n setSdkPrefix();\n sendAttachWarning();\n sdk.start();\n}\n\n/**\n * Shutdown Azure Monitor Open Telemetry Distro\n * @see https://github.com/open-telemetry/opentelemetry-js/blob/0229434cb5a3179f63c021105f36270ae7897929/experimental/packages/opentelemetry-sdk-node/src/sdk.ts#L398\n */\nexport function shutdownAzureMonitor(): Promise<void> {\n browserSdkLoader?.dispose();\n return sdk?.shutdown();\n}\n\n/**\n * Get the internal SDK instance for testing purposes\n * @internal\n */\n// eslint-disable-next-line no-underscore-dangle\nexport function _getSdkInstance(): NodeSDK | undefined {\n return sdk;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { metrics, trace } from \"@opentelemetry/api\";\nimport { logs } from \"@opentelemetry/api-logs\";\nimport type { NodeSDKConfiguration } from \"@opentelemetry/sdk-node\";\nimport { NodeSDK } from \"@opentelemetry/sdk-node\";\nimport type { MetricReader, ViewOptions } from \"@opentelemetry/sdk-metrics\";\nimport { InternalConfig } from \"./shared/config.js\";\nimport { MetricHandler } from \"./metrics/index.js\";\nimport { TraceHandler } from \"./traces/handler.js\";\nimport { LogHandler } from \"./logs/index.js\";\nimport type {\n StatsbeatFeatures,\n StatsbeatInstrumentations,\n AzureMonitorOpenTelemetryOptions,\n InstrumentationOptions,\n BrowserSdkLoaderOptions,\n} from \"./types.js\";\nimport {\n AZURE_MONITOR_OPENTELEMETRY_VERSION,\n APPLICATIONINSIGHTS_SDKSTATS_DISABLED,\n} from \"./types.js\";\nimport { BrowserSdkLoader } from \"./browserSdkLoader/browserSdkLoader.js\";\nimport { setSdkPrefix } from \"./metrics/quickpulse/utils.js\";\nimport type { SpanProcessor } from \"@opentelemetry/sdk-trace-base\";\nimport type { LogRecordProcessor } from \"@opentelemetry/sdk-logs\";\nimport { getInstance } from \"./utils/statsbeat.js\";\nimport { patchOpenTelemetryInstrumentationEnable } from \"./utils/opentelemetryInstrumentationPatcher.js\";\nimport { isFunctionApp, parseResourceDetectorsFromEnvVar } from \"./utils/common.js\";\nimport { Logger } from \"./shared/logging/index.js\";\nimport { AZURE_MONITOR_AUTO_ATTACH } from \"./types.js\";\nimport { SEMRESATTRS_K8S_CLUSTER_NAME } from \"@opentelemetry/semantic-conventions\";\n\n/**\n * Semantic attribute for cloud resource ID, defined by \\@opentelemetry/resource-detector-azure\n * @internal\n */\nconst CLOUD_RESOURCE_ID_ATTRIBUTE = \"cloud.resource_id\";\n\nexport type { AzureMonitorOpenTelemetryOptions, InstrumentationOptions, BrowserSdkLoaderOptions };\n\nprocess.env[\"AZURE_MONITOR_DISTRO_VERSION\"] = AZURE_MONITOR_OPENTELEMETRY_VERSION;\n\nlet sdk: NodeSDK;\nlet browserSdkLoader: BrowserSdkLoader | undefined;\n\n/**\n * Check if auto-attach (autoinstrumentation) is enabled and warn about double instrumentation.\n */\nfunction sendAttachWarning(): void {\n if (process.env[AZURE_MONITOR_AUTO_ATTACH] === \"true\" && !isFunctionApp()) {\n // TODO: When AKS attach is public, update this message with disablement instructions for AKS\n const message =\n \"Distro detected that automatic instrumentation may have occurred. Only use autoinstrumentation if you \" +\n \"are not using manual instrumentation of OpenTelemetry in your code, such as with \" +\n \"@azure/monitor-opentelemetry or @azure/monitor-opentelemetry-exporter. For App Service resources, disable \" +\n \"autoinstrumentation in the Application Insights experience on your App Service resource or by setting \" +\n \"the ApplicationInsightsAgent_EXTENSION_VERSION app setting to 'disabled'.\";\n // Surface in the log stream\n console.warn(message);\n // Also log via diagnostic logging\n Logger.getInstance().warn(message);\n }\n}\n\n/**\n * Initialize Azure Monitor Distro\n * @param options - Azure Monitor OpenTelemetry Options\n */\nexport function useAzureMonitor(options?: AzureMonitorOpenTelemetryOptions): void {\n const config = new InternalConfig(options);\n patchOpenTelemetryInstrumentationEnable();\n const statsbeatInstrumentations: StatsbeatInstrumentations = {\n // Instrumentations\n azureSdk: config.instrumentationOptions?.azureSdk?.enabled,\n mongoDb: config.instrumentationOptions?.mongoDb?.enabled,\n mySql: config.instrumentationOptions?.mySql?.enabled,\n postgreSql: config.instrumentationOptions?.postgreSql?.enabled,\n redis: config.instrumentationOptions?.redis?.enabled,\n bunyan: config.instrumentationOptions?.bunyan?.enabled,\n winston: config.instrumentationOptions?.winston?.enabled,\n };\n // Check if the AKS resource detector successfully populated specific resource attributes\n // (k8s.cluster.name or cloud.resource_id) beyond the basic cloud.platform/cloud.provider\n // Derive from config.resource.attributes which already includes the AKS detector results\n const resourceAttributes = config.resource.attributes;\n const aksResourceDetected =\n SEMRESATTRS_K8S_CLUSTER_NAME in resourceAttributes ||\n CLOUD_RESOURCE_ID_ATTRIBUTE in resourceAttributes;\n const statsbeatFeatures: StatsbeatFeatures = {\n browserSdkLoader: config.browserSdkLoaderOptions.enabled,\n aadHandling: !!config.azureMonitorExporterOptions?.credential,\n diskRetry: !config.azureMonitorExporterOptions?.disableOfflineStorage,\n customerSdkStats: process.env[APPLICATIONINSIGHTS_SDKSTATS_DISABLED]?.toLowerCase() === \"true\",\n aksResourceDetectorPopulation: aksResourceDetected,\n };\n getInstance().setStatsbeatFeatures(statsbeatInstrumentations, statsbeatFeatures);\n\n if (config.browserSdkLoaderOptions.enabled) {\n browserSdkLoader = new BrowserSdkLoader(config);\n }\n // Remove global providers in OpenTelemetry, these would be overridden if present\n metrics.disable();\n trace.disable();\n logs.disable();\n\n // Clear the entire OpenTelemetry API global state to avoid version conflicts.\n // The disable() calls above remove individual providers but leave the `version` field\n // on the global object intact. If a different version of @opentelemetry/api was loaded\n // first (e.g. by a VS Code extension host or another extension), the stale version\n // causes registerGlobal() in sdk.start() to fail with \"All API registration versions\n // must match\", resulting in Noop providers. Deleting the global object forces\n // registerGlobal() to create a fresh one with the correct version.\n const globalOpentelemetryApiKey = Symbol.for(\"opentelemetry.js.api.1\");\n delete (globalThis as Record<symbol, unknown>)[globalOpentelemetryApiKey];\n\n // Create internal handlers\n const metricHandler = new MetricHandler(config);\n const traceHandler = new TraceHandler(config, metricHandler);\n const logHandler = new LogHandler(config, metricHandler);\n\n const instrumentations = traceHandler\n .getInstrumentations()\n .concat(logHandler.getInstrumentations());\n\n const resourceDetectorsList = parseResourceDetectorsFromEnvVar();\n\n // Add extra SpanProcessors, and logRecordProcessors from user configuration\n const spanProcessors: SpanProcessor[] = options?.spanProcessors || [];\n const logRecordProcessors: LogRecordProcessor[] = options?.logRecordProcessors || [];\n const customViews: ViewOptions[] = options?.views || [];\n\n // Prepare metric readers - always include Azure Monitor\n const metricReaders: MetricReader[] = [\n metricHandler.getMetricReader(),\n ...(options?.metricReaders || []),\n ];\n\n const views: ViewOptions[] = metricHandler.getViews().concat(customViews);\n\n // Initialize OpenTelemetry SDK\n const sdkConfig: Partial<NodeSDKConfiguration> = {\n autoDetectResources: true,\n metricReaders: metricReaders,\n views,\n instrumentations: instrumentations,\n logRecordProcessors: [\n logHandler.getAzureLogRecordProcessor(),\n ...logRecordProcessors,\n logHandler.getBatchLogRecordProcessor(),\n ],\n resource: config.resource,\n sampler: traceHandler.getSampler(),\n spanProcessors: [\n traceHandler.getAzureMonitorSpanProcessor(),\n ...spanProcessors,\n traceHandler.getBatchSpanProcessor(),\n ],\n resourceDetectors: resourceDetectorsList,\n };\n sdk = new NodeSDK(sdkConfig);\n setSdkPrefix();\n sendAttachWarning();\n sdk.start();\n}\n\n/**\n * Shutdown Azure Monitor Open Telemetry Distro\n * @see https://github.com/open-telemetry/opentelemetry-js/blob/0229434cb5a3179f63c021105f36270ae7897929/experimental/packages/opentelemetry-sdk-node/src/sdk.ts#L398\n */\nexport function shutdownAzureMonitor(): Promise<void> {\n browserSdkLoader?.dispose();\n return sdk?.shutdown();\n}\n\n/**\n * Get the internal SDK instance for testing purposes\n * @internal\n */\n// eslint-disable-next-line no-underscore-dangle\nexport function _getSdkInstance(): NodeSDK | undefined {\n return sdk;\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { MetricHandler } from "../metrics/handler.js";
|
|
2
2
|
import type { LogRecordProcessor, SdkLogRecord } from "@opentelemetry/sdk-logs";
|
|
3
|
+
import type { Context } from "@opentelemetry/api";
|
|
3
4
|
/**
|
|
4
5
|
* Azure Monitor LogRecord Processor.
|
|
5
6
|
* @internal
|
|
@@ -7,7 +8,8 @@ import type { LogRecordProcessor, SdkLogRecord } from "@opentelemetry/sdk-logs";
|
|
|
7
8
|
export declare class AzureLogRecordProcessor implements LogRecordProcessor {
|
|
8
9
|
private readonly _metricHandler;
|
|
9
10
|
constructor(metricHandler: MetricHandler);
|
|
10
|
-
onEmit(logRecord: SdkLogRecord): void;
|
|
11
|
+
onEmit(logRecord: SdkLogRecord, context?: Context): void;
|
|
12
|
+
private _propagateMainAgentAttributesFromActiveSpan;
|
|
11
13
|
forceFlush(): Promise<void>;
|
|
12
14
|
shutdown(): Promise<void>;
|
|
13
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logRecordProcessor.d.ts","sourceRoot":"","sources":["../../../src/logs/logRecordProcessor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"logRecordProcessor.d.ts","sourceRoot":"","sources":["../../../src/logs/logRecordProcessor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAMlD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,kBAAkB;IAChE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;gBAEnC,aAAa,EAAE,aAAa;IAIjC,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI;IAa/D,OAAO,CAAC,2CAA2C;IA2B5C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGjC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// Copyright (c) Microsoft Corporation.
|
|
2
2
|
// Licensed under the MIT License.
|
|
3
|
+
import { trace } from "@opentelemetry/api";
|
|
3
4
|
import { Logger } from "../shared/logging/index.js";
|
|
5
|
+
import { MAIN_AGENT_TARGET_ATTRIBUTES } from "../utils/genaiAttributes.js";
|
|
4
6
|
/**
|
|
5
7
|
* Azure Monitor LogRecord Processor.
|
|
6
8
|
* @internal
|
|
@@ -10,7 +12,13 @@ export class AzureLogRecordProcessor {
|
|
|
10
12
|
constructor(metricHandler) {
|
|
11
13
|
this._metricHandler = metricHandler;
|
|
12
14
|
}
|
|
13
|
-
onEmit(logRecord) {
|
|
15
|
+
onEmit(logRecord, context) {
|
|
16
|
+
try {
|
|
17
|
+
this._propagateMainAgentAttributesFromActiveSpan(logRecord, context);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
Logger.getInstance().warn("Error while propagating main agent attributes onEmit", error);
|
|
21
|
+
}
|
|
14
22
|
try {
|
|
15
23
|
this._metricHandler.recordLog(logRecord);
|
|
16
24
|
}
|
|
@@ -18,6 +26,29 @@ export class AzureLogRecordProcessor {
|
|
|
18
26
|
Logger.getInstance().warn("Error while recording log", error);
|
|
19
27
|
}
|
|
20
28
|
}
|
|
29
|
+
_propagateMainAgentAttributesFromActiveSpan(logRecord, context) {
|
|
30
|
+
if (!context) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const span = trace.getSpan(context);
|
|
34
|
+
if (!span) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// The Span returned by trace.getSpan may be a non-recording span or a
|
|
38
|
+
// foreign implementation that does not expose `attributes`.
|
|
39
|
+
const spanAttributes = span.attributes;
|
|
40
|
+
if (!spanAttributes) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Copy only the spec-defined main-agent attributes rather than scanning
|
|
44
|
+
// every attribute on the span by prefix.
|
|
45
|
+
for (const key of MAIN_AGENT_TARGET_ATTRIBUTES) {
|
|
46
|
+
const value = spanAttributes[key];
|
|
47
|
+
if (value !== undefined) {
|
|
48
|
+
logRecord.setAttribute(key, value);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
21
52
|
forceFlush() {
|
|
22
53
|
return Promise.resolve();
|
|
23
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logRecordProcessor.js","sourceRoot":"","sources":["../../../src/logs/logRecordProcessor.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;
|
|
1
|
+
{"version":3,"file":"logRecordProcessor.js","sourceRoot":"","sources":["../../../src/logs/logRecordProcessor.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAKlC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAE3E;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IACjB,cAAc,CAAgB;IAE/C,YAAY,aAA4B;QACtC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,SAAuB,EAAE,OAAiB;QACtD,IAAI,CAAC;YACH,IAAI,CAAC,2CAA2C,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,sDAAsD,EAAE,KAAK,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,CAAC;YACH,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAEO,2CAA2C,CACjD,SAAuB,EACvB,OAAiB;QAEjB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,sEAAsE;QACtE,4DAA4D;QAC5D,MAAM,cAAc,GAAI,IAA8B,CAAC,UAAU,CAAC;QAClE,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,wEAAwE;QACxE,yCAAyC;QACzC,KAAK,MAAM,GAAG,IAAI,4BAA4B,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAEM,UAAU;QACf,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAEM,QAAQ;QACb,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { MetricHandler } from \"../metrics/handler.js\";\nimport type { LogRecordProcessor, SdkLogRecord } from \"@opentelemetry/sdk-logs\";\nimport type { Context } from \"@opentelemetry/api\";\nimport { trace } from \"@opentelemetry/api\";\nimport type { ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\nimport { Logger } from \"../shared/logging/index.js\";\nimport { MAIN_AGENT_TARGET_ATTRIBUTES } from \"../utils/genaiAttributes.js\";\n\n/**\n * Azure Monitor LogRecord Processor.\n * @internal\n */\nexport class AzureLogRecordProcessor implements LogRecordProcessor {\n private readonly _metricHandler: MetricHandler;\n\n constructor(metricHandler: MetricHandler) {\n this._metricHandler = metricHandler;\n }\n\n public onEmit(logRecord: SdkLogRecord, context?: Context): void {\n try {\n this._propagateMainAgentAttributesFromActiveSpan(logRecord, context);\n } catch (error) {\n Logger.getInstance().warn(\"Error while propagating main agent attributes onEmit\", error);\n }\n try {\n this._metricHandler.recordLog(logRecord);\n } catch (error) {\n Logger.getInstance().warn(\"Error while recording log\", error);\n }\n }\n\n private _propagateMainAgentAttributesFromActiveSpan(\n logRecord: SdkLogRecord,\n context?: Context,\n ): void {\n if (!context) {\n return;\n }\n const span = trace.getSpan(context);\n if (!span) {\n return;\n }\n // The Span returned by trace.getSpan may be a non-recording span or a\n // foreign implementation that does not expose `attributes`.\n const spanAttributes = (span as Partial<ReadableSpan>).attributes;\n if (!spanAttributes) {\n return;\n }\n // Copy only the spec-defined main-agent attributes rather than scanning\n // every attribute on the span by prefix.\n for (const key of MAIN_AGENT_TARGET_ATTRIBUTES) {\n const value = spanAttributes[key];\n if (value !== undefined) {\n logRecord.setAttribute(key, value);\n }\n }\n }\n\n public forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n\n public shutdown(): Promise<void> {\n return Promise.resolve();\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performanceCounters.d.ts","sourceRoot":"","sources":["../../../src/metrics/performanceCounters.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAM5D,OAAO,EAAE,aAAa,EAAiC,MAAM,4BAA4B,CAAC;AAC1F,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"performanceCounters.d.ts","sourceRoot":"","sources":["../../../src/metrics/performanceCounters.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAM5D,OAAO,EAAE,aAAa,EAAiC,MAAM,4BAA4B,CAAC;AAC1F,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,+BAA+B,CAAC;AAG9E,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAC;AAOpE;;GAEG;AACH,qBAAa,yBAAyB;IACpC,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,wBAAwB,CAAY;IAC5C,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,uBAAuB,CAAkB;IACjD,OAAO,CAAC,+BAA+B,CAAqB;IAC5D,OAAO,CAAC,yBAAyB,CAAkB;IACnD,OAAO,CAAC,iCAAiC,CAAqB;IAC9D,OAAO,CAAC,kBAAkB,CAAkB;IAC5C,OAAO,CAAC,0BAA0B,CAAqB;IACvD,OAAO,CAAC,0BAA0B,CAAkB;IACpD,OAAO,CAAC,kCAAkC,CAAqB;IAC/D,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,wBAAwB,CAAqB;IACrD,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,2BAA2B,CAAqB;IACxD,OAAO,CAAC,iBAAiB,CAA0D;IACnF,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,eAAe,CAA6D;IACpF,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,UAAU,CAAW;IAC7B,OAAO,CAAC,QAAQ,CAIZ;IACJ,OAAO,CAAC,eAAe,CAInB;IACJ,OAAO,CAAC,mBAAmB,CAAa;IAExC;;;;OAIG;gBACS,MAAM,EAAE,gCAAgC,EAAE,OAAO,CAAC,EAAE;QAAE,kBAAkB,EAAE,MAAM,CAAA;KAAE;IAgG9F;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC;;OAEG;IACI,gBAAgB,IAAI,aAAa;IAIxC;;;OAGG;IACI,UAAU,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAkB3C;;;OAGG;IACI,SAAS,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;IAO/C,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,mBAAmB;IAwC3B,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,wBAAwB;IAwChC,OAAO,CAAC,cAAc;IA2CtB,OAAO,CAAC,gBAAgB;CAgBzB"}
|
|
@@ -5,8 +5,10 @@ import { SpanKind, ValueType } from "@opentelemetry/api";
|
|
|
5
5
|
import { AzureMonitorMetricExporter } from "@azure/monitor-opentelemetry-exporter";
|
|
6
6
|
import { MeterProvider, PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics";
|
|
7
7
|
import { PerformanceCounterMetricNames } from "./types.js";
|
|
8
|
+
import { hrTimeToMilliseconds } from "@opentelemetry/core";
|
|
8
9
|
import { getLogData, isExceptionData } from "./quickpulse/utils.js";
|
|
9
10
|
import { Logger } from "../shared/logging/logger.js";
|
|
11
|
+
import { readAvailableMemory } from "./utils.js";
|
|
10
12
|
import process from "node:process";
|
|
11
13
|
/**
|
|
12
14
|
* Azure Monitor PerformanceCounter Metrics
|
|
@@ -136,7 +138,7 @@ export class PerformanceCounterMetrics {
|
|
|
136
138
|
return;
|
|
137
139
|
}
|
|
138
140
|
this.totalCount++;
|
|
139
|
-
const durationMs = span.duration
|
|
141
|
+
const durationMs = hrTimeToMilliseconds(span.duration);
|
|
140
142
|
this.intervalExecutionTime += durationMs;
|
|
141
143
|
this.requestDurationHistogram.record(durationMs);
|
|
142
144
|
if (span.events) {
|
|
@@ -182,7 +184,7 @@ export class PerformanceCounterMetrics {
|
|
|
182
184
|
}
|
|
183
185
|
}
|
|
184
186
|
getAvailableMemory(observableResult) {
|
|
185
|
-
observableResult.observe(
|
|
187
|
+
observableResult.observe(readAvailableMemory());
|
|
186
188
|
}
|
|
187
189
|
getTotalCombinedCpu(cpus, lastCpus) {
|
|
188
190
|
let totalUser = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performanceCounters.js","sourceRoot":"","sources":["../../../src/metrics/performanceCounters.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport os from \"node:os\";\nimport type {\n Histogram,\n Meter,\n ObservableCallback,\n ObservableGauge,\n ObservableResult,\n} from \"@opentelemetry/api\";\nimport { SpanKind, ValueType } from \"@opentelemetry/api\";\nimport type { SdkLogRecord } from \"@opentelemetry/sdk-logs\";\nimport { AzureMonitorMetricExporter } from \"@azure/monitor-opentelemetry-exporter\";\nimport type {\n MeterProviderOptions,\n PeriodicExportingMetricReaderOptions,\n} from \"@opentelemetry/sdk-metrics\";\nimport { MeterProvider, PeriodicExportingMetricReader } from \"@opentelemetry/sdk-metrics\";\nimport type { ReadableSpan, TimedEvent } from \"@opentelemetry/sdk-trace-base\";\nimport { PerformanceCounterMetricNames } from \"./types.js\";\nimport type { AzureMonitorOpenTelemetryOptions } from \"../types.js\";\nimport { getLogData, isExceptionData } from \"./quickpulse/utils.js\";\nimport type { ExceptionData, TraceData } from \"./quickpulse/types.js\";\nimport { Logger } from \"../shared/logging/logger.js\";\nimport process from \"node:process\";\n\n/**\n * Azure Monitor PerformanceCounter Metrics\n */\nexport class PerformanceCounterMetrics {\n private internalConfig: AzureMonitorOpenTelemetryOptions;\n private collectionInterval = 60000; // 60 seconds\n private meterProvider: MeterProvider;\n private azureExporter: AzureMonitorMetricExporter;\n private meter: Meter;\n private requestDurationHistogram: Histogram;\n private requestRateGauge: ObservableGauge;\n private requestRateGaugeCallback: ObservableCallback;\n private memoryPrivateBytesGauge: ObservableGauge;\n private memoryPrivateBytesGaugeCallback: ObservableCallback;\n private memoryAvailableBytesGauge: ObservableGauge;\n private memoryAvailableBytesGaugeCallback: ObservableCallback;\n private processorTimeGauge: ObservableGauge;\n private processorTimeGaugeCallback: ObservableCallback;\n private processTimeNormalizedGauge: ObservableGauge;\n private processTimeNormalizedGaugeCallback: ObservableCallback;\n private processTimeGauge: ObservableGauge;\n private processTimeGaugeCallback: ObservableCallback;\n private exceptionCountGauge: ObservableGauge;\n private exceptionCountGaugeCallback: ObservableCallback;\n private lastExceptionRate: { count: number; time: number } = { count: 0, time: 0 };\n private totalCount: number = 0;\n private intervalExecutionTime = 0;\n private lastRequestRate: { count: number; time: number; executionInterval: number };\n private lastAppCpuUsage: { user: number; system: number };\n private lastHrtime: number[];\n private lastCpus: {\n model: string;\n speed: number;\n times: { user: number; nice: number; sys: number; idle: number; irq: number };\n }[];\n private lastCpusProcess: {\n model: string;\n speed: number;\n times: { user: number; nice: number; sys: number; idle: number; irq: number };\n }[];\n private totalExceptionCount: number = 0;\n\n /**\n * Creates performance counter instruments.\n * @param options - Distro configuration.\n * @param config - Application Insights configuration.\n */\n constructor(config: AzureMonitorOpenTelemetryOptions, options?: { collectionInterval: number }) {\n this.internalConfig = config;\n this.lastCpus = os.cpus();\n this.lastCpusProcess = os.cpus();\n this.lastAppCpuUsage = process.cpuUsage();\n this.lastHrtime = process.hrtime();\n\n this.lastRequestRate = {\n count: this.totalCount,\n time: +new Date(),\n executionInterval: this.intervalExecutionTime,\n };\n\n this.azureExporter = new AzureMonitorMetricExporter(\n this.internalConfig.azureMonitorExporterOptions,\n );\n const metricReaderOptions: PeriodicExportingMetricReaderOptions = {\n exporter: this.azureExporter,\n exportIntervalMillis: options?.collectionInterval || this.collectionInterval,\n };\n const meterProviderConfig: MeterProviderOptions = {\n readers: [new PeriodicExportingMetricReader(metricReaderOptions)],\n resource: this.internalConfig.resource,\n };\n this.meterProvider = new MeterProvider(meterProviderConfig);\n this.meter = this.meterProvider.getMeter(\"AzureMonitorPerformanceCountersMeter\");\n\n this.lastRequestRate = { count: 0, time: 0, executionInterval: 0 };\n\n // Create Instruments\n this.requestDurationHistogram = this.meter.createHistogram(\n PerformanceCounterMetricNames.REQUEST_DURATION,\n { valueType: ValueType.DOUBLE },\n );\n this.requestRateGauge = this.meter.createObservableGauge(\n PerformanceCounterMetricNames.REQUEST_RATE,\n {\n description: \"Incoming Requests Average Execution Time\",\n valueType: ValueType.DOUBLE,\n },\n );\n this.memoryPrivateBytesGauge = this.meter.createObservableGauge(\n PerformanceCounterMetricNames.PRIVATE_BYTES,\n { description: \"Amount of memory process has used in bytes\", valueType: ValueType.INT },\n );\n this.memoryAvailableBytesGauge = this.meter.createObservableGauge(\n PerformanceCounterMetricNames.AVAILABLE_BYTES,\n { description: \"Amount of available memory in bytes\", valueType: ValueType.INT },\n );\n this.processorTimeGauge = this.meter.createObservableGauge(\n PerformanceCounterMetricNames.PROCESSOR_TIME,\n {\n description: \"Processor time as a percentage\",\n valueType: ValueType.DOUBLE,\n },\n );\n this.processTimeGauge = this.meter.createObservableGauge(\n PerformanceCounterMetricNames.PROCESS_TIME_STANDARD,\n {\n description: \"Process CPU usage as a percentage\",\n valueType: ValueType.DOUBLE,\n },\n );\n this.processTimeNormalizedGauge = this.meter.createObservableGauge(\n PerformanceCounterMetricNames.PROCESS_TIME_NORMALIZED,\n {\n description: \"Process CPU usage normalized as a percentage\",\n valueType: ValueType.DOUBLE,\n },\n );\n this.exceptionCountGauge = this.meter.createObservableGauge(\n PerformanceCounterMetricNames.EXCEPTION_RATE,\n {\n description: \"Exception Rate\",\n valueType: ValueType.DOUBLE,\n },\n );\n\n // Add callbacks\n this.requestRateGaugeCallback = this.getRequestRate.bind(this);\n this.memoryPrivateBytesGaugeCallback = this.getPrivateMemory.bind(this);\n this.memoryAvailableBytesGaugeCallback = this.getAvailableMemory.bind(this);\n this.processorTimeGaugeCallback = this.getProcessorTime.bind(this);\n this.processTimeGaugeCallback = this.getProcessTime.bind(this);\n this.processTimeNormalizedGaugeCallback = this.getNormalizedProcessTime.bind(this);\n this.exceptionCountGaugeCallback = this.getExceptionRate.bind(this);\n\n this.memoryPrivateBytesGauge.addCallback(this.memoryPrivateBytesGaugeCallback);\n this.memoryAvailableBytesGauge.addCallback(this.memoryAvailableBytesGaugeCallback);\n this.processTimeGauge.addCallback(this.processTimeGaugeCallback);\n this.processTimeNormalizedGauge.addCallback(this.processTimeNormalizedGaugeCallback);\n this.processorTimeGauge.addCallback(this.processorTimeGaugeCallback);\n this.requestRateGauge.addCallback(this.requestRateGaugeCallback);\n this.exceptionCountGauge.addCallback(this.exceptionCountGaugeCallback);\n }\n\n /**\n * Shutdown Meter Provider it will return no-op Meters after being called.\n */\n public async shutdown(): Promise<void> {\n return this.meterProvider.shutdown();\n }\n\n /**\n * Force flush Meter Provider.\n */\n public async flush(): Promise<void> {\n return this.meterProvider.forceFlush();\n }\n\n /**\n *Get OpenTelemetry MeterProvider\n */\n public getMeterProvider(): MeterProvider {\n return this.meterProvider;\n }\n\n /**\n * Record Span metrics\n * @internal\n */\n public recordSpan(span: ReadableSpan): void {\n if (span.kind !== SpanKind.SERVER) {\n return;\n }\n this.totalCount++;\n const durationMs = span.duration[0];\n this.intervalExecutionTime += durationMs;\n this.requestDurationHistogram.record(durationMs);\n if (span.events) {\n span.events.forEach((event: TimedEvent) => {\n event.attributes = event.attributes || {};\n if (event.name === \"exception\") {\n this.totalExceptionCount++;\n }\n });\n }\n }\n\n /**\n * Record Log metrics\n * @internal\n */\n public recordLog(logRecord: SdkLogRecord): void {\n const columns: TraceData | ExceptionData = getLogData(logRecord);\n if (isExceptionData(columns)) {\n this.totalExceptionCount++;\n }\n }\n\n private getRequestRate(observableResult: ObservableResult): void {\n const currentTime = +new Date();\n const intervalRequests = this.totalCount - this.lastRequestRate.count || 0;\n const elapsedMs = currentTime - this.lastRequestRate.time;\n if (elapsedMs > 0) {\n const elapsedSeconds = elapsedMs / 1000;\n const requestsPerSec = intervalRequests / elapsedSeconds;\n observableResult.observe(requestsPerSec);\n }\n this.lastRequestRate = {\n count: this.totalCount,\n time: currentTime,\n executionInterval: this.lastRequestRate.executionInterval,\n };\n }\n\n private getPrivateMemory(observableResult: ObservableResult): void {\n if (process?.memoryUsage) {\n observableResult.observe(process.memoryUsage().rss);\n } else {\n Logger.getInstance().debug(\"Couldn't report Private Memory. Process is not defined.\");\n }\n }\n\n private getAvailableMemory(observableResult: ObservableResult): void {\n observableResult.observe(os.freemem());\n }\n\n private getTotalCombinedCpu(cpus: os.CpuInfo[], lastCpus: os.CpuInfo[]) {\n let totalUser = 0;\n let totalSys = 0;\n let totalNice = 0;\n let totalIdle = 0;\n let totalIrq = 0;\n for (let i = 0; !!cpus && i < cpus.length; i++) {\n const cpu = cpus[i];\n const lastCpu = lastCpus[i];\n const times = cpu.times;\n const lastTimes = lastCpu.times;\n // user cpu time (or) % CPU time spent in user space\n let user = times.user - lastTimes.user;\n user = user > 0 ? user : 0; // Avoid negative values\n totalUser += user;\n // system cpu time (or) % CPU time spent in kernel space\n let sys = times.sys - lastTimes.sys;\n sys = sys > 0 ? sys : 0; // Avoid negative values\n totalSys += sys;\n // user nice cpu time (or) % CPU time spent on low priority processes\n let nice = times.nice - lastTimes.nice;\n nice = nice > 0 ? nice : 0; // Avoid negative values\n totalNice += nice;\n // idle cpu time (or) % CPU time spent idle\n let idle = times.idle - lastTimes.idle;\n idle = idle > 0 ? idle : 0; // Avoid negative values\n totalIdle += idle;\n // irq (or) % CPU time spent servicing/handling hardware interrupts\n let irq = times.irq - lastTimes.irq;\n irq = irq > 0 ? irq : 0; // Avoid negative values\n totalIrq += irq;\n }\n const combinedTotal = totalUser + totalSys + totalNice + totalIdle + totalIrq;\n return {\n combinedTotal: combinedTotal,\n totalUser: totalUser,\n totalIdle: totalIdle,\n };\n }\n\n private getProcessorTime(observableResult: ObservableResult): void {\n // this reports total ms spent in each category since the OS was booted, to calculate percent it is necessary\n // to find the delta since the last measurement\n const cpus = os.cpus();\n if (cpus && cpus.length && this.lastCpus && cpus.length === this.lastCpus.length) {\n const cpuTotals = this.getTotalCombinedCpu(cpus, this.lastCpus);\n\n const value =\n cpuTotals.combinedTotal > 0\n ? ((cpuTotals.combinedTotal - cpuTotals.totalIdle) / cpuTotals.combinedTotal) * 100\n : 0;\n observableResult.observe(value);\n }\n this.lastCpus = cpus;\n }\n\n private getNormalizedProcessTime(observableResult: ObservableResult): void {\n // this reports total ms spent in each category since the OS was booted, to calculate percent it is necessary\n // to find the delta since the last measurement\n const cpus = os.cpus();\n if (\n cpus &&\n cpus.length &&\n this.lastCpusProcess &&\n cpus.length === this.lastCpusProcess.length\n ) {\n // Calculate % of total cpu time (user + system) this App Process used (Only supported by node v6.1.0+)\n let appCpuPercent: number | undefined = undefined;\n const appCpuUsage = process.cpuUsage();\n const hrtime = process.hrtime();\n const totalApp =\n appCpuUsage.user -\n this.lastAppCpuUsage.user +\n (appCpuUsage.system - this.lastAppCpuUsage.system) || 0;\n\n if (typeof this.lastHrtime !== \"undefined\" && this.lastHrtime.length === 2) {\n const elapsedTime =\n (hrtime[0] - this.lastHrtime[0]) * 1e6 + (hrtime[1] - this.lastHrtime[1]) / 1e3 || 0; // convert to microseconds\n\n appCpuPercent = (100 * totalApp) / (elapsedTime * cpus.length);\n }\n // Set previous\n this.lastAppCpuUsage = appCpuUsage;\n this.lastHrtime = hrtime;\n const cpuTotals = this.getTotalCombinedCpu(cpus, this.lastCpusProcess);\n let value = 0;\n if (appCpuPercent !== undefined) {\n value = appCpuPercent;\n } else {\n value = (cpuTotals.totalUser / cpuTotals.combinedTotal) * 100;\n }\n observableResult.observe(value);\n }\n this.lastCpusProcess = cpus;\n }\n\n private getProcessTime(observableResult: ObservableResult): void {\n // this reports total ms spent in each category since the OS was booted, to calculate percent it is necessary\n // to find the delta since the last measurement\n if (process) {\n const cpus = os.cpus();\n if (\n cpus &&\n cpus.length &&\n this.lastCpusProcess &&\n cpus.length === this.lastCpusProcess.length\n ) {\n // Calculate % of total cpu time (user + system) this App Process used (Only supported by node v6.1.0+)\n let appCpuPercent: number | undefined = undefined;\n const appCpuUsage = process.cpuUsage();\n const hrtime = process.hrtime();\n const totalApp =\n appCpuUsage.user -\n this.lastAppCpuUsage.user +\n (appCpuUsage.system - this.lastAppCpuUsage.system) || 0;\n\n if (typeof this.lastHrtime !== \"undefined\" && this.lastHrtime.length === 2) {\n const elapsedTime =\n (hrtime[0] - this.lastHrtime[0]) * 1e6 + (hrtime[1] - this.lastHrtime[1]) / 1e3 || 0; // convert to microseconds\n appCpuPercent = (100 * totalApp) / elapsedTime;\n }\n // Set previous\n this.lastAppCpuUsage = appCpuUsage;\n this.lastHrtime = hrtime;\n const cpuTotals = this.getTotalCombinedCpu(cpus, this.lastCpusProcess);\n let value = 0;\n if (appCpuPercent !== undefined) {\n value = appCpuPercent;\n } else {\n value = (cpuTotals.totalUser / cpuTotals.combinedTotal) * 100;\n }\n observableResult.observe(value);\n }\n this.lastCpusProcess = cpus;\n } else {\n Logger.getInstance().debug(\"Couldn't report process time. Process is not defined.\");\n }\n }\n\n private getExceptionRate(observableResult: ObservableResult): void {\n const currentTime = +new Date();\n const intervalData = this.totalExceptionCount - this.lastExceptionRate.count || 0;\n const elapsedMs = currentTime - this.lastExceptionRate.time;\n if (elapsedMs > 0) {\n const elapsedSeconds = elapsedMs / 1000;\n const dataPerSec = intervalData / elapsedSeconds;\n observableResult.observe(dataPerSec);\n }\n this.lastExceptionRate = {\n count: this.totalExceptionCount,\n time: currentTime,\n };\n }\n\n // TODO: Add Process I/O Rate\n}\n"]}
|
|
1
|
+
{"version":3,"file":"performanceCounters.js","sourceRoot":"","sources":["../../../src/metrics/performanceCounters.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport os from \"node:os\";\nimport type {\n Histogram,\n Meter,\n ObservableCallback,\n ObservableGauge,\n ObservableResult,\n} from \"@opentelemetry/api\";\nimport { SpanKind, ValueType } from \"@opentelemetry/api\";\nimport type { SdkLogRecord } from \"@opentelemetry/sdk-logs\";\nimport { AzureMonitorMetricExporter } from \"@azure/monitor-opentelemetry-exporter\";\nimport type {\n MeterProviderOptions,\n PeriodicExportingMetricReaderOptions,\n} from \"@opentelemetry/sdk-metrics\";\nimport { MeterProvider, PeriodicExportingMetricReader } from \"@opentelemetry/sdk-metrics\";\nimport type { ReadableSpan, TimedEvent } from \"@opentelemetry/sdk-trace-base\";\nimport { PerformanceCounterMetricNames } from \"./types.js\";\nimport { hrTimeToMilliseconds } from \"@opentelemetry/core\";\nimport type { AzureMonitorOpenTelemetryOptions } from \"../types.js\";\nimport { getLogData, isExceptionData } from \"./quickpulse/utils.js\";\nimport type { ExceptionData, TraceData } from \"./quickpulse/types.js\";\nimport { Logger } from \"../shared/logging/logger.js\";\nimport { readAvailableMemory } from \"./utils.js\";\nimport process from \"node:process\";\n\n/**\n * Azure Monitor PerformanceCounter Metrics\n */\nexport class PerformanceCounterMetrics {\n private internalConfig: AzureMonitorOpenTelemetryOptions;\n private collectionInterval = 60000; // 60 seconds\n private meterProvider: MeterProvider;\n private azureExporter: AzureMonitorMetricExporter;\n private meter: Meter;\n private requestDurationHistogram: Histogram;\n private requestRateGauge: ObservableGauge;\n private requestRateGaugeCallback: ObservableCallback;\n private memoryPrivateBytesGauge: ObservableGauge;\n private memoryPrivateBytesGaugeCallback: ObservableCallback;\n private memoryAvailableBytesGauge: ObservableGauge;\n private memoryAvailableBytesGaugeCallback: ObservableCallback;\n private processorTimeGauge: ObservableGauge;\n private processorTimeGaugeCallback: ObservableCallback;\n private processTimeNormalizedGauge: ObservableGauge;\n private processTimeNormalizedGaugeCallback: ObservableCallback;\n private processTimeGauge: ObservableGauge;\n private processTimeGaugeCallback: ObservableCallback;\n private exceptionCountGauge: ObservableGauge;\n private exceptionCountGaugeCallback: ObservableCallback;\n private lastExceptionRate: { count: number; time: number } = { count: 0, time: 0 };\n private totalCount: number = 0;\n private intervalExecutionTime = 0;\n private lastRequestRate: { count: number; time: number; executionInterval: number };\n private lastAppCpuUsage: { user: number; system: number };\n private lastHrtime: number[];\n private lastCpus: {\n model: string;\n speed: number;\n times: { user: number; nice: number; sys: number; idle: number; irq: number };\n }[];\n private lastCpusProcess: {\n model: string;\n speed: number;\n times: { user: number; nice: number; sys: number; idle: number; irq: number };\n }[];\n private totalExceptionCount: number = 0;\n\n /**\n * Creates performance counter instruments.\n * @param options - Distro configuration.\n * @param config - Application Insights configuration.\n */\n constructor(config: AzureMonitorOpenTelemetryOptions, options?: { collectionInterval: number }) {\n this.internalConfig = config;\n this.lastCpus = os.cpus();\n this.lastCpusProcess = os.cpus();\n this.lastAppCpuUsage = process.cpuUsage();\n this.lastHrtime = process.hrtime();\n\n this.lastRequestRate = {\n count: this.totalCount,\n time: +new Date(),\n executionInterval: this.intervalExecutionTime,\n };\n\n this.azureExporter = new AzureMonitorMetricExporter(\n this.internalConfig.azureMonitorExporterOptions,\n );\n const metricReaderOptions: PeriodicExportingMetricReaderOptions = {\n exporter: this.azureExporter,\n exportIntervalMillis: options?.collectionInterval || this.collectionInterval,\n };\n const meterProviderConfig: MeterProviderOptions = {\n readers: [new PeriodicExportingMetricReader(metricReaderOptions)],\n resource: this.internalConfig.resource,\n };\n this.meterProvider = new MeterProvider(meterProviderConfig);\n this.meter = this.meterProvider.getMeter(\"AzureMonitorPerformanceCountersMeter\");\n\n this.lastRequestRate = { count: 0, time: 0, executionInterval: 0 };\n\n // Create Instruments\n this.requestDurationHistogram = this.meter.createHistogram(\n PerformanceCounterMetricNames.REQUEST_DURATION,\n { valueType: ValueType.DOUBLE },\n );\n this.requestRateGauge = this.meter.createObservableGauge(\n PerformanceCounterMetricNames.REQUEST_RATE,\n {\n description: \"Incoming Requests Average Execution Time\",\n valueType: ValueType.DOUBLE,\n },\n );\n this.memoryPrivateBytesGauge = this.meter.createObservableGauge(\n PerformanceCounterMetricNames.PRIVATE_BYTES,\n { description: \"Amount of memory process has used in bytes\", valueType: ValueType.INT },\n );\n this.memoryAvailableBytesGauge = this.meter.createObservableGauge(\n PerformanceCounterMetricNames.AVAILABLE_BYTES,\n { description: \"Amount of available memory in bytes\", valueType: ValueType.INT },\n );\n this.processorTimeGauge = this.meter.createObservableGauge(\n PerformanceCounterMetricNames.PROCESSOR_TIME,\n {\n description: \"Processor time as a percentage\",\n valueType: ValueType.DOUBLE,\n },\n );\n this.processTimeGauge = this.meter.createObservableGauge(\n PerformanceCounterMetricNames.PROCESS_TIME_STANDARD,\n {\n description: \"Process CPU usage as a percentage\",\n valueType: ValueType.DOUBLE,\n },\n );\n this.processTimeNormalizedGauge = this.meter.createObservableGauge(\n PerformanceCounterMetricNames.PROCESS_TIME_NORMALIZED,\n {\n description: \"Process CPU usage normalized as a percentage\",\n valueType: ValueType.DOUBLE,\n },\n );\n this.exceptionCountGauge = this.meter.createObservableGauge(\n PerformanceCounterMetricNames.EXCEPTION_RATE,\n {\n description: \"Exception Rate\",\n valueType: ValueType.DOUBLE,\n },\n );\n\n // Add callbacks\n this.requestRateGaugeCallback = this.getRequestRate.bind(this);\n this.memoryPrivateBytesGaugeCallback = this.getPrivateMemory.bind(this);\n this.memoryAvailableBytesGaugeCallback = this.getAvailableMemory.bind(this);\n this.processorTimeGaugeCallback = this.getProcessorTime.bind(this);\n this.processTimeGaugeCallback = this.getProcessTime.bind(this);\n this.processTimeNormalizedGaugeCallback = this.getNormalizedProcessTime.bind(this);\n this.exceptionCountGaugeCallback = this.getExceptionRate.bind(this);\n\n this.memoryPrivateBytesGauge.addCallback(this.memoryPrivateBytesGaugeCallback);\n this.memoryAvailableBytesGauge.addCallback(this.memoryAvailableBytesGaugeCallback);\n this.processTimeGauge.addCallback(this.processTimeGaugeCallback);\n this.processTimeNormalizedGauge.addCallback(this.processTimeNormalizedGaugeCallback);\n this.processorTimeGauge.addCallback(this.processorTimeGaugeCallback);\n this.requestRateGauge.addCallback(this.requestRateGaugeCallback);\n this.exceptionCountGauge.addCallback(this.exceptionCountGaugeCallback);\n }\n\n /**\n * Shutdown Meter Provider it will return no-op Meters after being called.\n */\n public async shutdown(): Promise<void> {\n return this.meterProvider.shutdown();\n }\n\n /**\n * Force flush Meter Provider.\n */\n public async flush(): Promise<void> {\n return this.meterProvider.forceFlush();\n }\n\n /**\n *Get OpenTelemetry MeterProvider\n */\n public getMeterProvider(): MeterProvider {\n return this.meterProvider;\n }\n\n /**\n * Record Span metrics\n * @internal\n */\n public recordSpan(span: ReadableSpan): void {\n if (span.kind !== SpanKind.SERVER) {\n return;\n }\n this.totalCount++;\n const durationMs = hrTimeToMilliseconds(span.duration);\n this.intervalExecutionTime += durationMs;\n this.requestDurationHistogram.record(durationMs);\n if (span.events) {\n span.events.forEach((event: TimedEvent) => {\n event.attributes = event.attributes || {};\n if (event.name === \"exception\") {\n this.totalExceptionCount++;\n }\n });\n }\n }\n\n /**\n * Record Log metrics\n * @internal\n */\n public recordLog(logRecord: SdkLogRecord): void {\n const columns: TraceData | ExceptionData = getLogData(logRecord);\n if (isExceptionData(columns)) {\n this.totalExceptionCount++;\n }\n }\n\n private getRequestRate(observableResult: ObservableResult): void {\n const currentTime = +new Date();\n const intervalRequests = this.totalCount - this.lastRequestRate.count || 0;\n const elapsedMs = currentTime - this.lastRequestRate.time;\n if (elapsedMs > 0) {\n const elapsedSeconds = elapsedMs / 1000;\n const requestsPerSec = intervalRequests / elapsedSeconds;\n observableResult.observe(requestsPerSec);\n }\n this.lastRequestRate = {\n count: this.totalCount,\n time: currentTime,\n executionInterval: this.lastRequestRate.executionInterval,\n };\n }\n\n private getPrivateMemory(observableResult: ObservableResult): void {\n if (process?.memoryUsage) {\n observableResult.observe(process.memoryUsage().rss);\n } else {\n Logger.getInstance().debug(\"Couldn't report Private Memory. Process is not defined.\");\n }\n }\n\n private getAvailableMemory(observableResult: ObservableResult): void {\n observableResult.observe(readAvailableMemory());\n }\n\n private getTotalCombinedCpu(cpus: os.CpuInfo[], lastCpus: os.CpuInfo[]) {\n let totalUser = 0;\n let totalSys = 0;\n let totalNice = 0;\n let totalIdle = 0;\n let totalIrq = 0;\n for (let i = 0; !!cpus && i < cpus.length; i++) {\n const cpu = cpus[i];\n const lastCpu = lastCpus[i];\n const times = cpu.times;\n const lastTimes = lastCpu.times;\n // user cpu time (or) % CPU time spent in user space\n let user = times.user - lastTimes.user;\n user = user > 0 ? user : 0; // Avoid negative values\n totalUser += user;\n // system cpu time (or) % CPU time spent in kernel space\n let sys = times.sys - lastTimes.sys;\n sys = sys > 0 ? sys : 0; // Avoid negative values\n totalSys += sys;\n // user nice cpu time (or) % CPU time spent on low priority processes\n let nice = times.nice - lastTimes.nice;\n nice = nice > 0 ? nice : 0; // Avoid negative values\n totalNice += nice;\n // idle cpu time (or) % CPU time spent idle\n let idle = times.idle - lastTimes.idle;\n idle = idle > 0 ? idle : 0; // Avoid negative values\n totalIdle += idle;\n // irq (or) % CPU time spent servicing/handling hardware interrupts\n let irq = times.irq - lastTimes.irq;\n irq = irq > 0 ? irq : 0; // Avoid negative values\n totalIrq += irq;\n }\n const combinedTotal = totalUser + totalSys + totalNice + totalIdle + totalIrq;\n return {\n combinedTotal: combinedTotal,\n totalUser: totalUser,\n totalIdle: totalIdle,\n };\n }\n\n private getProcessorTime(observableResult: ObservableResult): void {\n // this reports total ms spent in each category since the OS was booted, to calculate percent it is necessary\n // to find the delta since the last measurement\n const cpus = os.cpus();\n if (cpus && cpus.length && this.lastCpus && cpus.length === this.lastCpus.length) {\n const cpuTotals = this.getTotalCombinedCpu(cpus, this.lastCpus);\n\n const value =\n cpuTotals.combinedTotal > 0\n ? ((cpuTotals.combinedTotal - cpuTotals.totalIdle) / cpuTotals.combinedTotal) * 100\n : 0;\n observableResult.observe(value);\n }\n this.lastCpus = cpus;\n }\n\n private getNormalizedProcessTime(observableResult: ObservableResult): void {\n // this reports total ms spent in each category since the OS was booted, to calculate percent it is necessary\n // to find the delta since the last measurement\n const cpus = os.cpus();\n if (\n cpus &&\n cpus.length &&\n this.lastCpusProcess &&\n cpus.length === this.lastCpusProcess.length\n ) {\n // Calculate % of total cpu time (user + system) this App Process used (Only supported by node v6.1.0+)\n let appCpuPercent: number | undefined = undefined;\n const appCpuUsage = process.cpuUsage();\n const hrtime = process.hrtime();\n const totalApp =\n appCpuUsage.user -\n this.lastAppCpuUsage.user +\n (appCpuUsage.system - this.lastAppCpuUsage.system) || 0;\n\n if (typeof this.lastHrtime !== \"undefined\" && this.lastHrtime.length === 2) {\n const elapsedTime =\n (hrtime[0] - this.lastHrtime[0]) * 1e6 + (hrtime[1] - this.lastHrtime[1]) / 1e3 || 0; // convert to microseconds\n\n appCpuPercent = (100 * totalApp) / (elapsedTime * cpus.length);\n }\n // Set previous\n this.lastAppCpuUsage = appCpuUsage;\n this.lastHrtime = hrtime;\n const cpuTotals = this.getTotalCombinedCpu(cpus, this.lastCpusProcess);\n let value = 0;\n if (appCpuPercent !== undefined) {\n value = appCpuPercent;\n } else {\n value = (cpuTotals.totalUser / cpuTotals.combinedTotal) * 100;\n }\n observableResult.observe(value);\n }\n this.lastCpusProcess = cpus;\n }\n\n private getProcessTime(observableResult: ObservableResult): void {\n // this reports total ms spent in each category since the OS was booted, to calculate percent it is necessary\n // to find the delta since the last measurement\n if (process) {\n const cpus = os.cpus();\n if (\n cpus &&\n cpus.length &&\n this.lastCpusProcess &&\n cpus.length === this.lastCpusProcess.length\n ) {\n // Calculate % of total cpu time (user + system) this App Process used (Only supported by node v6.1.0+)\n let appCpuPercent: number | undefined = undefined;\n const appCpuUsage = process.cpuUsage();\n const hrtime = process.hrtime();\n const totalApp =\n appCpuUsage.user -\n this.lastAppCpuUsage.user +\n (appCpuUsage.system - this.lastAppCpuUsage.system) || 0;\n\n if (typeof this.lastHrtime !== \"undefined\" && this.lastHrtime.length === 2) {\n const elapsedTime =\n (hrtime[0] - this.lastHrtime[0]) * 1e6 + (hrtime[1] - this.lastHrtime[1]) / 1e3 || 0; // convert to microseconds\n appCpuPercent = (100 * totalApp) / elapsedTime;\n }\n // Set previous\n this.lastAppCpuUsage = appCpuUsage;\n this.lastHrtime = hrtime;\n const cpuTotals = this.getTotalCombinedCpu(cpus, this.lastCpusProcess);\n let value = 0;\n if (appCpuPercent !== undefined) {\n value = appCpuPercent;\n } else {\n value = (cpuTotals.totalUser / cpuTotals.combinedTotal) * 100;\n }\n observableResult.observe(value);\n }\n this.lastCpusProcess = cpus;\n } else {\n Logger.getInstance().debug(\"Couldn't report process time. Process is not defined.\");\n }\n }\n\n private getExceptionRate(observableResult: ObservableResult): void {\n const currentTime = +new Date();\n const intervalData = this.totalExceptionCount - this.lastExceptionRate.count || 0;\n const elapsedMs = currentTime - this.lastExceptionRate.time;\n if (elapsedMs > 0) {\n const elapsedSeconds = elapsedMs / 1000;\n const dataPerSec = intervalData / elapsedSeconds;\n observableResult.observe(dataPerSec);\n }\n this.lastExceptionRate = {\n count: this.totalExceptionCount,\n time: currentTime,\n };\n }\n\n // TODO: Add Process I/O Rate\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../../../../src/metrics/quickpulse/export/exporter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AACtF,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAU/C;;GAEG;AACH,qBAAa,wBAAyB,YAAW,kBAAkB;IACjE,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../../../../src/metrics/quickpulse/export/exporter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AACtF,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAU/C;;GAEG;AACH,qBAAa,wBAAyB,YAAW,kBAAkB;IACjE,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,YAAY,CAAqD;IACzE,OAAO,CAAC,cAAc,CAA0B;IAEhD,OAAO,CAAC,uBAAuB,CAAsB;IACrD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,WAAW,CAAuC;IAC1D,OAAO,CAAC,wBAAwB,CAA4B;IAE5D;;;OAGG;gBAES,OAAO,EAAE,yBAAyB;IAgB9C;;;;OAIG;IAEG,MAAM,CACV,OAAO,EAAE,eAAe,EACxB,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAC7C,OAAO,CAAC,IAAI,CAAC;IAyBhB;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtC;;OAEG;IACI,4BAA4B,CAAC,cAAc,EAAE,cAAc,GAAG,sBAAsB;IAU3F;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxC;;OAEG;IACI,SAAS,IAAI,gBAAgB;IAI7B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAGnC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../../../../src/metrics/quickpulse/export/exporter.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAExE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAQ/C,OAAO,EAAE,mBAAmB,EAAE,oCAAoC,EAAE,MAAM,aAAa,CAAC;AAExF;;GAEG;AACH,MAAM,OAAO,wBAAwB;IAC3B,MAAM,CAAmB;IACzB,YAAY,
|
|
1
|
+
{"version":3,"file":"exporter.js","sourceRoot":"","sources":["../../../../../src/metrics/quickpulse/export/exporter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport { context, diag } from \"@opentelemetry/api\";\nimport type { PushMetricExporter, ResourceMetrics } from \"@opentelemetry/sdk-metrics\";\nimport { AggregationTemporality, InstrumentType } from \"@opentelemetry/sdk-metrics\";\nimport type { ExportResult } from \"@opentelemetry/core\";\nimport { ExportResultCode, suppressTracing } from \"@opentelemetry/core\";\nimport type { QuickpulseExporterOptions } from \"../types.js\";\nimport { QuickpulseSender } from \"./sender.js\";\nimport type {\n DocumentIngress,\n MonitoringDataPoint,\n PublishOptionalParams,\n CollectionConfigurationError,\n} from \"../../../generated/index.js\";\nimport type { QuickpulseResponse } from \"./sender.js\";\nimport { getTransmissionTime, resourceMetricsToQuickpulseDataPoint } from \"../utils.js\";\n\n/**\n * Quickpulse Metric Exporter.\n */\nexport class QuickpulseMetricExporter implements PushMetricExporter {\n private sender: QuickpulseSender;\n private postCallback: (response: QuickpulseResponse | undefined) => void;\n private getDocumentsFn: () => DocumentIngress[];\n // Monitoring data point with common properties\n private baseMonitoringDataPoint: MonitoringDataPoint;\n private etag: string;\n private getErrorsFn: () => CollectionConfigurationError[];\n private getDerivedMetricValuesFn: () => Map<string, number>;\n\n /**\n * Initializes a new instance of the AzureMonitorMetricExporter class.\n * @param AzureExporterConfig - Exporter configuration.\n */\n\n constructor(options: QuickpulseExporterOptions) {\n this.sender = new QuickpulseSender({\n endpointUrl: options.endpointUrl,\n instrumentationKey: options.instrumentationKey,\n credential: options.credential,\n credentialScopes: options.credentialScopes,\n });\n this.postCallback = options.postCallback;\n this.getDocumentsFn = options.getDocumentsFn;\n this.baseMonitoringDataPoint = options.baseMonitoringDataPoint;\n this.getErrorsFn = options.getErrorsFn;\n this.etag = \"\";\n this.getDerivedMetricValuesFn = options.getDerivedMetricValuesFn;\n diag.debug(\"QuickpulseMetricExporter was successfully setup\");\n }\n\n /**\n * Export OpenTelemetry resource metrics.\n * @param metrics - Resource metrics to export.\n * @param resultCallback - Result callback.\n */\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n async export(\n metrics: ResourceMetrics,\n resultCallback: (result: ExportResult) => void,\n ): Promise<void> {\n diag.info(`Exporting Live metrics(s). Converting to envelopes...`);\n const optionalParams: PublishOptionalParams = {\n monitoringDataPoints: resourceMetricsToQuickpulseDataPoint(\n metrics,\n this.baseMonitoringDataPoint,\n this.getDocumentsFn(),\n this.getErrorsFn(),\n this.getDerivedMetricValuesFn(),\n ),\n transmissionTime: getTransmissionTime(),\n configurationEtag: this.etag,\n };\n // Supress tracing until OpenTelemetry Metrics SDK support it\n await context.with(suppressTracing(context.active()), async () => {\n try {\n this.postCallback(await this.sender.publish(optionalParams));\n resultCallback({ code: ExportResultCode.SUCCESS });\n } catch (error) {\n this.postCallback(undefined);\n resultCallback({ code: ExportResultCode.FAILED });\n }\n });\n }\n\n /**\n * Shutdown Exporter.\n */\n public async shutdown(): Promise<void> {\n diag.info(\"QuickpulseMetricExporter shutting down\");\n return Promise.resolve();\n }\n\n /**\n * Select aggregation temporality\n */\n public selectAggregationTemporality(instrumentType: InstrumentType): AggregationTemporality {\n if (\n instrumentType === InstrumentType.UP_DOWN_COUNTER ||\n instrumentType === InstrumentType.OBSERVABLE_UP_DOWN_COUNTER\n ) {\n return AggregationTemporality.CUMULATIVE;\n }\n return AggregationTemporality.DELTA;\n }\n\n /**\n * Force flush\n */\n public async forceFlush(): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * Get Sender\n */\n public getSender(): QuickpulseSender {\n return this.sender;\n }\n\n public setEtag(etag: string): void {\n this.etag = etag;\n }\n}\n"]}
|
|
@@ -1,30 +1,47 @@
|
|
|
1
1
|
import type { TokenCredential } from "@azure/core-auth";
|
|
2
|
-
import type { IsSubscribedOptionalParams,
|
|
2
|
+
import type { IsSubscribedOptionalParams, PublishOptionalParams, CollectionConfigurationInfo } from "../../../generated/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Response type that includes the body and response headers from the Live Metrics service.
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
export interface QuickpulseResponse extends CollectionConfigurationInfo {
|
|
8
|
+
/** Whether the instrumentation key is subscribed. */
|
|
9
|
+
xMsQpsSubscribed?: string;
|
|
10
|
+
/** Configuration ETag. */
|
|
11
|
+
xMsQpsConfigurationEtag?: string;
|
|
12
|
+
/** Polling interval hint (only for ping). */
|
|
13
|
+
xMsQpsServicePollingIntervalHint?: string;
|
|
14
|
+
/** Endpoint redirect (only for ping). */
|
|
15
|
+
xMsQpsServiceEndpointRedirectV2?: string;
|
|
16
|
+
}
|
|
3
17
|
/**
|
|
4
18
|
* Quickpulse sender class
|
|
5
19
|
* @internal
|
|
6
20
|
*/
|
|
7
21
|
export declare class QuickpulseSender {
|
|
8
|
-
private
|
|
9
|
-
private quickpulseClientOptions;
|
|
22
|
+
private quickpulseClient;
|
|
10
23
|
private instrumentationKey;
|
|
11
24
|
private endpointUrl;
|
|
25
|
+
private credential;
|
|
26
|
+
private credentialScopes;
|
|
27
|
+
private quickpulseClientOptions;
|
|
12
28
|
constructor(options: {
|
|
13
29
|
endpointUrl: string;
|
|
14
30
|
instrumentationKey: string;
|
|
15
31
|
credential?: TokenCredential;
|
|
16
32
|
credentialScopes?: string | string[];
|
|
17
33
|
});
|
|
34
|
+
private createQuickpulseClient;
|
|
18
35
|
/**
|
|
19
36
|
* isSubscribed Quickpulse service
|
|
20
37
|
* @internal
|
|
21
38
|
*/
|
|
22
|
-
isSubscribed(optionalParams: IsSubscribedOptionalParams): Promise<
|
|
39
|
+
isSubscribed(optionalParams: IsSubscribedOptionalParams): Promise<QuickpulseResponse | undefined>;
|
|
23
40
|
/**
|
|
24
41
|
* publish Quickpulse service
|
|
25
42
|
* @internal
|
|
26
43
|
*/
|
|
27
|
-
publish(optionalParams: PublishOptionalParams): Promise<
|
|
44
|
+
publish(optionalParams: PublishOptionalParams): Promise<QuickpulseResponse | undefined>;
|
|
28
45
|
handlePermanentRedirect(location: string | undefined): void;
|
|
29
46
|
}
|
|
30
47
|
//# sourceMappingURL=sender.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../../../../../src/metrics/quickpulse/export/sender.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,KAAK,EACV,0BAA0B,EAC1B,
|
|
1
|
+
{"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../../../../../src/metrics/quickpulse/export/sender.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,KAAK,EACV,0BAA0B,EAC1B,qBAAqB,EAErB,2BAA2B,EAC5B,MAAM,6BAA6B,CAAC;AAKrC;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,2BAA2B;IACrE,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0BAA0B;IAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,6CAA6C;IAC7C,gCAAgC,CAAC,EAAE,MAAM,CAAC;IAC1C,yCAAyC;IACzC,+BAA+B,CAAC,EAAE,MAAM,CAAC;CAC1C;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,gBAAgB,CAAW;IAEnC,OAAO,CAAC,uBAAuB,CAG7B;gBAEU,OAAO,EAAE;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,UAAU,CAAC,EAAE,eAAe,CAAC;QAC7B,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KACtC;IA+BD,OAAO,CAAC,sBAAsB;IAO9B;;;OAGG;IACG,YAAY,CAChB,cAAc,EAAE,0BAA0B,GACzC,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAuB1C;;;OAGG;IACG,OAAO,CAAC,cAAc,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAqB7F,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;CAa5D"}
|
|
@@ -4,37 +4,51 @@ import url from "url";
|
|
|
4
4
|
import { redirectPolicyName } from "@azure/core-rest-pipeline";
|
|
5
5
|
import { diag } from "@opentelemetry/api";
|
|
6
6
|
import { QuickpulseClient } from "../../../generated/index.js";
|
|
7
|
-
const applicationInsightsResource = "https://monitor.azure.com
|
|
7
|
+
const applicationInsightsResource = "https://monitor.azure.com/.default";
|
|
8
8
|
/**
|
|
9
9
|
* Quickpulse sender class
|
|
10
10
|
* @internal
|
|
11
11
|
*/
|
|
12
12
|
export class QuickpulseSender {
|
|
13
13
|
quickpulseClient;
|
|
14
|
-
quickpulseClientOptions;
|
|
15
14
|
instrumentationKey;
|
|
16
15
|
endpointUrl;
|
|
16
|
+
credential;
|
|
17
|
+
credentialScopes;
|
|
18
|
+
// @ts-expect-error - assigned in constructor, accessed by tests via bracket notation
|
|
19
|
+
quickpulseClientOptions;
|
|
17
20
|
constructor(options) {
|
|
18
21
|
// Build endpoint using provided configuration or default values
|
|
19
22
|
this.endpointUrl = options.endpointUrl;
|
|
20
|
-
|
|
23
|
+
const clientOptions = {
|
|
21
24
|
endpoint: this.endpointUrl,
|
|
22
25
|
};
|
|
23
26
|
this.instrumentationKey = options.instrumentationKey;
|
|
27
|
+
this.credential = options.credential;
|
|
28
|
+
// Configure credential scopes
|
|
29
|
+
if (options.credentialScopes) {
|
|
30
|
+
this.credentialScopes = Array.isArray(options.credentialScopes)
|
|
31
|
+
? options.credentialScopes
|
|
32
|
+
: [options.credentialScopes];
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
this.credentialScopes = [applicationInsightsResource];
|
|
36
|
+
}
|
|
24
37
|
if (options.credential) {
|
|
25
|
-
|
|
26
|
-
// Add credentialScopes
|
|
27
|
-
if (options.credentialScopes) {
|
|
28
|
-
this.quickpulseClientOptions.credentialScopes = options.credentialScopes;
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
// Default
|
|
32
|
-
this.quickpulseClientOptions.credentialScopes = [applicationInsightsResource];
|
|
33
|
-
}
|
|
38
|
+
clientOptions.credentials = { scopes: this.credentialScopes };
|
|
34
39
|
}
|
|
35
|
-
|
|
40
|
+
// Store credential info for testability
|
|
41
|
+
this.quickpulseClientOptions = {
|
|
42
|
+
credential: options.credential,
|
|
43
|
+
credentialScopes: this.credentialScopes,
|
|
44
|
+
};
|
|
45
|
+
this.quickpulseClient = this.createQuickpulseClient(clientOptions);
|
|
46
|
+
}
|
|
47
|
+
createQuickpulseClient(clientOptions) {
|
|
48
|
+
const client = new QuickpulseClient(this.credential, clientOptions);
|
|
36
49
|
// Handle redirects in HTTP Sender
|
|
37
|
-
|
|
50
|
+
client.pipeline.removePolicy({ name: redirectPolicyName });
|
|
51
|
+
return client;
|
|
38
52
|
}
|
|
39
53
|
/**
|
|
40
54
|
* isSubscribed Quickpulse service
|
|
@@ -42,8 +56,20 @@ export class QuickpulseSender {
|
|
|
42
56
|
*/
|
|
43
57
|
async isSubscribed(optionalParams) {
|
|
44
58
|
try {
|
|
45
|
-
|
|
46
|
-
|
|
59
|
+
let responseHeaders = {};
|
|
60
|
+
const body = await this.quickpulseClient.isSubscribed(this.instrumentationKey, {
|
|
61
|
+
...optionalParams,
|
|
62
|
+
onResponse: (rawResponse) => {
|
|
63
|
+
responseHeaders = rawResponse.headers.toJSON();
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
...body,
|
|
68
|
+
xMsQpsSubscribed: responseHeaders["x-ms-qps-subscribed"],
|
|
69
|
+
xMsQpsConfigurationEtag: responseHeaders["x-ms-qps-configuration-etag"],
|
|
70
|
+
xMsQpsServicePollingIntervalHint: responseHeaders["x-ms-qps-service-polling-interval-hint"],
|
|
71
|
+
xMsQpsServiceEndpointRedirectV2: responseHeaders["x-ms-qps-service-endpoint-redirect-v2"],
|
|
72
|
+
};
|
|
47
73
|
}
|
|
48
74
|
catch (error) {
|
|
49
75
|
const restError = error;
|
|
@@ -57,8 +83,18 @@ export class QuickpulseSender {
|
|
|
57
83
|
*/
|
|
58
84
|
async publish(optionalParams) {
|
|
59
85
|
try {
|
|
60
|
-
|
|
61
|
-
|
|
86
|
+
let responseHeaders = {};
|
|
87
|
+
const body = await this.quickpulseClient.publish(this.instrumentationKey, {
|
|
88
|
+
...optionalParams,
|
|
89
|
+
onResponse: (rawResponse) => {
|
|
90
|
+
responseHeaders = rawResponse.headers.toJSON();
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
return {
|
|
94
|
+
...body,
|
|
95
|
+
xMsQpsSubscribed: responseHeaders["x-ms-qps-subscribed"],
|
|
96
|
+
xMsQpsConfigurationEtag: responseHeaders["x-ms-qps-configuration-etag"],
|
|
97
|
+
};
|
|
62
98
|
}
|
|
63
99
|
catch (error) {
|
|
64
100
|
const restError = error;
|
|
@@ -71,6 +107,11 @@ export class QuickpulseSender {
|
|
|
71
107
|
const locUrl = new url.URL(location);
|
|
72
108
|
if (locUrl && locUrl.host) {
|
|
73
109
|
this.endpointUrl = "https://" + locUrl.host;
|
|
110
|
+
// Recreate the client so subsequent requests use the new endpoint
|
|
111
|
+
this.quickpulseClient = this.createQuickpulseClient({
|
|
112
|
+
endpoint: this.endpointUrl,
|
|
113
|
+
credentials: { scopes: this.credentialScopes },
|
|
114
|
+
});
|
|
74
115
|
}
|
|
75
116
|
}
|
|
76
117
|
}
|