From b5b79af0455c0cf453dc985f7979b593b23e2da4 Mon Sep 17 00:00:00 2001 From: Yan Zhang <2351748+Eskibear@users.noreply.github.com> Date: Tue, 11 Jun 2024 12:24:31 +0800 Subject: [PATCH 1/3] extract list/get config settings with trace --- src/AzureAppConfigurationImpl.ts | 44 +++++++++++++-------------- src/requestTracing/utils.ts | 52 +++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 24 deletions(-) diff --git a/src/AzureAppConfigurationImpl.ts b/src/AzureAppConfigurationImpl.ts index 2e88f461..99ed7ca7 100644 --- a/src/AzureAppConfigurationImpl.ts +++ b/src/AzureAppConfigurationImpl.ts @@ -11,8 +11,7 @@ import { DEFAULT_REFRESH_INTERVAL_IN_MS, MIN_REFRESH_INTERVAL_IN_MS } from "./Re import { Disposable } from "./common/disposable"; import { AzureKeyVaultKeyValueAdapter } from "./keyvault/AzureKeyVaultKeyValueAdapter"; import { RefreshTimer } from "./refresh/RefreshTimer"; -import { CORRELATION_CONTEXT_HEADER_NAME } from "./requestTracing/constants"; -import { createCorrelationContextHeader, requestTracingEnabled } from "./requestTracing/utils"; +import { getConfigurationSettingWithTrace, listConfigurationSettingsWithTrace, requestTracingEnabled } from "./requestTracing/utils"; import { KeyFilter, LabelFilter, SettingSelector } from "./types"; export class AzureAppConfigurationImpl implements AzureAppConfiguration { @@ -140,15 +139,14 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { labelFilter: selector.labelFilter }; - if (this.#requestTracingEnabled) { - listOptions.requestOptions = { - customHeaders: { - [CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(this.#options, this.#isInitialLoadCompleted) - } - } - } - - const settings = this.#client.listConfigurationSettings(listOptions); + const settings = listConfigurationSettingsWithTrace( + { + requestTracingEnabled: this.#requestTracingEnabled, + initialLoadCompleted: this.#isInitialLoadCompleted, + appConfigOptions: this.#options + }, + this.#client, listOptions + ); for await (const setting of settings) { if (!isFeatureFlag(setting)) { // exclude feature flags @@ -174,7 +172,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { } else { // Send a request to retrieve key-value since it may be either not loaded or loaded with a different label or different casing const { key, label } = sentinel; - const response = await this.#getConfigurationSettingWithTrace({ key, label }); + const response = await this.#getConfigurationSetting({ key, label }); if (response) { sentinel.etag = response.etag; } else { @@ -270,7 +268,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { // try refresh if any of watched settings is changed. let needRefresh = false; for (const sentinel of this.#sentinels.values()) { - const response = await this.#getConfigurationSettingWithTrace(sentinel, { + const response = await this.#getConfigurationSetting(sentinel, { onlyIfChanged: true }); @@ -342,18 +340,18 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { return key; } - async #getConfigurationSettingWithTrace(configurationSettingId: ConfigurationSettingId, customOptions?: GetConfigurationSettingOptions): Promise { + /** + * Get a configuration setting by key and label. If the setting is not found, return undefine instead of throwing an error. + */ + async #getConfigurationSetting(configurationSettingId: ConfigurationSettingId, customOptions?: GetConfigurationSettingOptions): Promise { let response: GetConfigurationSettingResponse | undefined; try { - const options = { ...customOptions ?? {} }; - if (this.#requestTracingEnabled) { - options.requestOptions = { - customHeaders: { - [CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(this.#options, this.#isInitialLoadCompleted) - } - } - } - response = await this.#client.getConfigurationSetting(configurationSettingId, options); + response = await getConfigurationSettingWithTrace({ + requestTracingEnabled: this.#requestTracingEnabled, + initialLoadCompleted: this.#isInitialLoadCompleted, + appConfigOptions: this.#options + }, this.#client, configurationSettingId, customOptions); + } catch (error) { if (error instanceof RestError && error.statusCode === 404) { response = undefined; diff --git a/src/requestTracing/utils.ts b/src/requestTracing/utils.ts index e82ffe52..eb821296 100644 --- a/src/requestTracing/utils.ts +++ b/src/requestTracing/utils.ts @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. +import { AppConfigurationClient, ConfigurationSettingId, GetConfigurationSettingOptions, ListConfigurationSettingsOptions } from "@azure/app-configuration"; import { AzureAppConfigurationOptions } from "../AzureAppConfigurationOptions"; import { AZURE_FUNCTION_ENV_VAR, @@ -17,10 +18,59 @@ import { NODEJS_ENV_VAR, REQUEST_TYPE_KEY, RequestType, - SERVICE_FABRIC_ENV_VAR + SERVICE_FABRIC_ENV_VAR, + CORRELATION_CONTEXT_HEADER_NAME } from "./constants"; // Utils +export function listConfigurationSettingsWithTrace( + requestTracingOptions: { + requestTracingEnabled: boolean; + initialLoadCompleted: boolean; + appConfigOptions: AzureAppConfigurationOptions | undefined; + }, + client: AppConfigurationClient, + listOptions: ListConfigurationSettingsOptions +) { + const { requestTracingEnabled, initialLoadCompleted, appConfigOptions } = requestTracingOptions; + + const actualListOptions = { ...listOptions }; + if (requestTracingEnabled) { + actualListOptions.requestOptions = { + customHeaders: { + [CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(appConfigOptions, initialLoadCompleted) + } + } + } + + return client.listConfigurationSettings(actualListOptions); +} + +export function getConfigurationSettingWithTrace( + requestTracingOptions: { + requestTracingEnabled: boolean; + initialLoadCompleted: boolean; + appConfigOptions: AzureAppConfigurationOptions | undefined; + }, + client: AppConfigurationClient, + configurationSettingId: ConfigurationSettingId, + getOptions?: GetConfigurationSettingOptions, +) { + const { requestTracingEnabled, initialLoadCompleted, appConfigOptions } = requestTracingOptions; + const actualGetOptions = { ...getOptions }; + + if (requestTracingEnabled) { + actualGetOptions.requestOptions = { + customHeaders: { + [CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(appConfigOptions, initialLoadCompleted) + } + } + } + + return client.getConfigurationSetting(configurationSettingId, actualGetOptions); + +} + export function createCorrelationContextHeader(options: AzureAppConfigurationOptions | undefined, isInitialLoadCompleted: boolean): string { /* RequestType: 'Startup' during application starting up, 'Watch' after startup completed. From 3f2a134da7636a1b7474741dd624c0c56476e360 Mon Sep 17 00:00:00 2001 From: Yan Zhang Date: Tue, 11 Jun 2024 13:14:59 +0800 Subject: [PATCH 2/3] unify code style --- src/AzureAppConfigurationImpl.ts | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/AzureAppConfigurationImpl.ts b/src/AzureAppConfigurationImpl.ts index 99ed7ca7..1ac77904 100644 --- a/src/AzureAppConfigurationImpl.ts +++ b/src/AzureAppConfigurationImpl.ts @@ -139,13 +139,15 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { labelFilter: selector.labelFilter }; + const requestTraceOptions = { + requestTracingEnabled: this.#requestTracingEnabled, + initialLoadCompleted: this.#isInitialLoadCompleted, + appConfigOptions: this.#options + }; const settings = listConfigurationSettingsWithTrace( - { - requestTracingEnabled: this.#requestTracingEnabled, - initialLoadCompleted: this.#isInitialLoadCompleted, - appConfigOptions: this.#options - }, - this.#client, listOptions + requestTraceOptions, + this.#client, + listOptions ); for await (const setting of settings) { @@ -346,11 +348,17 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { async #getConfigurationSetting(configurationSettingId: ConfigurationSettingId, customOptions?: GetConfigurationSettingOptions): Promise { let response: GetConfigurationSettingResponse | undefined; try { - response = await getConfigurationSettingWithTrace({ + const requestTraceOptions = { requestTracingEnabled: this.#requestTracingEnabled, initialLoadCompleted: this.#isInitialLoadCompleted, appConfigOptions: this.#options - }, this.#client, configurationSettingId, customOptions); + }; + response = await getConfigurationSettingWithTrace( + requestTraceOptions, + this.#client, + configurationSettingId, + customOptions + ); } catch (error) { if (error instanceof RestError && error.statusCode === 404) { From 5dec514f65af4f7dacad46ae88f691e3d6a2498c Mon Sep 17 00:00:00 2001 From: Yan Zhang <2351748+Eskibear@users.noreply.github.com> Date: Tue, 11 Jun 2024 15:50:26 +0800 Subject: [PATCH 3/3] remove empty line --- src/requestTracing/utils.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/requestTracing/utils.ts b/src/requestTracing/utils.ts index eb821296..61dda15d 100644 --- a/src/requestTracing/utils.ts +++ b/src/requestTracing/utils.ts @@ -68,7 +68,6 @@ export function getConfigurationSettingWithTrace( } return client.getConfigurationSetting(configurationSettingId, actualGetOptions); - } export function createCorrelationContextHeader(options: AzureAppConfigurationOptions | undefined, isInitialLoadCompleted: boolean): string { @@ -165,4 +164,4 @@ function isWebWorker() { const importScriptsAsGlobalFunction = typeof importScripts === "function"; return workerGlobalScopeDefined && importScriptsAsGlobalFunction && isNavigatorDefinedAsExpected; -} \ No newline at end of file +}