@microsoft/applicationinsights-dependencies-js 2.8.0-beta.2203-08 → 2.8.0-beta.2203-11

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/src/ajax.ts CHANGED
@@ -10,7 +10,8 @@ import {
10
10
  isNullOrUndefined, arrForEach, isString, strTrim, isFunction, LoggingSeverity, _InternalMessageId,
11
11
  IAppInsightsCore, BaseTelemetryPlugin, ITelemetryPluginChain, IConfiguration, IPlugin, ITelemetryItem, IProcessTelemetryContext,
12
12
  getLocation, getGlobal, strPrototype, IInstrumentCallDetails, InstrumentFunc, InstrumentProto, getPerformance,
13
- IInstrumentHooksCallbacks, objForEachKey, generateW3CId, getIEVersion, dumpObj, ICustomProperties, isXhrSupported, eventOn, mergeEvtNamespace, createUniqueNamespace
13
+ IInstrumentHooksCallbacks, objForEachKey, generateW3CId, getIEVersion, dumpObj, ICustomProperties, isXhrSupported, eventOn,
14
+ mergeEvtNamespace, createUniqueNamespace, createProcessTelemetryContext
14
15
  } from "@microsoft/applicationinsights-core-js";
15
16
  import { ajaxRecord, IAjaxRecordResponse } from "./ajaxRecord";
16
17
  import { Traceparent } from "./TraceParent";
@@ -21,6 +22,7 @@ const strDiagLog = "diagLog";
21
22
  const strAjaxData = "ajaxData";
22
23
  const strThrowInternal = "throwInternal";
23
24
  const strFetch = "fetch";
25
+ const strTrackDependencyDataInternal = "trackDependencyDataInternal"; // Using string to help with minification
24
26
 
25
27
  // Using a global value so that to handle same iKey with multiple app insights instances (mostly for testing)
26
28
  let _markCount: number = 0;
@@ -198,23 +200,23 @@ export class AjaxMonitor extends BaseTelemetryPlugin implements IDependenciesPlu
198
200
 
199
201
  constructor() {
200
202
  super();
201
- let strTrackDependencyDataInternal = "trackDependencyDataInternal"; // Using string to help with minification
202
- let location = getLocation();
203
- let _fetchInitialized:boolean = false; // fetch monitoring initialized
204
- let _xhrInitialized:boolean = false; // XHR monitoring initialized
205
- let _currentWindowHost:string = location && location.host && location.host.toLowerCase();
206
- let _config: ICorrelationConfig = AjaxMonitor.getEmptyConfig();
207
- let _enableRequestHeaderTracking = false;
208
- let _enableAjaxErrorStatusText = false;
209
- let _trackAjaxAttempts: number = 0;
203
+ let _fetchInitialized: boolean; // fetch monitoring initialized
204
+ let _xhrInitialized: boolean; // XHR monitoring initialized
205
+ let _currentWindowHost: string;
206
+ let _config: ICorrelationConfig;
207
+ let _enableRequestHeaderTracking: boolean;
208
+ let _enableAjaxErrorStatusText: boolean;
209
+ let _trackAjaxAttempts: number;
210
210
  let _context: ITelemetryContext;
211
211
  let _isUsingW3CHeaders: boolean;
212
212
  let _isUsingAIHeaders: boolean;
213
213
  let _markPrefix: string;
214
- let _enableAjaxPerfTracking:boolean = false;
215
- let _maxAjaxCallsPerView:number = 0;
216
- let _enableResponseHeaderTracking:boolean = false;
217
- let _disabledUrls:any = {};
214
+ let _enableAjaxPerfTracking: boolean;
215
+ let _maxAjaxCallsPerView: number;
216
+ let _enableResponseHeaderTracking: boolean;
217
+ let _disabledUrls: any;
218
+ let _disableAjaxTracking: boolean;
219
+ let _disableFetchTracking: boolean;
218
220
  let _excludeRequestFromAutoTrackingPatterns: string[] | RegExp[];
219
221
  let _addRequestContext: (requestContext?: IRequestContext) => ICustomProperties;
220
222
  let _evtNamespace: string | string[];
@@ -222,63 +224,24 @@ export class AjaxMonitor extends BaseTelemetryPlugin implements IDependenciesPlu
222
224
  dynamicProto(AjaxMonitor, this, (_self, _base) => {
223
225
  let _addHook = _base._addHook;
224
226
 
227
+ _initDefaults();
228
+
225
229
  _self.initialize = (config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?:ITelemetryPluginChain) => {
226
230
  if (!_self.isInitialized()) {
227
231
  _base.initialize(config, core, extensions, pluginChain);
228
- let ctx = _self._getTelCtx();
229
- const defaultConfig = AjaxMonitor.getDefaultConfig();
230
- objForEachKey(defaultConfig, (field, value) => {
231
- _config[field] = ctx.getConfig(AjaxMonitor.identifier, field, value);
232
- });
233
232
 
234
233
  _evtNamespace = mergeEvtNamespace(createUniqueNamespace("ajax"), core && core.evtNamespace && core.evtNamespace());
235
234
 
236
- let distributedTracingMode = _config.distributedTracingMode;
237
- _enableRequestHeaderTracking = _config.enableRequestHeaderTracking;
238
- _enableAjaxErrorStatusText = _config.enableAjaxErrorStatusText;
239
- _enableAjaxPerfTracking = _config.enableAjaxPerfTracking;
240
- _maxAjaxCallsPerView = _config.maxAjaxCallsPerView;
241
- _enableResponseHeaderTracking = _config.enableResponseHeaderTracking;
242
- _excludeRequestFromAutoTrackingPatterns = _config.excludeRequestFromAutoTrackingPatterns;
243
- _addRequestContext = _config.addRequestContext;
244
-
245
- _isUsingAIHeaders = distributedTracingMode === eDistributedTracingModes.AI || distributedTracingMode === eDistributedTracingModes.AI_AND_W3C;
246
- _isUsingW3CHeaders = distributedTracingMode === eDistributedTracingModes.AI_AND_W3C || distributedTracingMode === eDistributedTracingModes.W3C;
247
- if (_enableAjaxPerfTracking) {
248
- let iKey = config.instrumentationKey || "unkwn";
249
- if (iKey.length > 5) {
250
- _markPrefix = AJAX_MONITOR_PREFIX + iKey.substring(iKey.length - 5) + ".";
251
- } else {
252
- _markPrefix = AJAX_MONITOR_PREFIX + iKey + ".";
253
- }
254
- }
255
-
256
- if (_config.disableAjaxTracking === false) {
257
- _instrumentXhr();
258
- }
235
+ _populateDefaults(config);
259
236
 
237
+ _instrumentXhr();
260
238
  _instrumentFetch();
261
-
262
- if (extensions.length > 0 && extensions) {
263
- let propExt: any, extIx = 0;
264
- while (!propExt && extIx < extensions.length) {
265
- if (extensions[extIx] && extensions[extIx].identifier === PropertiesPluginIdentifier) {
266
- propExt = extensions[extIx];
267
- }
268
-
269
- extIx++;
270
- }
271
-
272
- if (propExt) {
273
- _context = propExt.context; // we could move IPropertiesPlugin to common as well
274
- }
275
- }
239
+ _populateContext();
276
240
  }
277
241
  };
278
242
 
279
243
  _self._doTeardown = () => {
280
- _fetchInitialized = false;
281
- _xhrInitialized = false;
244
+ _initDefaults();
282
245
  };
283
246
 
284
247
  _self.trackDependencyData = (dependency: IDependencyTelemetry, properties?: { [key: string]: any }) => {
@@ -385,6 +348,73 @@ export class AjaxMonitor extends BaseTelemetryPlugin implements IDependenciesPlu
385
348
  ++_trackAjaxAttempts;
386
349
  }
387
350
 
351
+ function _initDefaults() {
352
+ let location = getLocation();
353
+ _fetchInitialized = false; // fetch monitoring initialized
354
+ _xhrInitialized = false; // XHR monitoring initialized
355
+ _currentWindowHost = location && location.host && location.host.toLowerCase();
356
+ _config = AjaxMonitor.getEmptyConfig();
357
+ _enableRequestHeaderTracking = false;
358
+ _enableAjaxErrorStatusText = false;
359
+ _trackAjaxAttempts = 0;
360
+ _context = null;
361
+ _isUsingW3CHeaders = false;
362
+ _isUsingAIHeaders = false;
363
+ _markPrefix = null;
364
+ _enableAjaxPerfTracking = false;
365
+ _maxAjaxCallsPerView = 0;
366
+ _enableResponseHeaderTracking = false;
367
+ _disabledUrls = {};
368
+ _disableAjaxTracking = false;
369
+ _disableFetchTracking = true;
370
+
371
+ _excludeRequestFromAutoTrackingPatterns = null
372
+ _addRequestContext = null;
373
+ _evtNamespace = null;
374
+ }
375
+
376
+ function _populateDefaults(config: IConfiguration) {
377
+ let ctx = createProcessTelemetryContext(null, config, _self.core);
378
+
379
+ // Reset to the empty config
380
+ _config = AjaxMonitor.getEmptyConfig();
381
+ const defaultConfig = AjaxMonitor.getDefaultConfig();
382
+ objForEachKey(defaultConfig, (field, value) => {
383
+ _config[field] = ctx.getConfig(AjaxMonitor.identifier, field, value);
384
+ });
385
+
386
+ let distributedTracingMode = _config.distributedTracingMode;
387
+ _enableRequestHeaderTracking = _config.enableRequestHeaderTracking;
388
+ _enableAjaxErrorStatusText = _config.enableAjaxErrorStatusText;
389
+ _enableAjaxPerfTracking = _config.enableAjaxPerfTracking;
390
+ _maxAjaxCallsPerView = _config.maxAjaxCallsPerView;
391
+ _enableResponseHeaderTracking = _config.enableResponseHeaderTracking;
392
+ _excludeRequestFromAutoTrackingPatterns = _config.excludeRequestFromAutoTrackingPatterns;
393
+ _addRequestContext = _config.addRequestContext;
394
+
395
+ _isUsingAIHeaders = distributedTracingMode === eDistributedTracingModes.AI || distributedTracingMode === eDistributedTracingModes.AI_AND_W3C;
396
+ _isUsingW3CHeaders = distributedTracingMode === eDistributedTracingModes.AI_AND_W3C || distributedTracingMode === eDistributedTracingModes.W3C;
397
+
398
+ if (_enableAjaxPerfTracking) {
399
+ let iKey = config.instrumentationKey || "unkwn";
400
+ if (iKey.length > 5) {
401
+ _markPrefix = AJAX_MONITOR_PREFIX + iKey.substring(iKey.length - 5) + ".";
402
+ } else {
403
+ _markPrefix = AJAX_MONITOR_PREFIX + iKey + ".";
404
+ }
405
+ }
406
+
407
+ _disableAjaxTracking = !!_config.disableAjaxTracking;
408
+ _disableFetchTracking = !!_config.disableFetchTracking;
409
+ }
410
+
411
+ function _populateContext() {
412
+ let propExt = _self.core.getPlugin<any>(PropertiesPluginIdentifier);
413
+ if (propExt) {
414
+ _context = propExt.plugin.context; // we could move IPropertiesPlugin to common as well
415
+ }
416
+ }
417
+
388
418
  // discard the header if it's defined as ignoreHeaders in ICorrelationConfig
389
419
  function _canIncludeHeaders(header: string) {
390
420
  let rlt = true;
@@ -408,12 +438,13 @@ export class AjaxMonitor extends BaseTelemetryPlugin implements IDependenciesPlu
408
438
 
409
439
  let global = getGlobal();
410
440
  let isPolyfill = (fetch as any).polyfill;
411
- if (_config.disableFetchTracking === false) {
441
+ if (!_disableFetchTracking && !_fetchInitialized) {
412
442
  _addHook(InstrumentFunc(global, strFetch, {
443
+ ns: _evtNamespace,
413
444
  // Add request hook
414
445
  req: (callDetails: IInstrumentCallDetails, input, init) => {
415
446
  let fetchData: ajaxRecord;
416
- if (_fetchInitialized &&
447
+ if (!_disableFetchTracking && _fetchInitialized &&
417
448
  !_isDisabledRequest(null, input, init) &&
418
449
  // If we have a polyfil and XHR instrumented then let XHR report otherwise we get duplicates
419
450
  !(isPolyfill && _xhrInitialized)) {
@@ -427,35 +458,39 @@ export class AjaxMonitor extends BaseTelemetryPlugin implements IDependenciesPlu
427
458
  }
428
459
  },
429
460
  rsp: (callDetails: IInstrumentCallDetails, input) => {
430
- let fetchData = callDetails.ctx().data;
431
- if (fetchData) {
432
- // Replace the result with the new promise from this code
433
- callDetails.rslt = callDetails.rslt.then((response: any) => {
434
- _reportFetchMetrics(callDetails, (response||{}).status, input, response, fetchData, () => {
435
- let ajaxResponse:IAjaxRecordResponse = {
436
- statusText: response.statusText,
437
- headerMap: null,
438
- correlationContext: _getFetchCorrelationContext(response)
439
- };
440
-
441
- if (_enableResponseHeaderTracking) {
442
- const responseHeaderMap = {};
443
- response.headers.forEach((value: string, name: string) => {
444
- if (_canIncludeHeaders(name)) { responseHeaderMap[name] = value; }
445
- });
446
-
447
- ajaxResponse.headerMap = responseHeaderMap;
448
- }
449
-
450
- return ajaxResponse;
451
- });
452
-
453
- return response;
454
- })
455
- .catch((reason: any) => {
456
- _reportFetchMetrics(callDetails, 0, input, null, fetchData, null, { error: reason.message });
457
- throw reason;
458
- });
461
+ if (!_disableFetchTracking) {
462
+ let fetchData = callDetails.ctx().data;
463
+ if (fetchData) {
464
+ // Replace the result with the new promise from this code
465
+ callDetails.rslt = callDetails.rslt.then((response: any) => {
466
+ _reportFetchMetrics(callDetails, (response||{}).status, input, response, fetchData, () => {
467
+ let ajaxResponse:IAjaxRecordResponse = {
468
+ statusText: response.statusText,
469
+ headerMap: null,
470
+ correlationContext: _getFetchCorrelationContext(response)
471
+ };
472
+
473
+ if (_enableResponseHeaderTracking) {
474
+ const responseHeaderMap = {};
475
+ response.headers.forEach((value: string, name: string) => {
476
+ if (_canIncludeHeaders(name)) {
477
+ responseHeaderMap[name] = value;
478
+ }
479
+ });
480
+
481
+ ajaxResponse.headerMap = responseHeaderMap;
482
+ }
483
+
484
+ return ajaxResponse;
485
+ });
486
+
487
+ return response;
488
+ })
489
+ .catch((reason: any) => {
490
+ _reportFetchMetrics(callDetails, 0, input, null, fetchData, null, { error: reason.message });
491
+ throw reason;
492
+ });
493
+ }
459
494
  }
460
495
  },
461
496
  // Create an error callback to report any hook errors
@@ -472,6 +507,7 @@ export class AjaxMonitor extends BaseTelemetryPlugin implements IDependenciesPlu
472
507
  // the workaround is to add a polyfill property to your fetch implementation before initializing
473
508
  // App Insights
474
509
  _addHook(InstrumentFunc(global, strFetch, {
510
+ ns: _evtNamespace,
475
511
  req: (callDetails: IInstrumentCallDetails, input, init) => {
476
512
  // Just call so that we record any disabled URL
477
513
  _isDisabledRequest(null, input, init);
@@ -491,20 +527,23 @@ export class AjaxMonitor extends BaseTelemetryPlugin implements IDependenciesPlu
491
527
  }
492
528
 
493
529
  function _instrumentXhr():void {
494
- if (_supportsAjaxMonitoring(_self) && !_xhrInitialized) {
530
+ if (_supportsAjaxMonitoring(_self) && !_disableAjaxTracking && !_xhrInitialized) {
495
531
  // Instrument open
496
532
  _hookProto(XMLHttpRequest, "open", {
533
+ ns: _evtNamespace,
497
534
  req: (args:IInstrumentCallDetails, method:string, url:string, async?:boolean) => {
498
- let xhr = args.inst as XMLHttpRequestInstrumented;
499
- let ajaxData = xhr[strAjaxData];
500
- if (!_isDisabledRequest(xhr, url) && _isMonitoredXhrInstance(xhr, true)) {
501
- if (!ajaxData || !ajaxData.xhrMonitoringState.openDone) {
502
- // Only create a single ajaxData (even when multiple AI instances are running)
503
- _openHandler(xhr, method, url, async);
535
+ if (!_disableAjaxTracking) {
536
+ let xhr = args.inst as XMLHttpRequestInstrumented;
537
+ let ajaxData = xhr[strAjaxData];
538
+ if (!_isDisabledRequest(xhr, url) && _isMonitoredXhrInstance(xhr, true)) {
539
+ if (!ajaxData || !ajaxData.xhrMonitoringState.openDone) {
540
+ // Only create a single ajaxData (even when multiple AI instances are running)
541
+ _openHandler(xhr, method, url, async);
542
+ }
543
+
544
+ // always attach to the on ready state change (required for handling multiple instances)
545
+ _attachToOnReadyStateChange(xhr);
504
546
  }
505
-
506
- // always attach to the on ready state change (required for handling multiple instances)
507
- _attachToOnReadyStateChange(xhr);
508
547
  }
509
548
  },
510
549
  hkErr: _createErrorCallbackFunc(_self, _InternalMessageId.FailedMonitorAjaxOpen,
@@ -513,14 +552,17 @@ export class AjaxMonitor extends BaseTelemetryPlugin implements IDependenciesPlu
513
552
 
514
553
  // Instrument send
515
554
  _hookProto(XMLHttpRequest, "send", {
555
+ ns: _evtNamespace,
516
556
  req: (args:IInstrumentCallDetails, context?: Document | BodyInit | null) => {
517
- let xhr = args.inst as XMLHttpRequestInstrumented;
518
- let ajaxData = xhr[strAjaxData];
519
- if (_isMonitoredXhrInstance(xhr) && !ajaxData.xhrMonitoringState.sendDone) {
520
- _createMarkId("xhr", ajaxData);
521
- ajaxData.requestSentTime = dateTimeUtilsNow();
522
- _self.includeCorrelationHeaders(ajaxData, undefined, undefined, xhr);
523
- ajaxData.xhrMonitoringState.sendDone = true;
557
+ if (!_disableAjaxTracking) {
558
+ let xhr = args.inst as XMLHttpRequestInstrumented;
559
+ let ajaxData = xhr[strAjaxData];
560
+ if (_isMonitoredXhrInstance(xhr) && !ajaxData.xhrMonitoringState.sendDone) {
561
+ _createMarkId("xhr", ajaxData);
562
+ ajaxData.requestSentTime = dateTimeUtilsNow();
563
+ _self.includeCorrelationHeaders(ajaxData, undefined, undefined, xhr);
564
+ ajaxData.xhrMonitoringState.sendDone = true;
565
+ }
524
566
  }
525
567
  },
526
568
  hkErr: _createErrorCallbackFunc(_self, _InternalMessageId.FailedMonitorAjaxSend,
@@ -529,12 +571,15 @@ export class AjaxMonitor extends BaseTelemetryPlugin implements IDependenciesPlu
529
571
 
530
572
  // Instrument abort
531
573
  _hookProto(XMLHttpRequest, "abort", {
574
+ ns: _evtNamespace,
532
575
  req: (args:IInstrumentCallDetails) => {
533
- let xhr = args.inst as XMLHttpRequestInstrumented;
534
- let ajaxData = xhr[strAjaxData];
535
- if (_isMonitoredXhrInstance(xhr) && !ajaxData.xhrMonitoringState.abortDone) {
536
- ajaxData.aborted = 1;
537
- ajaxData.xhrMonitoringState.abortDone = true;
576
+ if (!_disableAjaxTracking) {
577
+ let xhr = args.inst as XMLHttpRequestInstrumented;
578
+ let ajaxData = xhr[strAjaxData];
579
+ if (_isMonitoredXhrInstance(xhr) && !ajaxData.xhrMonitoringState.abortDone) {
580
+ ajaxData.aborted = 1;
581
+ ajaxData.xhrMonitoringState.abortDone = true;
582
+ }
538
583
  }
539
584
  },
540
585
  hkErr: _createErrorCallbackFunc(_self, _InternalMessageId.FailedMonitorAjaxAbort,
@@ -542,18 +587,19 @@ export class AjaxMonitor extends BaseTelemetryPlugin implements IDependenciesPlu
542
587
  });
543
588
 
544
589
  // Instrument setRequestHeader
545
- if (_enableRequestHeaderTracking) {
546
- _hookProto(XMLHttpRequest, "setRequestHeader", {
547
- req: (args: IInstrumentCallDetails, header: string, value: string) => {
590
+ _hookProto(XMLHttpRequest, "setRequestHeader", {
591
+ ns: _evtNamespace,
592
+ req: (args: IInstrumentCallDetails, header: string, value: string) => {
593
+ if (!_disableAjaxTracking && _enableRequestHeaderTracking) {
548
594
  let xhr = args.inst as XMLHttpRequestInstrumented;
549
595
  if (_isMonitoredXhrInstance(xhr) && _canIncludeHeaders(header)) {
550
596
  xhr[strAjaxData].requestHeaders[header] = value;
551
597
  }
552
- },
553
- hkErr: _createErrorCallbackFunc(_self, _InternalMessageId.FailedMonitorAjaxSetRequestHeader,
554
- "Failed to monitor XMLHttpRequest.setRequestHeader, monitoring data for this ajax call may be incorrect.")
555
- });
556
- }
598
+ }
599
+ },
600
+ hkErr: _createErrorCallbackFunc(_self, _InternalMessageId.FailedMonitorAjaxSetRequestHeader,
601
+ "Failed to monitor XMLHttpRequest.setRequestHeader, monitoring data for this ajax call may be incorrect.")
602
+ });
557
603
 
558
604
  _xhrInitialized = true;
559
605
  }
@@ -729,7 +775,9 @@ export class AjaxMonitor extends BaseTelemetryPlugin implements IDependenciesPlu
729
775
  const parts = line.split(": ");
730
776
  const header = parts.shift();
731
777
  const value = parts.join(": ");
732
- if(_canIncludeHeaders(header)) { responseHeaderMap[header] = value; }
778
+ if(_canIncludeHeaders(header)) {
779
+ responseHeaderMap[header] = value;
780
+ }
733
781
  });
734
782
 
735
783
  ajaxResponse.headerMap = responseHeaderMap;
@@ -757,9 +805,9 @@ export class AjaxMonitor extends BaseTelemetryPlugin implements IDependenciesPlu
757
805
  _self[strTrackDependencyDataInternal](dependency);
758
806
  } else {
759
807
  _reportXhrError(null, {
760
- requestSentTime: ajaxData.requestSentTime,
761
- responseFinishedTime: ajaxData.responseFinishedTime
762
- });
808
+ requestSentTime: ajaxData.requestSentTime,
809
+ responseFinishedTime: ajaxData.responseFinishedTime
810
+ });
763
811
  }
764
812
  } finally {
765
813
  // cleanup telemetry data
@@ -899,7 +947,9 @@ export class AjaxMonitor extends BaseTelemetryPlugin implements IDependenciesPlu
899
947
  if (_enableRequestHeaderTracking) {
900
948
  let headers = new Headers((init ? init.headers : 0) || (input instanceof Request ? (input.headers || {}) : {}));
901
949
  headers.forEach((value, key) => {
902
- if (_canIncludeHeaders(key)) { requestHeaders[key] = value; }
950
+ if (_canIncludeHeaders(key)) {
951
+ requestHeaders[key] = value;
952
+ }
903
953
  });
904
954
  }
905
955
 
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.19.4"
8
+ "packageVersion": "7.19.5"
9
9
  }
10
10
  ]
11
11
  }