@azure/monitor-opentelemetry-exporter 1.0.0-beta.31 → 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 (195) hide show
  1. package/README.md +4 -4
  2. package/dist/commonjs/Declarations/Constants.d.ts +5 -0
  3. package/dist/commonjs/Declarations/Constants.d.ts.map +1 -1
  4. package/dist/commonjs/Declarations/Constants.js +6 -1
  5. package/dist/commonjs/Declarations/Constants.js.map +1 -1
  6. package/dist/commonjs/export/base.js +25 -14
  7. package/dist/commonjs/export/base.js.map +1 -1
  8. package/dist/commonjs/export/log.js +5 -4
  9. package/dist/commonjs/export/log.js.map +1 -1
  10. package/dist/commonjs/export/metric.js +5 -4
  11. package/dist/commonjs/export/metric.js.map +1 -1
  12. package/dist/commonjs/export/statsbeat/customerStatsbeat.d.ts +125 -0
  13. package/dist/commonjs/export/statsbeat/customerStatsbeat.d.ts.map +1 -0
  14. package/dist/commonjs/export/statsbeat/customerStatsbeat.js +480 -0
  15. package/dist/commonjs/export/statsbeat/customerStatsbeat.js.map +1 -0
  16. package/dist/commonjs/export/statsbeat/longIntervalStatsbeatMetrics.d.ts +7 -7
  17. package/dist/commonjs/export/statsbeat/longIntervalStatsbeatMetrics.d.ts.map +1 -1
  18. package/dist/commonjs/export/statsbeat/longIntervalStatsbeatMetrics.js +69 -30
  19. package/dist/commonjs/export/statsbeat/longIntervalStatsbeatMetrics.js.map +1 -1
  20. package/dist/commonjs/export/statsbeat/networkStatsbeatMetrics.d.ts +6 -1
  21. package/dist/commonjs/export/statsbeat/networkStatsbeatMetrics.d.ts.map +1 -1
  22. package/dist/commonjs/export/statsbeat/networkStatsbeatMetrics.js +115 -43
  23. package/dist/commonjs/export/statsbeat/networkStatsbeatMetrics.js.map +1 -1
  24. package/dist/commonjs/export/statsbeat/statsbeatExporter.d.ts +7 -0
  25. package/dist/commonjs/export/statsbeat/statsbeatExporter.d.ts.map +1 -1
  26. package/dist/commonjs/export/statsbeat/statsbeatExporter.js +25 -5
  27. package/dist/commonjs/export/statsbeat/statsbeatExporter.js.map +1 -1
  28. package/dist/commonjs/export/statsbeat/statsbeatMetrics.js +6 -8
  29. package/dist/commonjs/export/statsbeat/statsbeatMetrics.js.map +1 -1
  30. package/dist/commonjs/export/statsbeat/types.d.ts +52 -0
  31. package/dist/commonjs/export/statsbeat/types.d.ts.map +1 -1
  32. package/dist/commonjs/export/statsbeat/types.js +75 -1
  33. package/dist/commonjs/export/statsbeat/types.js.map +1 -1
  34. package/dist/commonjs/export/trace.js +6 -5
  35. package/dist/commonjs/export/trace.js.map +1 -1
  36. package/dist/commonjs/generated/applicationInsightsClient.js +9 -4
  37. package/dist/commonjs/generated/applicationInsightsClient.js.map +1 -1
  38. package/dist/commonjs/generated/models/mappers.js +145 -68
  39. package/dist/commonjs/generated/models/mappers.js.map +1 -1
  40. package/dist/commonjs/index.d.ts +2 -1
  41. package/dist/commonjs/index.d.ts.map +1 -1
  42. package/dist/commonjs/index.js +5 -3
  43. package/dist/commonjs/index.js.map +1 -1
  44. package/dist/commonjs/platform/nodejs/baseSender.d.ts +1 -0
  45. package/dist/commonjs/platform/nodejs/baseSender.d.ts.map +1 -1
  46. package/dist/commonjs/platform/nodejs/baseSender.js +101 -34
  47. package/dist/commonjs/platform/nodejs/baseSender.js.map +1 -1
  48. package/dist/commonjs/platform/nodejs/context/context.d.ts +0 -1
  49. package/dist/commonjs/platform/nodejs/context/context.d.ts.map +1 -1
  50. package/dist/commonjs/platform/nodejs/context/context.js +4 -8
  51. package/dist/commonjs/platform/nodejs/context/context.js.map +1 -1
  52. package/dist/commonjs/platform/nodejs/httpSender.js +11 -4
  53. package/dist/commonjs/platform/nodejs/httpSender.js.map +1 -1
  54. package/dist/commonjs/platform/nodejs/index.d.ts +1 -0
  55. package/dist/commonjs/platform/nodejs/index.d.ts.map +1 -1
  56. package/dist/commonjs/platform/nodejs/index.js +1 -0
  57. package/dist/commonjs/platform/nodejs/index.js.map +1 -1
  58. package/dist/commonjs/platform/nodejs/persist/fileAccessControl.js +7 -7
  59. package/dist/commonjs/platform/nodejs/persist/fileAccessControl.js.map +1 -1
  60. package/dist/commonjs/platform/nodejs/persist/fileSystemPersist.d.ts +9 -1
  61. package/dist/commonjs/platform/nodejs/persist/fileSystemPersist.d.ts.map +1 -1
  62. package/dist/commonjs/platform/nodejs/persist/fileSystemPersist.js +37 -16
  63. package/dist/commonjs/platform/nodejs/persist/fileSystemPersist.js.map +1 -1
  64. package/dist/commonjs/{sampling.d.ts → sampling/percentageSampler.d.ts} +2 -3
  65. package/dist/commonjs/sampling/percentageSampler.d.ts.map +1 -0
  66. package/dist/commonjs/{sampling.js → sampling/percentageSampler.js} +6 -39
  67. package/dist/commonjs/sampling/percentageSampler.js.map +1 -0
  68. package/dist/commonjs/sampling/rateLimitedSampler.d.ts +58 -0
  69. package/dist/commonjs/sampling/rateLimitedSampler.d.ts.map +1 -0
  70. package/dist/commonjs/sampling/rateLimitedSampler.js +118 -0
  71. package/dist/commonjs/sampling/rateLimitedSampler.js.map +1 -0
  72. package/dist/commonjs/sampling/samplingUtils.d.ts +17 -0
  73. package/dist/commonjs/sampling/samplingUtils.d.ts.map +1 -0
  74. package/dist/commonjs/sampling/samplingUtils.js +94 -0
  75. package/dist/commonjs/sampling/samplingUtils.js.map +1 -0
  76. package/dist/commonjs/tsdoc-metadata.json +11 -11
  77. package/dist/commonjs/types.d.ts.map +1 -1
  78. package/dist/commonjs/types.js +1 -0
  79. package/dist/commonjs/types.js.map +1 -1
  80. package/dist/commonjs/utils/common.js +2 -3
  81. package/dist/commonjs/utils/common.js.map +1 -1
  82. package/dist/commonjs/utils/connectionStringParser.js +3 -3
  83. package/dist/commonjs/utils/connectionStringParser.js.map +1 -1
  84. package/dist/commonjs/utils/constants/applicationinsights.d.ts +1 -1
  85. package/dist/commonjs/utils/constants/applicationinsights.js +1 -1
  86. package/dist/commonjs/utils/constants/applicationinsights.js.map +1 -1
  87. package/dist/commonjs/utils/eventhub.js +5 -2
  88. package/dist/commonjs/utils/eventhub.js.map +1 -1
  89. package/dist/commonjs/utils/logUtils.js +10 -9
  90. package/dist/commonjs/utils/logUtils.js.map +1 -1
  91. package/dist/commonjs/utils/metricUtils.d.ts.map +1 -1
  92. package/dist/commonjs/utils/metricUtils.js +6 -6
  93. package/dist/commonjs/utils/metricUtils.js.map +1 -1
  94. package/dist/commonjs/utils/spanUtils.d.ts.map +1 -1
  95. package/dist/commonjs/utils/spanUtils.js +16 -14
  96. package/dist/commonjs/utils/spanUtils.js.map +1 -1
  97. package/dist/esm/Declarations/Constants.d.ts +5 -0
  98. package/dist/esm/Declarations/Constants.d.ts.map +1 -1
  99. package/dist/esm/Declarations/Constants.js +5 -0
  100. package/dist/esm/Declarations/Constants.js.map +1 -1
  101. package/dist/esm/export/base.js +25 -14
  102. package/dist/esm/export/base.js.map +1 -1
  103. package/dist/esm/export/log.js +5 -4
  104. package/dist/esm/export/log.js.map +1 -1
  105. package/dist/esm/export/metric.js +5 -4
  106. package/dist/esm/export/metric.js.map +1 -1
  107. package/dist/esm/export/statsbeat/customerStatsbeat.d.ts +125 -0
  108. package/dist/esm/export/statsbeat/customerStatsbeat.d.ts.map +1 -0
  109. package/dist/esm/export/statsbeat/customerStatsbeat.js +475 -0
  110. package/dist/esm/export/statsbeat/customerStatsbeat.js.map +1 -0
  111. package/dist/esm/export/statsbeat/longIntervalStatsbeatMetrics.d.ts +7 -7
  112. package/dist/esm/export/statsbeat/longIntervalStatsbeatMetrics.d.ts.map +1 -1
  113. package/dist/esm/export/statsbeat/longIntervalStatsbeatMetrics.js +68 -30
  114. package/dist/esm/export/statsbeat/longIntervalStatsbeatMetrics.js.map +1 -1
  115. package/dist/esm/export/statsbeat/networkStatsbeatMetrics.d.ts +6 -1
  116. package/dist/esm/export/statsbeat/networkStatsbeatMetrics.d.ts.map +1 -1
  117. package/dist/esm/export/statsbeat/networkStatsbeatMetrics.js +115 -43
  118. package/dist/esm/export/statsbeat/networkStatsbeatMetrics.js.map +1 -1
  119. package/dist/esm/export/statsbeat/statsbeatExporter.d.ts +7 -0
  120. package/dist/esm/export/statsbeat/statsbeatExporter.d.ts.map +1 -1
  121. package/dist/esm/export/statsbeat/statsbeatExporter.js +25 -5
  122. package/dist/esm/export/statsbeat/statsbeatExporter.js.map +1 -1
  123. package/dist/esm/export/statsbeat/statsbeatMetrics.js +6 -8
  124. package/dist/esm/export/statsbeat/statsbeatMetrics.js.map +1 -1
  125. package/dist/esm/export/statsbeat/types.d.ts +52 -0
  126. package/dist/esm/export/statsbeat/types.d.ts.map +1 -1
  127. package/dist/esm/export/statsbeat/types.js +73 -0
  128. package/dist/esm/export/statsbeat/types.js.map +1 -1
  129. package/dist/esm/export/trace.js +6 -5
  130. package/dist/esm/export/trace.js.map +1 -1
  131. package/dist/esm/generated/applicationInsightsClient.js +9 -4
  132. package/dist/esm/generated/applicationInsightsClient.js.map +1 -1
  133. package/dist/esm/generated/models/mappers.js +145 -68
  134. package/dist/esm/generated/models/mappers.js.map +1 -1
  135. package/dist/esm/index.d.ts +2 -1
  136. package/dist/esm/index.d.ts.map +1 -1
  137. package/dist/esm/index.js +2 -1
  138. package/dist/esm/index.js.map +1 -1
  139. package/dist/esm/platform/nodejs/baseSender.d.ts +1 -0
  140. package/dist/esm/platform/nodejs/baseSender.d.ts.map +1 -1
  141. package/dist/esm/platform/nodejs/baseSender.js +104 -37
  142. package/dist/esm/platform/nodejs/baseSender.js.map +1 -1
  143. package/dist/esm/platform/nodejs/context/context.d.ts +0 -1
  144. package/dist/esm/platform/nodejs/context/context.d.ts.map +1 -1
  145. package/dist/esm/platform/nodejs/context/context.js +4 -8
  146. package/dist/esm/platform/nodejs/context/context.js.map +1 -1
  147. package/dist/esm/platform/nodejs/httpSender.js +11 -4
  148. package/dist/esm/platform/nodejs/httpSender.js.map +1 -1
  149. package/dist/esm/platform/nodejs/index.d.ts +1 -0
  150. package/dist/esm/platform/nodejs/index.d.ts.map +1 -1
  151. package/dist/esm/platform/nodejs/index.js +1 -0
  152. package/dist/esm/platform/nodejs/index.js.map +1 -1
  153. package/dist/esm/platform/nodejs/persist/fileAccessControl.js +7 -7
  154. package/dist/esm/platform/nodejs/persist/fileAccessControl.js.map +1 -1
  155. package/dist/esm/platform/nodejs/persist/fileSystemPersist.d.ts +9 -1
  156. package/dist/esm/platform/nodejs/persist/fileSystemPersist.d.ts.map +1 -1
  157. package/dist/esm/platform/nodejs/persist/fileSystemPersist.js +37 -16
  158. package/dist/esm/platform/nodejs/persist/fileSystemPersist.js.map +1 -1
  159. package/dist/esm/{sampling.d.ts → sampling/percentageSampler.d.ts} +2 -3
  160. package/dist/esm/sampling/percentageSampler.d.ts.map +1 -0
  161. package/dist/esm/{sampling.js → sampling/percentageSampler.js} +6 -39
  162. package/dist/esm/sampling/percentageSampler.js.map +1 -0
  163. package/dist/esm/sampling/rateLimitedSampler.d.ts +58 -0
  164. package/dist/esm/sampling/rateLimitedSampler.d.ts.map +1 -0
  165. package/dist/esm/sampling/rateLimitedSampler.js +114 -0
  166. package/dist/esm/sampling/rateLimitedSampler.js.map +1 -0
  167. package/dist/esm/sampling/samplingUtils.d.ts +17 -0
  168. package/dist/esm/sampling/samplingUtils.d.ts.map +1 -0
  169. package/dist/esm/sampling/samplingUtils.js +89 -0
  170. package/dist/esm/sampling/samplingUtils.js.map +1 -0
  171. package/dist/esm/types.d.ts.map +1 -1
  172. package/dist/esm/types.js +2 -1
  173. package/dist/esm/types.js.map +1 -1
  174. package/dist/esm/utils/common.js +2 -3
  175. package/dist/esm/utils/common.js.map +1 -1
  176. package/dist/esm/utils/connectionStringParser.js +3 -3
  177. package/dist/esm/utils/connectionStringParser.js.map +1 -1
  178. package/dist/esm/utils/constants/applicationinsights.d.ts +1 -1
  179. package/dist/esm/utils/constants/applicationinsights.js +1 -1
  180. package/dist/esm/utils/constants/applicationinsights.js.map +1 -1
  181. package/dist/esm/utils/eventhub.js +5 -2
  182. package/dist/esm/utils/eventhub.js.map +1 -1
  183. package/dist/esm/utils/logUtils.js +10 -9
  184. package/dist/esm/utils/logUtils.js.map +1 -1
  185. package/dist/esm/utils/metricUtils.d.ts.map +1 -1
  186. package/dist/esm/utils/metricUtils.js +6 -6
  187. package/dist/esm/utils/metricUtils.js.map +1 -1
  188. package/dist/esm/utils/spanUtils.d.ts.map +1 -1
  189. package/dist/esm/utils/spanUtils.js +16 -14
  190. package/dist/esm/utils/spanUtils.js.map +1 -1
  191. package/package.json +21 -26
  192. package/dist/commonjs/sampling.d.ts.map +0 -1
  193. package/dist/commonjs/sampling.js.map +0 -1
  194. package/dist/esm/sampling.d.ts.map +0 -1
  195. package/dist/esm/sampling.js.map +0 -1
@@ -8,26 +8,41 @@ import { StatsbeatMetrics } from "./statsbeatMetrics.js";
8
8
  import { StatsbeatCounter, STATSBEAT_LANGUAGE, StatsbeatFeatureType } from "./types.js";
9
9
  import { AzureMonitorStatsbeatExporter } from "./statsbeatExporter.js";
10
10
  import { getAttachType } from "../../utils/metricUtils.js";
11
- let instance = null;
12
11
  /**
13
12
  * Long Interval Statsbeat Metrics
14
13
  * @internal
15
14
  */
16
- class LongIntervalStatsbeatMetrics extends StatsbeatMetrics {
15
+ export class LongIntervalStatsbeatMetrics extends StatsbeatMetrics {
16
+ static instance = null;
17
+ statsCollectionLongInterval = 86400000; // 1 day
18
+ // Custom dimensions
19
+ cikey;
20
+ runtimeVersion;
21
+ language;
22
+ version;
23
+ attach = getAttachType();
24
+ commonProperties;
25
+ attachProperties;
26
+ feature = 0;
27
+ instrumentation = 0;
28
+ longIntervalStatsbeatMeterProvider;
29
+ longIntervalAzureExporter;
30
+ longIntervalMetricReader;
31
+ longIntervalStatsbeatMeter;
32
+ // Network Attributes
33
+ connectionString;
34
+ // Observable Gauges
35
+ featureStatsbeatGauge;
36
+ attachStatsbeatGauge;
37
+ isInitialized = false;
17
38
  constructor(options) {
18
39
  super();
19
- this.statsCollectionLongInterval = 86400000; // 1 day
20
- this.attach = getAttachType();
21
- this.feature = 0;
22
- this.instrumentation = 0;
23
- this.isInitialized = false;
24
40
  this.connectionString = super.getConnectionString(options.endpointUrl);
25
41
  const exporterConfig = {
26
42
  connectionString: this.connectionString,
27
43
  disableOfflineStorage: options.disableOfflineStorage,
28
44
  };
29
45
  this.setFeatures();
30
- this.longIntervalStatsbeatMeterProvider = new MeterProvider();
31
46
  this.longIntervalAzureExporter = new AzureMonitorStatsbeatExporter(exporterConfig);
32
47
  // Export Long Interval Statsbeats every day
33
48
  const longIntervalMetricReaderOptions = {
@@ -35,7 +50,9 @@ class LongIntervalStatsbeatMetrics extends StatsbeatMetrics {
35
50
  exportIntervalMillis: Number(process.env.LONG_INTERVAL_EXPORT_MILLIS) || this.statsCollectionLongInterval, // 1 day
36
51
  };
37
52
  this.longIntervalMetricReader = new PeriodicExportingMetricReader(longIntervalMetricReaderOptions);
38
- this.longIntervalStatsbeatMeterProvider.addMetricReader(this.longIntervalMetricReader);
53
+ this.longIntervalStatsbeatMeterProvider = new MeterProvider({
54
+ readers: [this.longIntervalMetricReader],
55
+ });
39
56
  this.longIntervalStatsbeatMeter = this.longIntervalStatsbeatMeterProvider.getMeter("Azure Monitor Long Interval Statsbeat");
40
57
  // Assign Common Properties
41
58
  this.runtimeVersion = process.version;
@@ -67,11 +84,22 @@ class LongIntervalStatsbeatMetrics extends StatsbeatMetrics {
67
84
  this.longIntervalStatsbeatMeter.addBatchObservableCallback(this.getEnvironmentStatus.bind(this), [this.featureStatsbeatGauge]);
68
85
  // Export Feature/Attach Statsbeat once upon app initialization after 15 second delay
69
86
  setTimeout(async () => {
70
- this.longIntervalAzureExporter.export((await this.longIntervalMetricReader.collect()).resourceMetrics, (result) => {
71
- if (result.code !== ExportResultCode.SUCCESS) {
72
- diag.error(`LongIntervalStatsbeat: metrics export failed (error ${result.error})`);
87
+ try {
88
+ const collectionResult = await this.longIntervalMetricReader.collect();
89
+ if (collectionResult) {
90
+ this.longIntervalAzureExporter.export(collectionResult.resourceMetrics, (result) => {
91
+ if (result.code !== ExportResultCode.SUCCESS) {
92
+ diag.debug(`LongIntervalStatsbeat: metrics export failed (error ${result.error})`);
93
+ }
94
+ });
73
95
  }
74
- });
96
+ else {
97
+ diag.debug("LongIntervalStatsbeat: No metrics collected");
98
+ }
99
+ }
100
+ catch (error) {
101
+ diag.debug(`LongIntervalStatsbeat: Error collecting metrics: ${error}`);
102
+ }
75
103
  }, 15000); // 15 seconds
76
104
  }
77
105
  catch (error) {
@@ -81,13 +109,23 @@ class LongIntervalStatsbeatMetrics extends StatsbeatMetrics {
81
109
  getEnvironmentStatus(observableResult) {
82
110
  this.setFeatures();
83
111
  let attributes;
84
- if (this.instrumentation) {
85
- attributes = Object.assign(Object.assign({}, this.commonProperties), { feature: this.instrumentation, type: StatsbeatFeatureType.INSTRUMENTATION });
86
- observableResult.observe(this.featureStatsbeatGauge, 1, Object.assign({}, attributes));
112
+ // Only send instrumentation statsbeat if value is greater than zero
113
+ if (this.instrumentation > 0) {
114
+ attributes = {
115
+ ...this.commonProperties,
116
+ feature: this.instrumentation,
117
+ type: StatsbeatFeatureType.INSTRUMENTATION,
118
+ };
119
+ observableResult.observe(this.featureStatsbeatGauge, 1, { ...attributes });
87
120
  }
88
- if (this.feature) {
89
- attributes = Object.assign(Object.assign({}, this.commonProperties), { feature: this.feature, type: StatsbeatFeatureType.FEATURE });
90
- observableResult.observe(this.featureStatsbeatGauge, 1, Object.assign({}, attributes));
121
+ // Only send feature statsbeat if value is greater than zero
122
+ if (this.feature > 0) {
123
+ attributes = {
124
+ ...this.commonProperties,
125
+ feature: this.feature,
126
+ type: StatsbeatFeatureType.FEATURE,
127
+ };
128
+ observableResult.observe(this.featureStatsbeatGauge, 1, { ...attributes });
91
129
  }
92
130
  }
93
131
  setFeatures() {
@@ -98,26 +136,26 @@ class LongIntervalStatsbeatMetrics extends StatsbeatMetrics {
98
136
  this.instrumentation = JSON.parse(statsbeatFeatures).instrumentation;
99
137
  }
100
138
  catch (error) {
101
- diag.error(`LongIntervalStatsbeat: Failed to parse features/instrumentations (error ${error})`);
139
+ diag.debug(`LongIntervalStatsbeat: Failed to parse features/instrumentations (error ${error})`);
102
140
  }
103
141
  }
104
142
  }
105
143
  attachCallback(observableResult) {
106
- const attributes = Object.assign(Object.assign({}, this.commonProperties), this.attachProperties);
144
+ const attributes = { ...this.commonProperties, ...this.attachProperties };
107
145
  observableResult.observe(1, attributes);
108
146
  }
109
147
  shutdown() {
110
148
  return this.longIntervalStatsbeatMeterProvider.shutdown();
111
149
  }
112
- }
113
- /**
114
- * Singleton LongIntervalStatsbeatMetrics instance.
115
- * @internal
116
- */
117
- export function getInstance(options) {
118
- if (!instance) {
119
- instance = new LongIntervalStatsbeatMetrics(options);
150
+ /**
151
+ * Singleton LongIntervalStatsbeatMetrics instance.
152
+ * @internal
153
+ */
154
+ static getInstance(options) {
155
+ if (!LongIntervalStatsbeatMetrics.instance) {
156
+ LongIntervalStatsbeatMetrics.instance = new LongIntervalStatsbeatMetrics(options);
157
+ }
158
+ return LongIntervalStatsbeatMetrics.instance;
120
159
  }
121
- return instance;
122
160
  }
123
161
  //# sourceMappingURL=longIntervalStatsbeatMetrics.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"longIntervalStatsbeatMetrics.js","sourceRoot":"","sources":["../../../../src/export/statsbeat/longIntervalStatsbeatMetrics.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n BatchObservableResult,\n ObservableGauge,\n ObservableResult,\n Meter,\n} from \"@opentelemetry/api\";\nimport { diag } from \"@opentelemetry/api\";\nimport type { ExportResult } from \"@opentelemetry/core\";\nimport { ExportResultCode } from \"@opentelemetry/core\";\nimport type { PeriodicExportingMetricReaderOptions } from \"@opentelemetry/sdk-metrics\";\nimport { MeterProvider, PeriodicExportingMetricReader } from \"@opentelemetry/sdk-metrics\";\nimport type { AzureMonitorExporterOptions } from \"../../index.js\";\nimport * as ai from \"../../utils/constants/applicationinsights.js\";\nimport { StatsbeatMetrics } from \"./statsbeatMetrics.js\";\nimport type {\n CommonStatsbeatProperties,\n AttachStatsbeatProperties,\n StatsbeatOptions,\n} from \"./types.js\";\nimport { StatsbeatCounter, STATSBEAT_LANGUAGE, StatsbeatFeatureType } from \"./types.js\";\nimport { AzureMonitorStatsbeatExporter } from \"./statsbeatExporter.js\";\nimport { getAttachType } from \"../../utils/metricUtils.js\";\n\nlet instance: LongIntervalStatsbeatMetrics | null = null;\n\n/**\n * Long Interval Statsbeat Metrics\n * @internal\n */\nclass LongIntervalStatsbeatMetrics extends StatsbeatMetrics {\n private statsCollectionLongInterval: number = 86400000; // 1 day\n // Custom dimensions\n private cikey: string;\n private runtimeVersion: string;\n private language: string;\n private version: string;\n private attach: string = getAttachType();\n\n private commonProperties: CommonStatsbeatProperties;\n private attachProperties: AttachStatsbeatProperties;\n\n private feature: number = 0;\n private instrumentation: number = 0;\n\n private longIntervalStatsbeatMeterProvider: MeterProvider;\n private longIntervalAzureExporter: AzureMonitorStatsbeatExporter;\n private longIntervalMetricReader: PeriodicExportingMetricReader;\n private longIntervalStatsbeatMeter: Meter;\n\n // Network Attributes\n private connectionString: string;\n\n // Observable Gauges\n private featureStatsbeatGauge: ObservableGauge;\n private attachStatsbeatGauge: ObservableGauge;\n\n public isInitialized: boolean = false;\n\n constructor(options: StatsbeatOptions) {\n super();\n this.connectionString = super.getConnectionString(options.endpointUrl);\n const exporterConfig: AzureMonitorExporterOptions = {\n connectionString: this.connectionString,\n disableOfflineStorage: options.disableOfflineStorage,\n };\n\n this.setFeatures();\n\n this.longIntervalStatsbeatMeterProvider = new MeterProvider();\n this.longIntervalAzureExporter = new AzureMonitorStatsbeatExporter(exporterConfig);\n\n // Export Long Interval Statsbeats every day\n const longIntervalMetricReaderOptions: PeriodicExportingMetricReaderOptions = {\n exporter: this.longIntervalAzureExporter,\n exportIntervalMillis:\n Number(process.env.LONG_INTERVAL_EXPORT_MILLIS) || this.statsCollectionLongInterval, // 1 day\n };\n\n this.longIntervalMetricReader = new PeriodicExportingMetricReader(\n longIntervalMetricReaderOptions,\n );\n this.longIntervalStatsbeatMeterProvider.addMetricReader(this.longIntervalMetricReader);\n this.longIntervalStatsbeatMeter = this.longIntervalStatsbeatMeterProvider.getMeter(\n \"Azure Monitor Long Interval Statsbeat\",\n );\n\n // Assign Common Properties\n this.runtimeVersion = process.version;\n this.language = STATSBEAT_LANGUAGE;\n this.version = ai.packageVersion;\n this.cikey = options.instrumentationKey;\n\n this.featureStatsbeatGauge = this.longIntervalStatsbeatMeter.createObservableGauge(\n StatsbeatCounter.FEATURE,\n );\n this.attachStatsbeatGauge = this.longIntervalStatsbeatMeter.createObservableGauge(\n StatsbeatCounter.ATTACH,\n );\n this.isInitialized = true;\n this.initialize();\n\n this.commonProperties = {\n os: this.os,\n rp: this.resourceProvider,\n cikey: this.cikey,\n runtimeVersion: this.runtimeVersion,\n language: this.language,\n version: this.version,\n attach: this.attach,\n };\n\n this.attachProperties = {\n rpId: this.resourceIdentifier,\n };\n }\n\n private async initialize(): Promise<void> {\n try {\n await this.getResourceProvider();\n\n // Add long interval observable callbacks\n this.attachStatsbeatGauge.addCallback(this.attachCallback.bind(this));\n this.longIntervalStatsbeatMeter.addBatchObservableCallback(\n this.getEnvironmentStatus.bind(this),\n [this.featureStatsbeatGauge],\n );\n\n // Export Feature/Attach Statsbeat once upon app initialization after 15 second delay\n setTimeout(async () => {\n this.longIntervalAzureExporter.export(\n (await this.longIntervalMetricReader.collect()).resourceMetrics,\n (result: ExportResult) => {\n if (result.code !== ExportResultCode.SUCCESS) {\n diag.error(`LongIntervalStatsbeat: metrics export failed (error ${result.error})`);\n }\n },\n );\n }, 15000); // 15 seconds\n } catch (error) {\n diag.debug(\"Call to get the resource provider failed.\");\n }\n }\n\n private getEnvironmentStatus(observableResult: BatchObservableResult): void {\n this.setFeatures();\n let attributes;\n if (this.instrumentation) {\n attributes = {\n ...this.commonProperties,\n feature: this.instrumentation,\n type: StatsbeatFeatureType.INSTRUMENTATION,\n };\n observableResult.observe(this.featureStatsbeatGauge, 1, { ...attributes });\n }\n\n if (this.feature) {\n attributes = {\n ...this.commonProperties,\n feature: this.feature,\n type: StatsbeatFeatureType.FEATURE,\n };\n observableResult.observe(this.featureStatsbeatGauge, 1, { ...attributes });\n }\n }\n\n private setFeatures(): void {\n const statsbeatFeatures = process.env.AZURE_MONITOR_STATSBEAT_FEATURES;\n if (statsbeatFeatures) {\n try {\n this.feature = JSON.parse(statsbeatFeatures).feature;\n this.instrumentation = JSON.parse(statsbeatFeatures).instrumentation;\n } catch (error: any) {\n diag.error(\n `LongIntervalStatsbeat: Failed to parse features/instrumentations (error ${error})`,\n );\n }\n }\n }\n\n private attachCallback(observableResult: ObservableResult): void {\n const attributes = { ...this.commonProperties, ...this.attachProperties };\n observableResult.observe(1, attributes);\n }\n\n public shutdown(): Promise<void> {\n return this.longIntervalStatsbeatMeterProvider.shutdown();\n }\n}\n\n/**\n * Singleton LongIntervalStatsbeatMetrics instance.\n * @internal\n */\nexport function getInstance(options: StatsbeatOptions): LongIntervalStatsbeatMetrics {\n if (!instance) {\n instance = new LongIntervalStatsbeatMetrics(options);\n }\n return instance;\n}\n"]}
1
+ {"version":3,"file":"longIntervalStatsbeatMetrics.js","sourceRoot":"","sources":["../../../../src/export/statsbeat/longIntervalStatsbeatMetrics.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\n\nimport type {\n BatchObservableResult,\n ObservableGauge,\n ObservableResult,\n Meter,\n} from \"@opentelemetry/api\";\nimport { diag } from \"@opentelemetry/api\";\nimport type { ExportResult } from \"@opentelemetry/core\";\nimport { ExportResultCode } from \"@opentelemetry/core\";\nimport type { PeriodicExportingMetricReaderOptions } from \"@opentelemetry/sdk-metrics\";\nimport { MeterProvider, PeriodicExportingMetricReader } from \"@opentelemetry/sdk-metrics\";\nimport type { AzureMonitorExporterOptions } from \"../../index.js\";\nimport * as ai from \"../../utils/constants/applicationinsights.js\";\nimport { StatsbeatMetrics } from \"./statsbeatMetrics.js\";\nimport type {\n CommonStatsbeatProperties,\n AttachStatsbeatProperties,\n StatsbeatOptions,\n} from \"./types.js\";\nimport { StatsbeatCounter, STATSBEAT_LANGUAGE, StatsbeatFeatureType } from \"./types.js\";\nimport { AzureMonitorStatsbeatExporter } from \"./statsbeatExporter.js\";\nimport { getAttachType } from \"../../utils/metricUtils.js\";\n\n/**\n * Long Interval Statsbeat Metrics\n * @internal\n */\nexport class LongIntervalStatsbeatMetrics extends StatsbeatMetrics {\n private static instance: LongIntervalStatsbeatMetrics | null = null;\n private statsCollectionLongInterval: number = 86400000; // 1 day\n // Custom dimensions\n private cikey: string;\n private runtimeVersion: string;\n private language: string;\n private version: string;\n private attach: string = getAttachType();\n\n private commonProperties: CommonStatsbeatProperties;\n private attachProperties: AttachStatsbeatProperties;\n\n private feature: number = 0;\n private instrumentation: number = 0;\n\n private longIntervalStatsbeatMeterProvider: MeterProvider;\n private longIntervalAzureExporter: AzureMonitorStatsbeatExporter;\n private longIntervalMetricReader: PeriodicExportingMetricReader;\n private longIntervalStatsbeatMeter: Meter;\n\n // Network Attributes\n private connectionString: string;\n\n // Observable Gauges\n private featureStatsbeatGauge: ObservableGauge;\n private attachStatsbeatGauge: ObservableGauge;\n\n public isInitialized: boolean = false;\n\n constructor(options: StatsbeatOptions) {\n super();\n this.connectionString = super.getConnectionString(options.endpointUrl);\n const exporterConfig: AzureMonitorExporterOptions = {\n connectionString: this.connectionString,\n disableOfflineStorage: options.disableOfflineStorage,\n };\n\n this.setFeatures();\n\n this.longIntervalAzureExporter = new AzureMonitorStatsbeatExporter(exporterConfig);\n // Export Long Interval Statsbeats every day\n const longIntervalMetricReaderOptions: PeriodicExportingMetricReaderOptions = {\n exporter: this.longIntervalAzureExporter,\n exportIntervalMillis:\n Number(process.env.LONG_INTERVAL_EXPORT_MILLIS) || this.statsCollectionLongInterval, // 1 day\n };\n\n this.longIntervalMetricReader = new PeriodicExportingMetricReader(\n longIntervalMetricReaderOptions,\n );\n this.longIntervalStatsbeatMeterProvider = new MeterProvider({\n readers: [this.longIntervalMetricReader],\n });\n this.longIntervalStatsbeatMeter = this.longIntervalStatsbeatMeterProvider.getMeter(\n \"Azure Monitor Long Interval Statsbeat\",\n );\n\n // Assign Common Properties\n this.runtimeVersion = process.version;\n this.language = STATSBEAT_LANGUAGE;\n this.version = ai.packageVersion;\n this.cikey = options.instrumentationKey;\n\n this.featureStatsbeatGauge = this.longIntervalStatsbeatMeter.createObservableGauge(\n StatsbeatCounter.FEATURE,\n );\n this.attachStatsbeatGauge = this.longIntervalStatsbeatMeter.createObservableGauge(\n StatsbeatCounter.ATTACH,\n );\n this.isInitialized = true;\n this.initialize();\n\n this.commonProperties = {\n os: this.os,\n rp: this.resourceProvider,\n cikey: this.cikey,\n runtimeVersion: this.runtimeVersion,\n language: this.language,\n version: this.version,\n attach: this.attach,\n };\n\n this.attachProperties = {\n rpId: this.resourceIdentifier,\n };\n }\n\n private async initialize(): Promise<void> {\n try {\n await this.getResourceProvider();\n\n // Add long interval observable callbacks\n this.attachStatsbeatGauge.addCallback(this.attachCallback.bind(this));\n this.longIntervalStatsbeatMeter.addBatchObservableCallback(\n this.getEnvironmentStatus.bind(this),\n [this.featureStatsbeatGauge],\n );\n\n // Export Feature/Attach Statsbeat once upon app initialization after 15 second delay\n setTimeout(async () => {\n try {\n const collectionResult = await this.longIntervalMetricReader.collect();\n if (collectionResult) {\n this.longIntervalAzureExporter.export(\n collectionResult.resourceMetrics,\n (result: ExportResult) => {\n if (result.code !== ExportResultCode.SUCCESS) {\n diag.debug(\n `LongIntervalStatsbeat: metrics export failed (error ${result.error})`,\n );\n }\n },\n );\n } else {\n diag.debug(\"LongIntervalStatsbeat: No metrics collected\");\n }\n } catch (error) {\n diag.debug(`LongIntervalStatsbeat: Error collecting metrics: ${error}`);\n }\n }, 15000); // 15 seconds\n } catch (error) {\n diag.debug(\"Call to get the resource provider failed.\");\n }\n }\n\n private getEnvironmentStatus(observableResult: BatchObservableResult): void {\n this.setFeatures();\n let attributes;\n // Only send instrumentation statsbeat if value is greater than zero\n if (this.instrumentation > 0) {\n attributes = {\n ...this.commonProperties,\n feature: this.instrumentation,\n type: StatsbeatFeatureType.INSTRUMENTATION,\n };\n observableResult.observe(this.featureStatsbeatGauge, 1, { ...attributes });\n }\n\n // Only send feature statsbeat if value is greater than zero\n if (this.feature > 0) {\n attributes = {\n ...this.commonProperties,\n feature: this.feature,\n type: StatsbeatFeatureType.FEATURE,\n };\n observableResult.observe(this.featureStatsbeatGauge, 1, { ...attributes });\n }\n }\n\n private setFeatures(): void {\n const statsbeatFeatures = process.env.AZURE_MONITOR_STATSBEAT_FEATURES;\n if (statsbeatFeatures) {\n try {\n this.feature = JSON.parse(statsbeatFeatures).feature;\n this.instrumentation = JSON.parse(statsbeatFeatures).instrumentation;\n } catch (error: any) {\n diag.debug(\n `LongIntervalStatsbeat: Failed to parse features/instrumentations (error ${error})`,\n );\n }\n }\n }\n\n private attachCallback(observableResult: ObservableResult): void {\n const attributes = { ...this.commonProperties, ...this.attachProperties };\n observableResult.observe(1, attributes);\n }\n\n public shutdown(): Promise<void> {\n return this.longIntervalStatsbeatMeterProvider.shutdown();\n }\n /**\n * Singleton LongIntervalStatsbeatMetrics instance.\n * @internal\n */\n public static getInstance(options: StatsbeatOptions): LongIntervalStatsbeatMetrics {\n if (!LongIntervalStatsbeatMetrics.instance) {\n LongIntervalStatsbeatMetrics.instance = new LongIntervalStatsbeatMetrics(options);\n }\n return LongIntervalStatsbeatMetrics.instance;\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { StatsbeatMetrics } from "./statsbeatMetrics.js";
2
2
  import type { StatsbeatOptions } from "./types.js";
3
3
  export declare class NetworkStatsbeatMetrics extends StatsbeatMetrics {
4
+ private static instance;
4
5
  private disableNonEssentialStatsbeat;
5
6
  private commonProperties;
6
7
  private networkProperties;
@@ -10,7 +11,6 @@ export declare class NetworkStatsbeatMetrics extends StatsbeatMetrics {
10
11
  private networkStatsbeatMeter;
11
12
  private networkStatsbeatMeterProvider;
12
13
  private networkAzureExporter;
13
- private networkMetricReader;
14
14
  private cikey;
15
15
  private runtimeVersion;
16
16
  private language;
@@ -47,5 +47,10 @@ export declare class NetworkStatsbeatMetrics extends StatsbeatMetrics {
47
47
  countException(exceptionType: Error): void;
48
48
  private getNetworkStatsbeatCounter;
49
49
  private getShortHost;
50
+ /**
51
+ * Singleton Network Statsbeat Metrics instance.
52
+ * @internal
53
+ */
54
+ static getInstance(options: StatsbeatOptions): NetworkStatsbeatMetrics;
50
55
  }
51
56
  //# sourceMappingURL=networkStatsbeatMetrics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"networkStatsbeatMetrics.d.ts","sourceRoot":"","sources":["../../../../src/export/statsbeat/networkStatsbeatMetrics.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAMpB,qBAAa,uBAAwB,SAAQ,gBAAgB;IAC3D,OAAO,CAAC,4BAA4B,CAAiD;IACrF,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,4BAA4B,CAAkB;IAEtD,OAAO,CAAC,0BAA0B,CAA+B;IACjE,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,6BAA6B,CAAgB;IACrD,OAAO,CAAC,oBAAoB,CAAgC;IAC5D,OAAO,CAAC,mBAAmB,CAAgC;IAG3D,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAA2B;IAGzC,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,kBAAkB,CAAkB;IAC5C,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,oBAAoB,CAAkB;IAE9C,OAAO,CAAC,gBAAgB,CAA8B;IACtD,OAAO,CAAC,iBAAiB,CAA8B;IAGvD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,IAAI,CAAS;gBAET,OAAO,EAAE,gBAAgB;IA4E9B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAIlB,UAAU;IA6BxB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,oBAAoB;IAQrB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAUpC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAmBxD,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAgBpC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAgBvC,gBAAgB,IAAI,IAAI;IAQxB,iBAAiB,IAAI,IAAI;IAQzB,cAAc,CAAC,aAAa,EAAE,KAAK,GAAG,IAAI;IAgBjD,OAAO,CAAC,0BAA0B;IAiBlC,OAAO,CAAC,YAAY;CAcrB"}
1
+ {"version":3,"file":"networkStatsbeatMetrics.d.ts","sourceRoot":"","sources":["../../../../src/export/statsbeat/networkStatsbeatMetrics.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAMpB,qBAAa,uBAAwB,SAAQ,gBAAgB;IAC3D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwC;IAC/D,OAAO,CAAC,4BAA4B,CAAiD;IACrF,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,4BAA4B,CAAkB;IAEtD,OAAO,CAAC,0BAA0B,CAA+B;IACjE,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,6BAA6B,CAAgB;IACrD,OAAO,CAAC,oBAAoB,CAAgC;IAG5D,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAA2B;IAGzC,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,iBAAiB,CAAkB;IAC3C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,kBAAkB,CAAkB;IAC5C,OAAO,CAAC,mBAAmB,CAAkB;IAC7C,OAAO,CAAC,oBAAoB,CAAkB;IAE9C,OAAO,CAAC,gBAAgB,CAA8B;IACtD,OAAO,CAAC,iBAAiB,CAA8B;IAGvD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,IAAI,CAAS;gBAET,OAAO,EAAE,gBAAgB;IA0E9B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAIlB,UAAU;IA6BxB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,eAAe;IAsBvB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,oBAAoB;IAWrB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAUpC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAmBxD,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAgBpC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAgBvC,gBAAgB,IAAI,IAAI;IAQxB,iBAAiB,IAAI,IAAI;IAQzB,cAAc,CAAC,aAAa,EAAE,KAAK,GAAG,IAAI;IAgBjD,OAAO,CAAC,0BAA0B;IAiBlC,OAAO,CAAC,YAAY;IAepB;;;OAGG;WACW,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,uBAAuB;CAM9E"}
@@ -9,15 +9,39 @@ import { AzureMonitorStatsbeatExporter } from "./statsbeatExporter.js";
9
9
  import { ENV_DISABLE_STATSBEAT } from "../../Declarations/Constants.js";
10
10
  import { getAttachType } from "../../utils/metricUtils.js";
11
11
  export class NetworkStatsbeatMetrics extends StatsbeatMetrics {
12
+ static instance = null;
13
+ disableNonEssentialStatsbeat = !!process.env[ENV_DISABLE_STATSBEAT];
14
+ commonProperties;
15
+ networkProperties;
16
+ isInitialized = false;
17
+ statsCollectionShortInterval = 900000; // 15 minutes
18
+ networkStatsbeatCollection = [];
19
+ networkStatsbeatMeter;
20
+ networkStatsbeatMeterProvider;
21
+ networkAzureExporter;
22
+ // Custom dimensions
23
+ cikey;
24
+ runtimeVersion;
25
+ language;
26
+ version;
27
+ attach = getAttachType();
28
+ // Observable Gauges
29
+ successCountGauge;
30
+ failureCountGauge;
31
+ retryCountGauge;
32
+ throttleCountGauge;
33
+ exceptionCountGauge;
34
+ averageDurationGauge;
35
+ // Non-essential Statsbeat Gauges
36
+ readFailureGauge;
37
+ writeFailureGauge;
38
+ // Network attributes
39
+ connectionString;
40
+ endpointUrl;
41
+ host;
12
42
  constructor(options) {
13
43
  super();
14
- this.disableNonEssentialStatsbeat = !!process.env[ENV_DISABLE_STATSBEAT];
15
- this.isInitialized = false;
16
- this.statsCollectionShortInterval = 900000; // 15 minutes
17
- this.networkStatsbeatCollection = [];
18
- this.attach = getAttachType();
19
44
  this.connectionString = super.getConnectionString(options.endpointUrl);
20
- this.networkStatsbeatMeterProvider = new MeterProvider();
21
45
  const exporterConfig = {
22
46
  connectionString: this.connectionString,
23
47
  };
@@ -27,8 +51,9 @@ export class NetworkStatsbeatMetrics extends StatsbeatMetrics {
27
51
  exporter: this.networkAzureExporter,
28
52
  exportIntervalMillis: options.networkCollectionInterval || this.statsCollectionShortInterval, // 15 minutes
29
53
  };
30
- this.networkMetricReader = new PeriodicExportingMetricReader(networkMetricReaderOptions);
31
- this.networkStatsbeatMeterProvider.addMetricReader(this.networkMetricReader);
54
+ this.networkStatsbeatMeterProvider = new MeterProvider({
55
+ readers: [new PeriodicExportingMetricReader(networkMetricReaderOptions)],
56
+ });
32
57
  this.networkStatsbeatMeter = this.networkStatsbeatMeterProvider.getMeter("Azure Monitor Network Statsbeat");
33
58
  this.endpointUrl = options.endpointUrl;
34
59
  this.runtimeVersion = process.version;
@@ -66,7 +91,6 @@ export class NetworkStatsbeatMetrics extends StatsbeatMetrics {
66
91
  return this.networkStatsbeatMeterProvider.shutdown();
67
92
  }
68
93
  async initialize() {
69
- var _a, _b;
70
94
  try {
71
95
  await super.getResourceProvider();
72
96
  // Add network observable callbacks
@@ -84,8 +108,8 @@ export class NetworkStatsbeatMetrics extends StatsbeatMetrics {
84
108
  this.exceptionCountGauge,
85
109
  ]);
86
110
  if (!this.disableNonEssentialStatsbeat) {
87
- (_a = this.readFailureGauge) === null || _a === void 0 ? void 0 : _a.addCallback(this.readFailureCallback.bind(this));
88
- (_b = this.writeFailureGauge) === null || _b === void 0 ? void 0 : _b.addCallback(this.writeFailureCallback.bind(this));
111
+ this.readFailureGauge?.addCallback(this.readFailureCallback.bind(this));
112
+ this.writeFailureGauge?.addCallback(this.writeFailureCallback.bind(this));
89
113
  }
90
114
  this.averageDurationGauge.addCallback(this.durationCallback.bind(this));
91
115
  }
@@ -96,9 +120,12 @@ export class NetworkStatsbeatMetrics extends StatsbeatMetrics {
96
120
  // Observable gauge callbacks
97
121
  successCallback(observableResult) {
98
122
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
99
- const attributes = Object.assign(Object.assign({}, this.commonProperties), this.networkProperties);
100
- observableResult.observe(counter.totalSuccessfulRequestCount, attributes);
101
- counter.totalSuccessfulRequestCount = 0;
123
+ // Only send metrics if count is greater than zero
124
+ if (counter.totalSuccessfulRequestCount > 0) {
125
+ const attributes = { ...this.commonProperties, ...this.networkProperties };
126
+ observableResult.observe(counter.totalSuccessfulRequestCount, attributes);
127
+ counter.totalSuccessfulRequestCount = 0;
128
+ }
102
129
  }
103
130
  failureCallback(observableResult) {
104
131
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
@@ -107,70 +134,105 @@ export class NetworkStatsbeatMetrics extends StatsbeatMetrics {
107
134
  create a unqiue counter based on statusCode as well
108
135
  append statusCode to attributes so the newly created attributes are unique.
109
136
  */
110
- const attributes = Object.assign(Object.assign(Object.assign({}, this.networkProperties), this.commonProperties), { statusCode: 0 });
137
+ const attributes = { ...this.networkProperties, ...this.commonProperties, statusCode: 0 };
111
138
  // For each { statusCode -> count } mapping, call observe, passing the count and attributes that include the statusCode
112
139
  for (let i = 0; i < counter.totalFailedRequestCount.length; i++) {
113
- attributes.statusCode = counter.totalFailedRequestCount[i].statusCode;
114
- observableResult.observe(this.failureCountGauge, counter.totalFailedRequestCount[i].count, Object.assign({}, attributes));
115
- counter.totalFailedRequestCount[i].count = 0;
140
+ // Only send metrics if count is greater than zero
141
+ if (counter.totalFailedRequestCount[i].count > 0) {
142
+ attributes.statusCode = counter.totalFailedRequestCount[i].statusCode;
143
+ observableResult.observe(this.failureCountGauge, counter.totalFailedRequestCount[i].count, {
144
+ ...attributes,
145
+ });
146
+ counter.totalFailedRequestCount[i].count = 0;
147
+ }
116
148
  }
117
149
  }
118
150
  retryCallback(observableResult) {
119
151
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
120
- const attributes = Object.assign(Object.assign(Object.assign({}, this.networkProperties), this.commonProperties), { statusCode: 0 });
152
+ const attributes = { ...this.networkProperties, ...this.commonProperties, statusCode: 0 };
121
153
  for (let i = 0; i < counter.retryCount.length; i++) {
122
- attributes.statusCode = counter.retryCount[i].statusCode;
123
- observableResult.observe(this.retryCountGauge, counter.retryCount[i].count, Object.assign({}, attributes));
124
- counter.retryCount[i].count = 0;
154
+ // Only send metrics if count is greater than zero
155
+ if (counter.retryCount[i].count > 0) {
156
+ attributes.statusCode = counter.retryCount[i].statusCode;
157
+ observableResult.observe(this.retryCountGauge, counter.retryCount[i].count, {
158
+ ...attributes,
159
+ });
160
+ counter.retryCount[i].count = 0;
161
+ }
125
162
  }
126
163
  }
127
164
  throttleCallback(observableResult) {
128
165
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
129
- const attributes = Object.assign(Object.assign(Object.assign({}, this.networkProperties), this.commonProperties), { statusCode: 0 });
166
+ const attributes = { ...this.networkProperties, ...this.commonProperties, statusCode: 0 };
130
167
  for (let i = 0; i < counter.throttleCount.length; i++) {
131
- attributes.statusCode = counter.throttleCount[i].statusCode;
132
- observableResult.observe(this.throttleCountGauge, counter.throttleCount[i].count, Object.assign({}, attributes));
133
- counter.throttleCount[i].count = 0;
168
+ // Only send metrics if count is greater than zero
169
+ if (counter.throttleCount[i].count > 0) {
170
+ attributes.statusCode = counter.throttleCount[i].statusCode;
171
+ observableResult.observe(this.throttleCountGauge, counter.throttleCount[i].count, {
172
+ ...attributes,
173
+ });
174
+ counter.throttleCount[i].count = 0;
175
+ }
134
176
  }
135
177
  }
136
178
  exceptionCallback(observableResult) {
137
179
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
138
- const attributes = Object.assign(Object.assign(Object.assign({}, this.networkProperties), this.commonProperties), { exceptionType: "" });
180
+ const attributes = { ...this.networkProperties, ...this.commonProperties, exceptionType: "" };
139
181
  for (let i = 0; i < counter.exceptionCount.length; i++) {
140
- attributes.exceptionType = counter.exceptionCount[i].exceptionType;
141
- observableResult.observe(this.exceptionCountGauge, counter.exceptionCount[i].count, Object.assign({}, attributes));
142
- counter.exceptionCount[i].count = 0;
182
+ // Only send metrics if count is greater than zero
183
+ if (counter.exceptionCount[i].count > 0) {
184
+ attributes.exceptionType = counter.exceptionCount[i].exceptionType;
185
+ observableResult.observe(this.exceptionCountGauge, counter.exceptionCount[i].count, {
186
+ ...attributes,
187
+ });
188
+ counter.exceptionCount[i].count = 0;
189
+ }
143
190
  }
144
191
  }
145
192
  durationCallback(observableResult) {
146
193
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
147
- const attributes = Object.assign(Object.assign({}, this.networkProperties), this.commonProperties);
194
+ const attributes = { ...this.networkProperties, ...this.commonProperties };
148
195
  for (let i = 0; i < this.networkStatsbeatCollection.length; i++) {
149
196
  const currentCounter = this.networkStatsbeatCollection[i];
150
197
  currentCounter.time = Number(new Date());
151
198
  const intervalRequests = currentCounter.totalRequestCount - currentCounter.lastRequestCount || 0;
152
- currentCounter.averageRequestExecutionTime =
153
- (currentCounter.intervalRequestExecutionTime -
154
- currentCounter.lastIntervalRequestExecutionTime) /
155
- intervalRequests || 0;
199
+ // Only calculate average if there were actual requests
200
+ if (intervalRequests > 0) {
201
+ currentCounter.averageRequestExecutionTime =
202
+ (currentCounter.intervalRequestExecutionTime -
203
+ currentCounter.lastIntervalRequestExecutionTime) /
204
+ intervalRequests || 0;
205
+ }
206
+ else {
207
+ currentCounter.averageRequestExecutionTime = 0;
208
+ }
156
209
  currentCounter.lastIntervalRequestExecutionTime = currentCounter.intervalRequestExecutionTime; // reset
157
210
  currentCounter.lastRequestCount = currentCounter.totalRequestCount;
158
211
  currentCounter.lastTime = currentCounter.time;
159
212
  }
160
- observableResult.observe(counter.averageRequestExecutionTime, attributes);
161
- counter.averageRequestExecutionTime = 0;
213
+ // Only report if there's a non-zero average duration
214
+ if (counter.averageRequestExecutionTime > 0) {
215
+ observableResult.observe(counter.averageRequestExecutionTime, attributes);
216
+ counter.averageRequestExecutionTime = 0;
217
+ }
162
218
  }
163
219
  readFailureCallback(observableResult) {
164
220
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
165
- const attributes = Object.assign(Object.assign({}, this.commonProperties), this.networkProperties);
166
- observableResult.observe(counter.totalReadFailureCount, attributes);
167
- counter.totalReadFailureCount = 0;
221
+ // Only send metrics if count is greater than zero
222
+ if (counter.totalReadFailureCount > 0) {
223
+ const attributes = { ...this.commonProperties, ...this.networkProperties };
224
+ observableResult.observe(counter.totalReadFailureCount, attributes);
225
+ counter.totalReadFailureCount = 0;
226
+ }
168
227
  }
169
228
  writeFailureCallback(observableResult) {
170
229
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
171
- const attributes = Object.assign(Object.assign({}, this.commonProperties), this.networkProperties);
172
- observableResult.observe(counter.totalWriteFailureCount, attributes);
173
- counter.totalWriteFailureCount = 0;
230
+ // Only send metrics if count is greater than zero
231
+ if (counter.totalWriteFailureCount > 0) {
232
+ const attributes = { ...this.commonProperties, ...this.networkProperties };
233
+ observableResult.observe(counter.totalWriteFailureCount, attributes);
234
+ counter.totalWriteFailureCount = 0;
235
+ }
174
236
  }
175
237
  // Public methods to increase counters
176
238
  countSuccess(duration) {
@@ -280,5 +342,15 @@ export class NetworkStatsbeatMetrics extends StatsbeatMetrics {
280
342
  }
281
343
  return shortHost;
282
344
  }
345
+ /**
346
+ * Singleton Network Statsbeat Metrics instance.
347
+ * @internal
348
+ */
349
+ static getInstance(options) {
350
+ if (!NetworkStatsbeatMetrics.instance) {
351
+ NetworkStatsbeatMetrics.instance = new NetworkStatsbeatMetrics(options);
352
+ }
353
+ return NetworkStatsbeatMetrics.instance;
354
+ }
283
355
  }
284
356
  //# sourceMappingURL=networkStatsbeatMetrics.js.map