@azure/monitor-opentelemetry-exporter 1.0.0-beta.32 → 1.0.0-beta.33

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 (180) hide show
  1. package/dist/commonjs/Declarations/Constants.d.ts +5 -0
  2. package/dist/commonjs/Declarations/Constants.d.ts.map +1 -1
  3. package/dist/commonjs/Declarations/Constants.js +6 -1
  4. package/dist/commonjs/Declarations/Constants.js.map +1 -1
  5. package/dist/commonjs/export/base.js +25 -14
  6. package/dist/commonjs/export/base.js.map +1 -1
  7. package/dist/commonjs/export/log.js +5 -4
  8. package/dist/commonjs/export/log.js.map +1 -1
  9. package/dist/commonjs/export/metric.js +5 -4
  10. package/dist/commonjs/export/metric.js.map +1 -1
  11. package/dist/commonjs/export/statsbeat/customerStatsbeat.d.ts +125 -0
  12. package/dist/commonjs/export/statsbeat/customerStatsbeat.d.ts.map +1 -0
  13. package/dist/commonjs/export/statsbeat/customerStatsbeat.js +480 -0
  14. package/dist/commonjs/export/statsbeat/customerStatsbeat.js.map +1 -0
  15. package/dist/commonjs/export/statsbeat/longIntervalStatsbeatMetrics.js +35 -11
  16. package/dist/commonjs/export/statsbeat/longIntervalStatsbeatMetrics.js.map +1 -1
  17. package/dist/commonjs/export/statsbeat/networkStatsbeatMetrics.js +52 -21
  18. package/dist/commonjs/export/statsbeat/networkStatsbeatMetrics.js.map +1 -1
  19. package/dist/commonjs/export/statsbeat/statsbeatExporter.d.ts +7 -0
  20. package/dist/commonjs/export/statsbeat/statsbeatExporter.d.ts.map +1 -1
  21. package/dist/commonjs/export/statsbeat/statsbeatExporter.js +25 -5
  22. package/dist/commonjs/export/statsbeat/statsbeatExporter.js.map +1 -1
  23. package/dist/commonjs/export/statsbeat/statsbeatMetrics.js +6 -8
  24. package/dist/commonjs/export/statsbeat/statsbeatMetrics.js.map +1 -1
  25. package/dist/commonjs/export/statsbeat/types.d.ts +52 -0
  26. package/dist/commonjs/export/statsbeat/types.d.ts.map +1 -1
  27. package/dist/commonjs/export/statsbeat/types.js +75 -1
  28. package/dist/commonjs/export/statsbeat/types.js.map +1 -1
  29. package/dist/commonjs/export/trace.js +6 -5
  30. package/dist/commonjs/export/trace.js.map +1 -1
  31. package/dist/commonjs/generated/applicationInsightsClient.js +9 -4
  32. package/dist/commonjs/generated/applicationInsightsClient.js.map +1 -1
  33. package/dist/commonjs/generated/models/mappers.js +145 -68
  34. package/dist/commonjs/generated/models/mappers.js.map +1 -1
  35. package/dist/commonjs/index.d.ts +2 -1
  36. package/dist/commonjs/index.d.ts.map +1 -1
  37. package/dist/commonjs/index.js +5 -3
  38. package/dist/commonjs/index.js.map +1 -1
  39. package/dist/commonjs/platform/nodejs/baseSender.d.ts +1 -0
  40. package/dist/commonjs/platform/nodejs/baseSender.d.ts.map +1 -1
  41. package/dist/commonjs/platform/nodejs/baseSender.js +74 -28
  42. package/dist/commonjs/platform/nodejs/baseSender.js.map +1 -1
  43. package/dist/commonjs/platform/nodejs/context/context.d.ts +0 -1
  44. package/dist/commonjs/platform/nodejs/context/context.d.ts.map +1 -1
  45. package/dist/commonjs/platform/nodejs/context/context.js +4 -8
  46. package/dist/commonjs/platform/nodejs/context/context.js.map +1 -1
  47. package/dist/commonjs/platform/nodejs/httpSender.js +11 -4
  48. package/dist/commonjs/platform/nodejs/httpSender.js.map +1 -1
  49. package/dist/commonjs/platform/nodejs/index.d.ts +1 -0
  50. package/dist/commonjs/platform/nodejs/index.d.ts.map +1 -1
  51. package/dist/commonjs/platform/nodejs/index.js +1 -0
  52. package/dist/commonjs/platform/nodejs/index.js.map +1 -1
  53. package/dist/commonjs/platform/nodejs/persist/fileAccessControl.js +7 -7
  54. package/dist/commonjs/platform/nodejs/persist/fileAccessControl.js.map +1 -1
  55. package/dist/commonjs/platform/nodejs/persist/fileSystemPersist.d.ts +9 -1
  56. package/dist/commonjs/platform/nodejs/persist/fileSystemPersist.d.ts.map +1 -1
  57. package/dist/commonjs/platform/nodejs/persist/fileSystemPersist.js +37 -16
  58. package/dist/commonjs/platform/nodejs/persist/fileSystemPersist.js.map +1 -1
  59. package/dist/commonjs/{sampling.d.ts → sampling/percentageSampler.d.ts} +2 -3
  60. package/dist/commonjs/sampling/percentageSampler.d.ts.map +1 -0
  61. package/dist/commonjs/{sampling.js → sampling/percentageSampler.js} +6 -39
  62. package/dist/commonjs/sampling/percentageSampler.js.map +1 -0
  63. package/dist/commonjs/sampling/rateLimitedSampler.d.ts +58 -0
  64. package/dist/commonjs/sampling/rateLimitedSampler.d.ts.map +1 -0
  65. package/dist/commonjs/sampling/rateLimitedSampler.js +118 -0
  66. package/dist/commonjs/sampling/rateLimitedSampler.js.map +1 -0
  67. package/dist/commonjs/sampling/samplingUtils.d.ts +17 -0
  68. package/dist/commonjs/sampling/samplingUtils.d.ts.map +1 -0
  69. package/dist/commonjs/sampling/samplingUtils.js +94 -0
  70. package/dist/commonjs/sampling/samplingUtils.js.map +1 -0
  71. package/dist/commonjs/tsdoc-metadata.json +11 -11
  72. package/dist/commonjs/utils/common.js +2 -3
  73. package/dist/commonjs/utils/common.js.map +1 -1
  74. package/dist/commonjs/utils/connectionStringParser.js +3 -3
  75. package/dist/commonjs/utils/connectionStringParser.js.map +1 -1
  76. package/dist/commonjs/utils/constants/applicationinsights.d.ts +1 -1
  77. package/dist/commonjs/utils/constants/applicationinsights.js +1 -1
  78. package/dist/commonjs/utils/constants/applicationinsights.js.map +1 -1
  79. package/dist/commonjs/utils/eventhub.js +5 -2
  80. package/dist/commonjs/utils/eventhub.js.map +1 -1
  81. package/dist/commonjs/utils/logUtils.js +10 -9
  82. package/dist/commonjs/utils/logUtils.js.map +1 -1
  83. package/dist/commonjs/utils/metricUtils.d.ts.map +1 -1
  84. package/dist/commonjs/utils/metricUtils.js +6 -6
  85. package/dist/commonjs/utils/metricUtils.js.map +1 -1
  86. package/dist/commonjs/utils/spanUtils.d.ts.map +1 -1
  87. package/dist/commonjs/utils/spanUtils.js +13 -11
  88. package/dist/commonjs/utils/spanUtils.js.map +1 -1
  89. package/dist/esm/Declarations/Constants.d.ts +5 -0
  90. package/dist/esm/Declarations/Constants.d.ts.map +1 -1
  91. package/dist/esm/Declarations/Constants.js +5 -0
  92. package/dist/esm/Declarations/Constants.js.map +1 -1
  93. package/dist/esm/export/base.js +25 -14
  94. package/dist/esm/export/base.js.map +1 -1
  95. package/dist/esm/export/log.js +5 -4
  96. package/dist/esm/export/log.js.map +1 -1
  97. package/dist/esm/export/metric.js +5 -4
  98. package/dist/esm/export/metric.js.map +1 -1
  99. package/dist/esm/export/statsbeat/customerStatsbeat.d.ts +125 -0
  100. package/dist/esm/export/statsbeat/customerStatsbeat.d.ts.map +1 -0
  101. package/dist/esm/export/statsbeat/customerStatsbeat.js +475 -0
  102. package/dist/esm/export/statsbeat/customerStatsbeat.js.map +1 -0
  103. package/dist/esm/export/statsbeat/longIntervalStatsbeatMetrics.js +35 -11
  104. package/dist/esm/export/statsbeat/longIntervalStatsbeatMetrics.js.map +1 -1
  105. package/dist/esm/export/statsbeat/networkStatsbeatMetrics.js +52 -21
  106. package/dist/esm/export/statsbeat/networkStatsbeatMetrics.js.map +1 -1
  107. package/dist/esm/export/statsbeat/statsbeatExporter.d.ts +7 -0
  108. package/dist/esm/export/statsbeat/statsbeatExporter.d.ts.map +1 -1
  109. package/dist/esm/export/statsbeat/statsbeatExporter.js +25 -5
  110. package/dist/esm/export/statsbeat/statsbeatExporter.js.map +1 -1
  111. package/dist/esm/export/statsbeat/statsbeatMetrics.js +6 -8
  112. package/dist/esm/export/statsbeat/statsbeatMetrics.js.map +1 -1
  113. package/dist/esm/export/statsbeat/types.d.ts +52 -0
  114. package/dist/esm/export/statsbeat/types.d.ts.map +1 -1
  115. package/dist/esm/export/statsbeat/types.js +73 -0
  116. package/dist/esm/export/statsbeat/types.js.map +1 -1
  117. package/dist/esm/export/trace.js +6 -5
  118. package/dist/esm/export/trace.js.map +1 -1
  119. package/dist/esm/generated/applicationInsightsClient.js +9 -4
  120. package/dist/esm/generated/applicationInsightsClient.js.map +1 -1
  121. package/dist/esm/generated/models/mappers.js +145 -68
  122. package/dist/esm/generated/models/mappers.js.map +1 -1
  123. package/dist/esm/index.d.ts +2 -1
  124. package/dist/esm/index.d.ts.map +1 -1
  125. package/dist/esm/index.js +2 -1
  126. package/dist/esm/index.js.map +1 -1
  127. package/dist/esm/platform/nodejs/baseSender.d.ts +1 -0
  128. package/dist/esm/platform/nodejs/baseSender.d.ts.map +1 -1
  129. package/dist/esm/platform/nodejs/baseSender.js +76 -30
  130. package/dist/esm/platform/nodejs/baseSender.js.map +1 -1
  131. package/dist/esm/platform/nodejs/context/context.d.ts +0 -1
  132. package/dist/esm/platform/nodejs/context/context.d.ts.map +1 -1
  133. package/dist/esm/platform/nodejs/context/context.js +4 -8
  134. package/dist/esm/platform/nodejs/context/context.js.map +1 -1
  135. package/dist/esm/platform/nodejs/httpSender.js +11 -4
  136. package/dist/esm/platform/nodejs/httpSender.js.map +1 -1
  137. package/dist/esm/platform/nodejs/index.d.ts +1 -0
  138. package/dist/esm/platform/nodejs/index.d.ts.map +1 -1
  139. package/dist/esm/platform/nodejs/index.js +1 -0
  140. package/dist/esm/platform/nodejs/index.js.map +1 -1
  141. package/dist/esm/platform/nodejs/persist/fileAccessControl.js +7 -7
  142. package/dist/esm/platform/nodejs/persist/fileAccessControl.js.map +1 -1
  143. package/dist/esm/platform/nodejs/persist/fileSystemPersist.d.ts +9 -1
  144. package/dist/esm/platform/nodejs/persist/fileSystemPersist.d.ts.map +1 -1
  145. package/dist/esm/platform/nodejs/persist/fileSystemPersist.js +37 -16
  146. package/dist/esm/platform/nodejs/persist/fileSystemPersist.js.map +1 -1
  147. package/dist/esm/{sampling.d.ts → sampling/percentageSampler.d.ts} +2 -3
  148. package/dist/esm/sampling/percentageSampler.d.ts.map +1 -0
  149. package/dist/esm/{sampling.js → sampling/percentageSampler.js} +6 -39
  150. package/dist/esm/sampling/percentageSampler.js.map +1 -0
  151. package/dist/esm/sampling/rateLimitedSampler.d.ts +58 -0
  152. package/dist/esm/sampling/rateLimitedSampler.d.ts.map +1 -0
  153. package/dist/esm/sampling/rateLimitedSampler.js +114 -0
  154. package/dist/esm/sampling/rateLimitedSampler.js.map +1 -0
  155. package/dist/esm/sampling/samplingUtils.d.ts +17 -0
  156. package/dist/esm/sampling/samplingUtils.d.ts.map +1 -0
  157. package/dist/esm/sampling/samplingUtils.js +89 -0
  158. package/dist/esm/sampling/samplingUtils.js.map +1 -0
  159. package/dist/esm/utils/common.js +2 -3
  160. package/dist/esm/utils/common.js.map +1 -1
  161. package/dist/esm/utils/connectionStringParser.js +3 -3
  162. package/dist/esm/utils/connectionStringParser.js.map +1 -1
  163. package/dist/esm/utils/constants/applicationinsights.d.ts +1 -1
  164. package/dist/esm/utils/constants/applicationinsights.js +1 -1
  165. package/dist/esm/utils/constants/applicationinsights.js.map +1 -1
  166. package/dist/esm/utils/eventhub.js +5 -2
  167. package/dist/esm/utils/eventhub.js.map +1 -1
  168. package/dist/esm/utils/logUtils.js +10 -9
  169. package/dist/esm/utils/logUtils.js.map +1 -1
  170. package/dist/esm/utils/metricUtils.d.ts.map +1 -1
  171. package/dist/esm/utils/metricUtils.js +6 -6
  172. package/dist/esm/utils/metricUtils.js.map +1 -1
  173. package/dist/esm/utils/spanUtils.d.ts.map +1 -1
  174. package/dist/esm/utils/spanUtils.js +13 -11
  175. package/dist/esm/utils/spanUtils.js.map +1 -1
  176. package/package.json +6 -6
  177. package/dist/commonjs/sampling.d.ts.map +0 -1
  178. package/dist/commonjs/sampling.js.map +0 -1
  179. package/dist/esm/sampling.d.ts.map +0 -1
  180. package/dist/esm/sampling.js.map +0 -1
@@ -1,6 +1,5 @@
1
1
  // Copyright (c) Microsoft Corporation.
2
2
  // Licensed under the MIT License.
3
- import * as os from "node:os";
4
3
  import { SDK_INFO } from "@opentelemetry/core";
5
4
  import { ATTR_TELEMETRY_SDK_VERSION } from "@opentelemetry/semantic-conventions";
6
5
  import { KnownContextTagKeys } from "../../../generated/index.js";
@@ -12,14 +11,14 @@ let instance = null;
12
11
  * @internal
13
12
  */
14
13
  export class Context {
14
+ tags;
15
+ static sdkVersion = null;
16
+ static opentelemetryVersion = null;
17
+ static nodeVersion = "";
15
18
  constructor() {
16
19
  this.tags = {};
17
- this._loadDeviceContext();
18
20
  this._loadInternalContext();
19
21
  }
20
- _loadDeviceContext() {
21
- this.tags[KnownContextTagKeys.AiDeviceOsVersion] = os && `${os.type()} ${os.release()}`;
22
- }
23
22
  _loadInternalContext() {
24
23
  const { node } = process.versions;
25
24
  [Context.nodeVersion] = node.split(".");
@@ -44,9 +43,6 @@ export class Context {
44
43
  }
45
44
  }
46
45
  }
47
- Context.sdkVersion = null;
48
- Context.opentelemetryVersion = null;
49
- Context.nodeVersion = "";
50
46
  /**
51
47
  * Singleton Context instance
52
48
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../../src/platform/nodejs/context/context.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,iDAAiD,CAAC;AAEtE,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,gCAAgC,GACjC,MAAM,oCAAoC,CAAC;AAE5C,IAAI,QAAQ,GAAmB,IAAI,CAAC;AAEpC;;;GAGG;AACH,MAAM,OAAO,OAAO;IASlB;QACE,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC;IAC1F,CAAC;IAEO,oBAAoB;QAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,CAAC,oBAAoB,GAAG,QAAQ,CAAC,0BAA0B,CAAC,CAAC;QACpE,OAAO,CAAC,UAAU,GAAG,EAAE,CAAC,cAAc,CAAC;QAEvC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;YAClD,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;YACvC,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,kBAAkB,GAAG,GAAG,MAAM,OAAO,OAAO,CAAC,WAAW,QAAQ,OAAO,CAAC,oBAAoB,IAAI,OAAO,EAAE,CAAC;QAChH,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,GAAG,kBAAkB,CAAC;IAC3E,CAAC;IAEO,WAAW;QACjB,IAAI,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,EAAE,CAAC;YACtD,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,EAAE,CAAC;QACnE,CAAC;aAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,EAAE,CAAC;YACzD,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,EAAE,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;;AAtCa,kBAAU,GAAkB,IAAI,CAAC;AAEjC,4BAAoB,GAAkB,IAAI,CAAC;AAE3C,mBAAW,GAAW,EAAE,CAAC;AAqCzC;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport * as os from \"node:os\";\nimport { SDK_INFO } from \"@opentelemetry/core\";\nimport { ATTR_TELEMETRY_SDK_VERSION } from \"@opentelemetry/semantic-conventions\";\nimport { KnownContextTagKeys } from \"../../../generated/index.js\";\nimport * as ai from \"../../../utils/constants/applicationinsights.js\";\nimport type { Tags } from \"../../../types.js\";\nimport {\n ENV_AZURE_MONITOR_PREFIX,\n ENV_APPLICATIONINSIGHTS_SHIM_VERSION,\n ENV_AZURE_MONITOR_DISTRO_VERSION,\n} from \"../../../Declarations/Constants.js\";\n\nlet instance: Context | null = null;\n\n/**\n * Azure Telemetry context.\n * @internal\n */\nexport class Context {\n public tags: Tags;\n\n public static sdkVersion: string | null = null;\n\n public static opentelemetryVersion: string | null = null;\n\n public static nodeVersion: string = \"\";\n\n constructor() {\n this.tags = {};\n this._loadDeviceContext();\n this._loadInternalContext();\n }\n\n private _loadDeviceContext(): void {\n this.tags[KnownContextTagKeys.AiDeviceOsVersion] = os && `${os.type()} ${os.release()}`;\n }\n\n private _loadInternalContext(): void {\n const { node } = process.versions;\n [Context.nodeVersion] = node.split(\".\");\n Context.opentelemetryVersion = SDK_INFO[ATTR_TELEMETRY_SDK_VERSION];\n Context.sdkVersion = ai.packageVersion;\n\n const prefix = process.env[ENV_AZURE_MONITOR_PREFIX]\n ? process.env[ENV_AZURE_MONITOR_PREFIX]\n : \"\";\n const version = this._getVersion();\n const internalSdkVersion = `${prefix}node${Context.nodeVersion}:otel${Context.opentelemetryVersion}:${version}`;\n this.tags[KnownContextTagKeys.AiInternalSdkVersion] = internalSdkVersion;\n }\n\n private _getVersion(): string {\n if (process.env[ENV_APPLICATIONINSIGHTS_SHIM_VERSION]) {\n return `sha${process.env[ENV_APPLICATIONINSIGHTS_SHIM_VERSION]}`;\n } else if (process.env[ENV_AZURE_MONITOR_DISTRO_VERSION]) {\n return `dst${process.env[ENV_AZURE_MONITOR_DISTRO_VERSION]}`;\n } else {\n return `ext${Context.sdkVersion}`;\n }\n }\n}\n\n/**\n * Singleton Context instance\n * @internal\n */\nexport function getInstance(): Context {\n if (!instance) {\n instance = new Context();\n }\n return instance;\n}\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../../src/platform/nodejs/context/context.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,MAAM,iDAAiD,CAAC;AAEtE,OAAO,EACL,wBAAwB,EACxB,oCAAoC,EACpC,gCAAgC,GACjC,MAAM,oCAAoC,CAAC;AAE5C,IAAI,QAAQ,GAAmB,IAAI,CAAC;AAEpC;;;GAGG;AACH,MAAM,OAAO,OAAO;IACX,IAAI,CAAO;IAEX,MAAM,CAAC,UAAU,GAAkB,IAAI,CAAC;IAExC,MAAM,CAAC,oBAAoB,GAAkB,IAAI,CAAC;IAElD,MAAM,CAAC,WAAW,GAAW,EAAE,CAAC;IAEvC;QACE,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAEO,oBAAoB;QAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,CAAC,oBAAoB,GAAG,QAAQ,CAAC,0BAA0B,CAAC,CAAC;QACpE,OAAO,CAAC,UAAU,GAAG,EAAE,CAAC,cAAc,CAAC;QAEvC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;YAClD,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;YACvC,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,kBAAkB,GAAG,GAAG,MAAM,OAAO,OAAO,CAAC,WAAW,QAAQ,OAAO,CAAC,oBAAoB,IAAI,OAAO,EAAE,CAAC;QAChH,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,GAAG,kBAAkB,CAAC;IAC3E,CAAC;IAEO,WAAW;QACjB,IAAI,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,EAAE,CAAC;YACtD,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,EAAE,CAAC;QACnE,CAAC;aAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,EAAE,CAAC;YACzD,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,EAAE,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;;AAGH;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,IAAI,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { SDK_INFO } from \"@opentelemetry/core\";\nimport { ATTR_TELEMETRY_SDK_VERSION } from \"@opentelemetry/semantic-conventions\";\nimport { KnownContextTagKeys } from \"../../../generated/index.js\";\nimport * as ai from \"../../../utils/constants/applicationinsights.js\";\nimport type { Tags } from \"../../../types.js\";\nimport {\n ENV_AZURE_MONITOR_PREFIX,\n ENV_APPLICATIONINSIGHTS_SHIM_VERSION,\n ENV_AZURE_MONITOR_DISTRO_VERSION,\n} from \"../../../Declarations/Constants.js\";\n\nlet instance: Context | null = null;\n\n/**\n * Azure Telemetry context.\n * @internal\n */\nexport class Context {\n public tags: Tags;\n\n public static sdkVersion: string | null = null;\n\n public static opentelemetryVersion: string | null = null;\n\n public static nodeVersion: string = \"\";\n\n constructor() {\n this.tags = {};\n this._loadInternalContext();\n }\n\n private _loadInternalContext(): void {\n const { node } = process.versions;\n [Context.nodeVersion] = node.split(\".\");\n Context.opentelemetryVersion = SDK_INFO[ATTR_TELEMETRY_SDK_VERSION];\n Context.sdkVersion = ai.packageVersion;\n\n const prefix = process.env[ENV_AZURE_MONITOR_PREFIX]\n ? process.env[ENV_AZURE_MONITOR_PREFIX]\n : \"\";\n const version = this._getVersion();\n const internalSdkVersion = `${prefix}node${Context.nodeVersion}:otel${Context.opentelemetryVersion}:${version}`;\n this.tags[KnownContextTagKeys.AiInternalSdkVersion] = internalSdkVersion;\n }\n\n private _getVersion(): string {\n if (process.env[ENV_APPLICATIONINSIGHTS_SHIM_VERSION]) {\n return `sha${process.env[ENV_APPLICATIONINSIGHTS_SHIM_VERSION]}`;\n } else if (process.env[ENV_AZURE_MONITOR_DISTRO_VERSION]) {\n return `dst${process.env[ENV_AZURE_MONITOR_DISTRO_VERSION]}`;\n } else {\n return `ext${Context.sdkVersion}`;\n }\n }\n}\n\n/**\n * Singleton Context instance\n * @internal\n */\nexport function getInstance(): Context {\n if (!instance) {\n instance = new Context();\n }\n return instance;\n}\n"]}
@@ -11,10 +11,15 @@ const applicationInsightsResource = "https://monitor.azure.com//.default";
11
11
  * @internal
12
12
  */
13
13
  export class HttpSender extends BaseSender {
14
+ appInsightsClient;
15
+ appInsightsClientOptions;
14
16
  constructor(options) {
15
17
  super(options);
16
18
  // Build endpoint using provided configuration or default values
17
- this.appInsightsClientOptions = Object.assign({ host: options.endpointUrl }, options.exporterOptions);
19
+ this.appInsightsClientOptions = {
20
+ host: options.endpointUrl,
21
+ ...options.exporterOptions,
22
+ };
18
23
  if (this.appInsightsClientOptions.credential) {
19
24
  // Add credentialScopes
20
25
  if (options.aadAudience) {
@@ -34,7 +39,6 @@ export class HttpSender extends BaseSender {
34
39
  * @internal
35
40
  */
36
41
  async send(envelopes) {
37
- var _a;
38
42
  const options = {};
39
43
  let response;
40
44
  function onResponse(rawResponse, flatResponse) {
@@ -43,8 +47,11 @@ export class HttpSender extends BaseSender {
43
47
  options.onResponse(rawResponse, flatResponse);
44
48
  }
45
49
  }
46
- await this.appInsightsClient.track(envelopes, Object.assign(Object.assign({}, options), { onResponse }));
47
- return { statusCode: response === null || response === void 0 ? void 0 : response.status, result: (_a = response === null || response === void 0 ? void 0 : response.bodyAsText) !== null && _a !== void 0 ? _a : "" };
50
+ await this.appInsightsClient.track(envelopes, {
51
+ ...options,
52
+ onResponse,
53
+ });
54
+ return { statusCode: response?.status, result: response?.bodyAsText ?? "" };
48
55
  }
49
56
  /**
50
57
  * Shutdown sender
@@ -1 +1 @@
1
- {"version":3,"file":"httpSender.js","sourceRoot":"","sources":["../../../../src/platform/nodejs/httpSender.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAO/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAErE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,2BAA2B,GAAG,qCAAqC,CAAC;AAE1E;;;GAGG;AACH,MAAM,OAAO,UAAW,SAAQ,UAAU;IAIxC,YAAY,OAOX;QACC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,gEAAgE;QAChE,IAAI,CAAC,wBAAwB,mBAC3B,IAAI,EAAE,OAAO,CAAC,WAAW,IACtB,OAAO,CAAC,eAAe,CAC3B,CAAC;QAEF,IAAI,IAAI,CAAC,wBAAwB,CAAC,UAAU,EAAE,CAAC;YAC7C,uBAAuB;YACvB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxB,IAAI,CAAC,wBAAwB,CAAC,gBAAgB,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACN,UAAU;gBACV,IAAI,CAAC,wBAAwB,CAAC,gBAAgB,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,yBAAyB,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAEtF,kCAAkC;QAClC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,SAAqB;;QAC9B,MAAM,OAAO,GAAwB,EAAE,CAAC;QACxC,IAAI,QAA2C,CAAC;QAChD,SAAS,UAAU,CAAC,WAAkC,EAAE,YAAqB;YAC3E,QAAQ,GAAG,WAAW,CAAC;YACvB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,kCACvC,OAAO,KACV,UAAU,IACV,CAAC;QAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,EAAE,MAAM,EAAE,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,UAAU,mCAAI,EAAE,EAAE,CAAC;IAC9E,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACxC,CAAC;IAED,uBAAuB,CAAC,QAA4B;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,iBAAiB,CAAC,IAAI,GAAG,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport url from \"node:url\";\nimport { diag } from \"@opentelemetry/api\";\nimport type { FullOperationResponse } from \"@azure/core-client\";\nimport { redirectPolicyName } from \"@azure/core-rest-pipeline\";\nimport type { SenderResult } from \"../../types.js\";\nimport type {\n TelemetryItem as Envelope,\n ApplicationInsightsClientOptionalParams,\n TrackOptionalParams,\n} from \"../../generated/index.js\";\nimport { ApplicationInsightsClient } from \"../../generated/index.js\";\nimport type { AzureMonitorExporterOptions } from \"../../config.js\";\nimport { BaseSender } from \"./baseSender.js\";\n\nconst applicationInsightsResource = \"https://monitor.azure.com//.default\";\n\n/**\n * Exporter HTTP sender class\n * @internal\n */\nexport class HttpSender extends BaseSender {\n private readonly appInsightsClient: ApplicationInsightsClient;\n private appInsightsClientOptions: ApplicationInsightsClientOptionalParams;\n\n constructor(options: {\n endpointUrl: string;\n instrumentationKey: string;\n trackStatsbeat: boolean;\n exporterOptions: AzureMonitorExporterOptions;\n aadAudience?: string;\n isStatsbeatSender?: boolean;\n }) {\n super(options);\n // Build endpoint using provided configuration or default values\n this.appInsightsClientOptions = {\n host: options.endpointUrl,\n ...options.exporterOptions,\n };\n\n if (this.appInsightsClientOptions.credential) {\n // Add credentialScopes\n if (options.aadAudience) {\n this.appInsightsClientOptions.credentialScopes = [options.aadAudience];\n } else {\n // Default\n this.appInsightsClientOptions.credentialScopes = [applicationInsightsResource];\n }\n }\n this.appInsightsClient = new ApplicationInsightsClient(this.appInsightsClientOptions);\n\n // Handle redirects in HTTP Sender\n this.appInsightsClient.pipeline.removePolicy({ name: redirectPolicyName });\n }\n\n /**\n * Send Azure envelopes\n * @internal\n */\n async send(envelopes: Envelope[]): Promise<SenderResult> {\n const options: TrackOptionalParams = {};\n let response: FullOperationResponse | undefined;\n function onResponse(rawResponse: FullOperationResponse, flatResponse: unknown): void {\n response = rawResponse;\n if (options.onResponse) {\n options.onResponse(rawResponse, flatResponse);\n }\n }\n await this.appInsightsClient.track(envelopes, {\n ...options,\n onResponse,\n });\n\n return { statusCode: response?.status, result: response?.bodyAsText ?? \"\" };\n }\n\n /**\n * Shutdown sender\n * @internal\n */\n async shutdown(): Promise<void> {\n diag.info(\"HttpSender shutting down\");\n }\n\n handlePermanentRedirect(location: string | undefined): void {\n if (location) {\n const locUrl = new url.URL(location);\n if (locUrl && locUrl.host) {\n this.appInsightsClient.host = \"https://\" + locUrl.host;\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"httpSender.js","sourceRoot":"","sources":["../../../../src/platform/nodejs/httpSender.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAO/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAErE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,2BAA2B,GAAG,qCAAqC,CAAC;AAE1E;;;GAGG;AACH,MAAM,OAAO,UAAW,SAAQ,UAAU;IACvB,iBAAiB,CAA4B;IACtD,wBAAwB,CAA0C;IAE1E,YAAY,OAOX;QACC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,gEAAgE;QAChE,IAAI,CAAC,wBAAwB,GAAG;YAC9B,IAAI,EAAE,OAAO,CAAC,WAAW;YACzB,GAAG,OAAO,CAAC,eAAe;SAC3B,CAAC;QAEF,IAAI,IAAI,CAAC,wBAAwB,CAAC,UAAU,EAAE,CAAC;YAC7C,uBAAuB;YACvB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxB,IAAI,CAAC,wBAAwB,CAAC,gBAAgB,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACN,UAAU;gBACV,IAAI,CAAC,wBAAwB,CAAC,gBAAgB,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,yBAAyB,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAEtF,kCAAkC;QAClC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,SAAqB;QAC9B,MAAM,OAAO,GAAwB,EAAE,CAAC;QACxC,IAAI,QAA2C,CAAC;QAChD,SAAS,UAAU,CAAC,WAAkC,EAAE,YAAqB;YAC3E,QAAQ,GAAG,WAAW,CAAC;YACvB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QACD,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE;YAC5C,GAAG,OAAO;YACV,UAAU;SACX,CAAC,CAAC;QAEH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,IAAI,EAAE,EAAE,CAAC;IAC9E,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACxC,CAAC;IAED,uBAAuB,CAAC,QAA4B;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,iBAAiB,CAAC,IAAI,GAAG,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport url from \"node:url\";\nimport { diag } from \"@opentelemetry/api\";\nimport type { FullOperationResponse } from \"@azure/core-client\";\nimport { redirectPolicyName } from \"@azure/core-rest-pipeline\";\nimport type { SenderResult } from \"../../types.js\";\nimport type {\n TelemetryItem as Envelope,\n ApplicationInsightsClientOptionalParams,\n TrackOptionalParams,\n} from \"../../generated/index.js\";\nimport { ApplicationInsightsClient } from \"../../generated/index.js\";\nimport type { AzureMonitorExporterOptions } from \"../../config.js\";\nimport { BaseSender } from \"./baseSender.js\";\n\nconst applicationInsightsResource = \"https://monitor.azure.com//.default\";\n\n/**\n * Exporter HTTP sender class\n * @internal\n */\nexport class HttpSender extends BaseSender {\n private readonly appInsightsClient: ApplicationInsightsClient;\n private appInsightsClientOptions: ApplicationInsightsClientOptionalParams;\n\n constructor(options: {\n endpointUrl: string;\n instrumentationKey: string;\n trackStatsbeat: boolean;\n exporterOptions: AzureMonitorExporterOptions;\n aadAudience?: string;\n isStatsbeatSender?: boolean;\n }) {\n super(options);\n // Build endpoint using provided configuration or default values\n this.appInsightsClientOptions = {\n host: options.endpointUrl,\n ...options.exporterOptions,\n };\n\n if (this.appInsightsClientOptions.credential) {\n // Add credentialScopes\n if (options.aadAudience) {\n this.appInsightsClientOptions.credentialScopes = [options.aadAudience];\n } else {\n // Default\n this.appInsightsClientOptions.credentialScopes = [applicationInsightsResource];\n }\n }\n this.appInsightsClient = new ApplicationInsightsClient(this.appInsightsClientOptions);\n\n // Handle redirects in HTTP Sender\n this.appInsightsClient.pipeline.removePolicy({ name: redirectPolicyName });\n }\n\n /**\n * Send Azure envelopes\n * @internal\n */\n async send(envelopes: Envelope[]): Promise<SenderResult> {\n const options: TrackOptionalParams = {};\n let response: FullOperationResponse | undefined;\n function onResponse(rawResponse: FullOperationResponse, flatResponse: unknown): void {\n response = rawResponse;\n if (options.onResponse) {\n options.onResponse(rawResponse, flatResponse);\n }\n }\n await this.appInsightsClient.track(envelopes, {\n ...options,\n onResponse,\n });\n\n return { statusCode: response?.status, result: response?.bodyAsText ?? \"\" };\n }\n\n /**\n * Shutdown sender\n * @internal\n */\n async shutdown(): Promise<void> {\n diag.info(\"HttpSender shutting down\");\n }\n\n handlePermanentRedirect(location: string | undefined): void {\n if (location) {\n const locUrl = new url.URL(location);\n if (locUrl && locUrl.host) {\n this.appInsightsClient.host = \"https://\" + locUrl.host;\n }\n }\n }\n}\n"]}
@@ -3,6 +3,7 @@
3
3
  */
4
4
  export * from "./constants.js";
5
5
  export * from "./persist/index.js";
6
+ export * from "./baseSender.js";
6
7
  export * from "./httpSender.js";
7
8
  export * from "./context/index.js";
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platform/nodejs/index.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platform/nodejs/index.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}
@@ -5,6 +5,7 @@
5
5
  */
6
6
  export * from "./constants.js";
7
7
  export * from "./persist/index.js";
8
+ export * from "./baseSender.js";
8
9
  export * from "./httpSender.js";
9
10
  export * from "./context/index.js";
10
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/platform/nodejs/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC;;GAEG;AACH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Node.js specific platform utils\n */\nexport * from \"./constants.js\";\nexport * from \"./persist/index.js\";\nexport * from \"./httpSender.js\";\nexport * from \"./context/index.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/platform/nodejs/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC;;GAEG;AACH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\n/**\n * Node.js specific platform utils\n */\nexport * from \"./constants.js\";\nexport * from \"./persist/index.js\";\nexport * from \"./baseSender.js\";\nexport * from \"./httpSender.js\";\nexport * from \"./context/index.js\";\n"]}
@@ -6,6 +6,13 @@ import { spawn, spawnSync } from "node:child_process";
6
6
  import { diag } from "@opentelemetry/api";
7
7
  import process from "node:process";
8
8
  export class FileAccessControl {
9
+ static ICACLS_PATH = `${process.env.SYSTEMDRIVE}/windows/system32/icacls.exe`;
10
+ static POWERSHELL_PATH = `${process.env.SYSTEMDRIVE}/windows/system32/windowspowershell/v1.0/powershell.exe`;
11
+ static ACLED_DIRECTORIES = {};
12
+ static ACL_IDENTITY = null;
13
+ static OS_FILE_PROTECTION_CHECKED = false;
14
+ static OS_PROVIDES_FILE_PROTECTION = false;
15
+ static USE_ICACLS = osType() === "Windows_NT";
9
16
  // Check if file access control could be enabled
10
17
  static checkFileProtection() {
11
18
  if (!FileAccessControl.OS_PROVIDES_FILE_PROTECTION &&
@@ -162,11 +169,4 @@ export class FileAccessControl {
162
169
  ]; // Remove all inherited permissions
163
170
  }
164
171
  }
165
- FileAccessControl.ICACLS_PATH = `${process.env.SYSTEMDRIVE}/windows/system32/icacls.exe`;
166
- FileAccessControl.POWERSHELL_PATH = `${process.env.SYSTEMDRIVE}/windows/system32/windowspowershell/v1.0/powershell.exe`;
167
- FileAccessControl.ACLED_DIRECTORIES = {};
168
- FileAccessControl.ACL_IDENTITY = null;
169
- FileAccessControl.OS_FILE_PROTECTION_CHECKED = false;
170
- FileAccessControl.OS_PROVIDES_FILE_PROTECTION = false;
171
- FileAccessControl.USE_ICACLS = osType() === "Windows_NT";
172
172
  //# sourceMappingURL=fileAccessControl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileAccessControl.js","sourceRoot":"","sources":["../../../../../src/platform/nodejs/persist/fileAccessControl.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { existsSync } from \"node:fs\";\nimport { type as osType } from \"node:os\";\nimport { spawn, spawnSync } from \"node:child_process\";\nimport { diag } from \"@opentelemetry/api\";\nimport process from \"node:process\";\n\nexport class FileAccessControl {\n private static ICACLS_PATH = `${process.env.SYSTEMDRIVE}/windows/system32/icacls.exe`;\n private static POWERSHELL_PATH = `${process.env.SYSTEMDRIVE}/windows/system32/windowspowershell/v1.0/powershell.exe`;\n private static ACLED_DIRECTORIES: { [id: string]: boolean } = {};\n private static ACL_IDENTITY: string | null = null;\n private static OS_FILE_PROTECTION_CHECKED = false;\n public static OS_PROVIDES_FILE_PROTECTION = false;\n public static USE_ICACLS = osType() === \"Windows_NT\";\n\n // Check if file access control could be enabled\n public static checkFileProtection(): void {\n if (\n !FileAccessControl.OS_PROVIDES_FILE_PROTECTION &&\n !FileAccessControl.OS_FILE_PROTECTION_CHECKED\n ) {\n FileAccessControl.OS_FILE_PROTECTION_CHECKED = true;\n // Node's chmod levels do not appropriately restrict file access on Windows\n // Use the built-in command line tool ICACLS on Windows to properly restrict\n // access to the temporary directory used for disk retry mode.\n if (FileAccessControl.USE_ICACLS) {\n // This should be async - but it's currently safer to have this synchronous\n // This guarantees we can immediately fail setDiskRetryMode if we need to\n try {\n FileAccessControl.OS_PROVIDES_FILE_PROTECTION = existsSync(FileAccessControl.ICACLS_PATH);\n } catch (e: any) {\n // Ignore error\n }\n if (!FileAccessControl.OS_PROVIDES_FILE_PROTECTION) {\n diag.warn(\n \"Could not find ICACLS in expected location! This is necessary to use disk retry mode on Windows.\",\n );\n }\n } else {\n // chmod works everywhere else\n FileAccessControl.OS_PROVIDES_FILE_PROTECTION = true;\n }\n }\n }\n\n public static async applyACLRules(directory: string): Promise<void> {\n if (FileAccessControl.USE_ICACLS) {\n if (FileAccessControl.ACLED_DIRECTORIES[directory] === undefined) {\n // Avoid multiple calls race condition by setting ACLED_DIRECTORIES to false for this directory immediately\n // If batches are being failed faster than the processes spawned below return, some data won't be stored to disk\n // This is better than the alternative of potentially infinitely spawned processes\n FileAccessControl.ACLED_DIRECTORIES[directory] = false;\n try {\n // Restrict this directory to only current user and administrator access\n const identity = await this._getACLIdentity();\n await this._runICACLS(this._getACLArguments(directory, identity));\n FileAccessControl.ACLED_DIRECTORIES[directory] = true;\n } catch (ex: any) {\n FileAccessControl.ACLED_DIRECTORIES[directory] = false; // false is used to cache failed (vs undefined which is \"not yet tried\")\n throw ex;\n }\n } else {\n if (!FileAccessControl.ACLED_DIRECTORIES[directory]) {\n throw new Error(\"Setting ACL restrictions did not succeed (cached result)\");\n }\n }\n }\n }\n\n public static applyACLRulesSync(directory: string): void {\n if (FileAccessControl.USE_ICACLS) {\n // For performance, only run ACL rules if we haven't already during this session\n if (FileAccessControl.ACLED_DIRECTORIES[directory] === undefined) {\n this._runICACLSSync(this._getACLArguments(directory, this._getACLIdentitySync()));\n FileAccessControl.ACLED_DIRECTORIES[directory] = true; // If we get here, it succeeded. _runIACLSSync will throw on failures\n return;\n } else if (!FileAccessControl.ACLED_DIRECTORIES[directory]) {\n // falsy but not undefined\n throw new Error(\"Setting ACL restrictions did not succeed (cached result)\");\n }\n }\n }\n\n private static _runICACLS(args: string[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const aclProc = spawn(FileAccessControl.ICACLS_PATH, args, <any>{\n windowsHide: true,\n });\n aclProc.on(\"error\", (e: Error) => reject(e));\n aclProc.on(\"close\", (code: number) => {\n if (code === 0) {\n resolve();\n } else {\n reject(\n new Error(`Setting ACL restrictions did not succeed (ICACLS returned code ${code})`),\n );\n }\n });\n });\n }\n\n private static _runICACLSSync(args: string[]): void {\n // Some very old versions of Node (< 0.11) don't have this\n if (spawnSync) {\n const aclProc = spawnSync(FileAccessControl.ICACLS_PATH, args, <any>{\n windowsHide: true,\n });\n if (aclProc.error) {\n throw aclProc.error;\n } else if (aclProc.status !== 0) {\n throw new Error(\n `Setting ACL restrictions did not succeed (ICACLS returned code ${aclProc.status})`,\n );\n }\n } else {\n throw new Error(\"Could not synchronously call ICACLS under current version of Node.js\");\n }\n }\n\n private static _getACLIdentity(): Promise<string> {\n return new Promise((resolve, reject) => {\n if (FileAccessControl.ACL_IDENTITY) {\n resolve(FileAccessControl.ACL_IDENTITY);\n }\n const psProc = spawn(\n FileAccessControl.POWERSHELL_PATH,\n [\"-Command\", \"[System.Security.Principal.WindowsIdentity]::GetCurrent().Name\"],\n <any>{\n windowsHide: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"], // Needed to prevent hanging on Win 7\n },\n );\n let data = \"\";\n psProc.stdout.on(\"data\", (d: string) => (data += d));\n psProc.on(\"error\", (e: Error) => reject(e));\n psProc.on(\"close\", (code: number) => {\n FileAccessControl.ACL_IDENTITY = data && data.trim();\n if (code === 0) {\n resolve(FileAccessControl.ACL_IDENTITY);\n } else {\n reject(new Error(`Getting ACL identity did not succeed (PS returned code ${code})`));\n }\n });\n });\n }\n\n private static _getACLIdentitySync(): string {\n if (FileAccessControl.ACL_IDENTITY) {\n return FileAccessControl.ACL_IDENTITY;\n }\n // Some very old versions of Node (< 0.11) don't have this\n if (spawnSync) {\n const psProc = spawnSync(\n FileAccessControl.POWERSHELL_PATH,\n [\"-Command\", \"[System.Security.Principal.WindowsIdentity]::GetCurrent().Name\"],\n <any>{\n windowsHide: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"], // Needed to prevent hanging on Win 7\n },\n );\n if (psProc.error) {\n throw psProc.error;\n } else if (psProc.status !== 0) {\n throw new Error(`Getting ACL identity did not succeed (PS returned code ${psProc.status})`);\n }\n FileAccessControl.ACL_IDENTITY = psProc.stdout && psProc.stdout.toString().trim();\n return FileAccessControl.ACL_IDENTITY;\n } else {\n throw new Error(\"Could not synchronously get ACL identity under current version of Node.js\");\n }\n }\n\n private static _getACLArguments(directory: string, identity: string): string[] {\n return [\n directory,\n \"/grant\",\n \"*S-1-5-32-544:(OI)(CI)F\", // Full permission for Administrators\n \"/grant\",\n `${identity}:(OI)(CI)F`, // Full permission for current user\n \"/inheritance:r\",\n ]; // Remove all inherited permissions\n }\n}\n"]}
1
+ {"version":3,"file":"fileAccessControl.js","sourceRoot":"","sources":["../../../../../src/platform/nodejs/persist/fileAccessControl.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { existsSync } from \"node:fs\";\nimport { type as osType } from \"node:os\";\nimport { spawn, spawnSync } from \"node:child_process\";\nimport { diag } from \"@opentelemetry/api\";\nimport process from \"node:process\";\n\nexport class FileAccessControl {\n private static ICACLS_PATH = `${process.env.SYSTEMDRIVE}/windows/system32/icacls.exe`;\n private static POWERSHELL_PATH = `${process.env.SYSTEMDRIVE}/windows/system32/windowspowershell/v1.0/powershell.exe`;\n private static ACLED_DIRECTORIES: { [id: string]: boolean } = {};\n private static ACL_IDENTITY: string | null = null;\n private static OS_FILE_PROTECTION_CHECKED = false;\n public static OS_PROVIDES_FILE_PROTECTION = false;\n public static USE_ICACLS = osType() === \"Windows_NT\";\n\n // Check if file access control could be enabled\n public static checkFileProtection(): void {\n if (\n !FileAccessControl.OS_PROVIDES_FILE_PROTECTION &&\n !FileAccessControl.OS_FILE_PROTECTION_CHECKED\n ) {\n FileAccessControl.OS_FILE_PROTECTION_CHECKED = true;\n // Node's chmod levels do not appropriately restrict file access on Windows\n // Use the built-in command line tool ICACLS on Windows to properly restrict\n // access to the temporary directory used for disk retry mode.\n if (FileAccessControl.USE_ICACLS) {\n // This should be async - but it's currently safer to have this synchronous\n // This guarantees we can immediately fail setDiskRetryMode if we need to\n try {\n FileAccessControl.OS_PROVIDES_FILE_PROTECTION = existsSync(FileAccessControl.ICACLS_PATH);\n } catch (e: any) {\n // Ignore error\n }\n if (!FileAccessControl.OS_PROVIDES_FILE_PROTECTION) {\n diag.warn(\n \"Could not find ICACLS in expected location! This is necessary to use disk retry mode on Windows.\",\n );\n }\n } else {\n // chmod works everywhere else\n FileAccessControl.OS_PROVIDES_FILE_PROTECTION = true;\n }\n }\n }\n\n public static async applyACLRules(directory: string): Promise<void> {\n if (FileAccessControl.USE_ICACLS) {\n if (FileAccessControl.ACLED_DIRECTORIES[directory] === undefined) {\n // Avoid multiple calls race condition by setting ACLED_DIRECTORIES to false for this directory immediately\n // If batches are being failed faster than the processes spawned below return, some data won't be stored to disk\n // This is better than the alternative of potentially infinitely spawned processes\n FileAccessControl.ACLED_DIRECTORIES[directory] = false;\n try {\n // Restrict this directory to only current user and administrator access\n const identity = await this._getACLIdentity();\n await this._runICACLS(this._getACLArguments(directory, identity));\n FileAccessControl.ACLED_DIRECTORIES[directory] = true;\n } catch (ex: any) {\n FileAccessControl.ACLED_DIRECTORIES[directory] = false; // false is used to cache failed (vs undefined which is \"not yet tried\")\n throw ex;\n }\n } else {\n if (!FileAccessControl.ACLED_DIRECTORIES[directory]) {\n throw new Error(\"Setting ACL restrictions did not succeed (cached result)\");\n }\n }\n }\n }\n\n public static applyACLRulesSync(directory: string): void {\n if (FileAccessControl.USE_ICACLS) {\n // For performance, only run ACL rules if we haven't already during this session\n if (FileAccessControl.ACLED_DIRECTORIES[directory] === undefined) {\n this._runICACLSSync(this._getACLArguments(directory, this._getACLIdentitySync()));\n FileAccessControl.ACLED_DIRECTORIES[directory] = true; // If we get here, it succeeded. _runIACLSSync will throw on failures\n return;\n } else if (!FileAccessControl.ACLED_DIRECTORIES[directory]) {\n // falsy but not undefined\n throw new Error(\"Setting ACL restrictions did not succeed (cached result)\");\n }\n }\n }\n\n private static _runICACLS(args: string[]): Promise<void> {\n return new Promise((resolve, reject) => {\n const aclProc = spawn(FileAccessControl.ICACLS_PATH, args, <any>{\n windowsHide: true,\n });\n aclProc.on(\"error\", (e: Error) => reject(e));\n aclProc.on(\"close\", (code: number) => {\n if (code === 0) {\n resolve();\n } else {\n reject(\n new Error(`Setting ACL restrictions did not succeed (ICACLS returned code ${code})`),\n );\n }\n });\n });\n }\n\n private static _runICACLSSync(args: string[]): void {\n // Some very old versions of Node (< 0.11) don't have this\n if (spawnSync) {\n const aclProc = spawnSync(FileAccessControl.ICACLS_PATH, args, <any>{\n windowsHide: true,\n });\n if (aclProc.error) {\n throw aclProc.error;\n } else if (aclProc.status !== 0) {\n throw new Error(\n `Setting ACL restrictions did not succeed (ICACLS returned code ${aclProc.status})`,\n );\n }\n } else {\n throw new Error(\"Could not synchronously call ICACLS under current version of Node.js\");\n }\n }\n\n private static _getACLIdentity(): Promise<string> {\n return new Promise((resolve, reject) => {\n if (FileAccessControl.ACL_IDENTITY) {\n resolve(FileAccessControl.ACL_IDENTITY);\n }\n const psProc = spawn(\n FileAccessControl.POWERSHELL_PATH,\n [\"-Command\", \"[System.Security.Principal.WindowsIdentity]::GetCurrent().Name\"],\n <any>{\n windowsHide: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"], // Needed to prevent hanging on Win 7\n },\n );\n let data = \"\";\n psProc.stdout.on(\"data\", (d: string) => (data += d));\n psProc.on(\"error\", (e: Error) => reject(e));\n psProc.on(\"close\", (code: number) => {\n FileAccessControl.ACL_IDENTITY = data && data.trim();\n if (code === 0) {\n resolve(FileAccessControl.ACL_IDENTITY);\n } else {\n reject(new Error(`Getting ACL identity did not succeed (PS returned code ${code})`));\n }\n });\n });\n }\n\n private static _getACLIdentitySync(): string {\n if (FileAccessControl.ACL_IDENTITY) {\n return FileAccessControl.ACL_IDENTITY;\n }\n // Some very old versions of Node (< 0.11) don't have this\n if (spawnSync) {\n const psProc = spawnSync(\n FileAccessControl.POWERSHELL_PATH,\n [\"-Command\", \"[System.Security.Principal.WindowsIdentity]::GetCurrent().Name\"],\n <any>{\n windowsHide: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"], // Needed to prevent hanging on Win 7\n },\n );\n if (psProc.error) {\n throw psProc.error;\n } else if (psProc.status !== 0) {\n throw new Error(`Getting ACL identity did not succeed (PS returned code ${psProc.status})`);\n }\n FileAccessControl.ACL_IDENTITY = psProc.stdout && psProc.stdout.toString().trim();\n return FileAccessControl.ACL_IDENTITY;\n } else {\n throw new Error(\"Could not synchronously get ACL identity under current version of Node.js\");\n }\n }\n\n private static _getACLArguments(directory: string, identity: string): string[] {\n return [\n directory,\n \"/grant\",\n \"*S-1-5-32-544:(OI)(CI)F\", // Full permission for Administrators\n \"/grant\",\n `${identity}:(OI)(CI)F`, // Full permission for current user\n \"/inheritance:r\",\n ]; // Remove all inherited permissions\n }\n}\n"]}
@@ -1,11 +1,13 @@
1
1
  import type { PersistentStorage } from "../../../types.js";
2
2
  import type { AzureMonitorExporterOptions } from "../../../config.js";
3
+ import type { CustomerStatsbeatMetrics } from "../../../export/statsbeat/customerStatsbeat.js";
3
4
  /**
4
5
  * File system persist class.
5
6
  * @internal
6
7
  */
7
8
  export declare class FileSystemPersist implements PersistentStorage {
8
9
  private _options?;
10
+ private _customerStatsbeatMetrics?;
9
11
  static TEMPDIR_PREFIX: string;
10
12
  static FILENAME_SUFFIX: string;
11
13
  fileRetemptionPeriod: number;
@@ -15,7 +17,7 @@ export declare class FileSystemPersist implements PersistentStorage {
15
17
  private _tempDirectory;
16
18
  private _fileCleanupTimer;
17
19
  private _instrumentationKey;
18
- constructor(instrumentationKey: string, _options?: AzureMonitorExporterOptions | undefined);
20
+ constructor(instrumentationKey: string, _options?: AzureMonitorExporterOptions | undefined, _customerStatsbeatMetrics?: CustomerStatsbeatMetrics | undefined);
19
21
  push(value: unknown[]): Promise<boolean>;
20
22
  shift(): Promise<unknown>;
21
23
  /**
@@ -23,6 +25,12 @@ export declare class FileSystemPersist implements PersistentStorage {
23
25
  * reads the first file if exist, deletes it and tries to send its load
24
26
  */
25
27
  private _getFirstFileOnDisk;
28
+ /**
29
+ * Stores telemetry data to disk.
30
+ * @param payload - The telemetry data to store.
31
+ * @param envelopeLength -The length of the telemetry envelope.
32
+ * @returns A promise that resolves to true if the data was stored successfully, false otherwise.
33
+ */
26
34
  private _storeToDisk;
27
35
  private _fileCleanupTask;
28
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fileSystemPersist.d.ts","sourceRoot":"","sources":["../../../../../src/platform/nodejs/persist/fileSystemPersist.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAGtE;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,iBAAiB;IAevD,OAAO,CAAC,QAAQ,CAAC;IAdnB,MAAM,CAAC,cAAc,SAAwB;IAC7C,MAAM,CAAC,eAAe,SAAc;IAEpC,oBAAoB,SAA2B;IAC/C,cAAc,SAAkB;IAChC,cAAc,EAAE,MAAM,CAAc;IAEpC,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,mBAAmB,CAAS;gBAGlC,kBAAkB,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,2BAA2B,YAAA;IAyChD,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBlC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAkB/B;;;OAGG;YACW,mBAAmB;YA8BnB,YAAY;YAmCZ,gBAAgB;CA+B/B"}
1
+ {"version":3,"file":"fileSystemPersist.d.ts","sourceRoot":"","sources":["../../../../../src/platform/nodejs/persist/fileSystemPersist.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAC;AAI/F;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,iBAAiB;IAevD,OAAO,CAAC,QAAQ,CAAC;IACjB,OAAO,CAAC,yBAAyB,CAAC;IAfpC,MAAM,CAAC,cAAc,SAAwB;IAC7C,MAAM,CAAC,eAAe,SAAc;IAEpC,oBAAoB,SAA2B;IAC/C,cAAc,SAAkB;IAChC,cAAc,EAAE,MAAM,CAAc;IAEpC,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,mBAAmB,CAAS;gBAGlC,kBAAkB,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,2BAA2B,YAAA,EACtC,yBAAyB,CAAC,EAAE,wBAAwB,YAAA;IAyC9D,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBlC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAkB/B;;;OAGG;YACW,mBAAmB;IA8BjC;;;;;OAKG;YACW,YAAY;YAuDZ,gBAAgB;CA+B/B"}
@@ -6,21 +6,28 @@ import { diag } from "@opentelemetry/api";
6
6
  import { FileAccessControl } from "./fileAccessControl.js";
7
7
  import { confirmDirExists, getShallowDirectorySize } from "./fileSystemHelpers.js";
8
8
  import { readdir, readFile, stat, unlink, writeFile } from "node:fs/promises";
9
+ import { DropCode } from "../../../export/statsbeat/types.js";
9
10
  /**
10
11
  * File system persist class.
11
12
  * @internal
12
13
  */
13
14
  export class FileSystemPersist {
14
- constructor(instrumentationKey, _options) {
15
- var _a, _b;
15
+ _options;
16
+ _customerStatsbeatMetrics;
17
+ static TEMPDIR_PREFIX = "ot-azure-exporter-";
18
+ static FILENAME_SUFFIX = ".ai.json";
19
+ fileRetemptionPeriod = 2 * 24 * 60 * 60 * 1000; // 2 days
20
+ cleanupTimeOut = 60 * 60 * 1000; // 1 hour
21
+ maxBytesOnDisk = 50_000_000; // ~50MB
22
+ _enabled;
23
+ _tempDirectory = "";
24
+ _fileCleanupTimer = null;
25
+ _instrumentationKey;
26
+ constructor(instrumentationKey, _options, _customerStatsbeatMetrics) {
16
27
  this._options = _options;
17
- this.fileRetemptionPeriod = 2 * 24 * 60 * 60 * 1000; // 2 days
18
- this.cleanupTimeOut = 60 * 60 * 1000; // 1 hour
19
- this.maxBytesOnDisk = 50000000; // ~50MB
20
- this._tempDirectory = "";
21
- this._fileCleanupTimer = null;
28
+ this._customerStatsbeatMetrics = _customerStatsbeatMetrics;
22
29
  this._instrumentationKey = instrumentationKey;
23
- if ((_a = this._options) === null || _a === void 0 ? void 0 : _a.disableOfflineStorage) {
30
+ if (this._options?.disableOfflineStorage) {
24
31
  this._enabled = false;
25
32
  return;
26
33
  }
@@ -35,7 +42,7 @@ export class FileSystemPersist {
35
42
  diag.error(`No instrumentation key was provided to FileSystemPersister. Files will not be persisted`);
36
43
  }
37
44
  if (this._enabled) {
38
- this._tempDirectory = join(((_b = this._options) === null || _b === void 0 ? void 0 : _b.storageDirectory) || tmpdir(), "Microsoft", "AzureMonitor", FileSystemPersist.TEMPDIR_PREFIX + this._instrumentationKey);
45
+ this._tempDirectory = join(this._options?.storageDirectory || tmpdir(), "Microsoft", "AzureMonitor", FileSystemPersist.TEMPDIR_PREFIX + this._instrumentationKey);
39
46
  // Starts file cleanup task
40
47
  if (!this._fileCleanupTimer) {
41
48
  this._fileCleanupTimer = setTimeout(() => {
@@ -46,13 +53,12 @@ export class FileSystemPersist {
46
53
  }
47
54
  }
48
55
  push(value) {
49
- var _a;
50
56
  if (this._enabled) {
51
57
  diag.debug("Pushing value to persistent storage", value.toString());
52
- return this._storeToDisk(JSON.stringify(value));
58
+ return this._storeToDisk(JSON.stringify(value), value);
53
59
  }
54
60
  // Only return a false promise if the SDK isn't set to disable offline storage
55
- if (!((_a = this._options) === null || _a === void 0 ? void 0 : _a.disableOfflineStorage)) {
61
+ if (!this._options?.disableOfflineStorage) {
56
62
  return new Promise((resolve) => {
57
63
  resolve(false);
58
64
  });
@@ -113,17 +119,32 @@ export class FileSystemPersist {
113
119
  }
114
120
  }
115
121
  }
116
- async _storeToDisk(payload) {
122
+ /**
123
+ * Stores telemetry data to disk.
124
+ * @param payload - The telemetry data to store.
125
+ * @param envelopeLength -The length of the telemetry envelope.
126
+ * @returns A promise that resolves to true if the data was stored successfully, false otherwise.
127
+ */
128
+ async _storeToDisk(payload, envelopes) {
117
129
  try {
118
130
  await confirmDirExists(this._tempDirectory);
119
131
  }
120
132
  catch (error) {
121
- diag.warn(`Error while checking/creating directory: `, error && error.message);
133
+ // Check if error is due to permission/readonly issues
134
+ if (error?.code === "EACCES" || error?.code === "EPERM") {
135
+ this._customerStatsbeatMetrics?.countDroppedItems(envelopes, DropCode.CLIENT_READONLY);
136
+ diag.warn(`Permission denied while checking/creating directory: ${this._tempDirectory}`, error?.message);
137
+ }
138
+ else {
139
+ diag.warn(`Error while checking/creating directory: `, error && error.message);
140
+ }
122
141
  return false;
123
142
  }
124
143
  try {
125
144
  const size = await getShallowDirectorySize(this._tempDirectory);
126
145
  if (size > this.maxBytesOnDisk) {
146
+ // If the directory size exceeds the max limit, we send customer statsbeat and warn the user
147
+ this._customerStatsbeatMetrics?.countDroppedItems(envelopes, DropCode.CLIENT_PERSISTENCE_CAPACITY);
127
148
  diag.warn(`Not saving data due to max size limit being met. Directory size in bytes is: ${size}`);
128
149
  return false;
129
150
  }
@@ -140,6 +161,8 @@ export class FileSystemPersist {
140
161
  await writeFile(fileFullPath, payload, { mode: 0o600 });
141
162
  }
142
163
  catch (writeError) {
164
+ // If the envelopes cannot be written to disk, we send customer statsbeat and warn the user
165
+ this._customerStatsbeatMetrics?.countDroppedItems(envelopes, DropCode.CLIENT_EXCEPTION, writeError?.message);
143
166
  diag.warn(`Error writing file to persistent file storage`, writeError);
144
167
  return false;
145
168
  }
@@ -175,6 +198,4 @@ export class FileSystemPersist {
175
198
  }
176
199
  }
177
200
  }
178
- FileSystemPersist.TEMPDIR_PREFIX = "ot-azure-exporter-";
179
- FileSystemPersist.FILENAME_SUFFIX = ".ai.json";
180
201
  //# sourceMappingURL=fileSystemPersist.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileSystemPersist.js","sourceRoot":"","sources":["../../../../../src/platform/nodejs/persist/fileSystemPersist.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { tmpdir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport { diag } from \"@opentelemetry/api\";\nimport type { PersistentStorage } from \"../../../types.js\";\nimport { FileAccessControl } from \"./fileAccessControl.js\";\nimport { confirmDirExists, getShallowDirectorySize } from \"./fileSystemHelpers.js\";\nimport type { AzureMonitorExporterOptions } from \"../../../config.js\";\nimport { readdir, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\n\n/**\n * File system persist class.\n * @internal\n */\nexport class FileSystemPersist implements PersistentStorage {\n static TEMPDIR_PREFIX = \"ot-azure-exporter-\";\n static FILENAME_SUFFIX = \".ai.json\";\n\n fileRetemptionPeriod = 2 * 24 * 60 * 60 * 1000; // 2 days\n cleanupTimeOut = 60 * 60 * 1000; // 1 hour\n maxBytesOnDisk: number = 50_000_000; // ~50MB\n\n private _enabled: boolean;\n private _tempDirectory: string = \"\";\n private _fileCleanupTimer: NodeJS.Timeout | null = null;\n private _instrumentationKey: string;\n\n constructor(\n instrumentationKey: string,\n private _options?: AzureMonitorExporterOptions,\n ) {\n this._instrumentationKey = instrumentationKey;\n if (this._options?.disableOfflineStorage) {\n this._enabled = false;\n return;\n }\n this._enabled = true;\n FileAccessControl.checkFileProtection();\n\n if (!FileAccessControl.OS_PROVIDES_FILE_PROTECTION) {\n this._enabled = false;\n diag.error(\n \"Sufficient file protection capabilities were not detected. Files will not be persisted\",\n );\n }\n\n if (!this._instrumentationKey) {\n this._enabled = false;\n diag.error(\n `No instrumentation key was provided to FileSystemPersister. Files will not be persisted`,\n );\n }\n if (this._enabled) {\n this._tempDirectory = join(\n this._options?.storageDirectory || tmpdir(),\n \"Microsoft\",\n \"AzureMonitor\",\n FileSystemPersist.TEMPDIR_PREFIX + this._instrumentationKey,\n );\n\n // Starts file cleanup task\n if (!this._fileCleanupTimer) {\n this._fileCleanupTimer = setTimeout(() => {\n this._fileCleanupTask();\n }, this.cleanupTimeOut);\n this._fileCleanupTimer.unref();\n }\n }\n }\n\n push(value: unknown[]): Promise<boolean> {\n if (this._enabled) {\n diag.debug(\"Pushing value to persistent storage\", value.toString());\n return this._storeToDisk(JSON.stringify(value));\n }\n // Only return a false promise if the SDK isn't set to disable offline storage\n if (!this._options?.disableOfflineStorage) {\n return new Promise((resolve) => {\n resolve(false);\n });\n }\n return new Promise((resolve) => {\n resolve(true);\n });\n }\n\n async shift(): Promise<unknown> {\n if (this._enabled) {\n diag.debug(\"Searching for filesystem persisted files\");\n try {\n const buffer = await this._getFirstFileOnDisk();\n if (buffer) {\n return JSON.parse(buffer.toString(\"utf8\"));\n }\n } catch (e: any) {\n diag.debug(\"Failed to read persisted file\", e);\n }\n return null;\n }\n return new Promise((resolve) => {\n resolve(null);\n });\n }\n\n /**\n * Check for temp telemetry files\n * reads the first file if exist, deletes it and tries to send its load\n */\n private async _getFirstFileOnDisk(): Promise<Buffer | null> {\n try {\n const stats = await stat(this._tempDirectory);\n if (stats.isDirectory()) {\n const origFiles = await readdir(this._tempDirectory);\n const files = origFiles.filter((f) =>\n basename(f).includes(FileSystemPersist.FILENAME_SUFFIX),\n );\n if (files.length === 0) {\n return null;\n } else {\n const firstFile = files[0];\n const filePath = join(this._tempDirectory, firstFile);\n const payload = await readFile(filePath);\n // delete the file first to prevent double sending\n await unlink(filePath);\n return payload;\n }\n }\n return null;\n } catch (e: any) {\n if (e.code === \"ENOENT\") {\n // File does not exist -- return null instead of throwing\n return null;\n } else {\n throw e;\n }\n }\n }\n\n private async _storeToDisk(payload: string): Promise<boolean> {\n try {\n await confirmDirExists(this._tempDirectory);\n } catch (error: any) {\n diag.warn(`Error while checking/creating directory: `, error && error.message);\n return false;\n }\n\n try {\n const size = await getShallowDirectorySize(this._tempDirectory);\n if (size > this.maxBytesOnDisk) {\n diag.warn(\n `Not saving data due to max size limit being met. Directory size in bytes is: ${size}`,\n );\n return false;\n }\n } catch (error: any) {\n diag.warn(`Error while checking size of persistence directory: `, error && error.message);\n return false;\n }\n\n const fileName = `${new Date().getTime()}${FileSystemPersist.FILENAME_SUFFIX}`;\n const fileFullPath = join(this._tempDirectory, fileName);\n\n // Mode 600 is w/r for creator and no read access for others\n diag.info(`saving data to disk at: ${fileFullPath}`);\n try {\n await writeFile(fileFullPath, payload, { mode: 0o600 });\n } catch (writeError: any) {\n diag.warn(`Error writing file to persistent file storage`, writeError);\n return false;\n }\n return true;\n }\n\n private async _fileCleanupTask(): Promise<boolean> {\n try {\n const stats = await stat(this._tempDirectory);\n if (stats.isDirectory()) {\n const origFiles = await readdir(this._tempDirectory);\n const files = origFiles.filter((f) =>\n basename(f).includes(FileSystemPersist.FILENAME_SUFFIX),\n );\n if (files.length === 0) {\n return false;\n } else {\n files.forEach(async (file) => {\n // Check expiration\n const fileCreationDate: Date = new Date(\n parseInt(file.split(FileSystemPersist.FILENAME_SUFFIX)[0]),\n );\n const expired = new Date(+new Date() - this.fileRetemptionPeriod) > fileCreationDate;\n if (expired) {\n const filePath = join(this._tempDirectory, file);\n await unlink(filePath);\n }\n });\n return true;\n }\n }\n return false;\n } catch (error: any) {\n diag.info(`Failed cleanup of persistent file storage expired files`, error);\n return false;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"fileSystemPersist.js","sourceRoot":"","sources":["../../../../../src/platform/nodejs/persist/fileSystemPersist.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport { tmpdir } from \"node:os\";\nimport { basename, join } from \"node:path\";\nimport { diag } from \"@opentelemetry/api\";\nimport type { PersistentStorage } from \"../../../types.js\";\nimport { FileAccessControl } from \"./fileAccessControl.js\";\nimport { confirmDirExists, getShallowDirectorySize } from \"./fileSystemHelpers.js\";\nimport type { AzureMonitorExporterOptions } from \"../../../config.js\";\nimport { readdir, readFile, stat, unlink, writeFile } from \"node:fs/promises\";\nimport type { CustomerStatsbeatMetrics } from \"../../../export/statsbeat/customerStatsbeat.js\";\nimport { DropCode } from \"../../../export/statsbeat/types.js\";\nimport type { TelemetryItem as Envelope } from \"../../../generated/index.js\";\n\n/**\n * File system persist class.\n * @internal\n */\nexport class FileSystemPersist implements PersistentStorage {\n static TEMPDIR_PREFIX = \"ot-azure-exporter-\";\n static FILENAME_SUFFIX = \".ai.json\";\n\n fileRetemptionPeriod = 2 * 24 * 60 * 60 * 1000; // 2 days\n cleanupTimeOut = 60 * 60 * 1000; // 1 hour\n maxBytesOnDisk: number = 50_000_000; // ~50MB\n\n private _enabled: boolean;\n private _tempDirectory: string = \"\";\n private _fileCleanupTimer: NodeJS.Timeout | null = null;\n private _instrumentationKey: string;\n\n constructor(\n instrumentationKey: string,\n private _options?: AzureMonitorExporterOptions,\n private _customerStatsbeatMetrics?: CustomerStatsbeatMetrics,\n ) {\n this._instrumentationKey = instrumentationKey;\n if (this._options?.disableOfflineStorage) {\n this._enabled = false;\n return;\n }\n this._enabled = true;\n FileAccessControl.checkFileProtection();\n\n if (!FileAccessControl.OS_PROVIDES_FILE_PROTECTION) {\n this._enabled = false;\n diag.error(\n \"Sufficient file protection capabilities were not detected. Files will not be persisted\",\n );\n }\n\n if (!this._instrumentationKey) {\n this._enabled = false;\n diag.error(\n `No instrumentation key was provided to FileSystemPersister. Files will not be persisted`,\n );\n }\n if (this._enabled) {\n this._tempDirectory = join(\n this._options?.storageDirectory || tmpdir(),\n \"Microsoft\",\n \"AzureMonitor\",\n FileSystemPersist.TEMPDIR_PREFIX + this._instrumentationKey,\n );\n\n // Starts file cleanup task\n if (!this._fileCleanupTimer) {\n this._fileCleanupTimer = setTimeout(() => {\n this._fileCleanupTask();\n }, this.cleanupTimeOut);\n this._fileCleanupTimer.unref();\n }\n }\n }\n\n push(value: unknown[]): Promise<boolean> {\n if (this._enabled) {\n diag.debug(\"Pushing value to persistent storage\", value.toString());\n return this._storeToDisk(JSON.stringify(value), value as Envelope[]);\n }\n // Only return a false promise if the SDK isn't set to disable offline storage\n if (!this._options?.disableOfflineStorage) {\n return new Promise((resolve) => {\n resolve(false);\n });\n }\n return new Promise((resolve) => {\n resolve(true);\n });\n }\n\n async shift(): Promise<unknown> {\n if (this._enabled) {\n diag.debug(\"Searching for filesystem persisted files\");\n try {\n const buffer = await this._getFirstFileOnDisk();\n if (buffer) {\n return JSON.parse(buffer.toString(\"utf8\"));\n }\n } catch (e: any) {\n diag.debug(\"Failed to read persisted file\", e);\n }\n return null;\n }\n return new Promise((resolve) => {\n resolve(null);\n });\n }\n\n /**\n * Check for temp telemetry files\n * reads the first file if exist, deletes it and tries to send its load\n */\n private async _getFirstFileOnDisk(): Promise<Buffer | null> {\n try {\n const stats = await stat(this._tempDirectory);\n if (stats.isDirectory()) {\n const origFiles = await readdir(this._tempDirectory);\n const files = origFiles.filter((f) =>\n basename(f).includes(FileSystemPersist.FILENAME_SUFFIX),\n );\n if (files.length === 0) {\n return null;\n } else {\n const firstFile = files[0];\n const filePath = join(this._tempDirectory, firstFile);\n const payload = await readFile(filePath);\n // delete the file first to prevent double sending\n await unlink(filePath);\n return payload;\n }\n }\n return null;\n } catch (e: any) {\n if (e.code === \"ENOENT\") {\n // File does not exist -- return null instead of throwing\n return null;\n } else {\n throw e;\n }\n }\n }\n\n /**\n * Stores telemetry data to disk.\n * @param payload - The telemetry data to store.\n * @param envelopeLength -The length of the telemetry envelope.\n * @returns A promise that resolves to true if the data was stored successfully, false otherwise.\n */\n private async _storeToDisk(payload: string, envelopes: Envelope[]): Promise<boolean> {\n try {\n await confirmDirExists(this._tempDirectory);\n } catch (error: any) {\n // Check if error is due to permission/readonly issues\n if (error?.code === \"EACCES\" || error?.code === \"EPERM\") {\n this._customerStatsbeatMetrics?.countDroppedItems(envelopes, DropCode.CLIENT_READONLY);\n diag.warn(\n `Permission denied while checking/creating directory: ${this._tempDirectory}`,\n error?.message,\n );\n } else {\n diag.warn(`Error while checking/creating directory: `, error && error.message);\n }\n return false;\n }\n\n try {\n const size = await getShallowDirectorySize(this._tempDirectory);\n if (size > this.maxBytesOnDisk) {\n // If the directory size exceeds the max limit, we send customer statsbeat and warn the user\n this._customerStatsbeatMetrics?.countDroppedItems(\n envelopes,\n DropCode.CLIENT_PERSISTENCE_CAPACITY,\n );\n diag.warn(\n `Not saving data due to max size limit being met. Directory size in bytes is: ${size}`,\n );\n return false;\n }\n } catch (error: any) {\n diag.warn(`Error while checking size of persistence directory: `, error && error.message);\n return false;\n }\n\n const fileName = `${new Date().getTime()}${FileSystemPersist.FILENAME_SUFFIX}`;\n const fileFullPath = join(this._tempDirectory, fileName);\n\n // Mode 600 is w/r for creator and no read access for others\n diag.info(`saving data to disk at: ${fileFullPath}`);\n try {\n await writeFile(fileFullPath, payload, { mode: 0o600 });\n } catch (writeError: any) {\n // If the envelopes cannot be written to disk, we send customer statsbeat and warn the user\n this._customerStatsbeatMetrics?.countDroppedItems(\n envelopes,\n DropCode.CLIENT_EXCEPTION,\n writeError?.message,\n );\n diag.warn(`Error writing file to persistent file storage`, writeError);\n return false;\n }\n return true;\n }\n\n private async _fileCleanupTask(): Promise<boolean> {\n try {\n const stats = await stat(this._tempDirectory);\n if (stats.isDirectory()) {\n const origFiles = await readdir(this._tempDirectory);\n const files = origFiles.filter((f) =>\n basename(f).includes(FileSystemPersist.FILENAME_SUFFIX),\n );\n if (files.length === 0) {\n return false;\n } else {\n files.forEach(async (file) => {\n // Check expiration\n const fileCreationDate: Date = new Date(\n parseInt(file.split(FileSystemPersist.FILENAME_SUFFIX)[0]),\n );\n const expired = new Date(+new Date() - this.fileRetemptionPeriod) > fileCreationDate;\n if (expired) {\n const filePath = join(this._tempDirectory, file);\n await unlink(filePath);\n }\n });\n return true;\n }\n }\n return false;\n } catch (error: any) {\n diag.info(`Failed cleanup of persistent file storage expired files`, error);\n return false;\n }\n }\n}\n"]}
@@ -7,7 +7,7 @@ import type { Sampler, SamplingResult } from "@opentelemetry/sdk-trace-base";
7
7
  * @param samplingRatio - 0 to 1 value.
8
8
  */
9
9
  export declare class ApplicationInsightsSampler implements Sampler {
10
- private readonly _sampleRate;
10
+ private _sampleRate;
11
11
  private readonly samplingRatio;
12
12
  /**
13
13
  * Initializes a new instance of the ApplicationInsightsSampler class.
@@ -33,6 +33,5 @@ export declare class ApplicationInsightsSampler implements Sampler {
33
33
  * Return Sampler description
34
34
  */
35
35
  toString(): string;
36
- private _getSamplingHashCode;
37
36
  }
38
- //# sourceMappingURL=sampling.d.ts.map
37
+ //# sourceMappingURL=percentageSampler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"percentageSampler.d.ts","sourceRoot":"","sources":["../../../src/sampling/percentageSampler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAI7E;;;;;GAKG;AACH,qBAAa,0BAA2B,YAAW,OAAO;IACxD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC;;;OAGG;gBACS,aAAa,GAAE,MAAU;IAQrC;;;;;;;;;;;;;OAaG;IACI,YAAY,CACjB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EAEf,QAAQ,EAAE,MAAM,EAEhB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EAEtB,KAAK,EAAE,IAAI,EAAE,GACZ,cAAc;IAMjB;;OAEG;IACI,QAAQ,IAAI,MAAM;CAG1B"}
@@ -1,5 +1,5 @@
1
1
  import { SamplingDecision } from "@opentelemetry/sdk-trace-base";
2
- import { AzureMonitorSampleRate } from "./utils/constants/applicationinsights.js";
2
+ import { shouldSample } from "./samplingUtils.js";
3
3
  /**
4
4
  * ApplicationInsightsSampler is responsible for the following:
5
5
  * Implements same trace id hashing algorithm so that traces are sampled the same across multiple nodes
@@ -7,6 +7,8 @@ import { AzureMonitorSampleRate } from "./utils/constants/applicationinsights.js
7
7
  * @param samplingRatio - 0 to 1 value.
8
8
  */
9
9
  export class ApplicationInsightsSampler {
10
+ _sampleRate;
11
+ samplingRatio;
10
12
  /**
11
13
  * Initializes a new instance of the ApplicationInsightsSampler class.
12
14
  * @param samplingRatio - Value in the range [0,1], 1 meaning all data will sampled and 0 all Tracing data will be sampled out.
@@ -32,32 +34,14 @@ export class ApplicationInsightsSampler {
32
34
  * be created. Typically useful for batch operations.
33
35
  * @returns a {@link SamplingResult}.
34
36
  */
35
- shouldSample(
36
- // @ts-expect-error unused argument
37
- context, traceId,
37
+ shouldSample(context, traceId,
38
38
  // @ts-expect-error unused argument
39
39
  spanName,
40
40
  // @ts-expect-error unused argument
41
41
  spanKind, attributes,
42
42
  // @ts-expect-error unused argument
43
43
  links) {
44
- let isSampledIn = false;
45
- if (this._sampleRate === 100) {
46
- isSampledIn = true;
47
- }
48
- else if (this._sampleRate === 0) {
49
- isSampledIn = false;
50
- }
51
- else {
52
- isSampledIn = this._getSamplingHashCode(traceId) < this._sampleRate;
53
- }
54
- // Add sample rate as span attribute
55
- attributes = attributes || {};
56
- // Only send the sample rate if it's not 100
57
- if (this._sampleRate !== 100) {
58
- attributes[AzureMonitorSampleRate] = this._sampleRate;
59
- }
60
- return isSampledIn
44
+ return shouldSample(this._sampleRate, context, traceId, attributes)
61
45
  ? { decision: SamplingDecision.RECORD_AND_SAMPLED, attributes: attributes }
62
46
  : { decision: SamplingDecision.NOT_RECORD, attributes: attributes };
63
47
  }
@@ -67,22 +51,5 @@ export class ApplicationInsightsSampler {
67
51
  toString() {
68
52
  return `ApplicationInsightsSampler{${this.samplingRatio}}`;
69
53
  }
70
- _getSamplingHashCode(input) {
71
- const csharpMin = -2147483648;
72
- const csharpMax = 2147483647;
73
- let hash = 5381;
74
- if (!input) {
75
- return 0;
76
- }
77
- while (input.length < 8) {
78
- input = input + input;
79
- }
80
- for (let i = 0; i < input.length; i++) {
81
- // JS doesn't respond to integer overflow by wrapping around. Simulate it with bitwise operators ( | 0)
82
- hash = ((((hash << 5) + hash) | 0) + input.charCodeAt(i)) | 0;
83
- }
84
- hash = hash <= csharpMin ? csharpMax : Math.abs(hash);
85
- return (hash / csharpMax) * 100;
86
- }
87
54
  }
88
- //# sourceMappingURL=sampling.js.map
55
+ //# sourceMappingURL=percentageSampler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"percentageSampler.js","sourceRoot":"","sources":["../../../src/sampling/percentageSampler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,OAAO,0BAA0B;IAC7B,WAAW,CAAS;IACX,aAAa,CAAS;IAEvC;;;OAGG;IACH,YAAY,gBAAwB,CAAC;QACnC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7F,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;;;;;;;;OAaG;IACI,YAAY,CACjB,OAAgB,EAChB,OAAe;IACf,mCAAmC;IACnC,QAAgB;IAChB,mCAAmC;IACnC,QAAkB,EAClB,UAAsB;IACtB,mCAAmC;IACnC,KAAa;QAEb,OAAO,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC;YACjE,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE;YAC3E,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IACxE,CAAC;IAED;;OAEG;IACI,QAAQ;QACb,OAAO,8BAA8B,IAAI,CAAC,aAAa,GAAG,CAAC;IAC7D,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport type { Link, Attributes, SpanKind, Context } from \"@opentelemetry/api\";\nimport type { Sampler, SamplingResult } from \"@opentelemetry/sdk-trace-base\";\nimport { SamplingDecision } from \"@opentelemetry/sdk-trace-base\";\nimport { shouldSample } from \"./samplingUtils.js\";\n\n/**\n * ApplicationInsightsSampler is responsible for the following:\n * Implements same trace id hashing algorithm so that traces are sampled the same across multiple nodes\n * Adds item count to span attribute if span is sampled (needed for ingestion service)\n * @param samplingRatio - 0 to 1 value.\n */\nexport class ApplicationInsightsSampler implements Sampler {\n private _sampleRate: number;\n private readonly samplingRatio: number;\n\n /**\n * Initializes a new instance of the ApplicationInsightsSampler class.\n * @param samplingRatio - Value in the range [0,1], 1 meaning all data will sampled and 0 all Tracing data will be sampled out.\n */\n constructor(samplingRatio: number = 1) {\n this.samplingRatio = samplingRatio;\n if (this.samplingRatio > 1 || this.samplingRatio < 0 || !Number.isFinite(this.samplingRatio)) {\n throw new Error(\"Wrong sampling rate, data will not be sampled out\");\n }\n this._sampleRate = Math.round(this.samplingRatio * 100);\n }\n\n /**\n * Checks whether span needs to be created and tracked.\n *\n * @param context - Parent Context which may contain a span.\n * @param traceId - traceif of the span to be created. It can be different from the\n * traceId in the {@link SpanContext}. Typically in situations when the\n * span to be created starts a new trace.\n * @param spanName - Name of the span to be created.\n * @param spanKind - Kind of the span to be created.\n * @param attributes - Initial set of SpanAttributes for the Span being constructed.\n * @param links - Collection of links that will be associated with the Span to\n * be created. Typically useful for batch operations.\n * @returns a {@link SamplingResult}.\n */\n public shouldSample(\n context: Context,\n traceId: string,\n // @ts-expect-error unused argument\n spanName: string,\n // @ts-expect-error unused argument\n spanKind: SpanKind,\n attributes: Attributes,\n // @ts-expect-error unused argument\n links: Link[],\n ): SamplingResult {\n return shouldSample(this._sampleRate, context, traceId, attributes)\n ? { decision: SamplingDecision.RECORD_AND_SAMPLED, attributes: attributes }\n : { decision: SamplingDecision.NOT_RECORD, attributes: attributes };\n }\n\n /**\n * Return Sampler description\n */\n public toString(): string {\n return `ApplicationInsightsSampler{${this.samplingRatio}}`;\n }\n}\n"]}