@azure/monitor-opentelemetry 1.19.0 → 1.20.1

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.
Files changed (117) hide show
  1. package/README.md +7 -3
  2. package/dist/commonjs/browserSdkLoader/browserSdkLoaderHelper.d.ts.map +1 -1
  3. package/dist/commonjs/browserSdkLoader/browserSdkLoaderHelper.js +1 -2
  4. package/dist/commonjs/browserSdkLoader/browserSdkLoaderHelper.js.map +1 -1
  5. package/dist/commonjs/index.d.ts +2 -2
  6. package/dist/commonjs/index.d.ts.map +1 -1
  7. package/dist/commonjs/index.js +18 -31
  8. package/dist/commonjs/index.js.map +1 -1
  9. package/dist/commonjs/logs/handler.d.ts +2 -1
  10. package/dist/commonjs/logs/handler.d.ts.map +1 -1
  11. package/dist/commonjs/logs/handler.js +14 -8
  12. package/dist/commonjs/logs/handler.js.map +1 -1
  13. package/dist/commonjs/metrics/performanceCounters.d.ts +3 -0
  14. package/dist/commonjs/metrics/performanceCounters.d.ts.map +1 -1
  15. package/dist/commonjs/metrics/performanceCounters.js +26 -26
  16. package/dist/commonjs/metrics/performanceCounters.js.map +1 -1
  17. package/dist/commonjs/metrics/quickpulse/export/sender.d.ts +1 -1
  18. package/dist/commonjs/metrics/quickpulse/export/sender.d.ts.map +1 -1
  19. package/dist/commonjs/metrics/quickpulse/export/sender.js +29 -23
  20. package/dist/commonjs/metrics/quickpulse/export/sender.js.map +1 -1
  21. package/dist/commonjs/metrics/quickpulse/liveMetrics.d.ts +5 -1
  22. package/dist/commonjs/metrics/quickpulse/liveMetrics.d.ts.map +1 -1
  23. package/dist/commonjs/metrics/quickpulse/liveMetrics.js +86 -75
  24. package/dist/commonjs/metrics/quickpulse/liveMetrics.js.map +1 -1
  25. package/dist/commonjs/package.json +6 -1
  26. package/dist/commonjs/shared/config.d.ts +7 -0
  27. package/dist/commonjs/shared/config.d.ts.map +1 -1
  28. package/dist/commonjs/shared/config.js +27 -6
  29. package/dist/commonjs/shared/config.js.map +1 -1
  30. package/dist/commonjs/traces/azureSdkInstrumentation.d.ts +12 -0
  31. package/dist/commonjs/traces/azureSdkInstrumentation.d.ts.map +1 -0
  32. package/dist/commonjs/traces/azureSdkInstrumentation.js +64 -0
  33. package/dist/commonjs/traces/azureSdkInstrumentation.js.map +1 -0
  34. package/dist/commonjs/traces/handler.d.ts +2 -13
  35. package/dist/commonjs/traces/handler.d.ts.map +1 -1
  36. package/dist/commonjs/traces/handler.js +14 -43
  37. package/dist/commonjs/traces/handler.js.map +1 -1
  38. package/dist/commonjs/traces/sampler.js +1 -1
  39. package/dist/commonjs/traces/sampler.js.map +1 -1
  40. package/dist/commonjs/tsdoc-metadata.json +1 -1
  41. package/dist/commonjs/types.d.ts +11 -2
  42. package/dist/commonjs/types.d.ts.map +1 -1
  43. package/dist/commonjs/types.js +1 -1
  44. package/dist/commonjs/types.js.map +1 -1
  45. package/dist/commonjs/utils/azureSdkTracingBridge.d.ts +4 -4
  46. package/dist/commonjs/utils/azureSdkTracingBridge.d.ts.map +1 -1
  47. package/dist/commonjs/utils/azureSdkTracingBridge.js +10 -8
  48. package/dist/commonjs/utils/azureSdkTracingBridge.js.map +1 -1
  49. package/dist/commonjs/utils/common.d.ts +24 -0
  50. package/dist/commonjs/utils/common.d.ts.map +1 -1
  51. package/dist/commonjs/utils/common.js +47 -0
  52. package/dist/commonjs/utils/common.js.map +1 -1
  53. package/dist/commonjs/utils/instrumentation.d.ts +8 -0
  54. package/dist/commonjs/utils/instrumentation.d.ts.map +1 -0
  55. package/dist/commonjs/utils/instrumentation.js +26 -0
  56. package/dist/commonjs/utils/instrumentation.js.map +1 -0
  57. package/dist/commonjs/utils/statsbeat.d.ts.map +1 -1
  58. package/dist/commonjs/utils/statsbeat.js +3 -1
  59. package/dist/commonjs/utils/statsbeat.js.map +1 -1
  60. package/dist/esm/browserSdkLoader/browserSdkLoaderHelper.d.ts.map +1 -1
  61. package/dist/esm/browserSdkLoader/browserSdkLoaderHelper.js +1 -2
  62. package/dist/esm/browserSdkLoader/browserSdkLoaderHelper.js.map +1 -1
  63. package/dist/esm/index.d.ts +2 -2
  64. package/dist/esm/index.d.ts.map +1 -1
  65. package/dist/esm/index.js +18 -31
  66. package/dist/esm/index.js.map +1 -1
  67. package/dist/esm/logs/handler.d.ts +2 -1
  68. package/dist/esm/logs/handler.d.ts.map +1 -1
  69. package/dist/esm/logs/handler.js +14 -8
  70. package/dist/esm/logs/handler.js.map +1 -1
  71. package/dist/esm/metrics/performanceCounters.d.ts +3 -0
  72. package/dist/esm/metrics/performanceCounters.d.ts.map +1 -1
  73. package/dist/esm/metrics/performanceCounters.js +26 -26
  74. package/dist/esm/metrics/performanceCounters.js.map +1 -1
  75. package/dist/esm/metrics/quickpulse/export/sender.d.ts +1 -1
  76. package/dist/esm/metrics/quickpulse/export/sender.d.ts.map +1 -1
  77. package/dist/esm/metrics/quickpulse/export/sender.js +29 -23
  78. package/dist/esm/metrics/quickpulse/export/sender.js.map +1 -1
  79. package/dist/esm/metrics/quickpulse/liveMetrics.d.ts +5 -1
  80. package/dist/esm/metrics/quickpulse/liveMetrics.d.ts.map +1 -1
  81. package/dist/esm/metrics/quickpulse/liveMetrics.js +86 -75
  82. package/dist/esm/metrics/quickpulse/liveMetrics.js.map +1 -1
  83. package/dist/esm/package.json +6 -1
  84. package/dist/esm/shared/config.d.ts +7 -0
  85. package/dist/esm/shared/config.d.ts.map +1 -1
  86. package/dist/esm/shared/config.js +28 -7
  87. package/dist/esm/shared/config.js.map +1 -1
  88. package/dist/esm/traces/azureSdkInstrumentation.d.ts +12 -0
  89. package/dist/esm/traces/azureSdkInstrumentation.d.ts.map +1 -0
  90. package/dist/esm/traces/azureSdkInstrumentation.js +60 -0
  91. package/dist/esm/traces/azureSdkInstrumentation.js.map +1 -0
  92. package/dist/esm/traces/handler.d.ts +2 -13
  93. package/dist/esm/traces/handler.d.ts.map +1 -1
  94. package/dist/esm/traces/handler.js +14 -42
  95. package/dist/esm/traces/handler.js.map +1 -1
  96. package/dist/esm/traces/sampler.js +1 -1
  97. package/dist/esm/traces/sampler.js.map +1 -1
  98. package/dist/esm/types.d.ts +11 -2
  99. package/dist/esm/types.d.ts.map +1 -1
  100. package/dist/esm/types.js +1 -1
  101. package/dist/esm/types.js.map +1 -1
  102. package/dist/esm/utils/azureSdkTracingBridge.d.ts +4 -4
  103. package/dist/esm/utils/azureSdkTracingBridge.d.ts.map +1 -1
  104. package/dist/esm/utils/azureSdkTracingBridge.js +11 -7
  105. package/dist/esm/utils/azureSdkTracingBridge.js.map +1 -1
  106. package/dist/esm/utils/common.d.ts +24 -0
  107. package/dist/esm/utils/common.d.ts.map +1 -1
  108. package/dist/esm/utils/common.js +45 -0
  109. package/dist/esm/utils/common.js.map +1 -1
  110. package/dist/esm/utils/instrumentation.d.ts +8 -0
  111. package/dist/esm/utils/instrumentation.d.ts.map +1 -0
  112. package/dist/esm/utils/instrumentation.js +23 -0
  113. package/dist/esm/utils/instrumentation.js.map +1 -0
  114. package/dist/esm/utils/statsbeat.d.ts.map +1 -1
  115. package/dist/esm/utils/statsbeat.js +4 -2
  116. package/dist/esm/utils/statsbeat.js.map +1 -1
  117. package/package.json +33 -30
@@ -3,12 +3,27 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getResourceProvider = exports.isAks = exports.isFunctionApp = exports.isAppService = exports.getOsPrefix = exports.isDarwin = exports.isLinux = exports.isWindows = void 0;
4
4
  exports.hasNumberFlag = hasNumberFlag;
5
5
  exports.addNumberFlag = addNumberFlag;
6
+ exports.removeNumberFlag = removeNumberFlag;
6
7
  exports.ignoreOutgoingRequestHook = ignoreOutgoingRequestHook;
8
+ exports.isAksResourceDetectorPopulated = isAksResourceDetectorPopulated;
7
9
  exports.msToTimeSpan = msToTimeSpan;
8
10
  exports.parseResourceDetectorsFromEnvVar = parseResourceDetectorsFromEnvVar;
9
11
  const resources_1 = require("@opentelemetry/resources");
10
12
  const api_1 = require("@opentelemetry/api");
11
13
  const resource_detector_azure_1 = require("@opentelemetry/resource-detector-azure");
14
+ /**
15
+ * Resource attribute holding the ARM resource ID of the AKS cluster, populated by the AKS
16
+ * resource detector. Declared locally because it is an unstable semantic convention that the
17
+ * detector package does not export.
18
+ * @internal
19
+ */
20
+ const CLOUD_RESOURCE_ID_ATTRIBUTE = "cloud.resource_id";
21
+ /**
22
+ * Matches the full ARM resource ID of an AKS managed cluster, for example
23
+ * `/subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.ContainerService/managedClusters/{name}`.
24
+ * @internal
25
+ */
26
+ const AKS_MANAGED_CLUSTER_RESOURCE_ID_REGEX = /^\/subscriptions\/[^/\s]+\/resourceGroups\/[^/\s]+\/providers\/Microsoft\.ContainerService\/managedClusters\/[^/\s]+\/?$/i;
12
27
  /**
13
28
  * Tests a flag without 32-bit coercion.
14
29
  * @internal
@@ -23,6 +38,13 @@ function hasNumberFlag(mask, flag) {
23
38
  function addNumberFlag(mask, flag) {
24
39
  return flag > 0 && !hasNumberFlag(mask, flag) ? mask + flag : mask;
25
40
  }
41
+ /**
42
+ * Clears a flag without 32-bit coercion.
43
+ * @internal
44
+ */
45
+ function removeNumberFlag(mask, flag) {
46
+ return hasNumberFlag(mask, flag) ? mask - flag : mask;
47
+ }
26
48
  function ignoreOutgoingRequestHook(request) {
27
49
  if (request && request.headers && !Array.isArray(request.headers)) {
28
50
  const outgoingHeaders = request.headers;
@@ -79,6 +101,31 @@ const isAks = () => {
79
101
  return process.env.AKS_ARM_NAMESPACE_ID || process.env.KUBERNETES_SERVICE_HOST ? true : false;
80
102
  };
81
103
  exports.isAks = isAks;
104
+ /**
105
+ * Determines whether the AKS resource detector was actually able to populate the AKS cluster
106
+ * attributes, based on the attributes that detector - and only that detector - produced.
107
+ *
108
+ * This is only the case when the customer is running in AKS *and* has correctly wired up access
109
+ * to the `aks-cluster-metadata` ConfigMap in the `kube-public` namespace (RBAC role and role
110
+ * binding, surfaced either through the `CLUSTER_RESOURCE_ID` environment variable or through the
111
+ * mounted ConfigMap file).
112
+ *
113
+ * The merged resource is deliberately not inspected, because `k8s.cluster.name` and
114
+ * `cloud.resource_id` can also be contributed by other sources - the App Service, Functions and
115
+ * VM detectors all set `cloud.resource_id`, and both attributes can be supplied by the customer
116
+ * through `OTEL_RESOURCE_ATTRIBUTES` or a custom resource - none of which indicate that the AKS
117
+ * resource detector is working. The cluster resource ID is additionally validated to be a full
118
+ * AKS managed cluster ARM ID, since the detector does not validate the value it reads.
119
+ * @internal
120
+ */
121
+ function isAksResourceDetectorPopulated(attributes = {}) {
122
+ if (!(0, exports.isAks)()) {
123
+ return false;
124
+ }
125
+ const clusterResourceId = attributes[CLOUD_RESOURCE_ID_ATTRIBUTE];
126
+ return (typeof clusterResourceId === "string" &&
127
+ AKS_MANAGED_CLUSTER_RESOURCE_ID_REGEX.test(clusterResourceId.trim()));
128
+ }
82
129
  /**
83
130
  * Get prefix resource provider, vm will considered as "unknown RP"
84
131
  * Web App: "a"
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/utils/common.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type http from \"node:http\";\nimport type { ResourceDetector } from \"@opentelemetry/resources\";\nimport {\n envDetector,\n hostDetector,\n osDetector,\n processDetector,\n serviceInstanceIdDetector,\n} from \"@opentelemetry/resources\";\nimport { diag } from \"@opentelemetry/api\";\nimport {\n azureAksDetector,\n azureAppServiceDetector,\n azureFunctionsDetector,\n azureVmDetector,\n} from \"@opentelemetry/resource-detector-azure\";\n\n/**\n * Tests a flag without 32-bit coercion.\n * @internal\n */\nexport function hasNumberFlag(mask: number, flag: number): boolean {\n return flag > 0 && Math.floor(mask / flag) % 2 === 1;\n}\n\n/**\n * Sets a flag without 32-bit coercion.\n * @internal\n */\nexport function addNumberFlag(mask: number, flag: number): number {\n return flag > 0 && !hasNumberFlag(mask, flag) ? mask + flag : mask;\n}\n\nexport function ignoreOutgoingRequestHook(request: http.RequestOptions): boolean {\n if (request && request.headers && !Array.isArray(request.headers)) {\n const outgoingHeaders = request.headers as http.OutgoingHttpHeaders;\n if (\n (outgoingHeaders[\"User-Agent\"] &&\n outgoingHeaders[\"User-Agent\"]\n .toString()\n .indexOf(\"azsdk-js-monitor-opentelemetry-exporter\") > -1) ||\n (outgoingHeaders[\"user-agent\"] &&\n outgoingHeaders[\"user-agent\"]\n .toString()\n .indexOf(\"azsdk-js-monitor-opentelemetry-exporter\") > -1)\n ) {\n return true;\n }\n }\n return false;\n}\n\nexport const isWindows = (): boolean => {\n return process.platform === \"win32\";\n};\n\nexport const isLinux = (): boolean => {\n return process.platform === \"linux\";\n};\n\nexport const isDarwin = (): boolean => {\n return process.platform === \"darwin\";\n};\n\n/**\n * Get prefix for OS\n * Windows system: \"w\"\n * Linux system: \"l\"\n * non-Windows and non-Linux system: \"u\" (unknown)\n */\nexport const getOsPrefix = (): string => {\n return isWindows() ? \"w\" : isLinux() ? \"l\" : \"u\";\n};\n\n/**\n * Get prefix resource provider, vm will considered as \"unknown RP\"\n * Web App: \"a\"\n * Function App: \"f\"\n * non-Web and non-Function APP: \"u\" (unknown)\n */\nexport const isAppService = (): boolean => {\n return process.env.WEBSITE_SITE_NAME && !process.env.FUNCTIONS_WORKER_RUNTIME ? true : false;\n};\n\nexport const isFunctionApp = (): boolean => {\n return process.env.FUNCTIONS_WORKER_RUNTIME ? true : false;\n};\n\nexport const isAks = (): boolean => {\n return process.env.AKS_ARM_NAMESPACE_ID || process.env.KUBERNETES_SERVICE_HOST ? true : false;\n};\n\n/**\n * Get prefix resource provider, vm will considered as \"unknown RP\"\n * Web App: \"a\"\n * Function App: \"f\"\n * AKS: \"k\"\n * non-Web and non-Function APP: \"u\" (unknown)\n */\nexport const getResourceProvider = (): string => {\n if (isAppService()) {\n return \"a\";\n }\n if (isFunctionApp()) {\n return \"f\";\n }\n if (isAks()) {\n return \"k\";\n }\n return \"u\";\n};\n\n/**\n * Convert milliseconds to Breeze expected time.\n * @internal\n */\nexport function msToTimeSpan(ms: number): string {\n let totalms = ms;\n if (Number.isNaN(totalms) || totalms < 0 || !Number.isFinite(ms)) {\n totalms = 0;\n }\n\n let sec = ((totalms / 1000) % 60).toFixed(7).replace(/0{0,4}$/, \"\");\n let min = `${Math.floor(totalms / (1000 * 60)) % 60}`;\n let hour = `${Math.floor(totalms / (1000 * 60 * 60)) % 24}`;\n const days = Math.floor(totalms / (1000 * 60 * 60 * 24));\n\n sec = sec.indexOf(\".\") < 2 ? `0${sec}` : sec;\n min = min.length < 2 ? `0${min}` : min;\n hour = hour.length < 2 ? `0${hour}` : hour;\n const daysText = days > 0 ? `${days}.` : \"\";\n\n return `${daysText + hour}:${min}:${sec}`;\n}\n\n// This function is a slight modification of an upstream otel util function -\n// mainly for prioritizing the resource detectors customer may specify over\n// env var & not enabling process detector by default.\nexport function parseResourceDetectorsFromEnvVar(): Array<ResourceDetector> {\n const resourceDetectors = new Map<string, ResourceDetector>([\n [\"env\", envDetector],\n [\"host\", hostDetector],\n [\"os\", osDetector],\n [\"process\", processDetector],\n [\"serviceinstance\", serviceInstanceIdDetector],\n [\"azure_aks\", azureAksDetector],\n [\"azure_app_service\", azureAppServiceDetector],\n [\"azure_functions\", azureFunctionsDetector],\n [\"azure_vm\", azureVmDetector],\n ]);\n\n if (process.env.OTEL_NODE_RESOURCE_DETECTORS != null) {\n const resourceDetectorsFromEnv = process.env.OTEL_NODE_RESOURCE_DETECTORS?.split(\",\") ?? [\n \"env\",\n \"host\",\n \"os\",\n ];\n\n if (resourceDetectorsFromEnv.includes(\"all\")) {\n return [...resourceDetectors.values()];\n }\n\n if (resourceDetectorsFromEnv.includes(\"none\")) {\n return [];\n }\n\n return resourceDetectorsFromEnv.flatMap((detector) => {\n const resourceDetector = resourceDetectors.get(detector);\n if (!resourceDetector) {\n diag.error(\n `Invalid resource detector \"${detector}\" specified in the environment variable OTEL_NODE_RESOURCE_DETECTORS`,\n );\n return [];\n }\n return [resourceDetector];\n });\n } else {\n // leaving out the process detector as that can add many resource attributes\n // with large values. Also not enabling service instance attributes by default\n // as this is still experimental.\n return [envDetector, hostDetector, osDetector];\n }\n}\n"]}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/utils/common.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type http from \"node:http\";\nimport type { Attributes } from \"@opentelemetry/api\";\nimport type { ResourceDetector } from \"@opentelemetry/resources\";\nimport {\n envDetector,\n hostDetector,\n osDetector,\n processDetector,\n serviceInstanceIdDetector,\n} from \"@opentelemetry/resources\";\nimport { diag } from \"@opentelemetry/api\";\nimport {\n azureAksDetector,\n azureAppServiceDetector,\n azureFunctionsDetector,\n azureVmDetector,\n} from \"@opentelemetry/resource-detector-azure\";\n\n/**\n * Resource attribute holding the ARM resource ID of the AKS cluster, populated by the AKS\n * resource detector. Declared locally because it is an unstable semantic convention that the\n * detector package does not export.\n * @internal\n */\nconst CLOUD_RESOURCE_ID_ATTRIBUTE = \"cloud.resource_id\";\n\n/**\n * Matches the full ARM resource ID of an AKS managed cluster, for example\n * `/subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.ContainerService/managedClusters/{name}`.\n * @internal\n */\nconst AKS_MANAGED_CLUSTER_RESOURCE_ID_REGEX =\n /^\\/subscriptions\\/[^/\\s]+\\/resourceGroups\\/[^/\\s]+\\/providers\\/Microsoft\\.ContainerService\\/managedClusters\\/[^/\\s]+\\/?$/i;\n\n/**\n * Tests a flag without 32-bit coercion.\n * @internal\n */\nexport function hasNumberFlag(mask: number, flag: number): boolean {\n return flag > 0 && Math.floor(mask / flag) % 2 === 1;\n}\n\n/**\n * Sets a flag without 32-bit coercion.\n * @internal\n */\nexport function addNumberFlag(mask: number, flag: number): number {\n return flag > 0 && !hasNumberFlag(mask, flag) ? mask + flag : mask;\n}\n\n/**\n * Clears a flag without 32-bit coercion.\n * @internal\n */\nexport function removeNumberFlag(mask: number, flag: number): number {\n return hasNumberFlag(mask, flag) ? mask - flag : mask;\n}\n\nexport function ignoreOutgoingRequestHook(request: http.RequestOptions): boolean {\n if (request && request.headers && !Array.isArray(request.headers)) {\n const outgoingHeaders = request.headers as http.OutgoingHttpHeaders;\n if (\n (outgoingHeaders[\"User-Agent\"] &&\n outgoingHeaders[\"User-Agent\"]\n .toString()\n .indexOf(\"azsdk-js-monitor-opentelemetry-exporter\") > -1) ||\n (outgoingHeaders[\"user-agent\"] &&\n outgoingHeaders[\"user-agent\"]\n .toString()\n .indexOf(\"azsdk-js-monitor-opentelemetry-exporter\") > -1)\n ) {\n return true;\n }\n }\n return false;\n}\n\nexport const isWindows = (): boolean => {\n return process.platform === \"win32\";\n};\n\nexport const isLinux = (): boolean => {\n return process.platform === \"linux\";\n};\n\nexport const isDarwin = (): boolean => {\n return process.platform === \"darwin\";\n};\n\n/**\n * Get prefix for OS\n * Windows system: \"w\"\n * Linux system: \"l\"\n * non-Windows and non-Linux system: \"u\" (unknown)\n */\nexport const getOsPrefix = (): string => {\n return isWindows() ? \"w\" : isLinux() ? \"l\" : \"u\";\n};\n\n/**\n * Get prefix resource provider, vm will considered as \"unknown RP\"\n * Web App: \"a\"\n * Function App: \"f\"\n * non-Web and non-Function APP: \"u\" (unknown)\n */\nexport const isAppService = (): boolean => {\n return process.env.WEBSITE_SITE_NAME && !process.env.FUNCTIONS_WORKER_RUNTIME ? true : false;\n};\n\nexport const isFunctionApp = (): boolean => {\n return process.env.FUNCTIONS_WORKER_RUNTIME ? true : false;\n};\n\nexport const isAks = (): boolean => {\n return process.env.AKS_ARM_NAMESPACE_ID || process.env.KUBERNETES_SERVICE_HOST ? true : false;\n};\n\n/**\n * Determines whether the AKS resource detector was actually able to populate the AKS cluster\n * attributes, based on the attributes that detector - and only that detector - produced.\n *\n * This is only the case when the customer is running in AKS *and* has correctly wired up access\n * to the `aks-cluster-metadata` ConfigMap in the `kube-public` namespace (RBAC role and role\n * binding, surfaced either through the `CLUSTER_RESOURCE_ID` environment variable or through the\n * mounted ConfigMap file).\n *\n * The merged resource is deliberately not inspected, because `k8s.cluster.name` and\n * `cloud.resource_id` can also be contributed by other sources - the App Service, Functions and\n * VM detectors all set `cloud.resource_id`, and both attributes can be supplied by the customer\n * through `OTEL_RESOURCE_ATTRIBUTES` or a custom resource - none of which indicate that the AKS\n * resource detector is working. The cluster resource ID is additionally validated to be a full\n * AKS managed cluster ARM ID, since the detector does not validate the value it reads.\n * @internal\n */\nexport function isAksResourceDetectorPopulated(attributes: Attributes = {}): boolean {\n if (!isAks()) {\n return false;\n }\n const clusterResourceId = attributes[CLOUD_RESOURCE_ID_ATTRIBUTE];\n return (\n typeof clusterResourceId === \"string\" &&\n AKS_MANAGED_CLUSTER_RESOURCE_ID_REGEX.test(clusterResourceId.trim())\n );\n}\n\n/**\n * Get prefix resource provider, vm will considered as \"unknown RP\"\n * Web App: \"a\"\n * Function App: \"f\"\n * AKS: \"k\"\n * non-Web and non-Function APP: \"u\" (unknown)\n */\nexport const getResourceProvider = (): string => {\n if (isAppService()) {\n return \"a\";\n }\n if (isFunctionApp()) {\n return \"f\";\n }\n if (isAks()) {\n return \"k\";\n }\n return \"u\";\n};\n\n/**\n * Convert milliseconds to Breeze expected time.\n * @internal\n */\nexport function msToTimeSpan(ms: number): string {\n let totalms = ms;\n if (Number.isNaN(totalms) || totalms < 0 || !Number.isFinite(ms)) {\n totalms = 0;\n }\n\n let sec = ((totalms / 1000) % 60).toFixed(7).replace(/0{0,4}$/, \"\");\n let min = `${Math.floor(totalms / (1000 * 60)) % 60}`;\n let hour = `${Math.floor(totalms / (1000 * 60 * 60)) % 24}`;\n const days = Math.floor(totalms / (1000 * 60 * 60 * 24));\n\n sec = sec.indexOf(\".\") < 2 ? `0${sec}` : sec;\n min = min.length < 2 ? `0${min}` : min;\n hour = hour.length < 2 ? `0${hour}` : hour;\n const daysText = days > 0 ? `${days}.` : \"\";\n\n return `${daysText + hour}:${min}:${sec}`;\n}\n\n// This function is a slight modification of an upstream otel util function -\n// mainly for prioritizing the resource detectors customer may specify over\n// env var & not enabling process detector by default.\nexport function parseResourceDetectorsFromEnvVar(): Array<ResourceDetector> {\n const resourceDetectors = new Map<string, ResourceDetector>([\n [\"env\", envDetector],\n [\"host\", hostDetector],\n [\"os\", osDetector],\n [\"process\", processDetector],\n [\"serviceinstance\", serviceInstanceIdDetector],\n [\"azure_aks\", azureAksDetector],\n [\"azure_app_service\", azureAppServiceDetector],\n [\"azure_functions\", azureFunctionsDetector],\n [\"azure_vm\", azureVmDetector],\n ]);\n\n if (process.env.OTEL_NODE_RESOURCE_DETECTORS != null) {\n const resourceDetectorsFromEnv = process.env.OTEL_NODE_RESOURCE_DETECTORS?.split(\",\") ?? [\n \"env\",\n \"host\",\n \"os\",\n ];\n\n if (resourceDetectorsFromEnv.includes(\"all\")) {\n return [...resourceDetectors.values()];\n }\n\n if (resourceDetectorsFromEnv.includes(\"none\")) {\n return [];\n }\n\n return resourceDetectorsFromEnv.flatMap((detector) => {\n const resourceDetector = resourceDetectors.get(detector);\n if (!resourceDetector) {\n diag.error(\n `Invalid resource detector \"${detector}\" specified in the environment variable OTEL_NODE_RESOURCE_DETECTORS`,\n );\n return [];\n }\n return [resourceDetector];\n });\n } else {\n // leaving out the process detector as that can add many resource attributes\n // with large values. Also not enabling service instance attributes by default\n // as this is still experimental.\n return [envDetector, hostDetector, osDetector];\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import type { Instrumentation, InstrumentationConfig } from "@opentelemetry/instrumentation";
2
+ /**
3
+ * Reuse module hooks across SDK lifetimes: new hooks cannot reliably patch
4
+ * libraries that have already been loaded. NodeSDK supplies the new providers
5
+ * before enabling the returned instrumentation.
6
+ */
7
+ export declare function configureInstrumentation<T extends InstrumentationConfig>(cache: Map<string, Instrumentation> | undefined, name: string, config: T, create: (config: T) => Instrumentation): Instrumentation;
8
+ //# sourceMappingURL=instrumentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../../src/utils/instrumentation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAE7F;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,qBAAqB,EACtE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,SAAS,EAC/C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,eAAe,GACrC,eAAe,CAajB"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT License.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.configureInstrumentation = configureInstrumentation;
6
+ /**
7
+ * Reuse module hooks across SDK lifetimes: new hooks cannot reliably patch
8
+ * libraries that have already been loaded. NodeSDK supplies the new providers
9
+ * before enabling the returned instrumentation.
10
+ */
11
+ function configureInstrumentation(cache, name, config, create) {
12
+ if (!cache) {
13
+ return create(config);
14
+ }
15
+ const deferredConfig = { ...config, enabled: false };
16
+ let instrumentation = cache.get(name);
17
+ if (instrumentation) {
18
+ instrumentation.setConfig(deferredConfig);
19
+ }
20
+ else {
21
+ instrumentation = create(deferredConfig);
22
+ cache.set(name, instrumentation);
23
+ }
24
+ return instrumentation;
25
+ }
26
+ //# sourceMappingURL=instrumentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../../../src/utils/instrumentation.ts"],"names":[],"mappings":";AAAA,uCAAuC;AACvC,kCAAkC;;AASlC,4DAkBC;AAvBD;;;;GAIG;AACH,SAAgB,wBAAwB,CACtC,KAA+C,EAC/C,IAAY,EACZ,MAAS,EACT,MAAsC;IAEtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IACD,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACrD,IAAI,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,eAAe,EAAE,CAAC;QACpB,eAAe,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,eAAe,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;QACzC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type { Instrumentation, InstrumentationConfig } from \"@opentelemetry/instrumentation\";\n\n/**\n * Reuse module hooks across SDK lifetimes: new hooks cannot reliably patch\n * libraries that have already been loaded. NodeSDK supplies the new providers\n * before enabling the returned instrumentation.\n */\nexport function configureInstrumentation<T extends InstrumentationConfig>(\n cache: Map<string, Instrumentation> | undefined,\n name: string,\n config: T,\n create: (config: T) => Instrumentation,\n): Instrumentation {\n if (!cache) {\n return create(config);\n }\n const deferredConfig = { ...config, enabled: false };\n let instrumentation = cache.get(name);\n if (instrumentation) {\n instrumentation.setConfig(deferredConfig);\n } else {\n instrumentation = create(deferredConfig);\n cache.set(name, instrumentation);\n }\n return instrumentation;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"statsbeat.d.ts","sourceRoot":"","sources":["../../../src/utils/statsbeat.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,iBAAiB,EACjB,yBAAyB,EAE1B,MAAM,aAAa,CAAC;AAarB,cAAM,sBAAsB;IAE1B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,gCAAgC,CAAiC;IACzE,OAAO,CAAC,wBAAwB,CAAyB;;IAmBlD,oBAAoB,GACzB,2BAA2B,yBAAyB,EACpD,mBAAmB,iBAAiB,UA4GpC;CACH;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,sBAAsB,CAKpD"}
1
+ {"version":3,"file":"statsbeat.d.ts","sourceRoot":"","sources":["../../../src/utils/statsbeat.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,iBAAiB,EACjB,yBAAyB,EAE1B,MAAM,aAAa,CAAC;AAarB,cAAM,sBAAsB;IAE1B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,gCAAgC,CAAiC;IACzE,OAAO,CAAC,wBAAwB,CAAyB;;IAmBlD,oBAAoB,GACzB,2BAA2B,yBAAyB,EACpD,mBAAmB,iBAAiB,UAiHpC;CACH;AAED;;;GAGG;AACH,wBAAgB,WAAW,IAAI,sBAAsB,CAKpD"}
@@ -107,7 +107,9 @@ class StatsbeatConfiguration {
107
107
  try {
108
108
  const currentFeaturesBitMap = Number(process.env[types_js_1.AZURE_MONITOR_STATSBEAT_FEATURES]);
109
109
  if (!isNaN(currentFeaturesBitMap)) {
110
- featureBitMap |= currentFeaturesBitMap;
110
+ // The AKS resource detector feature always reflects whether *this* process was able to
111
+ // read the AKS cluster metadata, so it is never inherited from a seeded bit map.
112
+ featureBitMap |= (0, common_js_1.removeNumberFlag)(currentFeaturesBitMap, types_js_1.StatsbeatFeature.AKS_RESOURCE_DETECTOR_POPULATION);
111
113
  }
112
114
  process.env[types_js_1.AZURE_MONITOR_STATSBEAT_FEATURES] = JSON.stringify({
113
115
  instrumentation: instrumentationBitMap,
@@ -1 +1 @@
1
- {"version":3,"file":"statsbeat.js","sourceRoot":"","sources":["../../../src/utils/statsbeat.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n StatsbeatEnvironmentConfig,\n StatsbeatFeatures,\n StatsbeatInstrumentations,\n StatsbeatOption,\n} from \"../types.js\";\nimport {\n AZURE_MONITOR_STATSBEAT_FEATURES,\n StatsbeatFeature,\n StatsbeatFeaturesMap,\n StatsbeatInstrumentation,\n StatsbeatInstrumentationsMap,\n} from \"../types.js\";\nimport { Logger as InternalLogger } from \"../shared/logging/index.js\";\nimport { addNumberFlag, hasNumberFlag } from \"./common.js\";\n\nlet instance: StatsbeatConfiguration;\n\nclass StatsbeatConfiguration {\n // Initial Statsbeat options\n private initializedByShim = false;\n private currentStatsbeatInstrumentations: StatsbeatInstrumentations = {};\n private currentStatsbeatFeatures: StatsbeatFeatures = {};\n\n constructor() {\n // Check for shim initialization upon construction\n try {\n if (\n JSON.parse(process.env[AZURE_MONITOR_STATSBEAT_FEATURES] || \"{}\").feature &\n StatsbeatFeature.SHIM\n ) {\n this.initializedByShim = true;\n }\n } catch (error) {\n InternalLogger.getInstance().error(\n \"Failed to parse statsbeat config environment variable.\",\n error,\n );\n }\n }\n\n public setStatsbeatFeatures = (\n statsbeatInstrumentations: StatsbeatInstrumentations,\n statsbeatFeatures: StatsbeatFeatures,\n ) => {\n let statsbeatEnv: StatsbeatEnvironmentConfig;\n try {\n statsbeatEnv = JSON.parse(process.env[AZURE_MONITOR_STATSBEAT_FEATURES] || \"{}\");\n } catch (error) {\n InternalLogger.getInstance().error(\n \"Failed to parse statsbeat config environment variable.\",\n error,\n );\n }\n this.currentStatsbeatInstrumentations = {\n ...this.currentStatsbeatInstrumentations,\n ...statsbeatInstrumentations,\n };\n this.currentStatsbeatFeatures = { ...this.currentStatsbeatFeatures, ...statsbeatFeatures };\n\n // Set the statsbeat options for community instrumentations based on the environment variable\n const envInstrumentation = statsbeatEnv!.instrumentation;\n statsbeatInstrumentations = {\n ...this.currentStatsbeatInstrumentations,\n amqplib: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.AMQPLIB),\n cucumber: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.CUCUMBER),\n dataloader: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.DATALOADER),\n fs: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.FS),\n lruMemoizer: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.LRU_MEMOIZER),\n mongoose: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.MONGOOSE),\n runtimeNode: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.RUNTIME_NODE),\n socketIo: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.SOCKET_IO),\n tedious: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.TEDIOUS),\n undici: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.UNDICI),\n cassandra: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.CASSANDRA),\n connect: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.CONNECT),\n dns: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.DNS),\n express: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.EXPRESS),\n fastify: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.FASTIFY),\n genericPool: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.GENERIC_POOL),\n graphql: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.GRAPHQL),\n hapi: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.HAPI),\n ioredis: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.IOREDIS),\n knex: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.KNEX),\n koa: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.KOA),\n memcached: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.MEMCACHED),\n mysql2: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.MYSQL2),\n nestjsCore: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.NESTJS_CORE),\n net: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.NET),\n pino: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.PINO),\n restify: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.RESTIFY),\n router: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.ROUTER),\n };\n\n let instrumentationBitMap = StatsbeatInstrumentation.NONE;\n\n const instrumentationArray: Array<StatsbeatOption> = Object.entries(\n statsbeatInstrumentations,\n ).map((entry) => {\n return { option: entry[0], value: entry[1] };\n });\n\n // Map enabled option names to their assigned bits.\n for (let i = 0; i < instrumentationArray.length; i++) {\n if (instrumentationArray[i].value) {\n const instrumentationBit = StatsbeatInstrumentationsMap.get(instrumentationArray[i].option);\n if (instrumentationBit !== undefined) {\n instrumentationBitMap = addNumberFlag(instrumentationBitMap, instrumentationBit);\n }\n }\n }\n\n // Create feature bit map\n let featureBitMap = StatsbeatFeature.NONE;\n\n if (this.initializedByShim) {\n this.currentStatsbeatFeatures.shim = true;\n } else {\n this.currentStatsbeatFeatures.distro = true;\n }\n\n if (statsbeatFeatures.liveMetrics) {\n this.currentStatsbeatFeatures.liveMetrics = true;\n }\n\n const featureArray: Array<StatsbeatOption> = Object.entries(this.currentStatsbeatFeatures).map(\n (entry) => {\n return { option: entry[0], value: entry[1] };\n },\n );\n\n // Map the feature options to a bit map\n for (let i = 0; i < featureArray.length; i++) {\n if (featureArray[i].value) {\n featureBitMap |= StatsbeatFeaturesMap.get(featureArray[i].option)!;\n }\n }\n\n // Merge old statsbeat options with new statsbeat options overriding any common properties\n try {\n const currentFeaturesBitMap = Number(process.env[AZURE_MONITOR_STATSBEAT_FEATURES]);\n if (!isNaN(currentFeaturesBitMap)) {\n featureBitMap |= currentFeaturesBitMap;\n }\n process.env[AZURE_MONITOR_STATSBEAT_FEATURES] = JSON.stringify({\n instrumentation: instrumentationBitMap,\n feature: featureBitMap,\n });\n } catch (error) {\n InternalLogger.getInstance().error(\"Failed call to JSON.stringify.\", error);\n }\n };\n}\n\n/**\n * Singleton Statsbeat instance.\n * @internal\n */\nexport function getInstance(): StatsbeatConfiguration {\n if (!instance) {\n instance = new StatsbeatConfiguration();\n }\n return instance;\n}\n"]}
1
+ {"version":3,"file":"statsbeat.js","sourceRoot":"","sources":["../../../src/utils/statsbeat.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n StatsbeatEnvironmentConfig,\n StatsbeatFeatures,\n StatsbeatInstrumentations,\n StatsbeatOption,\n} from \"../types.js\";\nimport {\n AZURE_MONITOR_STATSBEAT_FEATURES,\n StatsbeatFeature,\n StatsbeatFeaturesMap,\n StatsbeatInstrumentation,\n StatsbeatInstrumentationsMap,\n} from \"../types.js\";\nimport { Logger as InternalLogger } from \"../shared/logging/index.js\";\nimport { addNumberFlag, hasNumberFlag, removeNumberFlag } from \"./common.js\";\n\nlet instance: StatsbeatConfiguration;\n\nclass StatsbeatConfiguration {\n // Initial Statsbeat options\n private initializedByShim = false;\n private currentStatsbeatInstrumentations: StatsbeatInstrumentations = {};\n private currentStatsbeatFeatures: StatsbeatFeatures = {};\n\n constructor() {\n // Check for shim initialization upon construction\n try {\n if (\n JSON.parse(process.env[AZURE_MONITOR_STATSBEAT_FEATURES] || \"{}\").feature &\n StatsbeatFeature.SHIM\n ) {\n this.initializedByShim = true;\n }\n } catch (error) {\n InternalLogger.getInstance().error(\n \"Failed to parse statsbeat config environment variable.\",\n error,\n );\n }\n }\n\n public setStatsbeatFeatures = (\n statsbeatInstrumentations: StatsbeatInstrumentations,\n statsbeatFeatures: StatsbeatFeatures,\n ) => {\n let statsbeatEnv: StatsbeatEnvironmentConfig;\n try {\n statsbeatEnv = JSON.parse(process.env[AZURE_MONITOR_STATSBEAT_FEATURES] || \"{}\");\n } catch (error) {\n InternalLogger.getInstance().error(\n \"Failed to parse statsbeat config environment variable.\",\n error,\n );\n }\n this.currentStatsbeatInstrumentations = {\n ...this.currentStatsbeatInstrumentations,\n ...statsbeatInstrumentations,\n };\n this.currentStatsbeatFeatures = { ...this.currentStatsbeatFeatures, ...statsbeatFeatures };\n\n // Set the statsbeat options for community instrumentations based on the environment variable\n const envInstrumentation = statsbeatEnv!.instrumentation;\n statsbeatInstrumentations = {\n ...this.currentStatsbeatInstrumentations,\n amqplib: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.AMQPLIB),\n cucumber: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.CUCUMBER),\n dataloader: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.DATALOADER),\n fs: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.FS),\n lruMemoizer: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.LRU_MEMOIZER),\n mongoose: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.MONGOOSE),\n runtimeNode: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.RUNTIME_NODE),\n socketIo: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.SOCKET_IO),\n tedious: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.TEDIOUS),\n undici: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.UNDICI),\n cassandra: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.CASSANDRA),\n connect: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.CONNECT),\n dns: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.DNS),\n express: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.EXPRESS),\n fastify: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.FASTIFY),\n genericPool: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.GENERIC_POOL),\n graphql: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.GRAPHQL),\n hapi: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.HAPI),\n ioredis: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.IOREDIS),\n knex: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.KNEX),\n koa: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.KOA),\n memcached: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.MEMCACHED),\n mysql2: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.MYSQL2),\n nestjsCore: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.NESTJS_CORE),\n net: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.NET),\n pino: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.PINO),\n restify: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.RESTIFY),\n router: hasNumberFlag(envInstrumentation, StatsbeatInstrumentation.ROUTER),\n };\n\n let instrumentationBitMap = StatsbeatInstrumentation.NONE;\n\n const instrumentationArray: Array<StatsbeatOption> = Object.entries(\n statsbeatInstrumentations,\n ).map((entry) => {\n return { option: entry[0], value: entry[1] };\n });\n\n // Map enabled option names to their assigned bits.\n for (let i = 0; i < instrumentationArray.length; i++) {\n if (instrumentationArray[i].value) {\n const instrumentationBit = StatsbeatInstrumentationsMap.get(instrumentationArray[i].option);\n if (instrumentationBit !== undefined) {\n instrumentationBitMap = addNumberFlag(instrumentationBitMap, instrumentationBit);\n }\n }\n }\n\n // Create feature bit map\n let featureBitMap = StatsbeatFeature.NONE;\n\n if (this.initializedByShim) {\n this.currentStatsbeatFeatures.shim = true;\n } else {\n this.currentStatsbeatFeatures.distro = true;\n }\n\n if (statsbeatFeatures.liveMetrics) {\n this.currentStatsbeatFeatures.liveMetrics = true;\n }\n\n const featureArray: Array<StatsbeatOption> = Object.entries(this.currentStatsbeatFeatures).map(\n (entry) => {\n return { option: entry[0], value: entry[1] };\n },\n );\n\n // Map the feature options to a bit map\n for (let i = 0; i < featureArray.length; i++) {\n if (featureArray[i].value) {\n featureBitMap |= StatsbeatFeaturesMap.get(featureArray[i].option)!;\n }\n }\n\n // Merge old statsbeat options with new statsbeat options overriding any common properties\n try {\n const currentFeaturesBitMap = Number(process.env[AZURE_MONITOR_STATSBEAT_FEATURES]);\n if (!isNaN(currentFeaturesBitMap)) {\n // The AKS resource detector feature always reflects whether *this* process was able to\n // read the AKS cluster metadata, so it is never inherited from a seeded bit map.\n featureBitMap |= removeNumberFlag(\n currentFeaturesBitMap,\n StatsbeatFeature.AKS_RESOURCE_DETECTOR_POPULATION,\n );\n }\n process.env[AZURE_MONITOR_STATSBEAT_FEATURES] = JSON.stringify({\n instrumentation: instrumentationBitMap,\n feature: featureBitMap,\n });\n } catch (error) {\n InternalLogger.getInstance().error(\"Failed call to JSON.stringify.\", error);\n }\n };\n}\n\n/**\n * Singleton Statsbeat instance.\n * @internal\n */\nexport function getInstance(): StatsbeatConfiguration {\n if (!instance) {\n instance = new StatsbeatConfiguration();\n }\n return instance;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"browserSdkLoaderHelper.d.ts","sourceRoot":"","sources":["../../../src/browserSdkLoader/browserSdkLoaderHelper.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,oBAAY,qBAAqB;IAC/B,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,EAAE,OAAO;CACV;AAGD,eAAO,MAAM,mBAAmB,UAS/B,CAAC;AAGF,eAAO,MAAM,iBAAiB,QAAO,OAGpC,CAAC;AAEF,eAAO,MAAM,SAAS,gCAAuB,CAAC;AAC9C,eAAO,MAAM,WAAW,kCAAyB,CAAC;AAClD,eAAO,MAAM,YAAY,mCAA0B,CAAC;AACpD,eAAO,MAAM,YAAY,mCAA0B,CAAC;AAGpD,eAAO,MAAM,sBAAsB,GAAI,YAAY,GAAG,KAAG,QAAQ,GAAG,IAMnE,CAAC;AAGF,eAAO,MAAM,qBAAqB,GAAI,YAAY,GAAG,KAAG,QAAQ,GAAG,IAOlE,CAAC;AAGF,eAAO,MAAM,wBAAwB,GAAI,YAAY,GAAG,KAAG,QAAQ,GAAG,IAMrE,CAAC;AAGF,eAAO,MAAM,uBAAuB,GAAI,YAAY,GAAG,KAAG,QAAQ,GAAG,IAOpE,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,GAAG,IAStE,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,IAShE,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,gBAAgB,MAAM,KACrB,qBAAqB,GAAG,IAe1B,CAAC;AAIF,eAAO,MAAM,6BAA6B,GACxC,UAAU,IAAI,CAAC,cAAc,KAC5B,qBAAqB,EAAE,GAAG,IAW5B,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,OAAO,MAAM,EACb,MAAM,MAAM,EACZ,SAAS,MAAM,KACd,MAAM,GAAG,IAOX,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,UAAU,IAAI,CAAC,cAAc,KAAG,OAWvE,CAAC"}
1
+ {"version":3,"file":"browserSdkLoaderHelper.d.ts","sourceRoot":"","sources":["../../../src/browserSdkLoader/browserSdkLoaderHelper.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,oBAAY,qBAAqB;IAC/B,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,EAAE,OAAO;CACV;AAGD,eAAO,MAAM,mBAAmB,UAS/B,CAAC;AAGF,eAAO,MAAM,iBAAiB,QAAO,OAGpC,CAAC;AAEF,eAAO,MAAM,SAAS,gCAAuB,CAAC;AAC9C,eAAO,MAAM,WAAW,kCAAyB,CAAC;AAClD,eAAO,MAAM,YAAY,mCAA0B,CAAC;AACpD,eAAO,MAAM,YAAY,mCAA0B,CAAC;AAGpD,eAAO,MAAM,sBAAsB,GAAI,YAAY,GAAG,KAAG,QAAQ,GAAG,IAMnE,CAAC;AAGF,eAAO,MAAM,qBAAqB,GAAI,YAAY,GAAG,KAAG,QAAQ,GAAG,IAOlE,CAAC;AAGF,eAAO,MAAM,wBAAwB,GAAI,YAAY,GAAG,KAAG,QAAQ,GAAG,IAMrE,CAAC;AAGF,eAAO,MAAM,uBAAuB,GAAI,YAAY,GAAG,KAAG,QAAQ,GAAG,IAOpE,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,OAAO,MAAM,KAAG,OAAO,GAAG,IAStE,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,IAShE,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,gBAAgB,MAAM,KACrB,qBAAqB,GAAG,IAe1B,CAAC;AAIF,eAAO,MAAM,6BAA6B,GACxC,UAAU,IAAI,CAAC,cAAc,KAC5B,qBAAqB,EAAE,GAAG,IAW5B,CAAC;AAEF,eAAO,MAAM,6BAA6B,GACxC,OAAO,MAAM,EACb,MAAM,MAAM,EACZ,SAAS,MAAM,KACd,MAAM,GAAG,IAMX,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,UAAU,IAAI,CAAC,cAAc,KAAG,OAWvE,CAAC"}
@@ -117,10 +117,9 @@ export const getContentEncodingFromHeaders = (response) => {
117
117
  export const insertBrowserSdkLoaderByIndex = (index, html, snippet) => {
118
118
  if (index < 0)
119
119
  return null;
120
- let newHtml = null;
121
120
  const subStart = html.substring(0, index);
122
121
  const subEnd = html.substring(index);
123
- newHtml = subStart + '<script type="text/javascript">' + snippet + "</script>" + subEnd;
122
+ const newHtml = subStart + '<script type="text/javascript">' + snippet + "</script>" + subEnd;
124
123
  return newHtml;
125
124
  };
126
125
  export const isContentTypeHeaderHtml = (response) => {
@@ -1 +1 @@
1
- {"version":3,"file":"browserSdkLoaderHelper.js","sourceRoot":"","sources":["../../../src/browserSdkLoader/browserSdkLoaderHelper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n\nimport * as zlib from \"zlib\";\nimport { promisify } from \"node:util\";\nimport type http from \"node:http\";\n\n// currently support the following encoding types\nexport enum contentEncodingMethod {\n GZIP = \"gzip\",\n DEFLATE = \"deflate\",\n BR = \"br\",\n}\n\n// current supported encoding types\nexport const bufferEncodingTypes = [\n \"utf8\",\n \"utf16le\",\n \"latin1\",\n \"base64\",\n \"hex\",\n \"ascii\",\n \"binary\",\n \"ucs2\",\n];\n\n// for node version under 10, Brotli compression is not supported.\nexport const isBrotliSupported = (): boolean => {\n const majVer = process.versions.node.split(\".\")[0];\n return parseInt(majVer) >= 10;\n};\n\nexport const gzipAsync = promisify(zlib.gzip);\nexport const gunzipAsync = promisify(zlib.gunzip);\nexport const deflateAsync = promisify(zlib.deflate);\nexport const inflateAsync = promisify(zlib.inflate);\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const getBrotliCompressAsync = (zlibObject: any): Function | null => {\n const isMajorVer = isBrotliSupported();\n if (isMajorVer && typeof zlibObject.brotliCompress === \"function\") {\n return promisify(zlibObject.brotliCompress);\n }\n return null;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const getBrotliCompressSync = (zlibObject: any): Function | null => {\n const isMajorVer = isBrotliSupported();\n if (isMajorVer && typeof zlibObject.brotliCompressSync === \"function\") {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return zlibObject.brotliCompressSync;\n }\n return null;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const getBrotliDecompressAsync = (zlibObject: any): Function | null => {\n const isMajorVer = isBrotliSupported();\n if (isMajorVer && typeof zlibObject.brotliDecompress === \"function\") {\n return promisify(zlibObject.brotliDecompress);\n }\n return null;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const getBrotliDecompressSync = (zlibObject: any): Function | null => {\n const isMajorVer = isBrotliSupported();\n if (isMajorVer && typeof zlibObject.brotliDecompressSync === \"function\") {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return zlibObject.brotliDecompressSync;\n }\n return null;\n};\n\nexport const isBufferType = (buffer: Buffer, type?: string): boolean | null => {\n const encodingType = type ? type : \"utf8\";\n let result = false;\n if (Buffer.isEncoding(encodingType)) {\n const newBuffer = Buffer.from(buffer.toString(encodingType), encodingType);\n result = newBuffer.toJSON().data.toString() === buffer.toJSON().data.toString();\n }\n\n return result;\n};\n\nexport const findBufferEncodingType = (buffer: Buffer): string | null => {\n let bufferType = null;\n for (const type of bufferEncodingTypes) {\n if (Buffer.isEncoding(type) && isBufferType(buffer, type)) {\n bufferType = type;\n break;\n }\n }\n return bufferType;\n};\n\nexport const isSupportedContentEncoding = (\n encodingMethod: string,\n): contentEncodingMethod | null => {\n let encodingType = null;\n switch (encodingMethod) {\n case \"gzip\":\n encodingType = contentEncodingMethod.GZIP;\n break;\n case \"br\":\n encodingType = contentEncodingMethod.BR;\n break;\n case \"deflate\":\n encodingType = contentEncodingMethod.DEFLATE;\n break;\n default:\n }\n return encodingType;\n};\n\n// mutiple content-encoding is not supported\n// for mutiple content-encoding, this method will return any empty array\nexport const getContentEncodingFromHeaders = (\n response: http.ServerResponse,\n): contentEncodingMethod[] | null => {\n const headers: contentEncodingMethod[] = [];\n const contentEncodingHeaders = response.getHeader(\"Content-Encoding\");\n if (!contentEncodingHeaders) return null;\n if (typeof contentEncodingHeaders === \"string\") {\n const supportedContentEncoding = isSupportedContentEncoding(contentEncodingHeaders);\n if (supportedContentEncoding) {\n headers.push(supportedContentEncoding);\n }\n }\n return headers;\n};\n\nexport const insertBrowserSdkLoaderByIndex = (\n index: number,\n html: string,\n snippet: string,\n): string | null => {\n if (index < 0) return null;\n let newHtml = null;\n const subStart = html.substring(0, index);\n const subEnd = html.substring(index);\n newHtml = subStart + '<script type=\"text/javascript\">' + snippet + \"</script>\" + subEnd;\n return newHtml;\n};\n\nexport const isContentTypeHeaderHtml = (response: http.ServerResponse): boolean => {\n let isHtml = false;\n const contentType = response.getHeader(\"Content-Type\");\n if (contentType) {\n if (typeof contentType === \"string\") {\n isHtml = contentType.indexOf(\"html\") >= 0;\n } else {\n isHtml = contentType.toString().indexOf(\"html\") >= 0;\n }\n }\n return isHtml;\n};\n"]}
1
+ {"version":3,"file":"browserSdkLoaderHelper.js","sourceRoot":"","sources":["../../../src/browserSdkLoader/browserSdkLoaderHelper.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n\nimport * as zlib from \"zlib\";\nimport { promisify } from \"node:util\";\nimport type http from \"node:http\";\n\n// currently support the following encoding types\nexport enum contentEncodingMethod {\n GZIP = \"gzip\",\n DEFLATE = \"deflate\",\n BR = \"br\",\n}\n\n// current supported encoding types\nexport const bufferEncodingTypes = [\n \"utf8\",\n \"utf16le\",\n \"latin1\",\n \"base64\",\n \"hex\",\n \"ascii\",\n \"binary\",\n \"ucs2\",\n];\n\n// for node version under 10, Brotli compression is not supported.\nexport const isBrotliSupported = (): boolean => {\n const majVer = process.versions.node.split(\".\")[0];\n return parseInt(majVer) >= 10;\n};\n\nexport const gzipAsync = promisify(zlib.gzip);\nexport const gunzipAsync = promisify(zlib.gunzip);\nexport const deflateAsync = promisify(zlib.deflate);\nexport const inflateAsync = promisify(zlib.inflate);\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const getBrotliCompressAsync = (zlibObject: any): Function | null => {\n const isMajorVer = isBrotliSupported();\n if (isMajorVer && typeof zlibObject.brotliCompress === \"function\") {\n return promisify(zlibObject.brotliCompress);\n }\n return null;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const getBrotliCompressSync = (zlibObject: any): Function | null => {\n const isMajorVer = isBrotliSupported();\n if (isMajorVer && typeof zlibObject.brotliCompressSync === \"function\") {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return zlibObject.brotliCompressSync;\n }\n return null;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const getBrotliDecompressAsync = (zlibObject: any): Function | null => {\n const isMajorVer = isBrotliSupported();\n if (isMajorVer && typeof zlibObject.brotliDecompress === \"function\") {\n return promisify(zlibObject.brotliDecompress);\n }\n return null;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const getBrotliDecompressSync = (zlibObject: any): Function | null => {\n const isMajorVer = isBrotliSupported();\n if (isMajorVer && typeof zlibObject.brotliDecompressSync === \"function\") {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return zlibObject.brotliDecompressSync;\n }\n return null;\n};\n\nexport const isBufferType = (buffer: Buffer, type?: string): boolean | null => {\n const encodingType = type ? type : \"utf8\";\n let result = false;\n if (Buffer.isEncoding(encodingType)) {\n const newBuffer = Buffer.from(buffer.toString(encodingType), encodingType);\n result = newBuffer.toJSON().data.toString() === buffer.toJSON().data.toString();\n }\n\n return result;\n};\n\nexport const findBufferEncodingType = (buffer: Buffer): string | null => {\n let bufferType = null;\n for (const type of bufferEncodingTypes) {\n if (Buffer.isEncoding(type) && isBufferType(buffer, type)) {\n bufferType = type;\n break;\n }\n }\n return bufferType;\n};\n\nexport const isSupportedContentEncoding = (\n encodingMethod: string,\n): contentEncodingMethod | null => {\n let encodingType = null;\n switch (encodingMethod) {\n case \"gzip\":\n encodingType = contentEncodingMethod.GZIP;\n break;\n case \"br\":\n encodingType = contentEncodingMethod.BR;\n break;\n case \"deflate\":\n encodingType = contentEncodingMethod.DEFLATE;\n break;\n default:\n }\n return encodingType;\n};\n\n// mutiple content-encoding is not supported\n// for mutiple content-encoding, this method will return any empty array\nexport const getContentEncodingFromHeaders = (\n response: http.ServerResponse,\n): contentEncodingMethod[] | null => {\n const headers: contentEncodingMethod[] = [];\n const contentEncodingHeaders = response.getHeader(\"Content-Encoding\");\n if (!contentEncodingHeaders) return null;\n if (typeof contentEncodingHeaders === \"string\") {\n const supportedContentEncoding = isSupportedContentEncoding(contentEncodingHeaders);\n if (supportedContentEncoding) {\n headers.push(supportedContentEncoding);\n }\n }\n return headers;\n};\n\nexport const insertBrowserSdkLoaderByIndex = (\n index: number,\n html: string,\n snippet: string,\n): string | null => {\n if (index < 0) return null;\n const subStart = html.substring(0, index);\n const subEnd = html.substring(index);\n const newHtml = subStart + '<script type=\"text/javascript\">' + snippet + \"</script>\" + subEnd;\n return newHtml;\n};\n\nexport const isContentTypeHeaderHtml = (response: http.ServerResponse): boolean => {\n let isHtml = false;\n const contentType = response.getHeader(\"Content-Type\");\n if (contentType) {\n if (typeof contentType === \"string\") {\n isHtml = contentType.indexOf(\"html\") >= 0;\n } else {\n isHtml = contentType.toString().indexOf(\"html\") >= 0;\n }\n }\n return isHtml;\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  import { NodeSDK } from "@opentelemetry/sdk-node";
2
- import type { AzureMonitorOpenTelemetryOptions, InstrumentationOptions, BrowserSdkLoaderOptions } from "./types.js";
3
- export type { AzureMonitorOpenTelemetryOptions, InstrumentationOptions, BrowserSdkLoaderOptions };
2
+ import type { AzureMonitorOpenTelemetryOptions, InstrumentationOptions, ConsoleInstrumentationOptions, BrowserSdkLoaderOptions } from "./types.js";
3
+ export type { AzureMonitorOpenTelemetryOptions, InstrumentationOptions, ConsoleInstrumentationOptions, BrowserSdkLoaderOptions, };
4
4
  /**
5
5
  * Initialize Azure Monitor Distro
6
6
  * @param options - Azure Monitor OpenTelemetry Options
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAMlD,OAAO,KAAK,EAGV,gCAAgC,EAChC,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAwBpB,YAAY,EAAE,gCAAgC,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,CAAC;AA4BlG;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,gCAAgC,GAAG,IAAI,CA0GhF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMpD;AAED;;;GAGG;AAEH,wBAAgB,eAAe,IAAI,OAAO,GAAG,SAAS,CAErD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAMlD,OAAO,KAAK,EAGV,gCAAgC,EAChC,sBAAsB,EACtB,6BAA6B,EAC7B,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAgBpB,YAAY,EACV,gCAAgC,EAChC,sBAAsB,EACtB,6BAA6B,EAC7B,uBAAuB,GACxB,CAAC;AAoCF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,gCAAgC,GAAG,IAAI,CA6FhF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD;AAED;;;GAGG;AAEH,wBAAgB,eAAe,IAAI,OAAO,GAAG,SAAS,CAErD"}
package/dist/esm/index.js CHANGED
@@ -12,22 +12,22 @@ import { BrowserSdkLoader } from "./browserSdkLoader/browserSdkLoader.js";
12
12
  import { setSdkPrefix } from "./metrics/quickpulse/utils.js";
13
13
  import { getInstance } from "./utils/statsbeat.js";
14
14
  import { patchOpenTelemetryInstrumentationEnable } from "./utils/opentelemetryInstrumentationPatcher.js";
15
- import { ensureAzureSdkTracingBridge } from "./utils/azureSdkTracingBridge.js";
16
15
  import { isFunctionApp, parseResourceDetectorsFromEnvVar } from "./utils/common.js";
17
16
  import { isLogCollectionDisabled } from "./utils/logUtils.js";
18
17
  import { Logger } from "./shared/logging/index.js";
19
18
  import { AZURE_MONITOR_AUTO_ATTACH } from "./types.js";
20
- import { SEMRESATTRS_K8S_CLUSTER_NAME } from "@opentelemetry/semantic-conventions";
21
- /**
22
- * Semantic attribute for cloud resource ID, defined by \@opentelemetry/resource-detector-azure
23
- * @internal
24
- */
25
- const CLOUD_RESOURCE_ID_ATTRIBUTE = "cloud.resource_id";
26
19
  process.env["AZURE_MONITOR_DISTRO_VERSION"] = AZURE_MONITOR_OPENTELEMETRY_VERSION;
27
20
  let sdk;
28
21
  let browserSdkLoader;
29
- // Track the global console patch because NodeSDK does not disable instrumentations.
30
- let consoleInstrumentation;
22
+ // NodeSDK shuts down providers, but leaves instrumentation hooks enabled.
23
+ let instrumentations = [];
24
+ const instrumentationCache = new Map();
25
+ function disableInstrumentations() {
26
+ for (const instrumentation of instrumentations) {
27
+ instrumentation.disable();
28
+ }
29
+ instrumentations = [];
30
+ }
31
31
  /**
32
32
  * Check if auto-attach (autoinstrumentation) is enabled and warn about double instrumentation.
33
33
  */
@@ -51,6 +51,7 @@ function sendAttachWarning() {
51
51
  */
52
52
  export function useAzureMonitor(options) {
53
53
  const config = new InternalConfig(options);
54
+ disableInstrumentations();
54
55
  patchOpenTelemetryInstrumentationEnable();
55
56
  // Omit disabled log instrumentations from Statsbeat.
56
57
  const logInstrumentationsEnabled = !isLogCollectionDisabled();
@@ -65,18 +66,15 @@ export function useAzureMonitor(options) {
65
66
  winston: logInstrumentationsEnabled && config.instrumentationOptions?.winston?.enabled,
66
67
  console: logInstrumentationsEnabled && config.instrumentationOptions?.console?.enabled,
67
68
  };
68
- // Check if the AKS resource detector successfully populated specific resource attributes
69
- // (k8s.cluster.name or cloud.resource_id) beyond the basic cloud.platform/cloud.provider
70
- // Derive from config.resource.attributes which already includes the AKS detector results
71
- const resourceAttributes = config.resource.attributes;
72
- const aksResourceDetected = SEMRESATTRS_K8S_CLUSTER_NAME in resourceAttributes ||
73
- CLOUD_RESOURCE_ID_ATTRIBUTE in resourceAttributes;
69
+ // Only report this feature when the AKS resource detector itself was able to populate the AKS
70
+ // cluster attributes, which requires the customer to have configured access to the
71
+ // aks-cluster-metadata ConfigMap (RBAC + env var or mounted file).
74
72
  const statsbeatFeatures = {
75
73
  browserSdkLoader: config.browserSdkLoaderOptions.enabled,
76
74
  aadHandling: !!config.azureMonitorExporterOptions?.credential,
77
75
  diskRetry: !config.azureMonitorExporterOptions?.disableOfflineStorage,
78
76
  customerSdkStats: process.env[APPLICATIONINSIGHTS_SDKSTATS_DISABLED]?.toLowerCase() === "true",
79
- aksResourceDetectorPopulation: aksResourceDetected,
77
+ aksResourceDetectorPopulation: config.aksResourceDetectorPopulated,
80
78
  };
81
79
  getInstance().setStatsbeatFeatures(statsbeatInstrumentations, statsbeatFeatures);
82
80
  if (config.browserSdkLoaderOptions.enabled) {
@@ -86,9 +84,6 @@ export function useAzureMonitor(options) {
86
84
  metrics.disable();
87
85
  trace.disable();
88
86
  logs.disable();
89
- // Restore any console patch from the previous initialization.
90
- consoleInstrumentation?.disable();
91
- consoleInstrumentation = undefined;
92
87
  // Clear the entire OpenTelemetry API global state to avoid version conflicts.
93
88
  // The disable() calls above remove individual providers but leave the `version` field
94
89
  // on the global object intact. If a different version of @opentelemetry/api was loaded
@@ -100,12 +95,9 @@ export function useAzureMonitor(options) {
100
95
  Reflect.deleteProperty(globalThis, globalOpentelemetryApiKey);
101
96
  // Create internal handlers
102
97
  const metricHandler = new MetricHandler(config);
103
- const traceHandler = new TraceHandler(config, metricHandler);
104
- const logHandler = new LogHandler(config, metricHandler);
105
- const instrumentations = traceHandler
106
- .getInstrumentations()
107
- .concat(logHandler.getInstrumentations());
108
- consoleInstrumentation = logHandler.getConsoleInstrumentation();
98
+ const traceHandler = new TraceHandler(config, metricHandler, instrumentationCache);
99
+ const logHandler = new LogHandler(config, metricHandler, instrumentationCache);
100
+ instrumentations = traceHandler.getInstrumentations().concat(logHandler.getInstrumentations());
109
101
  const resourceDetectorsList = parseResourceDetectorsFromEnvVar();
110
102
  // Add extra SpanProcessors, and logRecordProcessors from user configuration
111
103
  const spanProcessors = options?.spanProcessors || [];
@@ -141,9 +133,6 @@ export function useAzureMonitor(options) {
141
133
  setSdkPrefix();
142
134
  sendAttachWarning();
143
135
  sdk.start();
144
- // Eagerly install the Azure SDK tracing bridge in case @azure/core-tracing
145
- // was loaded before useAzureMonitor() (the RITM hook misses it otherwise).
146
- ensureAzureSdkTracingBridge();
147
136
  }
148
137
  /**
149
138
  * Shutdown Azure Monitor Open Telemetry Distro
@@ -151,9 +140,7 @@ export function useAzureMonitor(options) {
151
140
  */
152
141
  export function shutdownAzureMonitor() {
153
142
  browserSdkLoader?.dispose();
154
- // NodeSDK.shutdown() does not restore the global console.
155
- consoleInstrumentation?.disable();
156
- consoleInstrumentation = undefined;
143
+ disableInstrumentations();
157
144
  return sdk?.shutdown();
158
145
  }
159
146
  /**
@@ -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 { Instrumentation } from \"@opentelemetry/instrumentation\";\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 { ensureAzureSdkTracingBridge } from \"./utils/azureSdkTracingBridge.js\";\nimport { isFunctionApp, parseResourceDetectorsFromEnvVar } from \"./utils/common.js\";\nimport { isLogCollectionDisabled } from \"./utils/logUtils.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// Track the global console patch because NodeSDK does not disable instrumentations.\nlet consoleInstrumentation: Instrumentation | 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 // Omit disabled log instrumentations from Statsbeat.\n const logInstrumentationsEnabled = !isLogCollectionDisabled();\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: logInstrumentationsEnabled && config.instrumentationOptions?.bunyan?.enabled,\n winston: logInstrumentationsEnabled && config.instrumentationOptions?.winston?.enabled,\n console: logInstrumentationsEnabled && config.instrumentationOptions?.console?.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 // Restore any console patch from the previous initialization.\n consoleInstrumentation?.disable();\n consoleInstrumentation = undefined;\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 Reflect.deleteProperty(globalThis, 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 consoleInstrumentation = logHandler.getConsoleInstrumentation();\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 // Eagerly install the Azure SDK tracing bridge in case @azure/core-tracing\n // was loaded before useAzureMonitor() (the RITM hook misses it otherwise).\n ensureAzureSdkTracingBridge();\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 // NodeSDK.shutdown() does not restore the global console.\n consoleInstrumentation?.disable();\n consoleInstrumentation = undefined;\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 { Instrumentation } from \"@opentelemetry/instrumentation\";\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 ConsoleInstrumentationOptions,\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 { isLogCollectionDisabled } from \"./utils/logUtils.js\";\nimport { Logger } from \"./shared/logging/index.js\";\nimport { AZURE_MONITOR_AUTO_ATTACH } from \"./types.js\";\n\nexport type {\n AzureMonitorOpenTelemetryOptions,\n InstrumentationOptions,\n ConsoleInstrumentationOptions,\n BrowserSdkLoaderOptions,\n};\n\nprocess.env[\"AZURE_MONITOR_DISTRO_VERSION\"] = AZURE_MONITOR_OPENTELEMETRY_VERSION;\n\nlet sdk: NodeSDK;\nlet browserSdkLoader: BrowserSdkLoader | undefined;\n// NodeSDK shuts down providers, but leaves instrumentation hooks enabled.\nlet instrumentations: Instrumentation[] = [];\nconst instrumentationCache = new Map<string, Instrumentation>();\n\nfunction disableInstrumentations(): void {\n for (const instrumentation of instrumentations) {\n instrumentation.disable();\n }\n instrumentations = [];\n}\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 disableInstrumentations();\n patchOpenTelemetryInstrumentationEnable();\n // Omit disabled log instrumentations from Statsbeat.\n const logInstrumentationsEnabled = !isLogCollectionDisabled();\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: logInstrumentationsEnabled && config.instrumentationOptions?.bunyan?.enabled,\n winston: logInstrumentationsEnabled && config.instrumentationOptions?.winston?.enabled,\n console: logInstrumentationsEnabled && config.instrumentationOptions?.console?.enabled,\n };\n // Only report this feature when the AKS resource detector itself was able to populate the AKS\n // cluster attributes, which requires the customer to have configured access to the\n // aks-cluster-metadata ConfigMap (RBAC + env var or mounted file).\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: config.aksResourceDetectorPopulated,\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 Reflect.deleteProperty(globalThis, globalOpentelemetryApiKey);\n\n // Create internal handlers\n const metricHandler = new MetricHandler(config);\n const traceHandler = new TraceHandler(config, metricHandler, instrumentationCache);\n const logHandler = new LogHandler(config, metricHandler, instrumentationCache);\n\n instrumentations = traceHandler.getInstrumentations().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 disableInstrumentations();\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"]}
@@ -7,6 +7,7 @@ import { AzureLogRecordProcessor } from "./logRecordProcessor.js";
7
7
  * Azure Monitor OpenTelemetry Log Handler
8
8
  */
9
9
  export declare class LogHandler {
10
+ private readonly instrumentationCache?;
10
11
  private _azureExporter;
11
12
  private _azureLogRecordProcessor;
12
13
  private _azureBatchLogRecordProcessor;
@@ -19,7 +20,7 @@ export declare class LogHandler {
19
20
  * @param _config - Distro configuration.
20
21
  * @param _metricHandler - MetricHandler.
21
22
  */
22
- constructor(config: InternalConfig, metricHandler: MetricHandler);
23
+ constructor(config: InternalConfig, metricHandler: MetricHandler, instrumentationCache?: Map<string, Instrumentation> | undefined);
23
24
  getAzureLogRecordProcessor(): AzureLogRecordProcessor;
24
25
  getBatchLogRecordProcessor(): BatchLogRecordProcessor;
25
26
  getInstrumentations(): Instrumentation[];
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/logs/handler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAItE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAIlE;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,wBAAwB,CAA0B;IAC1D,OAAO,CAAC,6BAA6B,CAA+B;IACpE,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,uBAAuB,CAA8B;IAE7D;;;;OAIG;gBACS,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa;IAYzD,0BAA0B,IAAI,uBAAuB;IAIrD,0BAA0B,IAAI,uBAAuB;IAIrD,mBAAmB,IAAI,eAAe,EAAE;IAI/C,6EAA6E;IACtE,yBAAyB,IAAI,eAAe,GAAG,SAAS;IAI/D;;OAEG;IACH,OAAO,CAAC,2BAA2B;CAmCpC"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/logs/handler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAItE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAKlE;;GAEG;AACH,qBAAa,UAAU;IAiBnB,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAhBxC,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,wBAAwB,CAA0B;IAC1D,OAAO,CAAC,6BAA6B,CAA+B;IACpE,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,uBAAuB,CAA8B;IAE7D;;;;OAIG;gBAED,MAAM,EAAE,cAAc,EACtB,aAAa,EAAE,aAAa,EACX,oBAAoB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,YAAA;IAa/D,0BAA0B,IAAI,uBAAuB;IAIrD,0BAA0B,IAAI,uBAAuB;IAIrD,mBAAmB,IAAI,eAAe,EAAE;IAI/C,6EAA6E;IACtE,yBAAyB,IAAI,eAAe,GAAG,SAAS;IAI/D;;OAEG;IACH,OAAO,CAAC,2BAA2B;CAgDpC"}