diff --git a/.gitignore b/.gitignore index 20c034c3..3eef64ba 100644 --- a/.gitignore +++ b/.gitignore @@ -177,9 +177,9 @@ dist/ # Grunt .tscache -ApplicationInsights/Tests/Selenium/*.tests.js -ApplicationInsights/Tests/Selenium/*.tests.d.ts -ApplicationInsights/Tests/Selenium/*.tests.js.map +**/Tests/Selenium/*.tests.js +**/Tests/Selenium/*.tests.d.ts +**/Tests/Selenium/*.tests.js.map # Misc statistics.html diff --git a/AISKU/package.json b/AISKU/package.json index c9a77596..2b0e4fbf 100644 --- a/AISKU/package.json +++ b/AISKU/package.json @@ -1,6 +1,6 @@ { "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", "main": "dist/applicationinsights-web.js", "module": "dist-esm/applicationinsights-web.js", @@ -26,11 +26,11 @@ "webpack-command": "^0.4.1" }, "dependencies": { - "@microsoft/applicationinsights-analytics-js": "^1.0.0-beta.3", - "@microsoft/applicationinsights-channel-js": "^1.0.0-beta.3", - "@microsoft/applicationinsights-common": "^1.0.0-beta.4", + "@microsoft/applicationinsights-analytics-js": "^1.0.0-beta.5", + "@microsoft/applicationinsights-channel-js": "^1.0.0-beta.6", + "@microsoft/applicationinsights-common": "^1.0.0-beta.7", "@microsoft/applicationinsights-core-js": "^1.0.0-beta.2", - "@microsoft/applicationinsights-properties-js": "^1.0.0-beta", - "@microsoft/applicationinsights-dependencies-js": "^1.0.0-beta.1" + "@microsoft/applicationinsights-properties-js": "^1.0.0-beta.3", + "@microsoft/applicationinsights-dependencies-js": "^1.0.0-beta.3" } } diff --git a/AISKU/src/Init.ts b/AISKU/src/Init.ts index d667b613..c7663ecf 100644 --- a/AISKU/src/Init.ts +++ b/AISKU/src/Init.ts @@ -18,10 +18,7 @@ try { // get sdk instance name should not conflict if page uses existing sdk for a layer of instrumentation aiName = window["appInsightsSDK"]; - if (window[aiName] === undefined) { - // if no snippet is present, initialize default values - AppAnalytics.appInsightsDefaultConfig = ApplicationInsights.getDefaultConfig(); - } else { + if (window[aiName] !== undefined) { if (window[aiName].initialize) { // initialize if required // this is the typical case for browser+snippet var snippet: Snippet = window[aiName] || {}; diff --git a/AISKU/src/Initialization.ts b/AISKU/src/Initialization.ts index d43ccec7..71d6556c 100644 --- a/AISKU/src/Initialization.ts +++ b/AISKU/src/Initialization.ts @@ -17,7 +17,7 @@ import { AjaxPlugin as DependenciesPlugin, IDependenciesPlugin } from '@microsof */ export interface Snippet { queue: Array<() => void>; - config: IConfiguration; + config: IConfiguration & IConfig; } export interface IApplicationInsights extends IAppInsights, IDependenciesPlugin, IPropertiesPlugin { @@ -41,7 +41,7 @@ export class Initialization implements IApplicationInsights { constructor(snippet: Snippet) { // initialize the queue and config in case they are undefined snippet.queue = snippet.queue || []; - var config: IConfiguration = snippet.config || {}; + var config: IConfiguration & IConfig = snippet.config || {}; // ensure instrumentationKey is specified if (config && !config.instrumentationKey) { @@ -50,8 +50,6 @@ export class Initialization implements IApplicationInsights { } this.appInsights = new ApplicationInsights(); - // set default values using config passed through snippet - config = Initialization.getDefaultConfig(config, this.appInsights.identifier); this.properties = new PropertiesPlugin(); this.dependencies = new DependenciesPlugin(); @@ -295,56 +293,4 @@ export class Initialization implements IApplicationInsights { } } } - - public static getDefaultConfig(configuration?: IConfiguration, identifier?: string): IConfiguration { - if (!configuration) { - configuration = {}; - } - - 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; - } } diff --git a/AISKULight/index.ts b/AISKULight/index.ts index 237e267c..b8995bac 100644 --- a/AISKULight/index.ts +++ b/AISKULight/index.ts @@ -9,6 +9,7 @@ import { CoreUtils, ITelemetryItem } from "@microsoft/applicationinsights-core-js"; +import { IConfig } from "@microsoft/applicationinsights-common"; import { Sender } from "@microsoft/applicationinsights-channel-js"; "use strict"; @@ -23,10 +24,10 @@ export class ApplicationInsights { /** * Creates an instance of ApplicationInsights. - * @param {IConfiguration} config + * @param {IConfiguration & IConfig} config * @memberof ApplicationInsights */ - constructor(config: IConfiguration) { + constructor(config: IConfiguration & IConfig) { // initialize the queue and config in case they are undefined if ( CoreUtils.isNullOrUndefined(config) || diff --git a/AISKULight/package.json b/AISKULight/package.json index c4173731..976100b8 100644 --- a/AISKULight/package.json +++ b/AISKULight/package.json @@ -1,6 +1,6 @@ { "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", "main": "dist/applicationinsights-web-basic.js", "module": "dist-esm/index.js", @@ -22,8 +22,8 @@ "typescript": "2.5.3" }, "dependencies": { - "@microsoft/applicationinsights-common": "^1.0.0-beta.5", - "@microsoft/applicationinsights-channel-js": "^1.0.0-beta.4", + "@microsoft/applicationinsights-common": "^1.0.0-beta.7", + "@microsoft/applicationinsights-channel-js": "^1.0.0-beta.6", "@microsoft/applicationinsights-core-js": "^1.0.0-beta.2" } } diff --git a/AppInsightsCommon/package.json b/AppInsightsCommon/package.json index f9afac56..42350d92 100644 --- a/AppInsightsCommon/package.json +++ b/AppInsightsCommon/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/applicationinsights-common", - "version": "1.0.0-beta.5", + "version": "1.0.0-beta.7", "description": "Microsoft Application Insights Common JavaScript Library", "main": "./dist/applicationinsights-common.js", "module": "./dist-esm/applicationinsights-common.js", diff --git a/AppInsightsCommon/src/Interfaces/IConfig.ts b/AppInsightsCommon/src/Interfaces/IConfig.ts index 03074a54..49875e1e 100644 --- a/AppInsightsCommon/src/Interfaces/IConfig.ts +++ b/AppInsightsCommon/src/Interfaces/IConfig.ts @@ -1,5 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +import { IConfiguration } from '@microsoft/applicationinsights-core-js'; export interface IConfig { emitLineDelimitedJson?: boolean; @@ -38,4 +39,16 @@ export interface IConfig { // Internal autoExceptionInstrumented?: boolean; -} \ No newline at end of file +} + +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; + } +} diff --git a/AppInsightsCommon/src/applicationinsights-common.ts b/AppInsightsCommon/src/applicationinsights-common.ts index 40d70815..2fe90dd9 100644 --- a/AppInsightsCommon/src/applicationinsights-common.ts +++ b/AppInsightsCommon/src/applicationinsights-common.ts @@ -27,7 +27,7 @@ export { Trace } from './Telemetry/Trace'; export { PageViewPerformance } from './Telemetry/PageViewPerformance'; export { Data } from './Telemetry/Common/Data'; export { SeverityLevel } from './Interfaces/Contracts/Generated/SeverityLevel'; -export { IConfig } from './Interfaces/IConfig'; +export { IConfig, ConfigurationManager } from './Interfaces/IConfig'; export { IChannelControlsAI } from './Interfaces/IChannelControlsAI'; export { ContextTagKeys } from './Interfaces/Contracts/Generated/ContextTagKeys'; export { DataSanitizer } from './Telemetry/Common/DataSanitizer'; diff --git a/ApplicationInsights/Tests/ApplicationInsights.tests.ts b/ApplicationInsights/Tests/ApplicationInsights.tests.ts index 67635f32..9b35915a 100644 --- a/ApplicationInsights/Tests/ApplicationInsights.tests.ts +++ b/ApplicationInsights/Tests/ApplicationInsights.tests.ts @@ -26,6 +26,33 @@ export class ApplicationInsightsTests extends TestClass { } 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({ name: "AppInsightsTests: public members are correct", test: () => { diff --git a/ApplicationInsights/package.json b/ApplicationInsights/package.json index 0cfcecd8..41568392 100644 --- a/ApplicationInsights/package.json +++ b/ApplicationInsights/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/applicationinsights-analytics-js", - "version": "1.0.0-beta.3", + "version": "1.0.0-beta.5", "description": "Microsoft Application Insights Javascript SDK apis", "main": "dist/applicationinsights-analytics-js.min.js", "module": "dist-esm/applicationinsights-analytics-js.js", @@ -25,7 +25,7 @@ }, "dependencies": { "@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" } diff --git a/ApplicationInsights/src/JavaScriptSDK/ApplicationInsights.ts b/ApplicationInsights/src/JavaScriptSDK/ApplicationInsights.ts index 9ac3c7a8..ecface03 100644 --- a/ApplicationInsights/src/JavaScriptSDK/ApplicationInsights.ts +++ b/ApplicationInsights/src/JavaScriptSDK/ApplicationInsights.ts @@ -10,7 +10,8 @@ import { PageView, IEnvelope, RemoteDependencyData, Event, IEventTelemetry, TelemetryItemCreator, Data, Metric, Exception, SeverityLevel, Trace, IDependencyTelemetry, IExceptionTelemetry, ITraceTelemetry, IMetricTelemetry, IAutoExceptionTelemetry, - IPageViewTelemetryInternal, IPageViewTelemetry, IPageViewPerformanceTelemetry + IPageViewTelemetryInternal, IPageViewTelemetry, IPageViewPerformanceTelemetry, + ConfigurationManager } from "@microsoft/applicationinsights-common"; import { IPlugin, IConfiguration, IAppInsightsCore, @@ -26,7 +27,6 @@ import { ITelemetryConfig } from "../JavaScriptSDK.Interfaces/ITelemetryConfig"; const durationProperty: string = "duration"; export class ApplicationInsights implements IAppInsights, ITelemetryPlugin, IAppInsightsInternal { - public static appInsightsDefaultConfig: IConfiguration; public static Version = "2.0.1-beta"; public initialize: (config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) => void; public identifier: string = "ApplicationInsightsAnalytics"; @@ -54,6 +54,28 @@ export class ApplicationInsights implements IAppInsights, ITelemetryPlugin, IApp 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) { var doNotSendItem = false; try { @@ -353,7 +375,7 @@ export class ApplicationInsights implements IAppInsights, ITelemetryPlugin, IApp this._telemetryInitializers.push(telemetryInitializer); } - private _initialize(config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) { + private _initialize(config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[]) { if (this._isInitialized) { return; @@ -367,21 +389,17 @@ export class ApplicationInsights implements IAppInsights, ITelemetryPlugin, IApp this._logger = core.logger; this._globalconfig = { 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] : {}; // load default values if specified - var defaults: IConfiguration = ApplicationInsights.appInsightsDefaultConfig; + var defaults: IConfig = ApplicationInsights.getDefaultConfig(); if (defaults !== undefined) { - if (defaults.extensions && defaults.extensions[this.identifier]) { - for (var field in defaults.extensions[this.identifier]) { - // for each unspecified field, set the default value - if (this.config[field] === undefined) { - this.config[field] = defaults[field]; - } - } + for (var field in defaults) { + // for each unspecified field, set the default value + this.config[field] = ConfigurationManager.getConfig(config, field, this.identifier, defaults[field]); } if (this._globalconfig) { @@ -405,14 +423,14 @@ export class ApplicationInsights implements IAppInsights, ITelemetryPlugin, IApp var configGetters: ITelemetryConfig = { instrumentationKey: () => config.instrumentationKey, - accountId: () => this.config.accountId, - sessionRenewalMs: () => this.config.sessionRenewalMs, - sessionExpirationMs: () => this.config.sessionExpirationMs, - sampleRate: () => this.config.samplingPercentage, - cookieDomain: () => this.config.cookieDomain, - sdkExtension: () => this.config.sdkExtension, - isBrowserLinkTrackingEnabled: () => this.config.isBrowserLinkTrackingEnabled, - appId: () => this.config.appId + accountId: () => this.config.accountId || config.accountId, + sessionRenewalMs: () => this.config.sessionRenewalMs || config.sessionRenewalMs, + sessionExpirationMs: () => this.config.sessionExpirationMs || config.sessionExpirationMs, + sampleRate: () => this.config.samplingPercentage || config.samplingPercentage, + cookieDomain: () => this.config.cookieDomain || config.cookieDomain, + sdkExtension: () => this.config.sdkExtension || config.sdkExtension, + isBrowserLinkTrackingEnabled: () => this.config.isBrowserLinkTrackingEnabled || config.isBrowserLinkTrackingEnabled, + appId: () => this.config.appId || config.appId } this._pageViewManager = new PageViewManager(this, this.config.overridePageViewDuration, this.core); diff --git a/extensions/applicationinsights-dependencies-js/Tests/Selenium/ajax.tests.ts b/extensions/applicationinsights-dependencies-js/Tests/Selenium/ajax.tests.ts index a9902123..585747a0 100644 --- a/extensions/applicationinsights-dependencies-js/Tests/Selenium/ajax.tests.ts +++ b/extensions/applicationinsights-dependencies-js/Tests/Selenium/ajax.tests.ts @@ -31,6 +31,19 @@ export class AjaxTests extends TestClass { } 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({ name: "Ajax: xhr.open gets instrumented", diff --git a/extensions/applicationinsights-dependencies-js/package.json b/extensions/applicationinsights-dependencies-js/package.json index 00f6496d..a2a71ddc 100644 --- a/extensions/applicationinsights-dependencies-js/package.json +++ b/extensions/applicationinsights-dependencies-js/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/applicationinsights-dependencies-js", - "version": "1.0.0-beta", + "version": "1.0.0-beta.3", "description": "Microsoft Application Insights XHR dependencies plugin", "main": "dist/applicationinsights-dependencies-js.min.js", "module": "dist-esm/applicationinsights-dependencies-js.js", @@ -29,7 +29,7 @@ }, "dependencies": { "@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" } diff --git a/extensions/applicationinsights-dependencies-js/src/ajax.ts b/extensions/applicationinsights-dependencies-js/src/ajax.ts index 0a3bcb63..f8515bb7 100644 --- a/extensions/applicationinsights-dependencies-js/src/ajax.ts +++ b/extensions/applicationinsights-dependencies-js/src/ajax.ts @@ -3,7 +3,8 @@ import { RequestHeaders, Util, CorrelationIdHelper, TelemetryItemCreator, ICorrelationConfig, - RemoteDependencyData, DateTimeUtils, DisabledPropertyName, Data, IDependencyTelemetry + RemoteDependencyData, DateTimeUtils, DisabledPropertyName, Data, IDependencyTelemetry, + IConfig, ConfigurationManager } from '@microsoft/applicationinsights-common'; import { CoreUtils, LoggingSeverity, _InternalMessageId, IDiagnosticLogger, @@ -569,25 +570,44 @@ export class AjaxMonitor implements ITelemetryPlugin, IDependenciesPlugin, IInst 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) { this._core = core; - config.extensionConfig = config.extensionConfig ? config.extensionConfig : {}; - let c = config.extensionConfig[AjaxMonitor.identifier] ? config.extensionConfig[AjaxMonitor.identifier] : {}; - this._config = { - maxAjaxCallsPerView: !isNaN(c.maxAjaxCallsPerView) ? c.maxAjaxCallsPerView : 500, - 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) - }; + const defaultConfig = AjaxMonitor.getDefaultConfig(); + this._config = AjaxMonitor.getEmptyConfig(); + for (let field in defaultConfig) { + this._config[field] = ConfigurationManager.getConfig(config, field, AjaxMonitor.identifier, defaultConfig[field]); + } if (this._config.disableAjaxTracking === false) { this.instrumentXhr(); diff --git a/extensions/applicationinsights-properties-js/Tests/Selenium/properties.tests.ts b/extensions/applicationinsights-properties-js/Tests/Selenium/properties.tests.ts index d5b0144b..a01a35fc 100644 --- a/extensions/applicationinsights-properties-js/Tests/Selenium/properties.tests.ts +++ b/extensions/applicationinsights-properties-js/Tests/Selenium/properties.tests.ts @@ -2,6 +2,7 @@ import { AppInsightsCore, IConfiguration, DiagnosticLogger } from "@microsoft/applicationinsights-core-js"; import PropertiesPlugin from "../../src/PropertiesPlugin"; +import { ITelemetryConfig } from "../../src/Interfaces/ITelemetryConfig"; import { Util } from "@microsoft/applicationinsights-common"; export class PropertiesTests extends TestClass { @@ -20,9 +21,35 @@ export class PropertiesTests extends TestClass { } public registerTests() { + this.addConfigTests(); 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() { this.testCase({ name: 'User: user context initializes from cookie when possible', @@ -411,7 +438,7 @@ export class PropertiesTests extends TestClass { accountId: null, sessionRenewalMs: null, sessionExpirationMs: null, - sampleRate: null, + samplingPercentage: null, endpointUrl: null, cookieDomain: null, emitLineDelimitedJson: null, diff --git a/extensions/applicationinsights-properties-js/package.json b/extensions/applicationinsights-properties-js/package.json index ab58b549..dd8523d6 100644 --- a/extensions/applicationinsights-properties-js/package.json +++ b/extensions/applicationinsights-properties-js/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/applicationinsights-properties-js", - "version": "1.0.0-beta", + "version": "1.0.0-beta.3", "description": "Microsoft Application Insights properties (Part A) plugin", "main": "dist/applicationinsights-properties-js.min.js", "module": "dist-esm/applicationinsights-properties-js.js", @@ -28,8 +28,8 @@ "rollup-plugin-uglify": "^6.0.0" }, "dependencies": { - "@microsoft/applicationinsights-core-js": "^1.0.0-beta", - "@microsoft/applicationinsights-common": "^1.0.0-beta" + "@microsoft/applicationinsights-core-js": "^1.0.0-beta.2", + "@microsoft/applicationinsights-common": "^1.0.0-beta.7" }, "license": "MIT" } diff --git a/extensions/applicationinsights-properties-js/src/Interfaces/ITelemetryConfig.ts b/extensions/applicationinsights-properties-js/src/Interfaces/ITelemetryConfig.ts index 31df6721..aa022aa3 100644 --- a/extensions/applicationinsights-properties-js/src/Interfaces/ITelemetryConfig.ts +++ b/extensions/applicationinsights-properties-js/src/Interfaces/ITelemetryConfig.ts @@ -5,7 +5,7 @@ export interface ITelemetryConfig { instrumentationKey: () => string; accountId: () => string; sessionRenewalMs: () => number; - sampleRate: () => number; + samplingPercentage: () => number; sessionExpirationMs: () => number; cookieDomain: () => string; sdkExtension: () => string; diff --git a/extensions/applicationinsights-properties-js/src/PropertiesPlugin.ts b/extensions/applicationinsights-properties-js/src/PropertiesPlugin.ts index 3ec25ace..81f3dec4 100644 --- a/extensions/applicationinsights-properties-js/src/PropertiesPlugin.ts +++ b/extensions/applicationinsights-properties-js/src/PropertiesPlugin.ts @@ -7,7 +7,7 @@ import { ITelemetryPlugin, IConfiguration, CoreUtils, IAppInsightsCore, IPlugin, ITelemetryItem, IDiagnosticLogger } 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 { Application } from './Context/Application'; import { Device } from './Context/Device'; @@ -36,22 +36,27 @@ export default class PropertiesPlugin implements ITelemetryPlugin, ITelemetryCon private _nextPlugin: ITelemetryPlugin; private _extensionConfig: ITelemetryConfig; - initialize(config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[]) { - let extensionConfig = config.extensionConfig && - config.extensionConfig[this.identifier] ? - config.extensionConfig[this.identifier] : {}; + public static getDefaultConfig(): ITelemetryConfig { + const defaultConfig: ITelemetryConfig = { + instrumentationKey: () => undefined, + 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 = { - instrumentationKey: () => extensionConfig.instrumentationKey, - accountId: () => extensionConfig.accountId, - sessionRenewalMs: () => extensionConfig.sessionRenewalMs, - sampleRate: () => extensionConfig.sampleRate, - sessionExpirationMs: () => extensionConfig.sessionExpirationMs, - cookieDomain: () => extensionConfig.cookieDomain, - sdkExtension: () => extensionConfig.sdkExtension, - isBrowserLinkTrackingEnabled: () => extensionConfig.isBrowserLinkTrackingEnabled, - appId: () => extensionConfig.appId - }; + initialize(config: IConfiguration & IConfig, core: IAppInsightsCore, extensions: IPlugin[]) { + const defaultConfig: ITelemetryConfig = PropertiesPlugin.getDefaultConfig(); + this._extensionConfig = this._extensionConfig || PropertiesPlugin.getDefaultConfig(); + for (let field in defaultConfig) { + this._extensionConfig[field] = () => ConfigurationManager.getConfig(config, field, this.identifier, defaultConfig[field]()); + } if (typeof window !== 'undefined') { 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.operation = new Operation(); this.session = new Session(); - this.sample = new Sample(this._extensionConfig.sampleRate(), core.logger); + this.sample = new Sample(this._extensionConfig.samplingPercentage(), core.logger); } }