Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[main] [BUG] using EndPointUrl (and IngestionEndpoint) results in Telemetry sent to incorrect urls #2197 #2274

Merged
merged 14 commits into from
Mar 4, 2024
17 changes: 17 additions & 0 deletions AISKU/Tests/Unit/src/applicationinsights.e2e.tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ export class ApplicationInsightsTests extends AITestClass {
this.addAsyncTests();
this.addDependencyPluginTests();
this.addPropertiesPluginTests();
this.addCDNOverrideTests();
}

public addGenericE2ETests(): void {
Expand Down Expand Up @@ -241,6 +242,22 @@ export class ApplicationInsightsTests extends AITestClass {
});
}

public addCDNOverrideTests(): void {
this.testCase({
name: 'CDNOverrideTests: customer could overwrite the url endpoint',
useFakeTimers: true,
test: () => {
let ingestionendpoint = "https://dc.services.visualstudio.com";
this._ai.config.connectionString = "InstrumentationKey=xxx;IngestionEndpoint=" + ingestionendpoint + ";LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/"
this.clock.tick(100);
Assert.deepEqual(this._ai.config.endpointUrl, ingestionendpoint + "/v2/track", "endpoint url is set from connection string");
this._ai.config.userOverrideEndpointUrl = "https://custom.endpoint";
this.clock.tick(100);
Assert.deepEqual(this._ai.config.endpointUrl, this._ai.config.userOverrideEndpointUrl, "endpoint url is override by userOverrideEndpointUrl");
}
});
}

public addAnalyticsApiTests(): void {
this.testCase({
name: 'E2E.AnalyticsApiTests: Public Members exist',
Expand Down
4 changes: 2 additions & 2 deletions AISKU/Tests/Unit/src/testSnippetV5.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export function createSnippetV5(snipConfig) {
var scriptText = "script";
var strInstrumentationKey = "instrumentationKey";
var strIngestionendpoint = "ingestionendpoint";
var userOverrideEndpointUrl = "userOverrideEndpointUrl";
var strDisableExceptionTracking = "disableExceptionTracking";
var strAiDevice = "ai.device.";
var strAiOperationName = "ai.operation.name";
Expand Down Expand Up @@ -89,8 +90,7 @@ export function createSnippetV5(snipConfig) {
var conString = _parseConnectionString();
var iKey = conString[strInstrumentationKey] || aiConfig[strInstrumentationKey] || strEmpty;
var ingest = conString[strIngestionendpoint];
var endpointUrl = ingest ? ingest + "/v2/track" : aiConfig.endpointUrl; // only add /v2/track when from connectionstring

var endpointUrl = aiConfig[userOverrideEndpointUrl] ? aiConfig[userOverrideEndpointUrl] : (ingest + "/v2/track");
var message = "SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)";
var evts = [];
evts.push(_createException(iKey, message, targetSrc, endpointUrl));
Expand Down
3 changes: 2 additions & 1 deletion AISKU/Tests/Unit/src/testSnippetV6.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export function createSnippetV6(snipConfig) {
var scriptText = "script";
var strInstrumentationKey = "instrumentationKey";
var strIngestionendpoint = "ingestionendpoint";
var userOverrideEndpointUrl = "userOverrideEndpointUrl";
var strDisableExceptionTracking = "disableExceptionTracking";
var strAiDevice = "ai.device.";
var strAiOperationName = "ai.operation.name";
Expand Down Expand Up @@ -90,7 +91,7 @@ export function createSnippetV6(snipConfig) {
var conString = _parseConnectionString();
var iKey = conString[strConStringIKey] || aiConfig[strInstrumentationKey] || strEmpty;
var ingest = conString[strIngestionendpoint];
var endpointUrl = ingest ? ingest + "/v2/track" : aiConfig.endpointUrl; // only add /v2/track when from connectionstring
var endpointUrl = aiConfig[userOverrideEndpointUrl] ? aiConfig[userOverrideEndpointUrl] : (ingest + "/v2/track");

var message = "SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)";
var evts = [];
Expand Down
5 changes: 4 additions & 1 deletion AISKU/src/AISku.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ const defaultConfigValues: IConfigDefaults<IConfiguration|IConfig> = {
connectionString: UNDEFINED_VALUE,
endpointUrl: UNDEFINED_VALUE,
instrumentationKey: UNDEFINED_VALUE,
userOverrideEndpointUrl: UNDEFINED_VALUE,
diagnosticLogInterval: cfgDfValidate(_chkDiagLevel, 10000),
featureOptIn:{
[IKEY_USAGE]: {mode: FeatureOptInMode.disable},
Expand Down Expand Up @@ -196,9 +197,11 @@ export class AppInsightsSku implements IApplicationInsights {
if (_config.connectionString) {
const cs = parseConnectionString(_config.connectionString);
const ingest = cs.ingestionendpoint;
_config.endpointUrl = ingest ? (ingest + DEFAULT_BREEZE_PATH) : _config.endpointUrl; // only add /v2/track when from connectionstring
_config.endpointUrl = _config.userOverrideEndpointUrl ? _config.userOverrideEndpointUrl : ingest + DEFAULT_BREEZE_PATH; // add /v2/track
_config.instrumentationKey = cs.instrumentationkey || _config.instrumentationKey;
}
// userOverrideEndpointUrl have the highest priority
_config.endpointUrl = _config.userOverrideEndpointUrl ? _config.userOverrideEndpointUrl : _config.endpointUrl;
}));

_self.snippet = snippet;
Expand Down
4 changes: 3 additions & 1 deletion AISKULight/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,11 @@ export class ApplicationInsights {
if (_config.connectionString) {
const cs = parseConnectionString(_config.connectionString);
const ingest = cs.ingestionendpoint;
_config.endpointUrl = ingest ? (ingest + DEFAULT_BREEZE_PATH) : _config.endpointUrl; // only add /v2/track when from connectionstring
_config.endpointUrl = _config.userOverrideEndpointUrl ? _config.userOverrideEndpointUrl : (ingest + DEFAULT_BREEZE_PATH); // only add /v2/track when from connectionstring
_config.instrumentationKey = cs.instrumentationkey || _config.instrumentationKey;
}
// userOverrideEndpointUrl have the highest priority
_config.endpointUrl = _config.userOverrideEndpointUrl ? _config.userOverrideEndpointUrl : _config.endpointUrl;
}));

// initialize core
Expand Down
4 changes: 2 additions & 2 deletions shared/AppInsightsCommon/src/ConnectionStringParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,12 @@ export function parseConnectionString(connectionString?: string): ConnectionStri
// this is a valid connection string, so parse the results

if (result.endpointsuffix) {
// use endpoint suffix where overrides are not provided
// apply the default endpoints
const locationPrefix = result.location ? result.location + "." : "";
result.ingestionendpoint = result.ingestionendpoint || ("https://" + locationPrefix + "dc." + result.endpointsuffix);
}

// apply the default endpoints
// apply user override endpoint or the default endpoints
result.ingestionendpoint = result.ingestionendpoint || DEFAULT_BREEZE_ENDPOINT;

if (strEndsWith(result.ingestionendpoint, "/")) {
Expand Down
6 changes: 6 additions & 0 deletions shared/AppInsightsCommon/src/Interfaces/IConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,12 @@ export interface IConfig {
* [Optional] Sets throttle mgr configuration by key
*/
throttleMgrCfg?: {[key: number]: IThrottleMgrConfig};

/**
* [Optional] Specifies a Highest Priority custom endpoint URL where telemetry data will be sent.
* This URL takes precedence over the 'config.endpointUrl' and any endpoint in the connection string.
*/
userOverrideEndpointUrl?: string;
}

export class ConfigurationManager {
Expand Down
5 changes: 3 additions & 2 deletions tools/applicationinsights-web-snippet/src/snippet.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Fields, ISnippetConfig } from "./type";
import { IEnvelope } from "@microsoft/applicationinsights-common";
import { IConfig, IEnvelope } from "@microsoft/applicationinsights-common";
import { IConfiguration, Snippet } from "@microsoft/applicationinsights-web";

// To ensure that SnippetConfig resides at the bottom of snippet.min.js,
Expand Down Expand Up @@ -32,7 +32,7 @@ declare var cfg:ISnippetConfig;
// Only set if supplied or another name is defined to avoid polluting the global namespace
win[sdkInstanceName] = aiName;
}
let aiSdk = win[aiName] || (function (aiConfig: IConfiguration) {
let aiSdk = win[aiName] || (function (aiConfig: IConfiguration & IConfig) {
let loadFailed = false;
let handled = false;
let appInsights: (Snippet & {initialize:boolean, cookie?:any, core?:any})= {
Expand Down Expand Up @@ -103,6 +103,7 @@ declare var cfg:ISnippetConfig;
ingest = ingest.slice(0,-1);
}
let endpointUrl = ingest ? ingest + "/v2/track" : aiConfig.endpointUrl; // only add /v2/track when from connectionstring
endpointUrl = aiConfig.userOverrideEndpointUrl ? aiConfig.userOverrideEndpointUrl : endpointUrl;

let message = "SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)";
let evts:IEnvelope[] = [];
Expand Down
Loading