@azure/monitor-opentelemetry-exporter 1.0.0-alpha.20221031.1 → 1.0.0-beta.10

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/dist/index.js CHANGED
@@ -66,7 +66,7 @@ const TIME_SINCE_ENQUEUED = "timeSinceEnqueued";
66
66
  * AzureMonitorTraceExporter version.
67
67
  * @internal
68
68
  */
69
- const packageVersion = "1.0.0-beta.9";
69
+ const packageVersion = "1.0.0-beta.10";
70
70
  var DependencyTypes;
71
71
  (function (DependencyTypes) {
72
72
  DependencyTypes["InProc"] = "InProc";
@@ -2023,7 +2023,7 @@ const EU_ENDPOINTS = [
2023
2023
  // Copyright (c) Microsoft Corporation.
2024
2024
  const os = require("os");
2025
2025
  class StatsbeatMetrics {
2026
- constructor(instrumentationKey, endpointUrl) {
2026
+ constructor(options) {
2027
2027
  this._isInitialized = false;
2028
2028
  this._networkStatsbeatCollection = [];
2029
2029
  this._statsCollectionShortInterval = 900000; // 15 minutes
@@ -2031,7 +2031,7 @@ class StatsbeatMetrics {
2031
2031
  this._resourceProvider = StatsbeatResourceProvider.unknown;
2032
2032
  this._os = os.type();
2033
2033
  this._attach = "sdk";
2034
- this._connectionString = this._getConnectionString(endpointUrl);
2034
+ this._connectionString = this._getConnectionString(options.endpointUrl);
2035
2035
  this._meterProvider = new sdkMetrics.MeterProvider();
2036
2036
  const exporterConfig = {
2037
2037
  connectionString: this._connectionString,
@@ -2039,18 +2039,18 @@ class StatsbeatMetrics {
2039
2039
  this._azureExporter = new _AzureMonitorStatsbeatExporter(exporterConfig);
2040
2040
  const metricReaderOptions = {
2041
2041
  exporter: this._azureExporter,
2042
- exportIntervalMillis: this._statsCollectionShortInterval, // 15 minutes
2042
+ exportIntervalMillis: options.collectionInterval || this._statsCollectionShortInterval, // 15 minutes
2043
2043
  };
2044
2044
  // Exports Network Statsbeat every 15 minutes
2045
2045
  this._metricReader = new sdkMetrics.PeriodicExportingMetricReader(metricReaderOptions);
2046
2046
  this._meterProvider.addMetricReader(this._metricReader);
2047
2047
  this._meter = this._meterProvider.getMeter("Azure Monitor NetworkStatsbeat");
2048
- this._endpointUrl = endpointUrl;
2048
+ this._endpointUrl = options.endpointUrl;
2049
2049
  this._runtimeVersion = process.version;
2050
2050
  this._language = STATSBEAT_LANGUAGE;
2051
2051
  this._version = packageVersion;
2052
- this._host = this._getShortHost(endpointUrl);
2053
- this._cikey = instrumentationKey;
2052
+ this._host = this._getShortHost(options.endpointUrl);
2053
+ this._cikey = options.instrumentationKey;
2054
2054
  this._successCountGauge = this._meter.createObservableGauge(StatsbeatCounter.SUCCESS_COUNT);
2055
2055
  this._failureCountGauge = this._meter.createObservableGauge(StatsbeatCounter.FAILURE_COUNT);
2056
2056
  this._retryCountGauge = this._meter.createObservableGauge(StatsbeatCounter.RETRY_COUNT);
@@ -2163,7 +2163,7 @@ class StatsbeatMetrics {
2163
2163
  // For each { statusCode -> count } mapping, call observe, passing the count and attributes that include the statusCode
2164
2164
  for (let i = 0; i < counter.totalFailedRequestCount.length; i++) {
2165
2165
  attributes.statusCode = counter.totalFailedRequestCount[i].statusCode;
2166
- observableResult.observe(this._failureCountGauge, counter.totalFailedRequestCount[i].count, attributes);
2166
+ observableResult.observe(this._failureCountGauge, counter.totalFailedRequestCount[i].count, Object.assign({}, attributes));
2167
2167
  counter.totalFailedRequestCount[i].count = 0;
2168
2168
  }
2169
2169
  }
@@ -2172,7 +2172,7 @@ class StatsbeatMetrics {
2172
2172
  let attributes = Object.assign(Object.assign(Object.assign({}, this._networkProperties), this._commonProperties), { statusCode: 0 });
2173
2173
  for (let i = 0; i < counter.retryCount.length; i++) {
2174
2174
  attributes.statusCode = counter.retryCount[i].statusCode;
2175
- observableResult.observe(this._retryCountGauge, counter.retryCount[i].count, attributes);
2175
+ observableResult.observe(this._retryCountGauge, counter.retryCount[i].count, Object.assign({}, attributes));
2176
2176
  counter.retryCount[i].count = 0;
2177
2177
  }
2178
2178
  }
@@ -2181,7 +2181,7 @@ class StatsbeatMetrics {
2181
2181
  let attributes = Object.assign(Object.assign(Object.assign({}, this._networkProperties), this._commonProperties), { statusCode: 0 });
2182
2182
  for (let i = 0; i < counter.throttleCount.length; i++) {
2183
2183
  attributes.statusCode = counter.throttleCount[i].statusCode;
2184
- observableResult.observe(this._throttleCountGauge, counter.throttleCount[i].count, attributes);
2184
+ observableResult.observe(this._throttleCountGauge, counter.throttleCount[i].count, Object.assign({}, attributes));
2185
2185
  counter.throttleCount[i].count = 0;
2186
2186
  }
2187
2187
  }
@@ -2190,13 +2190,25 @@ class StatsbeatMetrics {
2190
2190
  let attributes = Object.assign(Object.assign(Object.assign({}, this._networkProperties), this._commonProperties), { exceptionType: "" });
2191
2191
  for (let i = 0; i < counter.exceptionCount.length; i++) {
2192
2192
  attributes.exceptionType = counter.exceptionCount[i].exceptionType;
2193
- observableResult.observe(this._exceptionCountGauge, counter.exceptionCount[i].count, attributes);
2193
+ observableResult.observe(this._exceptionCountGauge, counter.exceptionCount[i].count, Object.assign({}, attributes));
2194
2194
  counter.exceptionCount[i].count = 0;
2195
2195
  }
2196
2196
  }
2197
2197
  _durationCallback(observableResult) {
2198
2198
  let counter = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);
2199
2199
  let attributes = Object.assign(Object.assign({}, this._networkProperties), this._commonProperties);
2200
+ for (let i = 0; i < this._networkStatsbeatCollection.length; i++) {
2201
+ let currentCounter = this._networkStatsbeatCollection[i];
2202
+ currentCounter.time = Number(new Date());
2203
+ let intervalRequests = currentCounter.totalRequestCount - currentCounter.lastRequestCount || 0;
2204
+ currentCounter.averageRequestExecutionTime =
2205
+ (currentCounter.intervalRequestExecutionTime -
2206
+ currentCounter.lastIntervalRequestExecutionTime) /
2207
+ intervalRequests || 0;
2208
+ currentCounter.lastIntervalRequestExecutionTime = currentCounter.intervalRequestExecutionTime; // reset
2209
+ currentCounter.lastRequestCount = currentCounter.totalRequestCount;
2210
+ currentCounter.lastTime = currentCounter.time;
2211
+ }
2200
2212
  observableResult.observe(counter.averageRequestExecutionTime, attributes);
2201
2213
  counter.averageRequestExecutionTime = 0;
2202
2214
  }
@@ -2264,20 +2276,6 @@ class StatsbeatMetrics {
2264
2276
  counter.exceptionCount.push({ exceptionType: exceptionType.name, count: 1 });
2265
2277
  }
2266
2278
  }
2267
- countAverageDuration() {
2268
- for (let i = 0; i < this._networkStatsbeatCollection.length; i++) {
2269
- let currentCounter = this._networkStatsbeatCollection[i];
2270
- currentCounter.time = Number(new Date());
2271
- let intervalRequests = currentCounter.totalRequestCount - currentCounter.lastRequestCount || 0;
2272
- currentCounter.averageRequestExecutionTime =
2273
- (currentCounter.intervalRequestExecutionTime -
2274
- currentCounter.lastIntervalRequestExecutionTime) /
2275
- intervalRequests || 0;
2276
- currentCounter.lastIntervalRequestExecutionTime = currentCounter.intervalRequestExecutionTime; // reset
2277
- currentCounter.lastRequestCount = currentCounter.totalRequestCount;
2278
- currentCounter.lastTime = currentCounter.time;
2279
- }
2280
- }
2281
2279
  // Gets a networkStatsbeat counter if one exists for the given endpoint
2282
2280
  _getNetworkStatsbeatCounter(endpoint, host) {
2283
2281
  // Check if the counter is available
@@ -2359,7 +2357,10 @@ class AzureMonitorBaseExporter {
2359
2357
  this._persister = new FileSystemPersist(this._instrumentationKey, this._options);
2360
2358
  if (!this._isStatsbeatExporter) {
2361
2359
  // Initialize statsbeatMetrics
2362
- this._statsbeatMetrics = new StatsbeatMetrics(this._instrumentationKey, this._endpointUrl);
2360
+ this._statsbeatMetrics = new StatsbeatMetrics({
2361
+ instrumentationKey: this._instrumentationKey,
2362
+ endpointUrl: this._endpointUrl,
2363
+ });
2363
2364
  }
2364
2365
  this._retryTimer = null;
2365
2366
  api.diag.debug("AzureMonitorExporter was successfully setup");
@@ -48,7 +48,10 @@ export class AzureMonitorBaseExporter {
48
48
  this._persister = new FileSystemPersist(this._instrumentationKey, this._options);
49
49
  if (!this._isStatsbeatExporter) {
50
50
  // Initialize statsbeatMetrics
51
- this._statsbeatMetrics = new StatsbeatMetrics(this._instrumentationKey, this._endpointUrl);
51
+ this._statsbeatMetrics = new StatsbeatMetrics({
52
+ instrumentationKey: this._instrumentationKey,
53
+ endpointUrl: this._endpointUrl,
54
+ });
52
55
  }
53
56
  this._retryTimer = null;
54
57
  diag.debug("AzureMonitorExporter was successfully setup");
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/export/base.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAgB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG5D,OAAO,EAAE,WAAW,EAAkB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAE3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,oCAAoC,GAAG,KAAM,CAAC;AACpD;;GAEG;AACH,MAAM,OAAgB,wBAAwB;IAmB5C;;;OAGG;IACH,YAAY,UAAuC,EAAE,EAAE,mBAA6B;;QAtBpF;;WAEG;QACO,wBAAmB,GAAW,EAAE,CAAC;QACnC,iBAAY,GAAW,EAAE,CAAC;QAO1B,2BAAsB,GAAW,CAAC,CAAC;QACnC,8BAAyB,GAAW,oCAAoC,CAAC;QAW/E,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,uBAAuB,CAAC;QAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QAC9F,IAAI,CAAC,oBAAoB,GAAG,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC;QAE9E,IAAI,gBAAgB,EAAE;YACpB,MAAM,sBAAsB,GAAG,sBAAsB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAC9E,IAAI,CAAC,mBAAmB;gBACtB,sBAAsB,CAAC,kBAAkB,IAAI,IAAI,CAAC,mBAAmB,CAAC;YACxE,IAAI,CAAC,YAAY,GAAG,CAAA,MAAA,sBAAsB,CAAC,iBAAiB,0CAAE,IAAI,EAAE,KAAI,IAAI,CAAC,YAAY,CAAC;SAC3F;QAED,kCAAkC;QAClC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAC7B,MAAM,OAAO,GACX,wFAAwF,CAAC;YAC3F,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;SAC1B;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjF,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC9B,8BAA8B;YAC9B,IAAI,CAAC,iBAAiB,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;SAC5F;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,QAAQ,CAAC,SAAoB;QACzC,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtD,OAAO,OAAO;gBACZ,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE;gBACpC,CAAC,CAAC;oBACE,IAAI,EAAE,gBAAgB,CAAC,MAAM;oBAC7B,KAAK,EAAE,IAAI,KAAK,CAAC,qCAAqC,CAAC;iBACxD,CAAC;SACP;QAAC,OAAO,EAAO,EAAE;YAChB,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;SACrD;IACH,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,SAAS;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,gBAAgB,CAAC,SAAqB;;QACpD,IAAI,CAAC,IAAI,CAAC,aAAa,SAAS,CAAC,MAAM,cAAc,CAAC,CAAC;QAEvD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YACxB,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC;SAC3C;QAED,IAAI;YACF,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACvC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClE,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;YACrC,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;YAElC,IAAI,UAAU,KAAK,GAAG,EAAE;gBACtB,sCAAsC;gBACtC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;oBACrB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;wBACjC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;wBACxB,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBACjC,CAAC,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;oBACnC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;iBAC1B;gBACD,oFAAoF;gBACpF,MAAA,IAAI,CAAC,iBAAiB,0CAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC/C,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC;aAC3C;iBAAM,IAAI,UAAU,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE;gBAChD,gCAAgC;gBAChC,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,EAAE;oBAC5C,MAAA,IAAI,CAAC,iBAAiB,0CAAE,aAAa,CAAC,UAAU,CAAC,CAAC;iBACnD;gBACD,IAAI,MAAM,EAAE;oBACV,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAClB,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAmB,CAAC;oBAC5D,MAAM,iBAAiB,GAAe,EAAE,CAAC;oBACzC,IAAI,cAAc,CAAC,MAAM,EAAE;wBACzB,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;4BACtC,IAAI,KAAK,CAAC,UAAU,IAAI,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;gCACrD,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;6BAChD;wBACH,CAAC,CAAC,CAAC;qBACJ;oBACD,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE;wBAChC,MAAA,IAAI,CAAC,iBAAiB,0CAAE,UAAU,CAAC,UAAU,CAAC,CAAC;wBAC/C,uEAAuE;wBACvE,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;qBAC/C;oBACD,0BAA0B;oBAC1B,MAAA,IAAI,CAAC,iBAAiB,0CAAE,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;oBAC3D,OAAO;wBACL,IAAI,EAAE,gBAAgB,CAAC,MAAM;qBAC9B,CAAC;iBACH;qBAAM;oBACL,uEAAuE;oBACvE,MAAA,IAAI,CAAC,iBAAiB,0CAAE,UAAU,CAAC,UAAU,CAAC,CAAC;oBAC/C,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;iBACvC;aACF;iBAAM;gBACL,0BAA0B;gBAC1B,IAAI,IAAI,CAAC,iBAAiB,EAAE;oBAC1B,IAAI,UAAU,EAAE;wBACd,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;qBAC3D;iBACF;qBAAM;oBACL,IAAI,CAAC,0BAA0B,EAAE,CAAC;iBACnC;gBACD,OAAO;oBACL,IAAI,EAAE,gBAAgB,CAAC,MAAM;iBAC9B,CAAC;aACH;SACF;QAAC,OAAO,KAAU,EAAE;YACnB,MAAM,SAAS,GAAG,KAAkB,CAAC;YACrC,IACE,SAAS,CAAC,UAAU;gBACpB,CAAC,SAAS,CAAC,UAAU,KAAK,GAAG,IAAI,qBAAqB;oBACpD,SAAS,CAAC,UAAU,KAAK,GAAG,CAAC,EAC/B;gBACA,qBAAqB;gBACrB,IAAI,CAAC,wBAAwB,EAAE,CAAC;gBAChC,gCAAgC;gBAChC,IAAI,IAAI,CAAC,wBAAwB,GAAG,EAAE,EAAE;oBACtC,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE;wBACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;wBAC5D,IAAI,QAAQ,EAAE;4BACZ,oBAAoB;4BACpB,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;4BAC/C,mFAAmF;4BACnF,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;yBACzC;qBACF;iBACF;qBAAM;oBACL,IAAI,aAAa,GAAG,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;oBACnD,MAAA,IAAI,CAAC,iBAAiB,0CAAE,cAAc,CAAC,aAAa,CAAC,CAAC;oBACtD,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;iBAChE;aACF;iBAAM,IAAI,SAAS,CAAC,UAAU,IAAI,WAAW,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;gBACpE,MAAA,IAAI,CAAC,iBAAiB,0CAAE,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBACzD,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;aACvC;YACD,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE;gBACnC,IAAI,SAAS,CAAC,UAAU,EAAE;oBACxB,MAAA,IAAI,CAAC,iBAAiB,0CAAE,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;iBAC1D;gBACD,IAAI,CAAC,KAAK,CACR,6DAA6D,EAC7D,SAAS,CAAC,OAAO,CAClB,CAAC;gBACF,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;aACvC;YACD,MAAA,IAAI,CAAC,iBAAiB,0CAAE,cAAc,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK,CACR,uEAAuE,EACvE,SAAS,CAAC,OAAO,CAClB,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SAC5D;IACH,CAAC;IAED,6DAA6D;IACrD,0BAA0B;;QAChC,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,EAAE;YACxD,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;YAClC,MAAA,IAAI,CAAC,iBAAiB,0CAAE,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACnC,IAAI,CAAC,sBAAsB,GAAG,CAAC,CAAC;SACjC;IACH,CAAC;IAEO,KAAK,CAAC,uBAAuB;QACnC,IAAI;YACF,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAsB,CAAC;YACvE,IAAI,SAAS,EAAE;gBACb,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aACpC;SACF;QAAC,OAAO,GAAQ,EAAE;YACjB,IAAI,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;SAClD;IACH,CAAC;IAEO,eAAe,CAAC,KAAgB;QACtC,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE;YAC9D,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { diag } from \"@opentelemetry/api\";\nimport { ExportResult, ExportResultCode } from \"@opentelemetry/core\";\nimport { RestError } from \"@azure/core-rest-pipeline\";\nimport { ConnectionStringParser } from \"../utils/connectionStringParser\";\nimport { HttpSender, FileSystemPersist } from \"../platform\";\nimport { AzureMonitorExporterOptions } from \"../config\";\nimport { PersistentStorage, Sender } from \"../types\";\nimport { isRetriable, BreezeResponse } from \"../utils/breezeUtils\";\nimport { DEFAULT_BREEZE_ENDPOINT, ENV_CONNECTION_STRING } from \"../Declarations/Constants\";\nimport { TelemetryItem as Envelope } from \"../generated\";\nimport { StatsbeatMetrics } from \"./statsbeat/statsbeatMetrics\";\nimport { MAX_STATSBEAT_FAILURES } from \"./statsbeat/types\";\n\nconst DEFAULT_BATCH_SEND_RETRY_INTERVAL_MS = 60_000;\n/**\n * Azure Monitor OpenTelemetry Trace Exporter.\n */\nexport abstract class AzureMonitorBaseExporter {\n /**\n * Instrumentation key to be used for exported envelopes\n */\n protected _instrumentationKey: string = \"\";\n private _endpointUrl: string = \"\";\n private readonly _persister: PersistentStorage;\n private readonly _sender: Sender;\n private _numConsecutiveRedirects: number;\n private _retryTimer: NodeJS.Timer | null;\n private _statsbeatMetrics: StatsbeatMetrics | undefined;\n private _isStatsbeatExporter: boolean;\n private _statsbeatFailureCount: number = 0;\n private _batchSendRetryIntervalMs: number = DEFAULT_BATCH_SEND_RETRY_INTERVAL_MS;\n /**\n * Exporter internal configuration\n */\n private readonly _options: AzureMonitorExporterOptions;\n\n /**\n * Initializes a new instance of the AzureMonitorBaseExporter class.\n * @param AzureMonitorExporterOptions - Exporter configuration.\n */\n constructor(options: AzureMonitorExporterOptions = {}, isStatsbeatExporter?: boolean) {\n this._options = options;\n this._numConsecutiveRedirects = 0;\n this._instrumentationKey = \"\";\n this._endpointUrl = DEFAULT_BREEZE_ENDPOINT;\n const connectionString = this._options.connectionString || process.env[ENV_CONNECTION_STRING];\n this._isStatsbeatExporter = isStatsbeatExporter ? isStatsbeatExporter : false;\n\n if (connectionString) {\n const parsedConnectionString = ConnectionStringParser.parse(connectionString);\n this._instrumentationKey =\n parsedConnectionString.instrumentationkey || this._instrumentationKey;\n this._endpointUrl = parsedConnectionString.ingestionendpoint?.trim() || this._endpointUrl;\n }\n\n // Instrumentation key is required\n if (!this._instrumentationKey) {\n const message =\n \"No instrumentation key or connection string was provided to the Azure Monitor Exporter\";\n diag.error(message);\n throw new Error(message);\n }\n this._sender = new HttpSender(this._endpointUrl, this._options);\n this._persister = new FileSystemPersist(this._instrumentationKey, this._options);\n\n if (!this._isStatsbeatExporter) {\n // Initialize statsbeatMetrics\n this._statsbeatMetrics = new StatsbeatMetrics(this._instrumentationKey, this._endpointUrl);\n }\n this._retryTimer = null;\n diag.debug(\"AzureMonitorExporter was successfully setup\");\n }\n\n /**\n * Persist envelopes to disk\n */\n private async _persist(envelopes: unknown[]): Promise<ExportResult> {\n try {\n const success = await this._persister.push(envelopes);\n return success\n ? { code: ExportResultCode.SUCCESS }\n : {\n code: ExportResultCode.FAILED,\n error: new Error(\"Failed to persist envelope in disk.\"),\n };\n } catch (ex: any) {\n return { code: ExportResultCode.FAILED, error: ex };\n }\n }\n\n /**\n * Shutdown exporter\n */\n protected async _shutdown(): Promise<void> {\n return this._sender.shutdown();\n }\n\n /**\n * Export envelopes\n */\n protected async _exportEnvelopes(envelopes: Envelope[]): Promise<ExportResult> {\n diag.info(`Exporting ${envelopes.length} envelope(s)`);\n\n if (envelopes.length < 1) {\n return { code: ExportResultCode.SUCCESS };\n }\n\n try {\n const startTime = new Date().getTime();\n const { result, statusCode } = await this._sender.send(envelopes);\n const endTime = new Date().getTime();\n const duration = endTime - startTime;\n this._numConsecutiveRedirects = 0;\n\n if (statusCode === 200) {\n // Success -- @todo: start retry timer\n if (!this._retryTimer) {\n this._retryTimer = setTimeout(() => {\n this._retryTimer = null;\n this._sendFirstPersistedFile();\n }, this._batchSendRetryIntervalMs);\n this._retryTimer.unref();\n }\n // If we are not exportings statsbeat and statsbeat is not disabled -- count success\n this._statsbeatMetrics?.countSuccess(duration);\n return { code: ExportResultCode.SUCCESS };\n } else if (statusCode && isRetriable(statusCode)) {\n // Failed -- persist failed data\n if (statusCode === 429 || statusCode === 439) {\n this._statsbeatMetrics?.countThrottle(statusCode);\n }\n if (result) {\n diag.info(result);\n const breezeResponse = JSON.parse(result) as BreezeResponse;\n const filteredEnvelopes: Envelope[] = [];\n if (breezeResponse.errors) {\n breezeResponse.errors.forEach((error) => {\n if (error.statusCode && isRetriable(error.statusCode)) {\n filteredEnvelopes.push(envelopes[error.index]);\n }\n });\n }\n if (filteredEnvelopes.length > 0) {\n this._statsbeatMetrics?.countRetry(statusCode);\n // calls resultCallback(ExportResult) based on result of persister.push\n return await this._persist(filteredEnvelopes);\n }\n // Failed -- not retriable\n this._statsbeatMetrics?.countFailure(duration, statusCode);\n return {\n code: ExportResultCode.FAILED,\n };\n } else {\n // calls resultCallback(ExportResult) based on result of persister.push\n this._statsbeatMetrics?.countRetry(statusCode);\n return await this._persist(envelopes);\n }\n } else {\n // Failed -- not retriable\n if (this._statsbeatMetrics) {\n if (statusCode) {\n this._statsbeatMetrics.countFailure(duration, statusCode);\n }\n } else {\n this._incrementStatsbeatFailure();\n }\n return {\n code: ExportResultCode.FAILED,\n };\n }\n } catch (error: any) {\n const restError = error as RestError;\n if (\n restError.statusCode &&\n (restError.statusCode === 307 || // Temporary redirect\n restError.statusCode === 308)\n ) {\n // Permanent redirect\n this._numConsecutiveRedirects++;\n // To prevent circular redirects\n if (this._numConsecutiveRedirects < 10) {\n if (restError.response && restError.response.headers) {\n const location = restError.response.headers.get(\"location\");\n if (location) {\n // Update sender URL\n this._sender.handlePermanentRedirect(location);\n // Send to redirect endpoint as HTTPs library doesn't handle redirect automatically\n return this._exportEnvelopes(envelopes);\n }\n }\n } else {\n let redirectError = new Error(\"Circular redirect\");\n this._statsbeatMetrics?.countException(redirectError);\n return { code: ExportResultCode.FAILED, error: redirectError };\n }\n } else if (restError.statusCode && isRetriable(restError.statusCode)) {\n this._statsbeatMetrics?.countRetry(restError.statusCode);\n return await this._persist(envelopes);\n }\n if (this._isNetworkError(restError)) {\n if (restError.statusCode) {\n this._statsbeatMetrics?.countRetry(restError.statusCode);\n }\n diag.error(\n \"Retrying due to transient client side error. Error message:\",\n restError.message\n );\n return await this._persist(envelopes);\n }\n this._statsbeatMetrics?.countException(restError);\n diag.error(\n \"Envelopes could not be exported and are not retriable. Error message:\",\n restError.message\n );\n return { code: ExportResultCode.FAILED, error: restError };\n }\n }\n\n // Disable collection of statsbeat metrics after max failures\n private _incrementStatsbeatFailure() {\n this._statsbeatFailureCount++;\n if (this._statsbeatFailureCount > MAX_STATSBEAT_FAILURES) {\n this._isStatsbeatExporter = false;\n this._statsbeatMetrics?.shutdown();\n this._statsbeatMetrics = undefined;\n this._statsbeatFailureCount = 0;\n }\n }\n\n private async _sendFirstPersistedFile(): Promise<void> {\n try {\n const envelopes = (await this._persister.shift()) as Envelope[] | null;\n if (envelopes) {\n await this._sender.send(envelopes);\n }\n } catch (err: any) {\n diag.warn(`Failed to fetch persisted file`, err);\n }\n }\n\n private _isNetworkError(error: RestError): boolean {\n if (error && error.code && error.code === \"REQUEST_SEND_ERROR\") {\n return true;\n }\n return false;\n }\n}\n"]}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/export/base.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport { diag } from \"@opentelemetry/api\";\nimport { ExportResult, ExportResultCode } from \"@opentelemetry/core\";\nimport { RestError } from \"@azure/core-rest-pipeline\";\nimport { ConnectionStringParser } from \"../utils/connectionStringParser\";\nimport { HttpSender, FileSystemPersist } from \"../platform\";\nimport { AzureMonitorExporterOptions } from \"../config\";\nimport { PersistentStorage, Sender } from \"../types\";\nimport { isRetriable, BreezeResponse } from \"../utils/breezeUtils\";\nimport { DEFAULT_BREEZE_ENDPOINT, ENV_CONNECTION_STRING } from \"../Declarations/Constants\";\nimport { TelemetryItem as Envelope } from \"../generated\";\nimport { StatsbeatMetrics } from \"./statsbeat/statsbeatMetrics\";\nimport { MAX_STATSBEAT_FAILURES } from \"./statsbeat/types\";\n\nconst DEFAULT_BATCH_SEND_RETRY_INTERVAL_MS = 60_000;\n/**\n * Azure Monitor OpenTelemetry Trace Exporter.\n */\nexport abstract class AzureMonitorBaseExporter {\n /**\n * Instrumentation key to be used for exported envelopes\n */\n protected _instrumentationKey: string = \"\";\n private _endpointUrl: string = \"\";\n private readonly _persister: PersistentStorage;\n private readonly _sender: Sender;\n private _numConsecutiveRedirects: number;\n private _retryTimer: NodeJS.Timer | null;\n private _statsbeatMetrics: StatsbeatMetrics | undefined;\n private _isStatsbeatExporter: boolean;\n private _statsbeatFailureCount: number = 0;\n private _batchSendRetryIntervalMs: number = DEFAULT_BATCH_SEND_RETRY_INTERVAL_MS;\n /**\n * Exporter internal configuration\n */\n private readonly _options: AzureMonitorExporterOptions;\n\n /**\n * Initializes a new instance of the AzureMonitorBaseExporter class.\n * @param AzureMonitorExporterOptions - Exporter configuration.\n */\n constructor(options: AzureMonitorExporterOptions = {}, isStatsbeatExporter?: boolean) {\n this._options = options;\n this._numConsecutiveRedirects = 0;\n this._instrumentationKey = \"\";\n this._endpointUrl = DEFAULT_BREEZE_ENDPOINT;\n const connectionString = this._options.connectionString || process.env[ENV_CONNECTION_STRING];\n this._isStatsbeatExporter = isStatsbeatExporter ? isStatsbeatExporter : false;\n\n if (connectionString) {\n const parsedConnectionString = ConnectionStringParser.parse(connectionString);\n this._instrumentationKey =\n parsedConnectionString.instrumentationkey || this._instrumentationKey;\n this._endpointUrl = parsedConnectionString.ingestionendpoint?.trim() || this._endpointUrl;\n }\n\n // Instrumentation key is required\n if (!this._instrumentationKey) {\n const message =\n \"No instrumentation key or connection string was provided to the Azure Monitor Exporter\";\n diag.error(message);\n throw new Error(message);\n }\n this._sender = new HttpSender(this._endpointUrl, this._options);\n this._persister = new FileSystemPersist(this._instrumentationKey, this._options);\n\n if (!this._isStatsbeatExporter) {\n // Initialize statsbeatMetrics\n this._statsbeatMetrics = new StatsbeatMetrics({\n instrumentationKey: this._instrumentationKey,\n endpointUrl: this._endpointUrl,\n });\n }\n this._retryTimer = null;\n diag.debug(\"AzureMonitorExporter was successfully setup\");\n }\n\n /**\n * Persist envelopes to disk\n */\n private async _persist(envelopes: unknown[]): Promise<ExportResult> {\n try {\n const success = await this._persister.push(envelopes);\n return success\n ? { code: ExportResultCode.SUCCESS }\n : {\n code: ExportResultCode.FAILED,\n error: new Error(\"Failed to persist envelope in disk.\"),\n };\n } catch (ex: any) {\n return { code: ExportResultCode.FAILED, error: ex };\n }\n }\n\n /**\n * Shutdown exporter\n */\n protected async _shutdown(): Promise<void> {\n return this._sender.shutdown();\n }\n\n /**\n * Export envelopes\n */\n protected async _exportEnvelopes(envelopes: Envelope[]): Promise<ExportResult> {\n diag.info(`Exporting ${envelopes.length} envelope(s)`);\n\n if (envelopes.length < 1) {\n return { code: ExportResultCode.SUCCESS };\n }\n\n try {\n const startTime = new Date().getTime();\n const { result, statusCode } = await this._sender.send(envelopes);\n const endTime = new Date().getTime();\n const duration = endTime - startTime;\n this._numConsecutiveRedirects = 0;\n\n if (statusCode === 200) {\n // Success -- @todo: start retry timer\n if (!this._retryTimer) {\n this._retryTimer = setTimeout(() => {\n this._retryTimer = null;\n this._sendFirstPersistedFile();\n }, this._batchSendRetryIntervalMs);\n this._retryTimer.unref();\n }\n // If we are not exportings statsbeat and statsbeat is not disabled -- count success\n this._statsbeatMetrics?.countSuccess(duration);\n return { code: ExportResultCode.SUCCESS };\n } else if (statusCode && isRetriable(statusCode)) {\n // Failed -- persist failed data\n if (statusCode === 429 || statusCode === 439) {\n this._statsbeatMetrics?.countThrottle(statusCode);\n }\n if (result) {\n diag.info(result);\n const breezeResponse = JSON.parse(result) as BreezeResponse;\n const filteredEnvelopes: Envelope[] = [];\n if (breezeResponse.errors) {\n breezeResponse.errors.forEach((error) => {\n if (error.statusCode && isRetriable(error.statusCode)) {\n filteredEnvelopes.push(envelopes[error.index]);\n }\n });\n }\n if (filteredEnvelopes.length > 0) {\n this._statsbeatMetrics?.countRetry(statusCode);\n // calls resultCallback(ExportResult) based on result of persister.push\n return await this._persist(filteredEnvelopes);\n }\n // Failed -- not retriable\n this._statsbeatMetrics?.countFailure(duration, statusCode);\n return {\n code: ExportResultCode.FAILED,\n };\n } else {\n // calls resultCallback(ExportResult) based on result of persister.push\n this._statsbeatMetrics?.countRetry(statusCode);\n return await this._persist(envelopes);\n }\n } else {\n // Failed -- not retriable\n if (this._statsbeatMetrics) {\n if (statusCode) {\n this._statsbeatMetrics.countFailure(duration, statusCode);\n }\n } else {\n this._incrementStatsbeatFailure();\n }\n return {\n code: ExportResultCode.FAILED,\n };\n }\n } catch (error: any) {\n const restError = error as RestError;\n if (\n restError.statusCode &&\n (restError.statusCode === 307 || // Temporary redirect\n restError.statusCode === 308)\n ) {\n // Permanent redirect\n this._numConsecutiveRedirects++;\n // To prevent circular redirects\n if (this._numConsecutiveRedirects < 10) {\n if (restError.response && restError.response.headers) {\n const location = restError.response.headers.get(\"location\");\n if (location) {\n // Update sender URL\n this._sender.handlePermanentRedirect(location);\n // Send to redirect endpoint as HTTPs library doesn't handle redirect automatically\n return this._exportEnvelopes(envelopes);\n }\n }\n } else {\n let redirectError = new Error(\"Circular redirect\");\n this._statsbeatMetrics?.countException(redirectError);\n return { code: ExportResultCode.FAILED, error: redirectError };\n }\n } else if (restError.statusCode && isRetriable(restError.statusCode)) {\n this._statsbeatMetrics?.countRetry(restError.statusCode);\n return await this._persist(envelopes);\n }\n if (this._isNetworkError(restError)) {\n if (restError.statusCode) {\n this._statsbeatMetrics?.countRetry(restError.statusCode);\n }\n diag.error(\n \"Retrying due to transient client side error. Error message:\",\n restError.message\n );\n return await this._persist(envelopes);\n }\n this._statsbeatMetrics?.countException(restError);\n diag.error(\n \"Envelopes could not be exported and are not retriable. Error message:\",\n restError.message\n );\n return { code: ExportResultCode.FAILED, error: restError };\n }\n }\n\n // Disable collection of statsbeat metrics after max failures\n private _incrementStatsbeatFailure() {\n this._statsbeatFailureCount++;\n if (this._statsbeatFailureCount > MAX_STATSBEAT_FAILURES) {\n this._isStatsbeatExporter = false;\n this._statsbeatMetrics?.shutdown();\n this._statsbeatMetrics = undefined;\n this._statsbeatFailureCount = 0;\n }\n }\n\n private async _sendFirstPersistedFile(): Promise<void> {\n try {\n const envelopes = (await this._persister.shift()) as Envelope[] | null;\n if (envelopes) {\n await this._sender.send(envelopes);\n }\n } catch (err: any) {\n diag.warn(`Failed to fetch persisted file`, err);\n }\n }\n\n private _isNetworkError(error: RestError): boolean {\n if (error && error.code && error.code === \"REQUEST_SEND_ERROR\") {\n return true;\n }\n return false;\n }\n}\n"]}
@@ -8,7 +8,7 @@ import * as ai from "../../utils/constants/applicationinsights";
8
8
  import { StatsbeatCounter, StatsbeatResourceProvider, STATSBEAT_LANGUAGE, NetworkStatsbeat, AIMS_URI, AIMS_API_VERSION, AIMS_FORMAT, EU_CONNECTION_STRING, EU_ENDPOINTS, NON_EU_CONNECTION_STRING, } from "./types";
9
9
  const os = require("os");
10
10
  export class StatsbeatMetrics {
11
- constructor(instrumentationKey, endpointUrl) {
11
+ constructor(options) {
12
12
  this._isInitialized = false;
13
13
  this._networkStatsbeatCollection = [];
14
14
  this._statsCollectionShortInterval = 900000; // 15 minutes
@@ -16,7 +16,7 @@ export class StatsbeatMetrics {
16
16
  this._resourceProvider = StatsbeatResourceProvider.unknown;
17
17
  this._os = os.type();
18
18
  this._attach = "sdk";
19
- this._connectionString = this._getConnectionString(endpointUrl);
19
+ this._connectionString = this._getConnectionString(options.endpointUrl);
20
20
  this._meterProvider = new MeterProvider();
21
21
  const exporterConfig = {
22
22
  connectionString: this._connectionString,
@@ -24,18 +24,18 @@ export class StatsbeatMetrics {
24
24
  this._azureExporter = new _AzureMonitorStatsbeatExporter(exporterConfig);
25
25
  const metricReaderOptions = {
26
26
  exporter: this._azureExporter,
27
- exportIntervalMillis: this._statsCollectionShortInterval, // 15 minutes
27
+ exportIntervalMillis: options.collectionInterval || this._statsCollectionShortInterval, // 15 minutes
28
28
  };
29
29
  // Exports Network Statsbeat every 15 minutes
30
30
  this._metricReader = new PeriodicExportingMetricReader(metricReaderOptions);
31
31
  this._meterProvider.addMetricReader(this._metricReader);
32
32
  this._meter = this._meterProvider.getMeter("Azure Monitor NetworkStatsbeat");
33
- this._endpointUrl = endpointUrl;
33
+ this._endpointUrl = options.endpointUrl;
34
34
  this._runtimeVersion = process.version;
35
35
  this._language = STATSBEAT_LANGUAGE;
36
36
  this._version = ai.packageVersion;
37
- this._host = this._getShortHost(endpointUrl);
38
- this._cikey = instrumentationKey;
37
+ this._host = this._getShortHost(options.endpointUrl);
38
+ this._cikey = options.instrumentationKey;
39
39
  this._successCountGauge = this._meter.createObservableGauge(StatsbeatCounter.SUCCESS_COUNT);
40
40
  this._failureCountGauge = this._meter.createObservableGauge(StatsbeatCounter.FAILURE_COUNT);
41
41
  this._retryCountGauge = this._meter.createObservableGauge(StatsbeatCounter.RETRY_COUNT);
@@ -148,7 +148,7 @@ export class StatsbeatMetrics {
148
148
  // For each { statusCode -> count } mapping, call observe, passing the count and attributes that include the statusCode
149
149
  for (let i = 0; i < counter.totalFailedRequestCount.length; i++) {
150
150
  attributes.statusCode = counter.totalFailedRequestCount[i].statusCode;
151
- observableResult.observe(this._failureCountGauge, counter.totalFailedRequestCount[i].count, attributes);
151
+ observableResult.observe(this._failureCountGauge, counter.totalFailedRequestCount[i].count, Object.assign({}, attributes));
152
152
  counter.totalFailedRequestCount[i].count = 0;
153
153
  }
154
154
  }
@@ -157,7 +157,7 @@ export class StatsbeatMetrics {
157
157
  let attributes = Object.assign(Object.assign(Object.assign({}, this._networkProperties), this._commonProperties), { statusCode: 0 });
158
158
  for (let i = 0; i < counter.retryCount.length; i++) {
159
159
  attributes.statusCode = counter.retryCount[i].statusCode;
160
- observableResult.observe(this._retryCountGauge, counter.retryCount[i].count, attributes);
160
+ observableResult.observe(this._retryCountGauge, counter.retryCount[i].count, Object.assign({}, attributes));
161
161
  counter.retryCount[i].count = 0;
162
162
  }
163
163
  }
@@ -166,7 +166,7 @@ export class StatsbeatMetrics {
166
166
  let attributes = Object.assign(Object.assign(Object.assign({}, this._networkProperties), this._commonProperties), { statusCode: 0 });
167
167
  for (let i = 0; i < counter.throttleCount.length; i++) {
168
168
  attributes.statusCode = counter.throttleCount[i].statusCode;
169
- observableResult.observe(this._throttleCountGauge, counter.throttleCount[i].count, attributes);
169
+ observableResult.observe(this._throttleCountGauge, counter.throttleCount[i].count, Object.assign({}, attributes));
170
170
  counter.throttleCount[i].count = 0;
171
171
  }
172
172
  }
@@ -175,13 +175,25 @@ export class StatsbeatMetrics {
175
175
  let attributes = Object.assign(Object.assign(Object.assign({}, this._networkProperties), this._commonProperties), { exceptionType: "" });
176
176
  for (let i = 0; i < counter.exceptionCount.length; i++) {
177
177
  attributes.exceptionType = counter.exceptionCount[i].exceptionType;
178
- observableResult.observe(this._exceptionCountGauge, counter.exceptionCount[i].count, attributes);
178
+ observableResult.observe(this._exceptionCountGauge, counter.exceptionCount[i].count, Object.assign({}, attributes));
179
179
  counter.exceptionCount[i].count = 0;
180
180
  }
181
181
  }
182
182
  _durationCallback(observableResult) {
183
183
  let counter = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);
184
184
  let attributes = Object.assign(Object.assign({}, this._networkProperties), this._commonProperties);
185
+ for (let i = 0; i < this._networkStatsbeatCollection.length; i++) {
186
+ let currentCounter = this._networkStatsbeatCollection[i];
187
+ currentCounter.time = Number(new Date());
188
+ let intervalRequests = currentCounter.totalRequestCount - currentCounter.lastRequestCount || 0;
189
+ currentCounter.averageRequestExecutionTime =
190
+ (currentCounter.intervalRequestExecutionTime -
191
+ currentCounter.lastIntervalRequestExecutionTime) /
192
+ intervalRequests || 0;
193
+ currentCounter.lastIntervalRequestExecutionTime = currentCounter.intervalRequestExecutionTime; // reset
194
+ currentCounter.lastRequestCount = currentCounter.totalRequestCount;
195
+ currentCounter.lastTime = currentCounter.time;
196
+ }
185
197
  observableResult.observe(counter.averageRequestExecutionTime, attributes);
186
198
  counter.averageRequestExecutionTime = 0;
187
199
  }
@@ -249,20 +261,6 @@ export class StatsbeatMetrics {
249
261
  counter.exceptionCount.push({ exceptionType: exceptionType.name, count: 1 });
250
262
  }
251
263
  }
252
- countAverageDuration() {
253
- for (let i = 0; i < this._networkStatsbeatCollection.length; i++) {
254
- let currentCounter = this._networkStatsbeatCollection[i];
255
- currentCounter.time = Number(new Date());
256
- let intervalRequests = currentCounter.totalRequestCount - currentCounter.lastRequestCount || 0;
257
- currentCounter.averageRequestExecutionTime =
258
- (currentCounter.intervalRequestExecutionTime -
259
- currentCounter.lastIntervalRequestExecutionTime) /
260
- intervalRequests || 0;
261
- currentCounter.lastIntervalRequestExecutionTime = currentCounter.intervalRequestExecutionTime; // reset
262
- currentCounter.lastRequestCount = currentCounter.totalRequestCount;
263
- currentCounter.lastTime = currentCounter.time;
264
- }
265
- }
266
264
  // Gets a networkStatsbeat counter if one exists for the given endpoint
267
265
  _getNetworkStatsbeatCounter(endpoint, host) {
268
266
  // Check if the counter is available
@@ -1 +1 @@
1
- {"version":3,"file":"statsbeatMetrics.js","sourceRoot":"","sources":["../../../../src/export/statsbeat/statsbeatMetrics.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n createDefaultHttpClient,\n createPipelineRequest,\n HttpMethods,\n} from \"@azure/core-rest-pipeline\";\nimport { diag } from \"@opentelemetry/api\";\nimport {\n BatchObservableResult,\n ObservableGauge,\n ObservableResult,\n} from \"@opentelemetry/api-metrics\";\nimport { Meter } from \"@opentelemetry/api-metrics/build/src/types/Meter\";\nimport {\n MeterProvider,\n PeriodicExportingMetricReader,\n PeriodicExportingMetricReaderOptions,\n} from \"@opentelemetry/sdk-metrics\";\nimport { AzureMonitorExporterOptions, _AzureMonitorStatsbeatExporter } from \"../../index\";\nimport * as ai from \"../../utils/constants/applicationinsights\";\nimport {\n StatsbeatCounter,\n StatsbeatResourceProvider,\n STATSBEAT_LANGUAGE,\n NetworkStatsbeat,\n AIMS_URI,\n AIMS_API_VERSION,\n AIMS_FORMAT,\n EU_CONNECTION_STRING,\n EU_ENDPOINTS,\n NON_EU_CONNECTION_STRING,\n CommonStatsbeatProperties,\n NetworkStatsbeatProperties,\n} from \"./types\";\n\nconst os = require(\"os\");\n\nexport class StatsbeatMetrics {\n private _commonProperties: CommonStatsbeatProperties;\n private _networkProperties: NetworkStatsbeatProperties;\n private _meter: Meter;\n private _isInitialized: boolean = false;\n private _networkStatsbeatCollection: Array<NetworkStatsbeat> = [];\n private _meterProvider: MeterProvider;\n private _azureExporter: _AzureMonitorStatsbeatExporter;\n private _metricReader: PeriodicExportingMetricReader;\n private _statsCollectionShortInterval: number = 900000; // 15 minutes\n\n // Custom dimensions\n private _resourceProvider: string = StatsbeatResourceProvider.unknown;\n private _os: string = os.type();\n private _cikey: string;\n private _runtimeVersion: string;\n private _language: string;\n private _version: string;\n private _attach: string = \"sdk\";\n\n // Observable Gauges\n private _successCountGauge: ObservableGauge;\n private _failureCountGauge: ObservableGauge;\n private _retryCountGauge: ObservableGauge;\n private _throttleCountGauge: ObservableGauge;\n private _exceptionCountGauge: ObservableGauge;\n private _averageDurationGauge: ObservableGauge;\n\n // Network attributes\n private _connectionString: string;\n private _endpointUrl: string;\n private _host: string;\n\n constructor(instrumentationKey: string, endpointUrl: string) {\n this._connectionString = this._getConnectionString(endpointUrl);\n this._meterProvider = new MeterProvider();\n\n const exporterConfig: AzureMonitorExporterOptions = {\n connectionString: this._connectionString,\n };\n\n this._azureExporter = new _AzureMonitorStatsbeatExporter(exporterConfig);\n\n const metricReaderOptions: PeriodicExportingMetricReaderOptions = {\n exporter: this._azureExporter,\n exportIntervalMillis: this._statsCollectionShortInterval, // 15 minutes\n };\n\n // Exports Network Statsbeat every 15 minutes\n this._metricReader = new PeriodicExportingMetricReader(metricReaderOptions);\n this._meterProvider.addMetricReader(this._metricReader);\n this._meter = this._meterProvider.getMeter(\"Azure Monitor NetworkStatsbeat\");\n\n this._endpointUrl = endpointUrl;\n this._runtimeVersion = process.version;\n this._language = STATSBEAT_LANGUAGE;\n this._version = ai.packageVersion;\n this._host = this._getShortHost(endpointUrl);\n this._cikey = instrumentationKey;\n\n this._successCountGauge = this._meter.createObservableGauge(StatsbeatCounter.SUCCESS_COUNT);\n this._failureCountGauge = this._meter.createObservableGauge(StatsbeatCounter.FAILURE_COUNT);\n this._retryCountGauge = this._meter.createObservableGauge(StatsbeatCounter.RETRY_COUNT);\n this._throttleCountGauge = this._meter.createObservableGauge(StatsbeatCounter.THROTTLE_COUNT);\n this._exceptionCountGauge = this._meter.createObservableGauge(StatsbeatCounter.EXCEPTION_COUNT);\n this._averageDurationGauge = this._meter.createObservableGauge(\n StatsbeatCounter.AVERAGE_DURATION\n );\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._networkProperties = {\n endpoint: this._endpointUrl,\n host: this._host,\n };\n\n this._isInitialized = true;\n this._initialize();\n }\n\n private async _getResourceProvider(): Promise<void> {\n // Check resource provider\n this._resourceProvider = StatsbeatResourceProvider.unknown;\n if (process.env.WEBSITE_SITE_NAME) {\n // Web apps\n this._resourceProvider = StatsbeatResourceProvider.appsvc;\n } else if (process.env.FUNCTIONS_WORKER_RUNTIME) {\n // Function apps\n this._resourceProvider = StatsbeatResourceProvider.functions;\n } else if (await this.getAzureComputeMetadata()) {\n this._resourceProvider = StatsbeatResourceProvider.vm;\n } else {\n this._resourceProvider = StatsbeatResourceProvider.unknown;\n }\n }\n\n public async getAzureComputeMetadata(): Promise<boolean> {\n const httpClient = createDefaultHttpClient();\n const method: HttpMethods = \"GET\";\n\n const options = {\n url: `${AIMS_URI}?${AIMS_API_VERSION}&${AIMS_FORMAT}`,\n timeout: 5000, // 5 seconds\n method: method,\n allowInsecureConnection: true,\n };\n const request = createPipelineRequest(options);\n\n await httpClient\n .sendRequest(request)\n .then((res: any) => {\n if (res.status === 200) {\n return true;\n } else {\n return false;\n }\n })\n .catch(() => {\n return false;\n });\n return false;\n }\n\n public isInitialized() {\n return this._isInitialized;\n }\n\n public shutdown() {\n this._meterProvider.shutdown();\n }\n\n private async _initialize() {\n try {\n await this._getResourceProvider();\n\n // Add observable callbacks\n this._successCountGauge.addCallback(this._successCallback.bind(this));\n this._meter.addBatchObservableCallback(this._failureCallback.bind(this), [\n this._failureCountGauge,\n ]);\n this._meter.addBatchObservableCallback(this._retryCallback.bind(this), [\n this._retryCountGauge,\n ]);\n this._meter.addBatchObservableCallback(this._throttleCallback.bind(this), [\n this._throttleCountGauge,\n ]);\n this._meter.addBatchObservableCallback(this._exceptionCallback.bind(this), [\n this._exceptionCountGauge,\n ]);\n this._averageDurationGauge.addCallback(this._durationCallback.bind(this));\n } catch (error) {\n diag.debug(\"Call to get the resource provider failed.\");\n }\n }\n\n // Observable gauge callbacks\n private _successCallback(observableResult: ObservableResult) {\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let attributes = { ...this._commonProperties, ...this._networkProperties };\n observableResult.observe(counter.totalSuccesfulRequestCount, attributes);\n counter.totalSuccesfulRequestCount = 0;\n }\n\n private _failureCallback(observableResult: BatchObservableResult) {\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n\n /*\n Takes the failureCountGauge, value (of the counter), and attributes\n create a unqiue counter based on statusCode as well\n append statusCode to attributes so the newly created attributes are unique.\n */\n let attributes = { ...this._networkProperties, ...this._commonProperties, statusCode: 0 };\n\n // For each { statusCode -> count } mapping, call observe, passing the count and attributes that include the statusCode\n for (let i = 0; i < counter.totalFailedRequestCount.length; i++) {\n attributes.statusCode = counter.totalFailedRequestCount[i].statusCode;\n observableResult.observe(\n this._failureCountGauge,\n counter.totalFailedRequestCount[i].count,\n attributes\n );\n counter.totalFailedRequestCount[i].count = 0;\n }\n }\n\n private _retryCallback(observableResult: BatchObservableResult) {\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let attributes = { ...this._networkProperties, ...this._commonProperties, statusCode: 0 };\n\n for (let i = 0; i < counter.retryCount.length; i++) {\n attributes.statusCode = counter.retryCount[i].statusCode;\n observableResult.observe(this._retryCountGauge, counter.retryCount[i].count, attributes);\n counter.retryCount[i].count = 0;\n }\n }\n\n private _throttleCallback(observableResult: BatchObservableResult) {\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let attributes = { ...this._networkProperties, ...this._commonProperties, statusCode: 0 };\n\n for (let i = 0; i < counter.throttleCount.length; i++) {\n attributes.statusCode = counter.throttleCount[i].statusCode;\n observableResult.observe(\n this._throttleCountGauge,\n counter.throttleCount[i].count,\n attributes\n );\n counter.throttleCount[i].count = 0;\n }\n }\n\n private _exceptionCallback(observableResult: BatchObservableResult) {\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let attributes = { ...this._networkProperties, ...this._commonProperties, exceptionType: \"\" };\n\n for (let i = 0; i < counter.exceptionCount.length; i++) {\n attributes.exceptionType = counter.exceptionCount[i].exceptionType;\n observableResult.observe(\n this._exceptionCountGauge,\n counter.exceptionCount[i].count,\n attributes\n );\n counter.exceptionCount[i].count = 0;\n }\n }\n\n private _durationCallback(observableResult: ObservableResult) {\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let attributes = { ...this._networkProperties, ...this._commonProperties };\n observableResult.observe(counter.averageRequestExecutionTime, attributes);\n counter.averageRequestExecutionTime = 0;\n }\n\n // Public methods to increase counters\n public countSuccess(duration: number) {\n if (!this._isInitialized) {\n return;\n }\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n counter.totalRequestCount++;\n counter.totalSuccesfulRequestCount++;\n counter.intervalRequestExecutionTime += duration;\n }\n\n public countFailure(duration: number, statusCode: number) {\n if (!this._isInitialized) {\n return;\n }\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let currentStatusCounter = counter.totalFailedRequestCount.find(\n (statusCounter) => statusCode === statusCounter.statusCode\n );\n\n if (currentStatusCounter) {\n currentStatusCounter.count++;\n } else {\n counter.totalFailedRequestCount.push({ statusCode: statusCode, count: 1 });\n }\n\n counter.totalRequestCount++;\n counter.intervalRequestExecutionTime += duration;\n }\n\n public countRetry(statusCode: number) {\n if (!this._isInitialized) {\n return;\n }\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let currentStatusCounter = counter.retryCount.find(\n (statusCounter) => statusCode === statusCounter.statusCode\n );\n\n if (currentStatusCounter) {\n currentStatusCounter.count++;\n } else {\n counter.retryCount.push({ statusCode: statusCode, count: 1 });\n }\n }\n\n public countThrottle(statusCode: number) {\n if (!this._isInitialized) {\n return;\n }\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let currentStatusCounter = counter.throttleCount.find(\n (statusCounter) => statusCode === statusCounter.statusCode\n );\n\n if (currentStatusCounter) {\n currentStatusCounter.count++;\n } else {\n counter.throttleCount.push({ statusCode: statusCode, count: 1 });\n }\n }\n\n public countException(exceptionType: Error) {\n if (!this._isInitialized) {\n return;\n }\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let currentErrorCounter = counter.exceptionCount.find(\n (exceptionCounter) => exceptionType.name === exceptionCounter.exceptionType\n );\n if (currentErrorCounter) {\n currentErrorCounter.count++;\n } else {\n counter.exceptionCount.push({ exceptionType: exceptionType.name, count: 1 });\n }\n }\n\n public countAverageDuration() {\n for (let i = 0; i < this._networkStatsbeatCollection.length; i++) {\n let currentCounter = this._networkStatsbeatCollection[i];\n currentCounter.time = Number(new Date());\n let intervalRequests =\n currentCounter.totalRequestCount - currentCounter.lastRequestCount || 0;\n currentCounter.averageRequestExecutionTime =\n (currentCounter.intervalRequestExecutionTime -\n currentCounter.lastIntervalRequestExecutionTime) /\n intervalRequests || 0;\n currentCounter.lastIntervalRequestExecutionTime = currentCounter.intervalRequestExecutionTime; // reset\n\n currentCounter.lastRequestCount = currentCounter.totalRequestCount;\n currentCounter.lastTime = currentCounter.time;\n }\n }\n\n // Gets a networkStatsbeat counter if one exists for the given endpoint\n private _getNetworkStatsbeatCounter(endpoint: string, host: string): NetworkStatsbeat {\n // Check if the counter is available\n for (let i = 0; i < this._networkStatsbeatCollection.length; i++) {\n // Same object\n if (\n endpoint === this._networkStatsbeatCollection[i].endpoint &&\n host === this._networkStatsbeatCollection[i].host\n ) {\n return this._networkStatsbeatCollection[i];\n }\n }\n // Create a new counter if not found\n let newCounter = new NetworkStatsbeat(endpoint, host);\n this._networkStatsbeatCollection.push(newCounter);\n return newCounter;\n }\n\n private _getShortHost(originalHost: string) {\n let shortHost = originalHost;\n try {\n let hostRegex = new RegExp(/^https?:\\/\\/(?:www\\.)?([^\\/.-]+)/);\n let res = hostRegex.exec(originalHost);\n if (res != null && res.length > 1) {\n shortHost = res[1];\n }\n } catch (error) {\n diag.debug(\"Failed to get the short host name.\");\n }\n return shortHost;\n }\n\n private _getConnectionString(endpointUrl: string) {\n let currentEndpoint = endpointUrl;\n for (let i = 0; i < EU_ENDPOINTS.length; i++) {\n if (currentEndpoint.includes(EU_ENDPOINTS[i])) {\n return EU_CONNECTION_STRING;\n }\n }\n return NON_EU_CONNECTION_STRING;\n }\n}\n"]}
1
+ {"version":3,"file":"statsbeatMetrics.js","sourceRoot":"","sources":["../../../../src/export/statsbeat/statsbeatMetrics.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\nimport {\n createDefaultHttpClient,\n createPipelineRequest,\n HttpMethods,\n} from \"@azure/core-rest-pipeline\";\nimport { diag } from \"@opentelemetry/api\";\nimport {\n BatchObservableResult,\n ObservableGauge,\n ObservableResult,\n} from \"@opentelemetry/api-metrics\";\nimport { Meter } from \"@opentelemetry/api-metrics/build/src/types/Meter\";\nimport {\n MeterProvider,\n PeriodicExportingMetricReader,\n PeriodicExportingMetricReaderOptions,\n} from \"@opentelemetry/sdk-metrics\";\nimport { AzureMonitorExporterOptions, _AzureMonitorStatsbeatExporter } from \"../../index\";\nimport * as ai from \"../../utils/constants/applicationinsights\";\nimport {\n StatsbeatCounter,\n StatsbeatResourceProvider,\n STATSBEAT_LANGUAGE,\n NetworkStatsbeat,\n AIMS_URI,\n AIMS_API_VERSION,\n AIMS_FORMAT,\n EU_CONNECTION_STRING,\n EU_ENDPOINTS,\n NON_EU_CONNECTION_STRING,\n CommonStatsbeatProperties,\n NetworkStatsbeatProperties,\n} from \"./types\";\n\nconst os = require(\"os\");\n\nexport class StatsbeatMetrics {\n private _commonProperties: CommonStatsbeatProperties;\n private _networkProperties: NetworkStatsbeatProperties;\n private _meter: Meter;\n private _isInitialized: boolean = false;\n private _networkStatsbeatCollection: Array<NetworkStatsbeat> = [];\n private _meterProvider: MeterProvider;\n private _azureExporter: _AzureMonitorStatsbeatExporter;\n private _metricReader: PeriodicExportingMetricReader;\n private _statsCollectionShortInterval: number = 900000; // 15 minutes\n\n // Custom dimensions\n private _resourceProvider: string = StatsbeatResourceProvider.unknown;\n private _os: string = os.type();\n private _cikey: string;\n private _runtimeVersion: string;\n private _language: string;\n private _version: string;\n private _attach: string = \"sdk\";\n\n // Observable Gauges\n private _successCountGauge: ObservableGauge;\n private _failureCountGauge: ObservableGauge;\n private _retryCountGauge: ObservableGauge;\n private _throttleCountGauge: ObservableGauge;\n private _exceptionCountGauge: ObservableGauge;\n private _averageDurationGauge: ObservableGauge;\n\n // Network attributes\n private _connectionString: string;\n private _endpointUrl: string;\n private _host: string;\n\n constructor(options: {\n instrumentationKey: string;\n endpointUrl: string;\n collectionInterval?: number;\n }) {\n this._connectionString = this._getConnectionString(options.endpointUrl);\n this._meterProvider = new MeterProvider();\n\n const exporterConfig: AzureMonitorExporterOptions = {\n connectionString: this._connectionString,\n };\n\n this._azureExporter = new _AzureMonitorStatsbeatExporter(exporterConfig);\n\n const metricReaderOptions: PeriodicExportingMetricReaderOptions = {\n exporter: this._azureExporter,\n exportIntervalMillis: options.collectionInterval || this._statsCollectionShortInterval, // 15 minutes\n };\n\n // Exports Network Statsbeat every 15 minutes\n this._metricReader = new PeriodicExportingMetricReader(metricReaderOptions);\n this._meterProvider.addMetricReader(this._metricReader);\n this._meter = this._meterProvider.getMeter(\"Azure Monitor NetworkStatsbeat\");\n\n this._endpointUrl = options.endpointUrl;\n this._runtimeVersion = process.version;\n this._language = STATSBEAT_LANGUAGE;\n this._version = ai.packageVersion;\n this._host = this._getShortHost(options.endpointUrl);\n this._cikey = options.instrumentationKey;\n\n this._successCountGauge = this._meter.createObservableGauge(StatsbeatCounter.SUCCESS_COUNT);\n this._failureCountGauge = this._meter.createObservableGauge(StatsbeatCounter.FAILURE_COUNT);\n this._retryCountGauge = this._meter.createObservableGauge(StatsbeatCounter.RETRY_COUNT);\n this._throttleCountGauge = this._meter.createObservableGauge(StatsbeatCounter.THROTTLE_COUNT);\n this._exceptionCountGauge = this._meter.createObservableGauge(StatsbeatCounter.EXCEPTION_COUNT);\n this._averageDurationGauge = this._meter.createObservableGauge(\n StatsbeatCounter.AVERAGE_DURATION\n );\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._networkProperties = {\n endpoint: this._endpointUrl,\n host: this._host,\n };\n\n this._isInitialized = true;\n this._initialize();\n }\n\n private async _getResourceProvider(): Promise<void> {\n // Check resource provider\n this._resourceProvider = StatsbeatResourceProvider.unknown;\n if (process.env.WEBSITE_SITE_NAME) {\n // Web apps\n this._resourceProvider = StatsbeatResourceProvider.appsvc;\n } else if (process.env.FUNCTIONS_WORKER_RUNTIME) {\n // Function apps\n this._resourceProvider = StatsbeatResourceProvider.functions;\n } else if (await this.getAzureComputeMetadata()) {\n this._resourceProvider = StatsbeatResourceProvider.vm;\n } else {\n this._resourceProvider = StatsbeatResourceProvider.unknown;\n }\n }\n\n public async getAzureComputeMetadata(): Promise<boolean> {\n const httpClient = createDefaultHttpClient();\n const method: HttpMethods = \"GET\";\n\n const options = {\n url: `${AIMS_URI}?${AIMS_API_VERSION}&${AIMS_FORMAT}`,\n timeout: 5000, // 5 seconds\n method: method,\n allowInsecureConnection: true,\n };\n const request = createPipelineRequest(options);\n\n await httpClient\n .sendRequest(request)\n .then((res: any) => {\n if (res.status === 200) {\n return true;\n } else {\n return false;\n }\n })\n .catch(() => {\n return false;\n });\n return false;\n }\n\n public isInitialized() {\n return this._isInitialized;\n }\n\n public shutdown() {\n this._meterProvider.shutdown();\n }\n\n private async _initialize() {\n try {\n await this._getResourceProvider();\n\n // Add observable callbacks\n this._successCountGauge.addCallback(this._successCallback.bind(this));\n this._meter.addBatchObservableCallback(this._failureCallback.bind(this), [\n this._failureCountGauge,\n ]);\n this._meter.addBatchObservableCallback(this._retryCallback.bind(this), [\n this._retryCountGauge,\n ]);\n this._meter.addBatchObservableCallback(this._throttleCallback.bind(this), [\n this._throttleCountGauge,\n ]);\n this._meter.addBatchObservableCallback(this._exceptionCallback.bind(this), [\n this._exceptionCountGauge,\n ]);\n this._averageDurationGauge.addCallback(this._durationCallback.bind(this));\n } catch (error) {\n diag.debug(\"Call to get the resource provider failed.\");\n }\n }\n\n // Observable gauge callbacks\n private _successCallback(observableResult: ObservableResult) {\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let attributes = { ...this._commonProperties, ...this._networkProperties };\n observableResult.observe(counter.totalSuccesfulRequestCount, attributes);\n counter.totalSuccesfulRequestCount = 0;\n }\n\n private _failureCallback(observableResult: BatchObservableResult) {\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n\n /*\n Takes the failureCountGauge, value (of the counter), and attributes\n create a unqiue counter based on statusCode as well\n append statusCode to attributes so the newly created attributes are unique.\n */\n let attributes = { ...this._networkProperties, ...this._commonProperties, statusCode: 0 };\n\n // For each { statusCode -> count } mapping, call observe, passing the count and attributes that include the statusCode\n for (let i = 0; i < counter.totalFailedRequestCount.length; i++) {\n attributes.statusCode = counter.totalFailedRequestCount[i].statusCode;\n observableResult.observe(this._failureCountGauge, counter.totalFailedRequestCount[i].count, {\n ...attributes,\n });\n counter.totalFailedRequestCount[i].count = 0;\n }\n }\n\n private _retryCallback(observableResult: BatchObservableResult) {\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let attributes = { ...this._networkProperties, ...this._commonProperties, statusCode: 0 };\n\n for (let i = 0; i < counter.retryCount.length; i++) {\n attributes.statusCode = counter.retryCount[i].statusCode;\n observableResult.observe(this._retryCountGauge, counter.retryCount[i].count, {\n ...attributes,\n });\n counter.retryCount[i].count = 0;\n }\n }\n\n private _throttleCallback(observableResult: BatchObservableResult) {\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let attributes = { ...this._networkProperties, ...this._commonProperties, statusCode: 0 };\n\n for (let i = 0; i < counter.throttleCount.length; i++) {\n attributes.statusCode = counter.throttleCount[i].statusCode;\n observableResult.observe(this._throttleCountGauge, counter.throttleCount[i].count, {\n ...attributes,\n });\n counter.throttleCount[i].count = 0;\n }\n }\n\n private _exceptionCallback(observableResult: BatchObservableResult) {\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let attributes = { ...this._networkProperties, ...this._commonProperties, exceptionType: \"\" };\n\n for (let i = 0; i < counter.exceptionCount.length; i++) {\n attributes.exceptionType = counter.exceptionCount[i].exceptionType;\n observableResult.observe(this._exceptionCountGauge, counter.exceptionCount[i].count, {\n ...attributes,\n });\n counter.exceptionCount[i].count = 0;\n }\n }\n\n private _durationCallback(observableResult: ObservableResult) {\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let attributes = { ...this._networkProperties, ...this._commonProperties };\n for (let i = 0; i < this._networkStatsbeatCollection.length; i++) {\n let currentCounter = this._networkStatsbeatCollection[i];\n currentCounter.time = Number(new Date());\n let intervalRequests =\n currentCounter.totalRequestCount - currentCounter.lastRequestCount || 0;\n currentCounter.averageRequestExecutionTime =\n (currentCounter.intervalRequestExecutionTime -\n currentCounter.lastIntervalRequestExecutionTime) /\n intervalRequests || 0;\n currentCounter.lastIntervalRequestExecutionTime = currentCounter.intervalRequestExecutionTime; // reset\n\n currentCounter.lastRequestCount = currentCounter.totalRequestCount;\n currentCounter.lastTime = currentCounter.time;\n }\n observableResult.observe(counter.averageRequestExecutionTime, attributes);\n\n counter.averageRequestExecutionTime = 0;\n }\n\n // Public methods to increase counters\n public countSuccess(duration: number) {\n if (!this._isInitialized) {\n return;\n }\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n counter.totalRequestCount++;\n counter.totalSuccesfulRequestCount++;\n counter.intervalRequestExecutionTime += duration;\n }\n\n public countFailure(duration: number, statusCode: number) {\n if (!this._isInitialized) {\n return;\n }\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let currentStatusCounter = counter.totalFailedRequestCount.find(\n (statusCounter) => statusCode === statusCounter.statusCode\n );\n\n if (currentStatusCounter) {\n currentStatusCounter.count++;\n } else {\n counter.totalFailedRequestCount.push({ statusCode: statusCode, count: 1 });\n }\n\n counter.totalRequestCount++;\n counter.intervalRequestExecutionTime += duration;\n }\n\n public countRetry(statusCode: number) {\n if (!this._isInitialized) {\n return;\n }\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let currentStatusCounter = counter.retryCount.find(\n (statusCounter) => statusCode === statusCounter.statusCode\n );\n\n if (currentStatusCounter) {\n currentStatusCounter.count++;\n } else {\n counter.retryCount.push({ statusCode: statusCode, count: 1 });\n }\n }\n\n public countThrottle(statusCode: number) {\n if (!this._isInitialized) {\n return;\n }\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let currentStatusCounter = counter.throttleCount.find(\n (statusCounter) => statusCode === statusCounter.statusCode\n );\n\n if (currentStatusCounter) {\n currentStatusCounter.count++;\n } else {\n counter.throttleCount.push({ statusCode: statusCode, count: 1 });\n }\n }\n\n public countException(exceptionType: Error) {\n if (!this._isInitialized) {\n return;\n }\n let counter: NetworkStatsbeat = this._getNetworkStatsbeatCounter(this._endpointUrl, this._host);\n let currentErrorCounter = counter.exceptionCount.find(\n (exceptionCounter) => exceptionType.name === exceptionCounter.exceptionType\n );\n if (currentErrorCounter) {\n currentErrorCounter.count++;\n } else {\n counter.exceptionCount.push({ exceptionType: exceptionType.name, count: 1 });\n }\n }\n\n // Gets a networkStatsbeat counter if one exists for the given endpoint\n private _getNetworkStatsbeatCounter(endpoint: string, host: string): NetworkStatsbeat {\n // Check if the counter is available\n for (let i = 0; i < this._networkStatsbeatCollection.length; i++) {\n // Same object\n if (\n endpoint === this._networkStatsbeatCollection[i].endpoint &&\n host === this._networkStatsbeatCollection[i].host\n ) {\n return this._networkStatsbeatCollection[i];\n }\n }\n // Create a new counter if not found\n let newCounter = new NetworkStatsbeat(endpoint, host);\n this._networkStatsbeatCollection.push(newCounter);\n return newCounter;\n }\n\n private _getShortHost(originalHost: string) {\n let shortHost = originalHost;\n try {\n let hostRegex = new RegExp(/^https?:\\/\\/(?:www\\.)?([^\\/.-]+)/);\n let res = hostRegex.exec(originalHost);\n if (res != null && res.length > 1) {\n shortHost = res[1];\n }\n } catch (error) {\n diag.debug(\"Failed to get the short host name.\");\n }\n return shortHost;\n }\n\n private _getConnectionString(endpointUrl: string) {\n let currentEndpoint = endpointUrl;\n for (let i = 0; i < EU_ENDPOINTS.length; i++) {\n if (currentEndpoint.includes(EU_ENDPOINTS[i])) {\n return EU_CONNECTION_STRING;\n }\n }\n return NON_EU_CONNECTION_STRING;\n }\n}\n"]}
@@ -19,7 +19,7 @@ export const TIME_SINCE_ENQUEUED = "timeSinceEnqueued";
19
19
  * AzureMonitorTraceExporter version.
20
20
  * @internal
21
21
  */
22
- export const packageVersion = "1.0.0-beta.9";
22
+ export const packageVersion = "1.0.0-beta.10";
23
23
  export var DependencyTypes;
24
24
  (function (DependencyTypes) {
25
25
  DependencyTypes["InProc"] = "InProc";
@@ -1 +1 @@
1
- {"version":3,"file":"applicationinsights.js","sourceRoot":"","sources":["../../../../src/utils/constants/applicationinsights.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC;AACpC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC;AAC5C;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AACvD;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,cAAc,CAAC;AAE7C,MAAM,CAAN,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,oCAAiB,CAAA;IACjB,iDAA8B,CAAA;IAC9B,8BAAW,CAAA;IACX,gCAAa,CAAA;IACb,gCAAa,CAAA;AACf,CAAC,EANW,eAAe,KAAf,eAAe,QAM1B;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AAEvD,MAAM,CAAN,IAAY,eAKX;AALD,WAAY,eAAe;IACzB,8EAA2D,CAAA;IAC3D,oFAAiE,CAAA;IACjE,kEAA+C,CAAA;IAC/C,0DAAuC,CAAA;AACzC,CAAC,EALW,eAAe,KAAf,eAAe,QAK1B;AAED,MAAM,CAAN,IAAY,iBAKX;AALD,WAAY,iBAAiB;IAC3B,2DAAsC,CAAA;IACtC,kEAA6C,CAAA;IAC7C,yDAAoC,CAAA;IACpC,iDAA4B,CAAA;AAC9B,CAAC,EALW,iBAAiB,KAAjB,iBAAiB,QAK5B;AAgBD,+CAA+C;AAC/C,MAAM,CAAC,MAAM,gCAAgC,GAAiD;IAC5F,iBAAiB,EAAE,oBAAoB;IACvC,aAAa,EAAE,gBAAgB;IAC/B,kBAAkB,EAAE,qBAAqB;IACzC,cAAc,EAAE,iBAAiB;IACjC,iBAAiB,EAAE,oBAAoB;IACvC,cAAc,EAAE,iBAAiB;IACjC,gBAAgB,EAAE,mBAAmB;IACrC,iBAAiB,EAAE,oBAAoB;IACvC,oBAAoB,EAAE,uBAAuB;IAC7C,kBAAkB,EAAE,qBAAqB;IACzC,QAAQ,EAAE,cAAc;IACxB,eAAe,EAAE,qBAAqB;CACvC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * AI MS Links.\n * @internal\n */\nexport const MS_LINKS = \"_MS.links\";\n/**\n * AI enqueued time attribute.\n * @internal\n */\nexport const ENQUEUED_TIME = \"enqueuedTime\";\n/**\n * AI time since enqueued attribute.\n * @internal\n */\nexport const TIME_SINCE_ENQUEUED = \"timeSinceEnqueued\";\n/**\n * AzureMonitorTraceExporter version.\n * @internal\n */\nexport const packageVersion = \"1.0.0-beta.9\";\n\nexport enum DependencyTypes {\n InProc = \"InProc\",\n QueueMessage = \"Queue Message\",\n Sql = \"SQL\",\n Http = \"Http\",\n Grpc = \"GRPC\",\n}\n\nexport const AzureMonitorSampleRate = \"_MS.sampleRate\";\n\nexport enum StandardMetrics {\n HTTP_REQUEST_DURATION = \"azureMonitor.http.requestDuration\",\n HTTP_DEPENDENCY_DURATION = \"azureMonitor.http.dependencyDuration\",\n EXCEPTION_COUNT = \"azureMonitor.exceptionCount\",\n TRACE_COUNT = \"azureMonitor.traceCount\",\n}\n\nexport enum StandardMetricIds {\n REQUEST_DURATION = \"requests/duration\",\n DEPENDENCY_DURATION = \"dependencies/duration\",\n EXCEPTION_COUNT = \"exceptions/count\",\n TRACE_COUNT = \"traces/count\",\n}\n\nexport type MetricDimensionTypeKeys =\n | \"cloudRoleInstance\"\n | \"cloudRoleName\"\n | \"requestSuccess\"\n | \"requestResultCode\"\n | \"dependencyType\"\n | \"dependencyTarget\"\n | \"dependencySuccess\"\n | \"dependencyResultCode\"\n | \"traceSeverityLevel\"\n | \"operationSynthetic\"\n | \"metricId\"\n | \"IsAutocollected\";\n\n// Names expected in Breeze side for dimensions\nexport const PreAggregatedMetricPropertyNames: { [key in MetricDimensionTypeKeys]: string } = {\n cloudRoleInstance: \"cloud/roleInstance\",\n cloudRoleName: \"cloud/roleName\",\n operationSynthetic: \"operation/synthetic\",\n requestSuccess: \"Request.Success\",\n requestResultCode: \"request/resultCode\",\n dependencyType: \"Dependency.Type\",\n dependencyTarget: \"dependency/target\",\n dependencySuccess: \"Dependency.Success\",\n dependencyResultCode: \"dependency/resultCode\",\n traceSeverityLevel: \"trace/severityLevel\",\n metricId: \"_MS.MetricId\",\n IsAutocollected: \"_MS.IsAutocollected\",\n};\n"]}
1
+ {"version":3,"file":"applicationinsights.js","sourceRoot":"","sources":["../../../../src/utils/constants/applicationinsights.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAElC;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC;AACpC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC;AAC5C;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,mBAAmB,CAAC;AACvD;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC;AAE9C,MAAM,CAAN,IAAY,eAMX;AAND,WAAY,eAAe;IACzB,oCAAiB,CAAA;IACjB,iDAA8B,CAAA;IAC9B,8BAAW,CAAA;IACX,gCAAa,CAAA;IACb,gCAAa,CAAA;AACf,CAAC,EANW,eAAe,KAAf,eAAe,QAM1B;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,gBAAgB,CAAC;AAEvD,MAAM,CAAN,IAAY,eAKX;AALD,WAAY,eAAe;IACzB,8EAA2D,CAAA;IAC3D,oFAAiE,CAAA;IACjE,kEAA+C,CAAA;IAC/C,0DAAuC,CAAA;AACzC,CAAC,EALW,eAAe,KAAf,eAAe,QAK1B;AAED,MAAM,CAAN,IAAY,iBAKX;AALD,WAAY,iBAAiB;IAC3B,2DAAsC,CAAA;IACtC,kEAA6C,CAAA;IAC7C,yDAAoC,CAAA;IACpC,iDAA4B,CAAA;AAC9B,CAAC,EALW,iBAAiB,KAAjB,iBAAiB,QAK5B;AAgBD,+CAA+C;AAC/C,MAAM,CAAC,MAAM,gCAAgC,GAAiD;IAC5F,iBAAiB,EAAE,oBAAoB;IACvC,aAAa,EAAE,gBAAgB;IAC/B,kBAAkB,EAAE,qBAAqB;IACzC,cAAc,EAAE,iBAAiB;IACjC,iBAAiB,EAAE,oBAAoB;IACvC,cAAc,EAAE,iBAAiB;IACjC,gBAAgB,EAAE,mBAAmB;IACrC,iBAAiB,EAAE,oBAAoB;IACvC,oBAAoB,EAAE,uBAAuB;IAC7C,kBAAkB,EAAE,qBAAqB;IACzC,QAAQ,EAAE,cAAc;IACxB,eAAe,EAAE,qBAAqB;CACvC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n\n/**\n * AI MS Links.\n * @internal\n */\nexport const MS_LINKS = \"_MS.links\";\n/**\n * AI enqueued time attribute.\n * @internal\n */\nexport const ENQUEUED_TIME = \"enqueuedTime\";\n/**\n * AI time since enqueued attribute.\n * @internal\n */\nexport const TIME_SINCE_ENQUEUED = \"timeSinceEnqueued\";\n/**\n * AzureMonitorTraceExporter version.\n * @internal\n */\nexport const packageVersion = \"1.0.0-beta.10\";\n\nexport enum DependencyTypes {\n InProc = \"InProc\",\n QueueMessage = \"Queue Message\",\n Sql = \"SQL\",\n Http = \"Http\",\n Grpc = \"GRPC\",\n}\n\nexport const AzureMonitorSampleRate = \"_MS.sampleRate\";\n\nexport enum StandardMetrics {\n HTTP_REQUEST_DURATION = \"azureMonitor.http.requestDuration\",\n HTTP_DEPENDENCY_DURATION = \"azureMonitor.http.dependencyDuration\",\n EXCEPTION_COUNT = \"azureMonitor.exceptionCount\",\n TRACE_COUNT = \"azureMonitor.traceCount\",\n}\n\nexport enum StandardMetricIds {\n REQUEST_DURATION = \"requests/duration\",\n DEPENDENCY_DURATION = \"dependencies/duration\",\n EXCEPTION_COUNT = \"exceptions/count\",\n TRACE_COUNT = \"traces/count\",\n}\n\nexport type MetricDimensionTypeKeys =\n | \"cloudRoleInstance\"\n | \"cloudRoleName\"\n | \"requestSuccess\"\n | \"requestResultCode\"\n | \"dependencyType\"\n | \"dependencyTarget\"\n | \"dependencySuccess\"\n | \"dependencyResultCode\"\n | \"traceSeverityLevel\"\n | \"operationSynthetic\"\n | \"metricId\"\n | \"IsAutocollected\";\n\n// Names expected in Breeze side for dimensions\nexport const PreAggregatedMetricPropertyNames: { [key in MetricDimensionTypeKeys]: string } = {\n cloudRoleInstance: \"cloud/roleInstance\",\n cloudRoleName: \"cloud/roleName\",\n operationSynthetic: \"operation/synthetic\",\n requestSuccess: \"Request.Success\",\n requestResultCode: \"request/resultCode\",\n dependencyType: \"Dependency.Type\",\n dependencyTarget: \"dependency/target\",\n dependencySuccess: \"Dependency.Success\",\n dependencyResultCode: \"dependency/resultCode\",\n traceSeverityLevel: \"trace/severityLevel\",\n metricId: \"_MS.MetricId\",\n IsAutocollected: \"_MS.IsAutocollected\",\n};\n"]}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@azure/monitor-opentelemetry-exporter",
3
3
  "author": "Microsoft Corporation",
4
4
  "sdk-type": "client",
5
- "version": "1.0.0-alpha.20221031.1",
5
+ "version": "1.0.0-beta.10",
6
6
  "description": "Application Insights exporter for the OpenTelemetry JavaScript (Node.js) SDK",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist-esm/src/index.js",
@@ -83,8 +83,8 @@
83
83
  }
84
84
  },
85
85
  "devDependencies": {
86
- "@azure/dev-tool": ">=1.0.0-alpha <1.0.0-alphb",
87
- "@azure/eslint-plugin-azure-sdk": ">=3.0.0-alpha <3.0.0-alphb",
86
+ "@azure/dev-tool": "^1.0.0",
87
+ "@azure/eslint-plugin-azure-sdk": "^3.0.0",
88
88
  "@microsoft/api-extractor": "^7.31.1",
89
89
  "@opentelemetry/instrumentation": "^0.33.0",
90
90
  "@opentelemetry/instrumentation-http": "^0.33.0",
@@ -101,7 +101,7 @@
101
101
  "rimraf": "^3.0.0",
102
102
  "sinon": "^9.0.2",
103
103
  "ts-node": "^10.0.0",
104
- "typescript": "~4.6.0"
104
+ "typescript": "~4.8.0"
105
105
  },
106
106
  "dependencies": {
107
107
  "@azure/core-client": "^1.0.0",