Skip to content

Commit 1eaa43e

Browse files
add request tracing for cdn
1 parent 14364c5 commit 1eaa43e

File tree

7 files changed

+36
-14
lines changed

7 files changed

+36
-14
lines changed

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/AzureAppConfigurationImpl.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
5959
#client: AppConfigurationClient;
6060
#clientEndpoint: string | undefined;
6161
#options: AzureAppConfigurationOptions | undefined;
62+
#isCdnUsed: boolean;
6263
#isInitialLoadCompleted: boolean = false;
6364

6465
// Refresh
@@ -80,11 +81,13 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
8081
constructor(
8182
client: AppConfigurationClient,
8283
clientEndpoint: string | undefined,
83-
options: AzureAppConfigurationOptions | undefined
84+
options: AzureAppConfigurationOptions | undefined,
85+
isCdnUsed: boolean
8486
) {
8587
this.#client = client;
8688
this.#clientEndpoint = clientEndpoint;
8789
this.#options = options;
90+
this.#isCdnUsed = isCdnUsed;
8891

8992
// Enable request tracing if not opt-out
9093
this.#requestTracingEnabled = requestTracingEnabled();
@@ -197,6 +200,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
197200
return {
198201
requestTracingEnabled: this.#requestTracingEnabled,
199202
initialLoadCompleted: this.#isInitialLoadCompleted,
203+
isCdnUsed: this.#isCdnUsed,
200204
appConfigOptions: this.#options
201205
};
202206
}

src/load.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ import * as RequestTracing from "./requestTracing/constants.js";
1010

1111
const MIN_DELAY_FOR_UNHANDLED_ERROR: number = 5000; // 5 seconds
1212

13+
// Empty token credential to be used when loading from CDN
14+
const emptyTokenCredential: TokenCredential = {
15+
getToken: async () => ({ token: "", expiresOnTimestamp: 0 })
16+
};
17+
1318
/**
1419
* Loads the data from Azure App Configuration service and returns an instance of AzureAppConfiguration.
1520
* @param connectionString The connection string for the App Configuration store.
@@ -67,7 +72,7 @@ export async function load(
6772
}
6873

6974
try {
70-
const appConfiguration = new AzureAppConfigurationImpl(client, clientEndpoint, options);
75+
const appConfiguration = new AzureAppConfigurationImpl(client, clientEndpoint, options, credentialOrOptions === emptyTokenCredential);
7176
await appConfiguration.load();
7277
return appConfiguration;
7378
} catch (error) {
@@ -93,10 +98,6 @@ export async function loadFromCdn(
9398
cdnEndpoint: string | URL,
9499
appConfigOptions?: AzureAppConfigurationOptions
95100
): Promise<AzureAppConfiguration> {
96-
const emptyTokenCredential: TokenCredential = {
97-
getToken: async () => ({ token: "", expiresOnTimestamp: 0 })
98-
};
99-
100101
if (appConfigOptions === undefined) {
101102
appConfigOptions = { clientOptions: {}};
102103
}

src/requestTracing/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,4 @@ export enum RequestType {
4646

4747
// Tag names
4848
export const KEY_VAULT_CONFIGURED_TAG = "UsesKeyVault";
49+
export const CDN_USED_TAG = "CDN";

src/requestTracing/utils.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
HOST_TYPE_KEY,
1414
HostType,
1515
KEY_VAULT_CONFIGURED_TAG,
16+
CDN_USED_TAG,
1617
KUBERNETES_ENV_VAR,
1718
NODEJS_DEV_ENV_VAL,
1819
NODEJS_ENV_VAR,
@@ -27,18 +28,19 @@ export function listConfigurationSettingsWithTrace(
2728
requestTracingOptions: {
2829
requestTracingEnabled: boolean;
2930
initialLoadCompleted: boolean;
31+
isCdnUsed: boolean;
3032
appConfigOptions: AzureAppConfigurationOptions | undefined;
3133
},
3234
client: AppConfigurationClient,
3335
listOptions: ListConfigurationSettingsOptions
3436
) {
35-
const { requestTracingEnabled, initialLoadCompleted, appConfigOptions } = requestTracingOptions;
37+
const { requestTracingEnabled, initialLoadCompleted, isCdnUsed, appConfigOptions } = requestTracingOptions;
3638

3739
const actualListOptions = { ...listOptions };
3840
if (requestTracingEnabled) {
3941
actualListOptions.requestOptions = {
4042
customHeaders: {
41-
[CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(appConfigOptions, initialLoadCompleted)
43+
[CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(appConfigOptions, initialLoadCompleted, isCdnUsed)
4244
}
4345
};
4446
}
@@ -50,27 +52,28 @@ export function getConfigurationSettingWithTrace(
5052
requestTracingOptions: {
5153
requestTracingEnabled: boolean;
5254
initialLoadCompleted: boolean;
55+
isCdnUsed: boolean;
5356
appConfigOptions: AzureAppConfigurationOptions | undefined;
5457
},
5558
client: AppConfigurationClient,
5659
configurationSettingId: ConfigurationSettingId,
5760
getOptions?: GetConfigurationSettingOptions,
5861
) {
59-
const { requestTracingEnabled, initialLoadCompleted, appConfigOptions } = requestTracingOptions;
62+
const { requestTracingEnabled, initialLoadCompleted, isCdnUsed, appConfigOptions } = requestTracingOptions;
6063
const actualGetOptions = { ...getOptions };
6164

6265
if (requestTracingEnabled) {
6366
actualGetOptions.requestOptions = {
6467
customHeaders: {
65-
[CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(appConfigOptions, initialLoadCompleted)
68+
[CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(appConfigOptions, initialLoadCompleted, isCdnUsed)
6669
}
6770
};
6871
}
6972

7073
return client.getConfigurationSetting(configurationSettingId, actualGetOptions);
7174
}
7275

73-
export function createCorrelationContextHeader(options: AzureAppConfigurationOptions | undefined, isInitialLoadCompleted: boolean): string {
76+
export function createCorrelationContextHeader(options: AzureAppConfigurationOptions | undefined, isInitialLoadCompleted: boolean, isCdnUsed: boolean): string {
7477
/*
7578
RequestType: 'Startup' during application starting up, 'Watch' after startup completed.
7679
Host: identify with defined envs
@@ -89,6 +92,9 @@ export function createCorrelationContextHeader(options: AzureAppConfigurationOpt
8992
tags.push(KEY_VAULT_CONFIGURED_TAG);
9093
}
9194
}
95+
if (isCdnUsed) {
96+
tags.push(CDN_USED_TAG);
97+
}
9298

9399
const contextParts: string[] = [];
94100
for (const [k, v] of keyValues) {

test/exportedApi.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT license.
33

4-
export { load } from "../src";
4+
export { load, loadFromCdn } from "../src";

test/requestTracing.test.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import * as chaiAsPromised from "chai-as-promised";
66
chai.use(chaiAsPromised);
77
const expect = chai.expect;
88
import { createMockedConnectionString, createMockedKeyValue, createMockedTokenCredential, mockAppConfigurationClientListConfigurationSettings, restoreMocks, sleepInMs } from "./utils/testHelper.js";
9-
import { load } from "./exportedApi.js";
9+
import { load, loadFromCdn } from "./exportedApi.js";
1010

1111
class HttpRequestHeadersPolicy {
1212
headers: any;
@@ -77,6 +77,16 @@ describe("request tracing", function () {
7777
expect(correlationContext.includes("UsesKeyVault")).eq(true);
7878
});
7979

80+
it("should have cdn tag in correlation-context header", async () => {
81+
try {
82+
await loadFromCdn(fakeEndpoint);
83+
} catch (e) { /* empty */ }
84+
expect(headerPolicy.headers).not.undefined;
85+
const correlationContext = headerPolicy.headers.get("Correlation-Context");
86+
expect(correlationContext).not.undefined;
87+
expect(correlationContext.includes("CDN")).eq(true);
88+
});
89+
8090
it("should detect env in correlation-context header", async () => {
8191
process.env.NODE_ENV = "development";
8292
try {

0 commit comments

Comments
 (0)