@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
@@ -2,7 +2,7 @@
2
2
  // Copyright (c) Microsoft Corporation.
3
3
  // Licensed under the MIT License.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.getInstance = getInstance;
5
+ exports.LongIntervalStatsbeatMetrics = void 0;
6
6
  const tslib_1 = require("tslib");
7
7
  const api_1 = require("@opentelemetry/api");
8
8
  const core_1 = require("@opentelemetry/core");
@@ -12,26 +12,41 @@ const statsbeatMetrics_js_1 = require("./statsbeatMetrics.js");
12
12
  const types_js_1 = require("./types.js");
13
13
  const statsbeatExporter_js_1 = require("./statsbeatExporter.js");
14
14
  const metricUtils_js_1 = require("../../utils/metricUtils.js");
15
- let instance = null;
16
15
  /**
17
16
  * Long Interval Statsbeat Metrics
18
17
  * @internal
19
18
  */
20
19
  class LongIntervalStatsbeatMetrics extends statsbeatMetrics_js_1.StatsbeatMetrics {
20
+ static instance = null;
21
+ statsCollectionLongInterval = 86400000; // 1 day
22
+ // Custom dimensions
23
+ cikey;
24
+ runtimeVersion;
25
+ language;
26
+ version;
27
+ attach = (0, metricUtils_js_1.getAttachType)();
28
+ commonProperties;
29
+ attachProperties;
30
+ feature = 0;
31
+ instrumentation = 0;
32
+ longIntervalStatsbeatMeterProvider;
33
+ longIntervalAzureExporter;
34
+ longIntervalMetricReader;
35
+ longIntervalStatsbeatMeter;
36
+ // Network Attributes
37
+ connectionString;
38
+ // Observable Gauges
39
+ featureStatsbeatGauge;
40
+ attachStatsbeatGauge;
41
+ isInitialized = false;
21
42
  constructor(options) {
22
43
  super();
23
- this.statsCollectionLongInterval = 86400000; // 1 day
24
- this.attach = (0, metricUtils_js_1.getAttachType)();
25
- this.feature = 0;
26
- this.instrumentation = 0;
27
- this.isInitialized = false;
28
44
  this.connectionString = super.getConnectionString(options.endpointUrl);
29
45
  const exporterConfig = {
30
46
  connectionString: this.connectionString,
31
47
  disableOfflineStorage: options.disableOfflineStorage,
32
48
  };
33
49
  this.setFeatures();
34
- this.longIntervalStatsbeatMeterProvider = new sdk_metrics_1.MeterProvider();
35
50
  this.longIntervalAzureExporter = new statsbeatExporter_js_1.AzureMonitorStatsbeatExporter(exporterConfig);
36
51
  // Export Long Interval Statsbeats every day
37
52
  const longIntervalMetricReaderOptions = {
@@ -39,7 +54,9 @@ class LongIntervalStatsbeatMetrics extends statsbeatMetrics_js_1.StatsbeatMetric
39
54
  exportIntervalMillis: Number(process.env.LONG_INTERVAL_EXPORT_MILLIS) || this.statsCollectionLongInterval, // 1 day
40
55
  };
41
56
  this.longIntervalMetricReader = new sdk_metrics_1.PeriodicExportingMetricReader(longIntervalMetricReaderOptions);
42
- this.longIntervalStatsbeatMeterProvider.addMetricReader(this.longIntervalMetricReader);
57
+ this.longIntervalStatsbeatMeterProvider = new sdk_metrics_1.MeterProvider({
58
+ readers: [this.longIntervalMetricReader],
59
+ });
43
60
  this.longIntervalStatsbeatMeter = this.longIntervalStatsbeatMeterProvider.getMeter("Azure Monitor Long Interval Statsbeat");
44
61
  // Assign Common Properties
45
62
  this.runtimeVersion = process.version;
@@ -71,11 +88,22 @@ class LongIntervalStatsbeatMetrics extends statsbeatMetrics_js_1.StatsbeatMetric
71
88
  this.longIntervalStatsbeatMeter.addBatchObservableCallback(this.getEnvironmentStatus.bind(this), [this.featureStatsbeatGauge]);
72
89
  // Export Feature/Attach Statsbeat once upon app initialization after 15 second delay
73
90
  setTimeout(async () => {
74
- this.longIntervalAzureExporter.export((await this.longIntervalMetricReader.collect()).resourceMetrics, (result) => {
75
- if (result.code !== core_1.ExportResultCode.SUCCESS) {
76
- api_1.diag.error(`LongIntervalStatsbeat: metrics export failed (error ${result.error})`);
91
+ try {
92
+ const collectionResult = await this.longIntervalMetricReader.collect();
93
+ if (collectionResult) {
94
+ this.longIntervalAzureExporter.export(collectionResult.resourceMetrics, (result) => {
95
+ if (result.code !== core_1.ExportResultCode.SUCCESS) {
96
+ api_1.diag.debug(`LongIntervalStatsbeat: metrics export failed (error ${result.error})`);
97
+ }
98
+ });
77
99
  }
78
- });
100
+ else {
101
+ api_1.diag.debug("LongIntervalStatsbeat: No metrics collected");
102
+ }
103
+ }
104
+ catch (error) {
105
+ api_1.diag.debug(`LongIntervalStatsbeat: Error collecting metrics: ${error}`);
106
+ }
79
107
  }, 15000); // 15 seconds
80
108
  }
81
109
  catch (error) {
@@ -85,13 +113,23 @@ class LongIntervalStatsbeatMetrics extends statsbeatMetrics_js_1.StatsbeatMetric
85
113
  getEnvironmentStatus(observableResult) {
86
114
  this.setFeatures();
87
115
  let attributes;
88
- if (this.instrumentation) {
89
- attributes = Object.assign(Object.assign({}, this.commonProperties), { feature: this.instrumentation, type: types_js_1.StatsbeatFeatureType.INSTRUMENTATION });
90
- observableResult.observe(this.featureStatsbeatGauge, 1, Object.assign({}, attributes));
116
+ // Only send instrumentation statsbeat if value is greater than zero
117
+ if (this.instrumentation > 0) {
118
+ attributes = {
119
+ ...this.commonProperties,
120
+ feature: this.instrumentation,
121
+ type: types_js_1.StatsbeatFeatureType.INSTRUMENTATION,
122
+ };
123
+ observableResult.observe(this.featureStatsbeatGauge, 1, { ...attributes });
91
124
  }
92
- if (this.feature) {
93
- attributes = Object.assign(Object.assign({}, this.commonProperties), { feature: this.feature, type: types_js_1.StatsbeatFeatureType.FEATURE });
94
- observableResult.observe(this.featureStatsbeatGauge, 1, Object.assign({}, attributes));
125
+ // Only send feature statsbeat if value is greater than zero
126
+ if (this.feature > 0) {
127
+ attributes = {
128
+ ...this.commonProperties,
129
+ feature: this.feature,
130
+ type: types_js_1.StatsbeatFeatureType.FEATURE,
131
+ };
132
+ observableResult.observe(this.featureStatsbeatGauge, 1, { ...attributes });
95
133
  }
96
134
  }
97
135
  setFeatures() {
@@ -102,26 +140,27 @@ class LongIntervalStatsbeatMetrics extends statsbeatMetrics_js_1.StatsbeatMetric
102
140
  this.instrumentation = JSON.parse(statsbeatFeatures).instrumentation;
103
141
  }
104
142
  catch (error) {
105
- api_1.diag.error(`LongIntervalStatsbeat: Failed to parse features/instrumentations (error ${error})`);
143
+ api_1.diag.debug(`LongIntervalStatsbeat: Failed to parse features/instrumentations (error ${error})`);
106
144
  }
107
145
  }
108
146
  }
109
147
  attachCallback(observableResult) {
110
- const attributes = Object.assign(Object.assign({}, this.commonProperties), this.attachProperties);
148
+ const attributes = { ...this.commonProperties, ...this.attachProperties };
111
149
  observableResult.observe(1, attributes);
112
150
  }
113
151
  shutdown() {
114
152
  return this.longIntervalStatsbeatMeterProvider.shutdown();
115
153
  }
116
- }
117
- /**
118
- * Singleton LongIntervalStatsbeatMetrics instance.
119
- * @internal
120
- */
121
- function getInstance(options) {
122
- if (!instance) {
123
- instance = new LongIntervalStatsbeatMetrics(options);
154
+ /**
155
+ * Singleton LongIntervalStatsbeatMetrics instance.
156
+ * @internal
157
+ */
158
+ static getInstance(options) {
159
+ if (!LongIntervalStatsbeatMetrics.instance) {
160
+ LongIntervalStatsbeatMetrics.instance = new LongIntervalStatsbeatMetrics(options);
161
+ }
162
+ return LongIntervalStatsbeatMetrics.instance;
124
163
  }
125
- return instance;
126
164
  }
165
+ exports.LongIntervalStatsbeatMetrics = LongIntervalStatsbeatMetrics;
127
166
  //# 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"}
@@ -13,15 +13,39 @@ const statsbeatExporter_js_1 = require("./statsbeatExporter.js");
13
13
  const Constants_js_1 = require("../../Declarations/Constants.js");
14
14
  const metricUtils_js_1 = require("../../utils/metricUtils.js");
15
15
  class NetworkStatsbeatMetrics extends statsbeatMetrics_js_1.StatsbeatMetrics {
16
+ static instance = null;
17
+ disableNonEssentialStatsbeat = !!process.env[Constants_js_1.ENV_DISABLE_STATSBEAT];
18
+ commonProperties;
19
+ networkProperties;
20
+ isInitialized = false;
21
+ statsCollectionShortInterval = 900000; // 15 minutes
22
+ networkStatsbeatCollection = [];
23
+ networkStatsbeatMeter;
24
+ networkStatsbeatMeterProvider;
25
+ networkAzureExporter;
26
+ // Custom dimensions
27
+ cikey;
28
+ runtimeVersion;
29
+ language;
30
+ version;
31
+ attach = (0, metricUtils_js_1.getAttachType)();
32
+ // Observable Gauges
33
+ successCountGauge;
34
+ failureCountGauge;
35
+ retryCountGauge;
36
+ throttleCountGauge;
37
+ exceptionCountGauge;
38
+ averageDurationGauge;
39
+ // Non-essential Statsbeat Gauges
40
+ readFailureGauge;
41
+ writeFailureGauge;
42
+ // Network attributes
43
+ connectionString;
44
+ endpointUrl;
45
+ host;
16
46
  constructor(options) {
17
47
  super();
18
- this.disableNonEssentialStatsbeat = !!process.env[Constants_js_1.ENV_DISABLE_STATSBEAT];
19
- this.isInitialized = false;
20
- this.statsCollectionShortInterval = 900000; // 15 minutes
21
- this.networkStatsbeatCollection = [];
22
- this.attach = (0, metricUtils_js_1.getAttachType)();
23
48
  this.connectionString = super.getConnectionString(options.endpointUrl);
24
- this.networkStatsbeatMeterProvider = new sdk_metrics_1.MeterProvider();
25
49
  const exporterConfig = {
26
50
  connectionString: this.connectionString,
27
51
  };
@@ -31,8 +55,9 @@ class NetworkStatsbeatMetrics extends statsbeatMetrics_js_1.StatsbeatMetrics {
31
55
  exporter: this.networkAzureExporter,
32
56
  exportIntervalMillis: options.networkCollectionInterval || this.statsCollectionShortInterval, // 15 minutes
33
57
  };
34
- this.networkMetricReader = new sdk_metrics_1.PeriodicExportingMetricReader(networkMetricReaderOptions);
35
- this.networkStatsbeatMeterProvider.addMetricReader(this.networkMetricReader);
58
+ this.networkStatsbeatMeterProvider = new sdk_metrics_1.MeterProvider({
59
+ readers: [new sdk_metrics_1.PeriodicExportingMetricReader(networkMetricReaderOptions)],
60
+ });
36
61
  this.networkStatsbeatMeter = this.networkStatsbeatMeterProvider.getMeter("Azure Monitor Network Statsbeat");
37
62
  this.endpointUrl = options.endpointUrl;
38
63
  this.runtimeVersion = process.version;
@@ -70,7 +95,6 @@ class NetworkStatsbeatMetrics extends statsbeatMetrics_js_1.StatsbeatMetrics {
70
95
  return this.networkStatsbeatMeterProvider.shutdown();
71
96
  }
72
97
  async initialize() {
73
- var _a, _b;
74
98
  try {
75
99
  await super.getResourceProvider();
76
100
  // Add network observable callbacks
@@ -88,8 +112,8 @@ class NetworkStatsbeatMetrics extends statsbeatMetrics_js_1.StatsbeatMetrics {
88
112
  this.exceptionCountGauge,
89
113
  ]);
90
114
  if (!this.disableNonEssentialStatsbeat) {
91
- (_a = this.readFailureGauge) === null || _a === void 0 ? void 0 : _a.addCallback(this.readFailureCallback.bind(this));
92
- (_b = this.writeFailureGauge) === null || _b === void 0 ? void 0 : _b.addCallback(this.writeFailureCallback.bind(this));
115
+ this.readFailureGauge?.addCallback(this.readFailureCallback.bind(this));
116
+ this.writeFailureGauge?.addCallback(this.writeFailureCallback.bind(this));
93
117
  }
94
118
  this.averageDurationGauge.addCallback(this.durationCallback.bind(this));
95
119
  }
@@ -100,9 +124,12 @@ class NetworkStatsbeatMetrics extends statsbeatMetrics_js_1.StatsbeatMetrics {
100
124
  // Observable gauge callbacks
101
125
  successCallback(observableResult) {
102
126
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
103
- const attributes = Object.assign(Object.assign({}, this.commonProperties), this.networkProperties);
104
- observableResult.observe(counter.totalSuccessfulRequestCount, attributes);
105
- counter.totalSuccessfulRequestCount = 0;
127
+ // Only send metrics if count is greater than zero
128
+ if (counter.totalSuccessfulRequestCount > 0) {
129
+ const attributes = { ...this.commonProperties, ...this.networkProperties };
130
+ observableResult.observe(counter.totalSuccessfulRequestCount, attributes);
131
+ counter.totalSuccessfulRequestCount = 0;
132
+ }
106
133
  }
107
134
  failureCallback(observableResult) {
108
135
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
@@ -111,70 +138,105 @@ class NetworkStatsbeatMetrics extends statsbeatMetrics_js_1.StatsbeatMetrics {
111
138
  create a unqiue counter based on statusCode as well
112
139
  append statusCode to attributes so the newly created attributes are unique.
113
140
  */
114
- const attributes = Object.assign(Object.assign(Object.assign({}, this.networkProperties), this.commonProperties), { statusCode: 0 });
141
+ const attributes = { ...this.networkProperties, ...this.commonProperties, statusCode: 0 };
115
142
  // For each { statusCode -> count } mapping, call observe, passing the count and attributes that include the statusCode
116
143
  for (let i = 0; i < counter.totalFailedRequestCount.length; i++) {
117
- attributes.statusCode = counter.totalFailedRequestCount[i].statusCode;
118
- observableResult.observe(this.failureCountGauge, counter.totalFailedRequestCount[i].count, Object.assign({}, attributes));
119
- counter.totalFailedRequestCount[i].count = 0;
144
+ // Only send metrics if count is greater than zero
145
+ if (counter.totalFailedRequestCount[i].count > 0) {
146
+ attributes.statusCode = counter.totalFailedRequestCount[i].statusCode;
147
+ observableResult.observe(this.failureCountGauge, counter.totalFailedRequestCount[i].count, {
148
+ ...attributes,
149
+ });
150
+ counter.totalFailedRequestCount[i].count = 0;
151
+ }
120
152
  }
121
153
  }
122
154
  retryCallback(observableResult) {
123
155
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
124
- const attributes = Object.assign(Object.assign(Object.assign({}, this.networkProperties), this.commonProperties), { statusCode: 0 });
156
+ const attributes = { ...this.networkProperties, ...this.commonProperties, statusCode: 0 };
125
157
  for (let i = 0; i < counter.retryCount.length; i++) {
126
- attributes.statusCode = counter.retryCount[i].statusCode;
127
- observableResult.observe(this.retryCountGauge, counter.retryCount[i].count, Object.assign({}, attributes));
128
- counter.retryCount[i].count = 0;
158
+ // Only send metrics if count is greater than zero
159
+ if (counter.retryCount[i].count > 0) {
160
+ attributes.statusCode = counter.retryCount[i].statusCode;
161
+ observableResult.observe(this.retryCountGauge, counter.retryCount[i].count, {
162
+ ...attributes,
163
+ });
164
+ counter.retryCount[i].count = 0;
165
+ }
129
166
  }
130
167
  }
131
168
  throttleCallback(observableResult) {
132
169
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
133
- const attributes = Object.assign(Object.assign(Object.assign({}, this.networkProperties), this.commonProperties), { statusCode: 0 });
170
+ const attributes = { ...this.networkProperties, ...this.commonProperties, statusCode: 0 };
134
171
  for (let i = 0; i < counter.throttleCount.length; i++) {
135
- attributes.statusCode = counter.throttleCount[i].statusCode;
136
- observableResult.observe(this.throttleCountGauge, counter.throttleCount[i].count, Object.assign({}, attributes));
137
- counter.throttleCount[i].count = 0;
172
+ // Only send metrics if count is greater than zero
173
+ if (counter.throttleCount[i].count > 0) {
174
+ attributes.statusCode = counter.throttleCount[i].statusCode;
175
+ observableResult.observe(this.throttleCountGauge, counter.throttleCount[i].count, {
176
+ ...attributes,
177
+ });
178
+ counter.throttleCount[i].count = 0;
179
+ }
138
180
  }
139
181
  }
140
182
  exceptionCallback(observableResult) {
141
183
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
142
- const attributes = Object.assign(Object.assign(Object.assign({}, this.networkProperties), this.commonProperties), { exceptionType: "" });
184
+ const attributes = { ...this.networkProperties, ...this.commonProperties, exceptionType: "" };
143
185
  for (let i = 0; i < counter.exceptionCount.length; i++) {
144
- attributes.exceptionType = counter.exceptionCount[i].exceptionType;
145
- observableResult.observe(this.exceptionCountGauge, counter.exceptionCount[i].count, Object.assign({}, attributes));
146
- counter.exceptionCount[i].count = 0;
186
+ // Only send metrics if count is greater than zero
187
+ if (counter.exceptionCount[i].count > 0) {
188
+ attributes.exceptionType = counter.exceptionCount[i].exceptionType;
189
+ observableResult.observe(this.exceptionCountGauge, counter.exceptionCount[i].count, {
190
+ ...attributes,
191
+ });
192
+ counter.exceptionCount[i].count = 0;
193
+ }
147
194
  }
148
195
  }
149
196
  durationCallback(observableResult) {
150
197
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
151
- const attributes = Object.assign(Object.assign({}, this.networkProperties), this.commonProperties);
198
+ const attributes = { ...this.networkProperties, ...this.commonProperties };
152
199
  for (let i = 0; i < this.networkStatsbeatCollection.length; i++) {
153
200
  const currentCounter = this.networkStatsbeatCollection[i];
154
201
  currentCounter.time = Number(new Date());
155
202
  const intervalRequests = currentCounter.totalRequestCount - currentCounter.lastRequestCount || 0;
156
- currentCounter.averageRequestExecutionTime =
157
- (currentCounter.intervalRequestExecutionTime -
158
- currentCounter.lastIntervalRequestExecutionTime) /
159
- intervalRequests || 0;
203
+ // Only calculate average if there were actual requests
204
+ if (intervalRequests > 0) {
205
+ currentCounter.averageRequestExecutionTime =
206
+ (currentCounter.intervalRequestExecutionTime -
207
+ currentCounter.lastIntervalRequestExecutionTime) /
208
+ intervalRequests || 0;
209
+ }
210
+ else {
211
+ currentCounter.averageRequestExecutionTime = 0;
212
+ }
160
213
  currentCounter.lastIntervalRequestExecutionTime = currentCounter.intervalRequestExecutionTime; // reset
161
214
  currentCounter.lastRequestCount = currentCounter.totalRequestCount;
162
215
  currentCounter.lastTime = currentCounter.time;
163
216
  }
164
- observableResult.observe(counter.averageRequestExecutionTime, attributes);
165
- counter.averageRequestExecutionTime = 0;
217
+ // Only report if there's a non-zero average duration
218
+ if (counter.averageRequestExecutionTime > 0) {
219
+ observableResult.observe(counter.averageRequestExecutionTime, attributes);
220
+ counter.averageRequestExecutionTime = 0;
221
+ }
166
222
  }
167
223
  readFailureCallback(observableResult) {
168
224
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
169
- const attributes = Object.assign(Object.assign({}, this.commonProperties), this.networkProperties);
170
- observableResult.observe(counter.totalReadFailureCount, attributes);
171
- counter.totalReadFailureCount = 0;
225
+ // Only send metrics if count is greater than zero
226
+ if (counter.totalReadFailureCount > 0) {
227
+ const attributes = { ...this.commonProperties, ...this.networkProperties };
228
+ observableResult.observe(counter.totalReadFailureCount, attributes);
229
+ counter.totalReadFailureCount = 0;
230
+ }
172
231
  }
173
232
  writeFailureCallback(observableResult) {
174
233
  const counter = this.getNetworkStatsbeatCounter(this.endpointUrl, this.host);
175
- const attributes = Object.assign(Object.assign({}, this.commonProperties), this.networkProperties);
176
- observableResult.observe(counter.totalWriteFailureCount, attributes);
177
- counter.totalWriteFailureCount = 0;
234
+ // Only send metrics if count is greater than zero
235
+ if (counter.totalWriteFailureCount > 0) {
236
+ const attributes = { ...this.commonProperties, ...this.networkProperties };
237
+ observableResult.observe(counter.totalWriteFailureCount, attributes);
238
+ counter.totalWriteFailureCount = 0;
239
+ }
178
240
  }
179
241
  // Public methods to increase counters
180
242
  countSuccess(duration) {
@@ -284,6 +346,16 @@ class NetworkStatsbeatMetrics extends statsbeatMetrics_js_1.StatsbeatMetrics {
284
346
  }
285
347
  return shortHost;
286
348
  }
349
+ /**
350
+ * Singleton Network Statsbeat Metrics instance.
351
+ * @internal
352
+ */
353
+ static getInstance(options) {
354
+ if (!NetworkStatsbeatMetrics.instance) {
355
+ NetworkStatsbeatMetrics.instance = new NetworkStatsbeatMetrics(options);
356
+ }
357
+ return NetworkStatsbeatMetrics.instance;
358
+ }
287
359
  }
288
360
  exports.NetworkStatsbeatMetrics = NetworkStatsbeatMetrics;
289
361
  //# sourceMappingURL=networkStatsbeatMetrics.js.map