@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.
- package/README.md +4 -4
- package/dist/commonjs/Declarations/Constants.d.ts +5 -0
- package/dist/commonjs/Declarations/Constants.d.ts.map +1 -1
- package/dist/commonjs/Declarations/Constants.js +6 -1
- package/dist/commonjs/Declarations/Constants.js.map +1 -1
- package/dist/commonjs/export/base.js +25 -14
- package/dist/commonjs/export/base.js.map +1 -1
- package/dist/commonjs/export/log.js +5 -4
- package/dist/commonjs/export/log.js.map +1 -1
- package/dist/commonjs/export/metric.js +5 -4
- package/dist/commonjs/export/metric.js.map +1 -1
- package/dist/commonjs/export/statsbeat/customerStatsbeat.d.ts +125 -0
- package/dist/commonjs/export/statsbeat/customerStatsbeat.d.ts.map +1 -0
- package/dist/commonjs/export/statsbeat/customerStatsbeat.js +480 -0
- package/dist/commonjs/export/statsbeat/customerStatsbeat.js.map +1 -0
- package/dist/commonjs/export/statsbeat/longIntervalStatsbeatMetrics.d.ts +7 -7
- package/dist/commonjs/export/statsbeat/longIntervalStatsbeatMetrics.d.ts.map +1 -1
- package/dist/commonjs/export/statsbeat/longIntervalStatsbeatMetrics.js +69 -30
- package/dist/commonjs/export/statsbeat/longIntervalStatsbeatMetrics.js.map +1 -1
- package/dist/commonjs/export/statsbeat/networkStatsbeatMetrics.d.ts +6 -1
- package/dist/commonjs/export/statsbeat/networkStatsbeatMetrics.d.ts.map +1 -1
- package/dist/commonjs/export/statsbeat/networkStatsbeatMetrics.js +115 -43
- package/dist/commonjs/export/statsbeat/networkStatsbeatMetrics.js.map +1 -1
- package/dist/commonjs/export/statsbeat/statsbeatExporter.d.ts +7 -0
- package/dist/commonjs/export/statsbeat/statsbeatExporter.d.ts.map +1 -1
- package/dist/commonjs/export/statsbeat/statsbeatExporter.js +25 -5
- package/dist/commonjs/export/statsbeat/statsbeatExporter.js.map +1 -1
- package/dist/commonjs/export/statsbeat/statsbeatMetrics.js +6 -8
- package/dist/commonjs/export/statsbeat/statsbeatMetrics.js.map +1 -1
- package/dist/commonjs/export/statsbeat/types.d.ts +52 -0
- package/dist/commonjs/export/statsbeat/types.d.ts.map +1 -1
- package/dist/commonjs/export/statsbeat/types.js +75 -1
- package/dist/commonjs/export/statsbeat/types.js.map +1 -1
- package/dist/commonjs/export/trace.js +6 -5
- package/dist/commonjs/export/trace.js.map +1 -1
- package/dist/commonjs/generated/applicationInsightsClient.js +9 -4
- package/dist/commonjs/generated/applicationInsightsClient.js.map +1 -1
- package/dist/commonjs/generated/models/mappers.js +145 -68
- package/dist/commonjs/generated/models/mappers.js.map +1 -1
- package/dist/commonjs/index.d.ts +2 -1
- package/dist/commonjs/index.d.ts.map +1 -1
- package/dist/commonjs/index.js +5 -3
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/platform/nodejs/baseSender.d.ts +1 -0
- package/dist/commonjs/platform/nodejs/baseSender.d.ts.map +1 -1
- package/dist/commonjs/platform/nodejs/baseSender.js +101 -34
- package/dist/commonjs/platform/nodejs/baseSender.js.map +1 -1
- package/dist/commonjs/platform/nodejs/context/context.d.ts +0 -1
- package/dist/commonjs/platform/nodejs/context/context.d.ts.map +1 -1
- package/dist/commonjs/platform/nodejs/context/context.js +4 -8
- package/dist/commonjs/platform/nodejs/context/context.js.map +1 -1
- package/dist/commonjs/platform/nodejs/httpSender.js +11 -4
- package/dist/commonjs/platform/nodejs/httpSender.js.map +1 -1
- package/dist/commonjs/platform/nodejs/index.d.ts +1 -0
- package/dist/commonjs/platform/nodejs/index.d.ts.map +1 -1
- package/dist/commonjs/platform/nodejs/index.js +1 -0
- package/dist/commonjs/platform/nodejs/index.js.map +1 -1
- package/dist/commonjs/platform/nodejs/persist/fileAccessControl.js +7 -7
- package/dist/commonjs/platform/nodejs/persist/fileAccessControl.js.map +1 -1
- package/dist/commonjs/platform/nodejs/persist/fileSystemPersist.d.ts +9 -1
- package/dist/commonjs/platform/nodejs/persist/fileSystemPersist.d.ts.map +1 -1
- package/dist/commonjs/platform/nodejs/persist/fileSystemPersist.js +37 -16
- package/dist/commonjs/platform/nodejs/persist/fileSystemPersist.js.map +1 -1
- package/dist/commonjs/{sampling.d.ts → sampling/percentageSampler.d.ts} +2 -3
- package/dist/commonjs/sampling/percentageSampler.d.ts.map +1 -0
- package/dist/commonjs/{sampling.js → sampling/percentageSampler.js} +6 -39
- package/dist/commonjs/sampling/percentageSampler.js.map +1 -0
- package/dist/commonjs/sampling/rateLimitedSampler.d.ts +58 -0
- package/dist/commonjs/sampling/rateLimitedSampler.d.ts.map +1 -0
- package/dist/commonjs/sampling/rateLimitedSampler.js +118 -0
- package/dist/commonjs/sampling/rateLimitedSampler.js.map +1 -0
- package/dist/commonjs/sampling/samplingUtils.d.ts +17 -0
- package/dist/commonjs/sampling/samplingUtils.d.ts.map +1 -0
- package/dist/commonjs/sampling/samplingUtils.js +94 -0
- package/dist/commonjs/sampling/samplingUtils.js.map +1 -0
- package/dist/commonjs/tsdoc-metadata.json +11 -11
- package/dist/commonjs/types.d.ts.map +1 -1
- package/dist/commonjs/types.js +1 -0
- package/dist/commonjs/types.js.map +1 -1
- package/dist/commonjs/utils/common.js +2 -3
- package/dist/commonjs/utils/common.js.map +1 -1
- package/dist/commonjs/utils/connectionStringParser.js +3 -3
- package/dist/commonjs/utils/connectionStringParser.js.map +1 -1
- package/dist/commonjs/utils/constants/applicationinsights.d.ts +1 -1
- package/dist/commonjs/utils/constants/applicationinsights.js +1 -1
- package/dist/commonjs/utils/constants/applicationinsights.js.map +1 -1
- package/dist/commonjs/utils/eventhub.js +5 -2
- package/dist/commonjs/utils/eventhub.js.map +1 -1
- package/dist/commonjs/utils/logUtils.js +10 -9
- package/dist/commonjs/utils/logUtils.js.map +1 -1
- package/dist/commonjs/utils/metricUtils.d.ts.map +1 -1
- package/dist/commonjs/utils/metricUtils.js +6 -6
- package/dist/commonjs/utils/metricUtils.js.map +1 -1
- package/dist/commonjs/utils/spanUtils.d.ts.map +1 -1
- package/dist/commonjs/utils/spanUtils.js +16 -14
- package/dist/commonjs/utils/spanUtils.js.map +1 -1
- package/dist/esm/Declarations/Constants.d.ts +5 -0
- package/dist/esm/Declarations/Constants.d.ts.map +1 -1
- package/dist/esm/Declarations/Constants.js +5 -0
- package/dist/esm/Declarations/Constants.js.map +1 -1
- package/dist/esm/export/base.js +25 -14
- package/dist/esm/export/base.js.map +1 -1
- package/dist/esm/export/log.js +5 -4
- package/dist/esm/export/log.js.map +1 -1
- package/dist/esm/export/metric.js +5 -4
- package/dist/esm/export/metric.js.map +1 -1
- package/dist/esm/export/statsbeat/customerStatsbeat.d.ts +125 -0
- package/dist/esm/export/statsbeat/customerStatsbeat.d.ts.map +1 -0
- package/dist/esm/export/statsbeat/customerStatsbeat.js +475 -0
- package/dist/esm/export/statsbeat/customerStatsbeat.js.map +1 -0
- package/dist/esm/export/statsbeat/longIntervalStatsbeatMetrics.d.ts +7 -7
- package/dist/esm/export/statsbeat/longIntervalStatsbeatMetrics.d.ts.map +1 -1
- package/dist/esm/export/statsbeat/longIntervalStatsbeatMetrics.js +68 -30
- package/dist/esm/export/statsbeat/longIntervalStatsbeatMetrics.js.map +1 -1
- package/dist/esm/export/statsbeat/networkStatsbeatMetrics.d.ts +6 -1
- package/dist/esm/export/statsbeat/networkStatsbeatMetrics.d.ts.map +1 -1
- package/dist/esm/export/statsbeat/networkStatsbeatMetrics.js +115 -43
- package/dist/esm/export/statsbeat/networkStatsbeatMetrics.js.map +1 -1
- package/dist/esm/export/statsbeat/statsbeatExporter.d.ts +7 -0
- package/dist/esm/export/statsbeat/statsbeatExporter.d.ts.map +1 -1
- package/dist/esm/export/statsbeat/statsbeatExporter.js +25 -5
- package/dist/esm/export/statsbeat/statsbeatExporter.js.map +1 -1
- package/dist/esm/export/statsbeat/statsbeatMetrics.js +6 -8
- package/dist/esm/export/statsbeat/statsbeatMetrics.js.map +1 -1
- package/dist/esm/export/statsbeat/types.d.ts +52 -0
- package/dist/esm/export/statsbeat/types.d.ts.map +1 -1
- package/dist/esm/export/statsbeat/types.js +73 -0
- package/dist/esm/export/statsbeat/types.js.map +1 -1
- package/dist/esm/export/trace.js +6 -5
- package/dist/esm/export/trace.js.map +1 -1
- package/dist/esm/generated/applicationInsightsClient.js +9 -4
- package/dist/esm/generated/applicationInsightsClient.js.map +1 -1
- package/dist/esm/generated/models/mappers.js +145 -68
- package/dist/esm/generated/models/mappers.js.map +1 -1
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/platform/nodejs/baseSender.d.ts +1 -0
- package/dist/esm/platform/nodejs/baseSender.d.ts.map +1 -1
- package/dist/esm/platform/nodejs/baseSender.js +104 -37
- package/dist/esm/platform/nodejs/baseSender.js.map +1 -1
- package/dist/esm/platform/nodejs/context/context.d.ts +0 -1
- package/dist/esm/platform/nodejs/context/context.d.ts.map +1 -1
- package/dist/esm/platform/nodejs/context/context.js +4 -8
- package/dist/esm/platform/nodejs/context/context.js.map +1 -1
- package/dist/esm/platform/nodejs/httpSender.js +11 -4
- package/dist/esm/platform/nodejs/httpSender.js.map +1 -1
- package/dist/esm/platform/nodejs/index.d.ts +1 -0
- package/dist/esm/platform/nodejs/index.d.ts.map +1 -1
- package/dist/esm/platform/nodejs/index.js +1 -0
- package/dist/esm/platform/nodejs/index.js.map +1 -1
- package/dist/esm/platform/nodejs/persist/fileAccessControl.js +7 -7
- package/dist/esm/platform/nodejs/persist/fileAccessControl.js.map +1 -1
- package/dist/esm/platform/nodejs/persist/fileSystemPersist.d.ts +9 -1
- package/dist/esm/platform/nodejs/persist/fileSystemPersist.d.ts.map +1 -1
- package/dist/esm/platform/nodejs/persist/fileSystemPersist.js +37 -16
- package/dist/esm/platform/nodejs/persist/fileSystemPersist.js.map +1 -1
- package/dist/esm/{sampling.d.ts → sampling/percentageSampler.d.ts} +2 -3
- package/dist/esm/sampling/percentageSampler.d.ts.map +1 -0
- package/dist/esm/{sampling.js → sampling/percentageSampler.js} +6 -39
- package/dist/esm/sampling/percentageSampler.js.map +1 -0
- package/dist/esm/sampling/rateLimitedSampler.d.ts +58 -0
- package/dist/esm/sampling/rateLimitedSampler.d.ts.map +1 -0
- package/dist/esm/sampling/rateLimitedSampler.js +114 -0
- package/dist/esm/sampling/rateLimitedSampler.js.map +1 -0
- package/dist/esm/sampling/samplingUtils.d.ts +17 -0
- package/dist/esm/sampling/samplingUtils.d.ts.map +1 -0
- package/dist/esm/sampling/samplingUtils.js +89 -0
- package/dist/esm/sampling/samplingUtils.js.map +1 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/types.js +2 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utils/common.js +2 -3
- package/dist/esm/utils/common.js.map +1 -1
- package/dist/esm/utils/connectionStringParser.js +3 -3
- package/dist/esm/utils/connectionStringParser.js.map +1 -1
- package/dist/esm/utils/constants/applicationinsights.d.ts +1 -1
- package/dist/esm/utils/constants/applicationinsights.js +1 -1
- package/dist/esm/utils/constants/applicationinsights.js.map +1 -1
- package/dist/esm/utils/eventhub.js +5 -2
- package/dist/esm/utils/eventhub.js.map +1 -1
- package/dist/esm/utils/logUtils.js +10 -9
- package/dist/esm/utils/logUtils.js.map +1 -1
- package/dist/esm/utils/metricUtils.d.ts.map +1 -1
- package/dist/esm/utils/metricUtils.js +6 -6
- package/dist/esm/utils/metricUtils.js.map +1 -1
- package/dist/esm/utils/spanUtils.d.ts.map +1 -1
- package/dist/esm/utils/spanUtils.js +16 -14
- package/dist/esm/utils/spanUtils.js.map +1 -1
- package/package.json +21 -26
- package/dist/commonjs/sampling.d.ts.map +0 -1
- package/dist/commonjs/sampling.js.map +0 -1
- package/dist/esm/sampling.d.ts.map +0 -1
- 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
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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.
|
|
139
|
+
diag.debug(`LongIntervalStatsbeat: Failed to parse features/instrumentations (error ${error})`);
|
|
102
140
|
}
|
|
103
141
|
}
|
|
104
142
|
}
|
|
105
143
|
attachCallback(observableResult) {
|
|
106
|
-
const attributes =
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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":"AAAA,uCAAuC;AACvC,kCAAkC;AAQlC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAE1F,OAAO,KAAK,EAAE,MAAM,8CAA8C,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAMzD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACxF,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,IAAI,QAAQ,GAAwC,IAAI,CAAC;AAEzD;;;GAGG;AACH,MAAM,4BAA6B,SAAQ,gBAAgB;IA6BzD,YAAY,OAAyB;QACnC,KAAK,EAAE,CAAC;QA7BF,gCAA2B,GAAW,QAAQ,CAAC,CAAC,QAAQ;QAMxD,WAAM,GAAW,aAAa,EAAE,CAAC;QAKjC,YAAO,GAAW,CAAC,CAAC;QACpB,oBAAe,GAAW,CAAC,CAAC;QAc7B,kBAAa,GAAY,KAAK,CAAC;QAIpC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACvE,MAAM,cAAc,GAAgC;YAClD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,qBAAqB,EAAE,OAAO,CAAC,qBAAqB;SACrD,CAAC;QAEF,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,IAAI,CAAC,kCAAkC,GAAG,IAAI,aAAa,EAAE,CAAC;QAC9D,IAAI,CAAC,yBAAyB,GAAG,IAAI,6BAA6B,CAAC,cAAc,CAAC,CAAC;QAEnF,4CAA4C;QAC5C,MAAM,+BAA+B,GAAyC;YAC5E,QAAQ,EAAE,IAAI,CAAC,yBAAyB;YACxC,oBAAoB,EAClB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,IAAI,CAAC,2BAA2B,EAAE,QAAQ;SAChG,CAAC;QAEF,IAAI,CAAC,wBAAwB,GAAG,IAAI,6BAA6B,CAC/D,+BAA+B,CAChC,CAAC;QACF,IAAI,CAAC,kCAAkC,CAAC,eAAe,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACvF,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,kCAAkC,CAAC,QAAQ,CAChF,uCAAuC,CACxC,CAAC;QAEF,2BAA2B;QAC3B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,kBAAkB,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,kBAAkB,CAAC;QAExC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,0BAA0B,CAAC,qBAAqB,CAChF,gBAAgB,CAAC,OAAO,CACzB,CAAC;QACF,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,0BAA0B,CAAC,qBAAqB,CAC/E,gBAAgB,CAAC,MAAM,CACxB,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,CAAC,gBAAgB,GAAG;YACtB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,EAAE,EAAE,IAAI,CAAC,gBAAgB;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;QAEF,IAAI,CAAC,gBAAgB,GAAG;YACtB,IAAI,EAAE,IAAI,CAAC,kBAAkB;SAC9B,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAEjC,yCAAyC;YACzC,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACtE,IAAI,CAAC,0BAA0B,CAAC,0BAA0B,CACxD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EACpC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAC7B,CAAC;YAEF,qFAAqF;YACrF,UAAU,CAAC,KAAK,IAAI,EAAE;gBACpB,IAAI,CAAC,yBAAyB,CAAC,MAAM,CACnC,CAAC,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,CAAC,CAAC,eAAe,EAC/D,CAAC,MAAoB,EAAE,EAAE;oBACvB,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB,CAAC,OAAO,EAAE,CAAC;wBAC7C,IAAI,CAAC,KAAK,CAAC,uDAAuD,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;oBACrF,CAAC;gBACH,CAAC,CACF,CAAC;YACJ,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,aAAa;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,gBAAuC;QAClE,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,UAAU,CAAC;QACf,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,UAAU,mCACL,IAAI,CAAC,gBAAgB,KACxB,OAAO,EAAE,IAAI,CAAC,eAAe,EAC7B,IAAI,EAAE,oBAAoB,CAAC,eAAe,GAC3C,CAAC;YACF,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,oBAAO,UAAU,EAAG,CAAC;QAC7E,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,UAAU,mCACL,IAAI,CAAC,gBAAgB,KACxB,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAE,oBAAoB,CAAC,OAAO,GACnC,CAAC;YACF,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,oBAAO,UAAU,EAAG,CAAC;QAC7E,CAAC;IACH,CAAC;IAEO,WAAW;QACjB,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC;QACvE,IAAI,iBAAiB,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC;gBACrD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC;YACvE,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,CACR,2EAA2E,KAAK,GAAG,CACpF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,gBAAkC;QACvD,MAAM,UAAU,mCAAQ,IAAI,CAAC,gBAAgB,GAAK,IAAI,CAAC,gBAAgB,CAAE,CAAC;QAC1E,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;IAEM,QAAQ;QACb,OAAO,IAAI,CAAC,kCAAkC,CAAC,QAAQ,EAAE,CAAC;IAC5D,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAAyB;IACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,IAAI,4BAA4B,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC","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;
|
|
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.
|
|
31
|
-
|
|
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
|
-
|
|
88
|
-
|
|
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
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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 =
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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 =
|
|
152
|
+
const attributes = { ...this.networkProperties, ...this.commonProperties, statusCode: 0 };
|
|
121
153
|
for (let i = 0; i < counter.retryCount.length; i++) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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 =
|
|
166
|
+
const attributes = { ...this.networkProperties, ...this.commonProperties, statusCode: 0 };
|
|
130
167
|
for (let i = 0; i < counter.throttleCount.length; i++) {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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 =
|
|
180
|
+
const attributes = { ...this.networkProperties, ...this.commonProperties, exceptionType: "" };
|
|
139
181
|
for (let i = 0; i < counter.exceptionCount.length; i++) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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 =
|
|
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
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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
|
-
|
|
161
|
-
counter.averageRequestExecutionTime
|
|
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
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|