Update for flattening IConfiguration (#713)

* Update for flattening IConfiguration

* Add ConfigurationManager to common

* Change version for ConfigurationManager

* Add defaultValue to ConfigurationManager

* Change PropertiesPlugin defaults to nulls

* Add defaults to PropertiesPlugin
This commit is contained in:
Mark Wolff 2018-11-16 13:28:03 -08:00 коммит произвёл GitHub
Родитель 5571517180
Коммит 90f1059e31
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
19 изменённых файлов: 207 добавлений и 140 удалений

6
.gitignore поставляемый
Просмотреть файл

@ -177,9 +177,9 @@ dist/
# Grunt # Grunt
.tscache .tscache
ApplicationInsights/Tests/Selenium/*.tests.js **/Tests/Selenium/*.tests.js
ApplicationInsights/Tests/Selenium/*.tests.d.ts **/Tests/Selenium/*.tests.d.ts
ApplicationInsights/Tests/Selenium/*.tests.js.map **/Tests/Selenium/*.tests.js.map
# Misc # Misc
statistics.html statistics.html

Просмотреть файл

@ -1,6 +1,6 @@
{ {
"name": "@microsoft/applicationinsights-web", "name": "@microsoft/applicationinsights-web",
"version": "1.0.0-beta.1", "version": "1.0.0-beta.2",
"description": "Microsoft Application Insights Javascript SDK API 1.0 beta", "description": "Microsoft Application Insights Javascript SDK API 1.0 beta",
"main": "dist/applicationinsights-web.js", "main": "dist/applicationinsights-web.js",
"module": "dist-esm/applicationinsights-web.js", "module": "dist-esm/applicationinsights-web.js",
@ -26,11 +26,11 @@
"webpack-command": "^0.4.1" "webpack-command": "^0.4.1"
}, },
"dependencies": { "dependencies": {
"@microsoft/applicationinsights-analytics-js": "^1.0.0-beta.3", "@microsoft/applicationinsights-analytics-js": "^1.0.0-beta.5",
"@microsoft/applicationinsights-channel-js": "^1.0.0-beta.3", "@microsoft/applicationinsights-channel-js": "^1.0.0-beta.6",
"@microsoft/applicationinsights-common": "^1.0.0-beta.4", "@microsoft/applicationinsights-common": "^1.0.0-beta.7",
"@microsoft/applicationinsights-core-js": "^1.0.0-beta.2", "@microsoft/applicationinsights-core-js": "^1.0.0-beta.2",
"@microsoft/applicationinsights-properties-js": "^1.0.0-beta", "@microsoft/applicationinsights-properties-js": "^1.0.0-beta.3",
"@microsoft/applicationinsights-dependencies-js": "^1.0.0-beta.1" "@microsoft/applicationinsights-dependencies-js": "^1.0.0-beta.3"
} }
} }

Просмотреть файл

@ -18,10 +18,7 @@ try {
// get sdk instance name should not conflict if page uses existing sdk for a layer of instrumentation // get sdk instance name should not conflict if page uses existing sdk for a layer of instrumentation
aiName = window["appInsightsSDK"]; aiName = window["appInsightsSDK"];
if (window[aiName] === undefined) { if (window[aiName] !== undefined) {
// if no snippet is present, initialize default values
AppAnalytics.appInsightsDefaultConfig = ApplicationInsights.getDefaultConfig();
} else {
if (window[aiName].initialize) { // initialize if required if (window[aiName].initialize) { // initialize if required
// this is the typical case for browser+snippet // this is the typical case for browser+snippet
var snippet: Snippet = window[aiName] || <any>{}; var snippet: Snippet = window[aiName] || <any>{};

Просмотреть файл

@ -17,7 +17,7 @@ import { AjaxPlugin as DependenciesPlugin, IDependenciesPlugin } from '@microsof
*/ */
export interface Snippet { export interface Snippet {
queue: Array<() => void>; queue: Array<() => void>;
config: IConfiguration; config: IConfiguration & IConfig;
} }
export interface IApplicationInsights extends IAppInsights, IDependenciesPlugin, IPropertiesPlugin { export interface IApplicationInsights extends IAppInsights, IDependenciesPlugin, IPropertiesPlugin {
@ -41,7 +41,7 @@ export class Initialization implements IApplicationInsights {
constructor(snippet: Snippet) { constructor(snippet: Snippet) {
// initialize the queue and config in case they are undefined // initialize the queue and config in case they are undefined
snippet.queue = snippet.queue || []; snippet.queue = snippet.queue || [];
var config: IConfiguration = snippet.config || <any>{}; var config: IConfiguration & IConfig = snippet.config || <any>{};
// ensure instrumentationKey is specified // ensure instrumentationKey is specified
if (config && !config.instrumentationKey) { if (config && !config.instrumentationKey) {
@ -50,8 +50,6 @@ export class Initialization implements IApplicationInsights {
} }
this.appInsights = new ApplicationInsights(); this.appInsights = new ApplicationInsights();
// set default values using config passed through snippet
config = Initialization.getDefaultConfig(config, this.appInsights.identifier);
this.properties = new PropertiesPlugin(); this.properties = new PropertiesPlugin();
this.dependencies = new DependenciesPlugin(); this.dependencies = new DependenciesPlugin();
@ -295,56 +293,4 @@ export class Initialization implements IApplicationInsights {
} }
} }
} }
public static getDefaultConfig(configuration?: IConfiguration, identifier?: string): IConfiguration {
if (!configuration) {
configuration = <IConfiguration>{};
}
if (configuration) {
identifier = identifier ? identifier : "ApplicationInsightsAnalytics";
}
// Undefined checks
if (!configuration.extensionConfig) {
configuration.extensionConfig = {};
}
if (!configuration.extensionConfig[identifier]) {
configuration.extensionConfig[identifier] = {};
}
const extensionConfig: IConfig = configuration.extensionConfig[identifier]; // ref to main config
// set default values
configuration.endpointUrl = configuration.endpointUrl || "https://dc.services.visualstudio.com/v2/track";
configuration.diagnosticLoggingInterval = configuration.diagnosticLoggingInterval || 10000;
extensionConfig.sessionRenewalMs = 30 * 60 * 1000;
extensionConfig.sessionExpirationMs = 24 * 60 * 60 * 1000;
extensionConfig.enableDebug = Util.stringToBoolOrDefault(extensionConfig.enableDebug);
extensionConfig.disableExceptionTracking = Util.stringToBoolOrDefault(extensionConfig.disableExceptionTracking);
extensionConfig.consoleLoggingLevel = extensionConfig.consoleLoggingLevel || 1; // Show only CRITICAL level
extensionConfig.telemetryLoggingLevel = extensionConfig.telemetryLoggingLevel || 0; // Send nothing
extensionConfig.autoTrackPageVisitTime = Util.stringToBoolOrDefault(extensionConfig.autoTrackPageVisitTime);
if (isNaN(extensionConfig.samplingPercentage) || extensionConfig.samplingPercentage <= 0 || extensionConfig.samplingPercentage >= 100) {
extensionConfig.samplingPercentage = 100;
}
extensionConfig.disableAjaxTracking = Util.stringToBoolOrDefault(extensionConfig.disableAjaxTracking)
extensionConfig.disableFetchTracking = Util.stringToBoolOrDefault(extensionConfig.disableFetchTracking, false);
extensionConfig.maxAjaxCallsPerView = !isNaN(extensionConfig.maxAjaxCallsPerView) ? extensionConfig.maxAjaxCallsPerView : 500;
extensionConfig.disableCorrelationHeaders = Util.stringToBoolOrDefault(extensionConfig.disableCorrelationHeaders);
extensionConfig.correlationHeaderExcludedDomains = extensionConfig.correlationHeaderExcludedDomains || [
"*.blob.core.windows.net",
"*.blob.core.chinacloudapi.cn",
"*.blob.core.cloudapi.de",
"*.blob.core.usgovcloudapi.net"];
extensionConfig.disableFlushOnBeforeUnload = Util.stringToBoolOrDefault(extensionConfig.disableFlushOnBeforeUnload);
extensionConfig.isCookieUseDisabled = Util.stringToBoolOrDefault(extensionConfig.isCookieUseDisabled);
extensionConfig.isStorageUseDisabled = Util.stringToBoolOrDefault(extensionConfig.isStorageUseDisabled);
extensionConfig.isBrowserLinkTrackingEnabled = Util.stringToBoolOrDefault(extensionConfig.isBrowserLinkTrackingEnabled);
extensionConfig.enableCorsCorrelation = Util.stringToBoolOrDefault(extensionConfig.enableCorsCorrelation);
return configuration;
}
} }

Просмотреть файл

@ -9,6 +9,7 @@ import {
CoreUtils, CoreUtils,
ITelemetryItem ITelemetryItem
} from "@microsoft/applicationinsights-core-js"; } from "@microsoft/applicationinsights-core-js";
import { IConfig } from "@microsoft/applicationinsights-common";
import { Sender } from "@microsoft/applicationinsights-channel-js"; import { Sender } from "@microsoft/applicationinsights-channel-js";
"use strict"; "use strict";
@ -23,10 +24,10 @@ export class ApplicationInsights {
/** /**
* Creates an instance of ApplicationInsights. * Creates an instance of ApplicationInsights.
* @param {IConfiguration} config * @param {IConfiguration & IConfig} config
* @memberof ApplicationInsights * @memberof ApplicationInsights
*/ */
constructor(config: IConfiguration) { constructor(config: IConfiguration & IConfig) {
// initialize the queue and config in case they are undefined // initialize the queue and config in case they are undefined
if ( if (
CoreUtils.isNullOrUndefined(config) || CoreUtils.isNullOrUndefined(config) ||

Просмотреть файл

@ -1,6 +1,6 @@
{ {
"name": "@microsoft/applicationinsights-web-basic", "name": "@microsoft/applicationinsights-web-basic",
"version": "1.0.0-beta.5", "version": "1.0.0-beta.6",
"description": "Microsoft Application Insights Javascript SDK core and channel", "description": "Microsoft Application Insights Javascript SDK core and channel",
"main": "dist/applicationinsights-web-basic.js", "main": "dist/applicationinsights-web-basic.js",
"module": "dist-esm/index.js", "module": "dist-esm/index.js",
@ -22,8 +22,8 @@
"typescript": "2.5.3" "typescript": "2.5.3"
}, },
"dependencies": { "dependencies": {
"@microsoft/applicationinsights-common": "^1.0.0-beta.5", "@microsoft/applicationinsights-common": "^1.0.0-beta.7",
"@microsoft/applicationinsights-channel-js": "^1.0.0-beta.4", "@microsoft/applicationinsights-channel-js": "^1.0.0-beta.6",
"@microsoft/applicationinsights-core-js": "^1.0.0-beta.2" "@microsoft/applicationinsights-core-js": "^1.0.0-beta.2"
} }
} }

Просмотреть файл

@ -1,6 +1,6 @@
{ {
"name": "@microsoft/applicationinsights-common", "name": "@microsoft/applicationinsights-common",
"version": "1.0.0-beta.5", "version": "1.0.0-beta.7",
"description": "Microsoft Application Insights Common JavaScript Library", "description": "Microsoft Application Insights Common JavaScript Library",
"main": "./dist/applicationinsights-common.js", "main": "./dist/applicationinsights-common.js",
"module": "./dist-esm/applicationinsights-common.js", "module": "./dist-esm/applicationinsights-common.js",

Просмотреть файл

@ -1,5 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved. // Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. // Licensed under the MIT License.
import { IConfiguration } from '@microsoft/applicationinsights-core-js';
export interface IConfig { export interface IConfig {
emitLineDelimitedJson?: boolean; emitLineDelimitedJson?: boolean;
@ -38,4 +39,16 @@ export interface IConfig {
// Internal // Internal
autoExceptionInstrumented?: boolean; autoExceptionInstrumented?: boolean;
} }
export class ConfigurationManager {
public static getConfig(config: IConfiguration & IConfig, field: string, identifier?: string, defaultValue: any = false): number | string | boolean {
let configValue;
if (!identifier || !config.extensionConfig || !config.extensionConfig[identifier]) {
configValue = config[field];
} else {
configValue = config.extensionConfig[identifier][field] || config[field];
}
return configValue !== undefined ? configValue : defaultValue;
}
}

Просмотреть файл

@ -27,7 +27,7 @@ export { Trace } from './Telemetry/Trace';
export { PageViewPerformance } from './Telemetry/PageViewPerformance'; export { PageViewPerformance } from './Telemetry/PageViewPerformance';
export { Data } from './Telemetry/Common/Data'; export { Data } from './Telemetry/Common/Data';
export { SeverityLevel } from './Interfaces/Contracts/Generated/SeverityLevel'; export { SeverityLevel } from './Interfaces/Contracts/Generated/SeverityLevel';
export { IConfig } from './Interfaces/IConfig'; export { IConfig, ConfigurationManager } from './Interfaces/IConfig';
export { IChannelControlsAI } from './Interfaces/IChannelControlsAI'; export { IChannelControlsAI } from './Interfaces/IChannelControlsAI';
export { ContextTagKeys } from './Interfaces/Contracts/Generated/ContextTagKeys'; export { ContextTagKeys } from './Interfaces/Contracts/Generated/ContextTagKeys';
export { DataSanitizer } from './Telemetry/Common/DataSanitizer'; export { DataSanitizer } from './Telemetry/Common/DataSanitizer';

Просмотреть файл

@ -26,6 +26,33 @@ export class ApplicationInsightsTests extends TestClass {
} }
public registerTests() { public registerTests() {
this.testCase({
name: 'AppInsightsTests: config can be set from root',
test: () => {
// Setup
var appInsights: ApplicationInsights = new ApplicationInsights();
// Act
var config = {
instrumentationKey: 'instrumentation_key',
samplingPercentage: 12,
accountId: 'aaa',
extensionConfig: {
[appInsights.identifier]: {
accountId: 'def'
}
}
};
appInsights.initialize(config, new AppInsightsCore(), []);
// Assert
Assert.equal(12, appInsights.config.samplingPercentage);
Assert.notEqual('aaa', appInsights.config.accountId);
Assert.equal('def', appInsights.config.accountId);
Assert.equal('instrumentation_key', appInsights['_globalconfig'].instrumentationKey);
}
});
this.testCase({ this.testCase({
name: "AppInsightsTests: public members are correct", name: "AppInsightsTests: public members are correct",
test: () => { test: () => {

Просмотреть файл

@ -1,6 +1,6 @@
{ {
"name": "@microsoft/applicationinsights-analytics-js", "name": "@microsoft/applicationinsights-analytics-js",
"version": "1.0.0-beta.3", "version": "1.0.0-beta.5",
"description": "Microsoft Application Insights Javascript SDK apis", "description": "Microsoft Application Insights Javascript SDK apis",
"main": "dist/applicationinsights-analytics-js.min.js", "main": "dist/applicationinsights-analytics-js.min.js",
"module": "dist-esm/applicationinsights-analytics-js.js", "module": "dist-esm/applicationinsights-analytics-js.js",
@ -25,7 +25,7 @@
}, },
"dependencies": { "dependencies": {
"@microsoft/applicationinsights-core-js": "^1.0.0-beta.2", "@microsoft/applicationinsights-core-js": "^1.0.0-beta.2",
"@microsoft/applicationinsights-common": "^1.0.0-beta.3" "@microsoft/applicationinsights-common": "^1.0.0-beta.7"
}, },
"license": "MIT" "license": "MIT"
} }

Просмотреть файл

@ -10,7 +10,8 @@ import {
PageView, IEnvelope, RemoteDependencyData, Event, IEventTelemetry, PageView, IEnvelope, RemoteDependencyData, Event, IEventTelemetry,
TelemetryItemCreator, Data, Metric, Exception, SeverityLevel, Trace, IDependencyTelemetry, TelemetryItemCreator, Data, Metric, Exception, SeverityLevel, Trace, IDependencyTelemetry,
IExceptionTelemetry, ITraceTelemetry, IMetricTelemetry, IAutoExceptionTelemetry, IExceptionTelemetry, ITraceTelemetry, IMetricTelemetry, IAutoExceptionTelemetry,
IPageViewTelemetryInternal, IPageViewTelemetry, IPageViewPerformanceTelemetry IPageViewTelemetryInternal, IPageViewTelemetry, IPageViewPerformanceTelemetry,
ConfigurationManager
} from "@microsoft/applicationinsights-common"; } from "@microsoft/applicationinsights-common";
import { import {
IPlugin, IConfiguration, IAppInsightsCore, IPlugin, IConfiguration, IAppInsightsCore,
@ -26,7 +27,6 @@ import { ITelemetryConfig } from "../JavaScriptSDK.Interfaces/ITelemetryConfig";
const durationProperty: string = "duration"; const durationProperty: string = "duration";
export class ApplicationInsights implements IAppInsights, ITelemetryPlugin, IAppInsightsInternal { export class ApplicationInsights implements IAppInsights, ITelemetryPlugin, IAppInsightsInternal {
public static appInsightsDefaultConfig: IConfiguration;
public static Version = "2.0.1-beta"; public static Version = "2.0.1-beta";
public initialize: (config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) => void; public initialize: (config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) => void;
public identifier: string = "ApplicationInsightsAnalytics"; public identifier: string = "ApplicationInsightsAnalytics";
@ -54,6 +54,28 @@ export class ApplicationInsights implements IAppInsights, ITelemetryPlugin, IApp
this.initialize = this._initialize.bind(this); this.initialize = this._initialize.bind(this);
} }
public static getDefaultConfig(config?: IConfig): IConfig {
if (!config) {
config = {};
}
// set default values
config.sessionRenewalMs = 30 * 60 * 1000;
config.sessionExpirationMs = 24 * 60 * 60 * 1000;
config.disableExceptionTracking = Util.stringToBoolOrDefault(config.disableExceptionTracking);
config.autoTrackPageVisitTime = Util.stringToBoolOrDefault(config.autoTrackPageVisitTime);
if (isNaN(config.samplingPercentage) || config.samplingPercentage <= 0 || config.samplingPercentage >= 100) {
config.samplingPercentage = 100;
}
config.isCookieUseDisabled = Util.stringToBoolOrDefault(config.isCookieUseDisabled);
config.isStorageUseDisabled = Util.stringToBoolOrDefault(config.isStorageUseDisabled);
config.isBrowserLinkTrackingEnabled = Util.stringToBoolOrDefault(config.isBrowserLinkTrackingEnabled);
return config;
}
public processTelemetry(env: ITelemetryItem) { public processTelemetry(env: ITelemetryItem) {
var doNotSendItem = false; var doNotSendItem = false;
try { try {
@ -353,7 +375,7 @@ export class ApplicationInsights implements IAppInsights, ITelemetryPlugin, IApp
this._telemetryInitializers.push(telemetryInitializer); this._telemetryInitializers.push(telemetryInitializer);
} }
private _initialize(config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) { private _initialize(config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[]) {
if (this._isInitialized) { if (this._isInitialized) {
return; return;
@ -367,21 +389,17 @@ export class ApplicationInsights implements IAppInsights, ITelemetryPlugin, IApp
this._logger = core.logger; this._logger = core.logger;
this._globalconfig = { this._globalconfig = {
instrumentationKey: config.instrumentationKey, instrumentationKey: config.instrumentationKey,
endpointUrl: config.endpointUrl endpointUrl: config.endpointUrl || "https://dc.services.visualstudio.com/v2/track"
}; };
this.config = config.extensionConfig && config.extensionConfig[this.identifier] ? config.extensionConfig[this.identifier] : <IConfig>{}; this.config = config.extensionConfig && config.extensionConfig[this.identifier] ? config.extensionConfig[this.identifier] : <IConfig>{};
// load default values if specified // load default values if specified
var defaults: IConfiguration = ApplicationInsights.appInsightsDefaultConfig; var defaults: IConfig = ApplicationInsights.getDefaultConfig();
if (defaults !== undefined) { if (defaults !== undefined) {
if (defaults.extensions && defaults.extensions[this.identifier]) { for (var field in defaults) {
for (var field in defaults.extensions[this.identifier]) { // for each unspecified field, set the default value
// for each unspecified field, set the default value this.config[field] = ConfigurationManager.getConfig(config, field, this.identifier, defaults[field]);
if (this.config[field] === undefined) {
this.config[field] = defaults[field];
}
}
} }
if (this._globalconfig) { if (this._globalconfig) {
@ -405,14 +423,14 @@ export class ApplicationInsights implements IAppInsights, ITelemetryPlugin, IApp
var configGetters: ITelemetryConfig = { var configGetters: ITelemetryConfig = {
instrumentationKey: () => config.instrumentationKey, instrumentationKey: () => config.instrumentationKey,
accountId: () => this.config.accountId, accountId: () => this.config.accountId || config.accountId,
sessionRenewalMs: () => this.config.sessionRenewalMs, sessionRenewalMs: () => this.config.sessionRenewalMs || config.sessionRenewalMs,
sessionExpirationMs: () => this.config.sessionExpirationMs, sessionExpirationMs: () => this.config.sessionExpirationMs || config.sessionExpirationMs,
sampleRate: () => this.config.samplingPercentage, sampleRate: () => this.config.samplingPercentage || config.samplingPercentage,
cookieDomain: () => this.config.cookieDomain, cookieDomain: () => this.config.cookieDomain || config.cookieDomain,
sdkExtension: () => this.config.sdkExtension, sdkExtension: () => this.config.sdkExtension || config.sdkExtension,
isBrowserLinkTrackingEnabled: () => this.config.isBrowserLinkTrackingEnabled, isBrowserLinkTrackingEnabled: () => this.config.isBrowserLinkTrackingEnabled || config.isBrowserLinkTrackingEnabled,
appId: () => this.config.appId appId: () => this.config.appId || config.appId
} }
this._pageViewManager = new PageViewManager(this, this.config.overridePageViewDuration, this.core); this._pageViewManager = new PageViewManager(this, this.config.overridePageViewDuration, this.core);

Просмотреть файл

@ -31,6 +31,19 @@ export class AjaxTests extends TestClass {
} }
public registerTests() { public registerTests() {
this.testCase({
name: "Dependencies Configuration: Config can be set from root config",
test: () => {
let ajaxMonitor = new AjaxMonitor();
ajaxMonitor.initialize({
instrumentationKey: "instrumentation_key",
maxAjaxCallsPerView: 999,
}, new AppInsightsCore(), []);
Assert.equal(999, ajaxMonitor["_config"].maxAjaxCallsPerView, "Config options can be set from root config");
}
});
this.testCase({ this.testCase({
name: "Ajax: xhr.open gets instrumented", name: "Ajax: xhr.open gets instrumented",

Просмотреть файл

@ -1,6 +1,6 @@
{ {
"name": "@microsoft/applicationinsights-dependencies-js", "name": "@microsoft/applicationinsights-dependencies-js",
"version": "1.0.0-beta", "version": "1.0.0-beta.3",
"description": "Microsoft Application Insights XHR dependencies plugin", "description": "Microsoft Application Insights XHR dependencies plugin",
"main": "dist/applicationinsights-dependencies-js.min.js", "main": "dist/applicationinsights-dependencies-js.min.js",
"module": "dist-esm/applicationinsights-dependencies-js.js", "module": "dist-esm/applicationinsights-dependencies-js.js",
@ -29,7 +29,7 @@
}, },
"dependencies": { "dependencies": {
"@microsoft/applicationinsights-core-js": "^1.0.0-beta.2", "@microsoft/applicationinsights-core-js": "^1.0.0-beta.2",
"@microsoft/applicationinsights-common": "^1.0.0-beta.3" "@microsoft/applicationinsights-common": "^1.0.0-beta.7"
}, },
"license": "MIT" "license": "MIT"
} }

Просмотреть файл

@ -3,7 +3,8 @@
import { import {
RequestHeaders, Util, CorrelationIdHelper, TelemetryItemCreator, ICorrelationConfig, RequestHeaders, Util, CorrelationIdHelper, TelemetryItemCreator, ICorrelationConfig,
RemoteDependencyData, DateTimeUtils, DisabledPropertyName, Data, IDependencyTelemetry RemoteDependencyData, DateTimeUtils, DisabledPropertyName, Data, IDependencyTelemetry,
IConfig, ConfigurationManager
} from '@microsoft/applicationinsights-common'; } from '@microsoft/applicationinsights-common';
import { import {
CoreUtils, LoggingSeverity, _InternalMessageId, IDiagnosticLogger, CoreUtils, LoggingSeverity, _InternalMessageId, IDiagnosticLogger,
@ -569,25 +570,44 @@ export class AjaxMonitor implements ITelemetryPlugin, IDependenciesPlugin, IInst
this.initialized = true; this.initialized = true;
} }
} }
public static getDefaultConfig(): ICorrelationConfig {
const config: ICorrelationConfig = {
maxAjaxCallsPerView: 500,
disableAjaxTracking: false,
disableFetchTracking: true,
disableCorrelationHeaders: false,
correlationHeaderExcludedDomains: [
"*.blob.core.windows.net",
"*.blob.core.chinacloudapi.cn",
"*.blob.core.cloudapi.de",
"*.blob.core.usgovcloudapi.net"],
appId: undefined,
enableCorsCorrelation: false
}
return config;
}
public static getEmptyConfig(): ICorrelationConfig {
return {
maxAjaxCallsPerView: undefined,
disableAjaxTracking: undefined,
disableFetchTracking: undefined,
disableCorrelationHeaders: undefined,
correlationHeaderExcludedDomains: undefined,
appId: undefined,
enableCorsCorrelation: undefined
}
}
public initialize(config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) { public initialize(config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[]) {
if (!this.initialized && !this._fetchInitialized) { if (!this.initialized && !this._fetchInitialized) {
this._core = core; this._core = core;
config.extensionConfig = config.extensionConfig ? config.extensionConfig : {}; const defaultConfig = AjaxMonitor.getDefaultConfig();
let c = config.extensionConfig[AjaxMonitor.identifier] ? config.extensionConfig[AjaxMonitor.identifier] : {}; this._config = AjaxMonitor.getEmptyConfig();
this._config = { for (let field in defaultConfig) {
maxAjaxCallsPerView: !isNaN(c.maxAjaxCallsPerView) ? c.maxAjaxCallsPerView : 500, this._config[field] = ConfigurationManager.getConfig(config, field, AjaxMonitor.identifier, defaultConfig[field]);
disableAjaxTracking: Util.stringToBoolOrDefault(c.disableAjaxTracking), }
disableFetchTracking: Util.stringToBoolOrDefault(c.disableFetchTracking, true),
disableCorrelationHeaders: Util.stringToBoolOrDefault(c.disableCorrelationHeaders),
correlationHeaderExcludedDomains: c.correlationHeaderExcludedDomains || [
"*.blob.core.windows.net",
"*.blob.core.chinacloudapi.cn",
"*.blob.core.cloudapi.de",
"*.blob.core.usgovcloudapi.net"],
appId: c.appId,
enableCorsCorrelation: Util.stringToBoolOrDefault(c.enableCorsCorrelation)
};
if (this._config.disableAjaxTracking === false) { if (this._config.disableAjaxTracking === false) {
this.instrumentXhr(); this.instrumentXhr();

Просмотреть файл

@ -2,6 +2,7 @@
import { AppInsightsCore, IConfiguration, DiagnosticLogger } from "@microsoft/applicationinsights-core-js"; import { AppInsightsCore, IConfiguration, DiagnosticLogger } from "@microsoft/applicationinsights-core-js";
import PropertiesPlugin from "../../src/PropertiesPlugin"; import PropertiesPlugin from "../../src/PropertiesPlugin";
import { ITelemetryConfig } from "../../src/Interfaces/ITelemetryConfig";
import { Util } from "@microsoft/applicationinsights-common"; import { Util } from "@microsoft/applicationinsights-common";
export class PropertiesTests extends TestClass { export class PropertiesTests extends TestClass {
@ -20,9 +21,35 @@ export class PropertiesTests extends TestClass {
} }
public registerTests() { public registerTests() {
this.addConfigTests();
this.addUserTests(); this.addUserTests();
} }
private addConfigTests() {
this.testCase({
name: 'Properties Configuration: Config options can be passed from root config',
test: () => {
this.properties.initialize({
instrumentationKey: 'instrumentation_key',
accountId: 'abc',
samplingPercentage: 15,
sessionExpirationMs: 99999,
extensionConfig: {
[this.properties.identifier]: {
sessionExpirationMs: 88888
}
}
}, this.core, []);
const config: ITelemetryConfig = this.properties['_extensionConfig'];
Assert.equal(15, config.samplingPercentage(), 'Extension configs can be set via root config (number)');
Assert.equal('abc', config.accountId(), 'Extension configs can be set via root config (string)');
Assert.equal(88888, config.sessionExpirationMs(), 'Root config does not override extensionConfig field when both are present')
Assert.notEqual(99999, config.sessionExpirationMs(), 'extensionConfig overrides root config field when both are present');
}
});
}
private addUserTests() { private addUserTests() {
this.testCase({ this.testCase({
name: 'User: user context initializes from cookie when possible', name: 'User: user context initializes from cookie when possible',
@ -411,7 +438,7 @@ export class PropertiesTests extends TestClass {
accountId: null, accountId: null,
sessionRenewalMs: null, sessionRenewalMs: null,
sessionExpirationMs: null, sessionExpirationMs: null,
sampleRate: null, samplingPercentage: null,
endpointUrl: null, endpointUrl: null,
cookieDomain: null, cookieDomain: null,
emitLineDelimitedJson: null, emitLineDelimitedJson: null,

Просмотреть файл

@ -1,6 +1,6 @@
{ {
"name": "@microsoft/applicationinsights-properties-js", "name": "@microsoft/applicationinsights-properties-js",
"version": "1.0.0-beta", "version": "1.0.0-beta.3",
"description": "Microsoft Application Insights properties (Part A) plugin", "description": "Microsoft Application Insights properties (Part A) plugin",
"main": "dist/applicationinsights-properties-js.min.js", "main": "dist/applicationinsights-properties-js.min.js",
"module": "dist-esm/applicationinsights-properties-js.js", "module": "dist-esm/applicationinsights-properties-js.js",
@ -28,8 +28,8 @@
"rollup-plugin-uglify": "^6.0.0" "rollup-plugin-uglify": "^6.0.0"
}, },
"dependencies": { "dependencies": {
"@microsoft/applicationinsights-core-js": "^1.0.0-beta", "@microsoft/applicationinsights-core-js": "^1.0.0-beta.2",
"@microsoft/applicationinsights-common": "^1.0.0-beta" "@microsoft/applicationinsights-common": "^1.0.0-beta.7"
}, },
"license": "MIT" "license": "MIT"
} }

Просмотреть файл

@ -5,7 +5,7 @@ export interface ITelemetryConfig {
instrumentationKey: () => string; instrumentationKey: () => string;
accountId: () => string; accountId: () => string;
sessionRenewalMs: () => number; sessionRenewalMs: () => number;
sampleRate: () => number; samplingPercentage: () => number;
sessionExpirationMs: () => number; sessionExpirationMs: () => number;
cookieDomain: () => string; cookieDomain: () => string;
sdkExtension: () => string; sdkExtension: () => string;

Просмотреть файл

@ -7,7 +7,7 @@ import {
ITelemetryPlugin, IConfiguration, CoreUtils, ITelemetryPlugin, IConfiguration, CoreUtils,
IAppInsightsCore, IPlugin, ITelemetryItem, IDiagnosticLogger IAppInsightsCore, IPlugin, ITelemetryItem, IDiagnosticLogger
} from '@microsoft/applicationinsights-core-js'; } from '@microsoft/applicationinsights-core-js';
import { ContextTagKeys, Util, PageView } from '@microsoft/applicationinsights-common'; import { ContextTagKeys, Util, PageView, ConfigurationManager, IConfig } from '@microsoft/applicationinsights-common';
import { Session, _SessionManager } from './Context/Session'; import { Session, _SessionManager } from './Context/Session';
import { Application } from './Context/Application'; import { Application } from './Context/Application';
import { Device } from './Context/Device'; import { Device } from './Context/Device';
@ -36,22 +36,27 @@ export default class PropertiesPlugin implements ITelemetryPlugin, ITelemetryCon
private _nextPlugin: ITelemetryPlugin; private _nextPlugin: ITelemetryPlugin;
private _extensionConfig: ITelemetryConfig; private _extensionConfig: ITelemetryConfig;
initialize(config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) { public static getDefaultConfig(): ITelemetryConfig {
let extensionConfig = config.extensionConfig && const defaultConfig: ITelemetryConfig = {
config.extensionConfig[this.identifier] ? instrumentationKey: () => undefined,
config.extensionConfig[this.identifier] : {}; accountId: () => null,
sessionRenewalMs: () => 30 * 60 * 1000,
samplingPercentage: () => 100,
sessionExpirationMs: () => 24 * 60 * 60 * 1000,
cookieDomain: () => null,
sdkExtension: () => null,
isBrowserLinkTrackingEnabled: () => false,
appId: () => null
}
return defaultConfig;
}
this._extensionConfig = { initialize(config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[]) {
instrumentationKey: () => extensionConfig.instrumentationKey, const defaultConfig: ITelemetryConfig = PropertiesPlugin.getDefaultConfig();
accountId: () => extensionConfig.accountId, this._extensionConfig = this._extensionConfig || PropertiesPlugin.getDefaultConfig();
sessionRenewalMs: () => extensionConfig.sessionRenewalMs, for (let field in defaultConfig) {
sampleRate: () => extensionConfig.sampleRate, this._extensionConfig[field] = () => ConfigurationManager.getConfig(config, field, this.identifier, defaultConfig[field]());
sessionExpirationMs: () => extensionConfig.sessionExpirationMs, }
cookieDomain: () => extensionConfig.cookieDomain,
sdkExtension: () => extensionConfig.sdkExtension,
isBrowserLinkTrackingEnabled: () => extensionConfig.isBrowserLinkTrackingEnabled,
appId: () => extensionConfig.appId
};
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
this._sessionManager = new _SessionManager(this._extensionConfig, core.logger); this._sessionManager = new _SessionManager(this._extensionConfig, core.logger);
@ -62,7 +67,7 @@ export default class PropertiesPlugin implements ITelemetryPlugin, ITelemetryCon
this.user = new User(this._extensionConfig, core.logger); this.user = new User(this._extensionConfig, core.logger);
this.operation = new Operation(); this.operation = new Operation();
this.session = new Session(); this.session = new Session();
this.sample = new Sample(this._extensionConfig.sampleRate(), core.logger); this.sample = new Sample(this._extensionConfig.samplingPercentage(), core.logger);
} }
} }