Skip to content

Commit ca7c5bb

Browse files
Add feature management package version tracing (#153)
* add fm package version tracing * update comment * update
1 parent 5956b72 commit ca7c5bb

File tree

5 files changed

+34
-3
lines changed

5 files changed

+34
-3
lines changed

rollup.config.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import dts from "rollup-plugin-dts";
44

55
export default [
66
{
7-
external: ["@azure/app-configuration", "@azure/keyvault-secrets", "@azure/core-rest-pipeline", "crypto", "dns/promises"],
7+
external: ["@azure/app-configuration", "@azure/keyvault-secrets", "@azure/core-rest-pipeline", "crypto", "dns/promises", "@microsoft/feature-management"],
88
input: "src/index.ts",
99
output: [
1010
{

src/AzureAppConfigurationImpl.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import {
3333
CONDITIONS_KEY_NAME,
3434
CLIENT_FILTERS_KEY_NAME
3535
} from "./featureManagement/constants.js";
36+
import { FM_PACKAGE_NAME } from "./requestTracing/constants.js";
3637
import { AzureKeyVaultKeyValueAdapter } from "./keyvault/AzureKeyVaultKeyValueAdapter.js";
3738
import { RefreshTimer } from "./refresh/RefreshTimer.js";
3839
import { RequestTracingOptions, getConfigurationSettingWithTrace, listConfigurationSettingsWithTrace, requestTracingEnabled } from "./requestTracing/utils.js";
@@ -65,6 +66,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
6566
#isInitialLoadCompleted: boolean = false;
6667
#isFailoverRequest: boolean = false;
6768
#featureFlagTracing: FeatureFlagTracingOptions | undefined;
69+
#fmVersion: string | undefined;
6870

6971
// Refresh
7072
#refreshInProgress: boolean = false;
@@ -184,7 +186,8 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
184186
initialLoadCompleted: this.#isInitialLoadCompleted,
185187
replicaCount: this.#clientManager.getReplicaCount(),
186188
isFailoverRequest: this.#isFailoverRequest,
187-
featureFlagTracing: this.#featureFlagTracing
189+
featureFlagTracing: this.#featureFlagTracing,
190+
fmVersion: this.#fmVersion
188191
};
189192
}
190193

@@ -226,6 +229,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
226229
* Loads the configuration store for the first time.
227230
*/
228231
async load() {
232+
await this.#inspectFmPackage();
229233
await this.#loadSelectedAndWatchedKeyValues();
230234
if (this.#featureFlagEnabled) {
231235
await this.#loadFeatureFlags();
@@ -316,6 +320,21 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
316320
return new Disposable(remove);
317321
}
318322

323+
/**
324+
* Inspects the feature management package version.
325+
*/
326+
async #inspectFmPackage() {
327+
if (this.#requestTracingEnabled && !this.#fmVersion) {
328+
try {
329+
// get feature management package version
330+
const fmPackage = await import(FM_PACKAGE_NAME);
331+
this.#fmVersion = fmPackage?.VERSION;
332+
} catch (error) {
333+
// ignore the error
334+
}
335+
}
336+
}
337+
319338
async #refreshTasks(): Promise<void> {
320339
const refreshTasks: Promise<boolean>[] = [];
321340
if (this.#refreshEnabled) {

src/ConfigurationClientManager.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ export class ConfigurationClientManager {
8585
this.#isFailoverable = false;
8686
return;
8787
}
88+
if (this.#dns) {
89+
return;
90+
}
8891

8992
try {
9093
this.#dns = await import("dns/promises");

src/requestTracing/constants.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ export const FAILOVER_REQUEST_TAG = "Failover";
5555
export const FEATURES_KEY = "Features";
5656
export const LOAD_BALANCE_CONFIGURED_TAG = "LB";
5757

58+
// Feature management package
59+
export const FM_PACKAGE_NAME = "@microsoft/feature-management";
60+
export const FM_VERSION_KEY = "FMJsVer";
61+
5862
// Feature flag usage tracing
5963
export const FEATURE_FILTER_TYPE_KEY = "Filter";
6064
export const CUSTOM_FILTER_KEY = "CSTM";

src/requestTracing/utils.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ import {
2727
REPLICA_COUNT_KEY,
2828
FAILOVER_REQUEST_TAG,
2929
FEATURES_KEY,
30-
LOAD_BALANCE_CONFIGURED_TAG
30+
LOAD_BALANCE_CONFIGURED_TAG,
31+
FM_VERSION_KEY
3132
} from "./constants";
3233

3334
export interface RequestTracingOptions {
@@ -37,6 +38,7 @@ export interface RequestTracingOptions {
3738
replicaCount: number;
3839
isFailoverRequest: boolean;
3940
featureFlagTracing: FeatureFlagTracingOptions | undefined;
41+
fmVersion: string | undefined;
4042
}
4143

4244
// Utils
@@ -119,6 +121,9 @@ export function createCorrelationContextHeader(requestTracingOptions: RequestTra
119121
if (requestTracingOptions.replicaCount > 0) {
120122
keyValues.set(REPLICA_COUNT_KEY, requestTracingOptions.replicaCount.toString());
121123
}
124+
if (requestTracingOptions.fmVersion) {
125+
keyValues.set(FM_VERSION_KEY, requestTracingOptions.fmVersion);
126+
}
122127

123128
// Compact tags: Features=LB+...
124129
if (appConfigOptions?.loadBalancingEnabled) {

0 commit comments

Comments
 (0)