Skip to content

Commit 3b0a6eb

Browse files
authored
extract list/get config settings with trace (#69)
1 parent 1059213 commit 3b0a6eb

File tree

2 files changed

+80
-25
lines changed

2 files changed

+80
-25
lines changed

src/AzureAppConfigurationImpl.ts

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ import { DEFAULT_REFRESH_INTERVAL_IN_MS, MIN_REFRESH_INTERVAL_IN_MS } from "./Re
1111
import { Disposable } from "./common/disposable";
1212
import { AzureKeyVaultKeyValueAdapter } from "./keyvault/AzureKeyVaultKeyValueAdapter";
1313
import { RefreshTimer } from "./refresh/RefreshTimer";
14-
import { CORRELATION_CONTEXT_HEADER_NAME } from "./requestTracing/constants";
15-
import { createCorrelationContextHeader, requestTracingEnabled } from "./requestTracing/utils";
14+
import { getConfigurationSettingWithTrace, listConfigurationSettingsWithTrace, requestTracingEnabled } from "./requestTracing/utils";
1615
import { KeyFilter, LabelFilter, SettingSelector } from "./types";
1716

1817
export class AzureAppConfigurationImpl implements AzureAppConfiguration {
@@ -140,15 +139,16 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
140139
labelFilter: selector.labelFilter
141140
};
142141

143-
if (this.#requestTracingEnabled) {
144-
listOptions.requestOptions = {
145-
customHeaders: {
146-
[CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(this.#options, this.#isInitialLoadCompleted)
147-
}
148-
}
149-
}
150-
151-
const settings = this.#client.listConfigurationSettings(listOptions);
142+
const requestTraceOptions = {
143+
requestTracingEnabled: this.#requestTracingEnabled,
144+
initialLoadCompleted: this.#isInitialLoadCompleted,
145+
appConfigOptions: this.#options
146+
};
147+
const settings = listConfigurationSettingsWithTrace(
148+
requestTraceOptions,
149+
this.#client,
150+
listOptions
151+
);
152152

153153
for await (const setting of settings) {
154154
if (!isFeatureFlag(setting)) { // exclude feature flags
@@ -174,7 +174,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
174174
} else {
175175
// Send a request to retrieve key-value since it may be either not loaded or loaded with a different label or different casing
176176
const { key, label } = sentinel;
177-
const response = await this.#getConfigurationSettingWithTrace({ key, label });
177+
const response = await this.#getConfigurationSetting({ key, label });
178178
if (response) {
179179
sentinel.etag = response.etag;
180180
} else {
@@ -270,7 +270,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
270270
// try refresh if any of watched settings is changed.
271271
let needRefresh = false;
272272
for (const sentinel of this.#sentinels.values()) {
273-
const response = await this.#getConfigurationSettingWithTrace(sentinel, {
273+
const response = await this.#getConfigurationSetting(sentinel, {
274274
onlyIfChanged: true
275275
});
276276

@@ -342,18 +342,24 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
342342
return key;
343343
}
344344

345-
async #getConfigurationSettingWithTrace(configurationSettingId: ConfigurationSettingId, customOptions?: GetConfigurationSettingOptions): Promise<GetConfigurationSettingResponse | undefined> {
345+
/**
346+
* Get a configuration setting by key and label. If the setting is not found, return undefine instead of throwing an error.
347+
*/
348+
async #getConfigurationSetting(configurationSettingId: ConfigurationSettingId, customOptions?: GetConfigurationSettingOptions): Promise<GetConfigurationSettingResponse | undefined> {
346349
let response: GetConfigurationSettingResponse | undefined;
347350
try {
348-
const options = { ...customOptions ?? {} };
349-
if (this.#requestTracingEnabled) {
350-
options.requestOptions = {
351-
customHeaders: {
352-
[CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(this.#options, this.#isInitialLoadCompleted)
353-
}
354-
}
355-
}
356-
response = await this.#client.getConfigurationSetting(configurationSettingId, options);
351+
const requestTraceOptions = {
352+
requestTracingEnabled: this.#requestTracingEnabled,
353+
initialLoadCompleted: this.#isInitialLoadCompleted,
354+
appConfigOptions: this.#options
355+
};
356+
response = await getConfigurationSettingWithTrace(
357+
requestTraceOptions,
358+
this.#client,
359+
configurationSettingId,
360+
customOptions
361+
);
362+
357363
} catch (error) {
358364
if (error instanceof RestError && error.statusCode === 404) {
359365
response = undefined;

src/requestTracing/utils.ts

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT license.
33

4+
import { AppConfigurationClient, ConfigurationSettingId, GetConfigurationSettingOptions, ListConfigurationSettingsOptions } from "@azure/app-configuration";
45
import { AzureAppConfigurationOptions } from "../AzureAppConfigurationOptions";
56
import {
67
AZURE_FUNCTION_ENV_VAR,
@@ -17,10 +18,58 @@ import {
1718
NODEJS_ENV_VAR,
1819
REQUEST_TYPE_KEY,
1920
RequestType,
20-
SERVICE_FABRIC_ENV_VAR
21+
SERVICE_FABRIC_ENV_VAR,
22+
CORRELATION_CONTEXT_HEADER_NAME
2123
} from "./constants";
2224

2325
// Utils
26+
export function listConfigurationSettingsWithTrace(
27+
requestTracingOptions: {
28+
requestTracingEnabled: boolean;
29+
initialLoadCompleted: boolean;
30+
appConfigOptions: AzureAppConfigurationOptions | undefined;
31+
},
32+
client: AppConfigurationClient,
33+
listOptions: ListConfigurationSettingsOptions
34+
) {
35+
const { requestTracingEnabled, initialLoadCompleted, appConfigOptions } = requestTracingOptions;
36+
37+
const actualListOptions = { ...listOptions };
38+
if (requestTracingEnabled) {
39+
actualListOptions.requestOptions = {
40+
customHeaders: {
41+
[CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(appConfigOptions, initialLoadCompleted)
42+
}
43+
}
44+
}
45+
46+
return client.listConfigurationSettings(actualListOptions);
47+
}
48+
49+
export function getConfigurationSettingWithTrace(
50+
requestTracingOptions: {
51+
requestTracingEnabled: boolean;
52+
initialLoadCompleted: boolean;
53+
appConfigOptions: AzureAppConfigurationOptions | undefined;
54+
},
55+
client: AppConfigurationClient,
56+
configurationSettingId: ConfigurationSettingId,
57+
getOptions?: GetConfigurationSettingOptions,
58+
) {
59+
const { requestTracingEnabled, initialLoadCompleted, appConfigOptions } = requestTracingOptions;
60+
const actualGetOptions = { ...getOptions };
61+
62+
if (requestTracingEnabled) {
63+
actualGetOptions.requestOptions = {
64+
customHeaders: {
65+
[CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(appConfigOptions, initialLoadCompleted)
66+
}
67+
}
68+
}
69+
70+
return client.getConfigurationSetting(configurationSettingId, actualGetOptions);
71+
}
72+
2473
export function createCorrelationContextHeader(options: AzureAppConfigurationOptions | undefined, isInitialLoadCompleted: boolean): string {
2574
/*
2675
RequestType: 'Startup' during application starting up, 'Watch' after startup completed.
@@ -115,4 +164,4 @@ function isWebWorker() {
115164
const importScriptsAsGlobalFunction = typeof importScripts === "function";
116165

117166
return workerGlobalScopeDefined && importScriptsAsGlobalFunction && isNavigatorDefinedAsExpected;
118-
}
167+
}

0 commit comments

Comments
 (0)