diff --git a/rollup.config.mjs b/rollup.config.mjs index 8ad51640..1fa9626f 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -4,7 +4,7 @@ import dts from "rollup-plugin-dts"; export default [ { - external: ["@azure/app-configuration", "@azure/keyvault-secrets", "@azure/core-rest-pipeline", "crypto", "dns/promises"], + external: ["@azure/app-configuration", "@azure/keyvault-secrets", "@azure/core-rest-pipeline", "crypto", "dns/promises", "@microsoft/feature-management"], input: "src/index.ts", output: [ { diff --git a/src/AzureAppConfigurationImpl.ts b/src/AzureAppConfigurationImpl.ts index 916ece49..9a21fdd4 100644 --- a/src/AzureAppConfigurationImpl.ts +++ b/src/AzureAppConfigurationImpl.ts @@ -33,6 +33,7 @@ import { CONDITIONS_KEY_NAME, CLIENT_FILTERS_KEY_NAME } from "./featureManagement/constants.js"; +import { FM_PACKAGE_NAME } from "./requestTracing/constants.js"; import { AzureKeyVaultKeyValueAdapter } from "./keyvault/AzureKeyVaultKeyValueAdapter.js"; import { RefreshTimer } from "./refresh/RefreshTimer.js"; import { RequestTracingOptions, getConfigurationSettingWithTrace, listConfigurationSettingsWithTrace, requestTracingEnabled } from "./requestTracing/utils.js"; @@ -65,6 +66,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { #isInitialLoadCompleted: boolean = false; #isFailoverRequest: boolean = false; #featureFlagTracing: FeatureFlagTracingOptions | undefined; + #fmVersion: string | undefined; // Refresh #refreshInProgress: boolean = false; @@ -184,7 +186,8 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { initialLoadCompleted: this.#isInitialLoadCompleted, replicaCount: this.#clientManager.getReplicaCount(), isFailoverRequest: this.#isFailoverRequest, - featureFlagTracing: this.#featureFlagTracing + featureFlagTracing: this.#featureFlagTracing, + fmVersion: this.#fmVersion }; } @@ -226,6 +229,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { * Loads the configuration store for the first time. */ async load() { + await this.#inspectFmPackage(); await this.#loadSelectedAndWatchedKeyValues(); if (this.#featureFlagEnabled) { await this.#loadFeatureFlags(); @@ -316,6 +320,21 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration { return new Disposable(remove); } + /** + * Inspects the feature management package version. + */ + async #inspectFmPackage() { + if (this.#requestTracingEnabled && !this.#fmVersion) { + try { + // get feature management package version + const fmPackage = await import(FM_PACKAGE_NAME); + this.#fmVersion = fmPackage?.VERSION; + } catch (error) { + // ignore the error + } + } + } + async #refreshTasks(): Promise { const refreshTasks: Promise[] = []; if (this.#refreshEnabled) { diff --git a/src/ConfigurationClientManager.ts b/src/ConfigurationClientManager.ts index 92e16a3a..7ad8e597 100644 --- a/src/ConfigurationClientManager.ts +++ b/src/ConfigurationClientManager.ts @@ -85,6 +85,9 @@ export class ConfigurationClientManager { this.#isFailoverable = false; return; } + if (this.#dns) { + return; + } try { this.#dns = await import("dns/promises"); diff --git a/src/requestTracing/constants.ts b/src/requestTracing/constants.ts index 5a88b0fc..74ca58bb 100644 --- a/src/requestTracing/constants.ts +++ b/src/requestTracing/constants.ts @@ -55,6 +55,10 @@ export const FAILOVER_REQUEST_TAG = "Failover"; export const FEATURES_KEY = "Features"; export const LOAD_BALANCE_CONFIGURED_TAG = "LB"; +// Feature management package +export const FM_PACKAGE_NAME = "@microsoft/feature-management"; +export const FM_VERSION_KEY = "FMJsVer"; + // Feature flag usage tracing export const FEATURE_FILTER_TYPE_KEY = "Filter"; export const CUSTOM_FILTER_KEY = "CSTM"; diff --git a/src/requestTracing/utils.ts b/src/requestTracing/utils.ts index b56c460c..2e8b1124 100644 --- a/src/requestTracing/utils.ts +++ b/src/requestTracing/utils.ts @@ -27,7 +27,8 @@ import { REPLICA_COUNT_KEY, FAILOVER_REQUEST_TAG, FEATURES_KEY, - LOAD_BALANCE_CONFIGURED_TAG + LOAD_BALANCE_CONFIGURED_TAG, + FM_VERSION_KEY } from "./constants"; export interface RequestTracingOptions { @@ -37,6 +38,7 @@ export interface RequestTracingOptions { replicaCount: number; isFailoverRequest: boolean; featureFlagTracing: FeatureFlagTracingOptions | undefined; + fmVersion: string | undefined; } // Utils @@ -119,6 +121,9 @@ export function createCorrelationContextHeader(requestTracingOptions: RequestTra if (requestTracingOptions.replicaCount > 0) { keyValues.set(REPLICA_COUNT_KEY, requestTracingOptions.replicaCount.toString()); } + if (requestTracingOptions.fmVersion) { + keyValues.set(FM_VERSION_KEY, requestTracingOptions.fmVersion); + } // Compact tags: Features=LB+... if (appConfigOptions?.loadBalancingEnabled) {