Skip to content

Commit 4db7392

Browse files
WIP
1 parent 7d45d1c commit 4db7392

File tree

5 files changed

+30
-24
lines changed

5 files changed

+30
-24
lines changed

src/AzureAppConfigurationImpl.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import { IKeyValueAdapter } from "./IKeyValueAdapter";
99
import { JsonKeyValueAdapter } from "./JsonKeyValueAdapter";
1010
import { DEFAULT_REFRESH_INTERVAL_IN_MS, MIN_REFRESH_INTERVAL_IN_MS } from "./RefreshOptions";
1111
import { Disposable } from "./common/disposable";
12-
import { FEATURE_FLAGS_KEY_NAME, FEATURE_MANAGEMENT_KEY_NAME, CONDITIONS_KEY_NAME, CLIENT_FILTERS_KEY_NAME } from "./featureManagement/constants";
12+
import { FEATURE_FLAGS_KEY_NAME, FEATURE_MANAGEMENT_KEY_NAME, CONDITIONS_KEY_NAME, CLIENT_FILTERS_KEY_NAME, NAME_KEY_NAME } from "./featureManagement/constants";
1313
import { AzureKeyVaultKeyValueAdapter } from "./keyvault/AzureKeyVaultKeyValueAdapter";
1414
import { RefreshTimer } from "./refresh/RefreshTimer";
1515
import { getConfigurationSettingWithTrace, listConfigurationSettingsWithTrace, requestTracingEnabled } from "./requestTracing/utils";
16-
import { FeatureFlagTracing } from "./requestTracing/FeatureFlagTracing";
16+
import { FeatureFlagTracingOptions } from "./requestTracing/FeatureFlagTracingOptions";
1717
import { KeyFilter, LabelFilter, SettingSelector } from "./types";
1818

1919
type PagedSettingSelector = SettingSelector & {
@@ -39,7 +39,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
3939
#client: AppConfigurationClient;
4040
#options: AzureAppConfigurationOptions | undefined;
4141
#isInitialLoadCompleted: boolean = false;
42-
#featureFlagTracing: FeatureFlagTracing = new FeatureFlagTracing();
42+
#featureFlagTracing: FeatureFlagTracingOptions = new FeatureFlagTracingOptions();
4343

4444
// Refresh
4545
#refreshInterval: number = DEFAULT_REFRESH_INTERVAL_IN_MS;
@@ -258,6 +258,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
258258
}
259259

260260
async #loadFeatureFlags() {
261+
this.#featureFlagTracing.resetFeatureFlagTracing();
261262
const featureFlagSettings: ConfigurationSetting[] = [];
262263
for (const selector of this.#featureFlagSelectors) {
263264
const listOptions: ListConfigurationSettingsOptions = {
@@ -544,7 +545,11 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
544545
}
545546
const featureFlag = JSON.parse(rawFlag);
546547

547-
548+
if (featureFlag[CONDITIONS_KEY_NAME] && featureFlag[CONDITIONS_KEY_NAME][CLIENT_FILTERS_KEY_NAME]) {
549+
for (const filter of featureFlag[CONDITIONS_KEY_NAME][CLIENT_FILTERS_KEY_NAME]) {
550+
this.#featureFlagTracing.updateFeatureFilterTracing(filter[NAME_KEY_NAME]);
551+
}
552+
}
548553

549554
return featureFlag;
550555
}

src/featureManagement/constants.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,8 @@
44
export const FEATURE_MANAGEMENT_KEY_NAME = "feature_management";
55
export const FEATURE_FLAGS_KEY_NAME = "feature_flags";
66
export const CONDITIONS_KEY_NAME = "conditions";
7-
export const CLIENT_FILTERS_KEY_NAME = "client_filters";
7+
export const CLIENT_FILTERS_KEY_NAME = "client_filters";
8+
export const NAME_KEY_NAME = "name";
9+
10+
export const TIME_WINDOW_FILTER_NAMES = ["TimeWindow", "Microsoft.TimeWindow", "TimeWindowFilter", "Microsoft.TimeWindowFilter"];
11+
export const TARGETING_FILTER_NAMES = ["Targeting", "Microsoft.Targeting", "TargetingFilter", "Microsoft.TargetingFilter"];

src/requestTracing/FeatureFlagTracing.ts renamed to src/requestTracing/FeatureFlagTracingOptions.ts

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

4-
import {
5-
CUSTOM_FILTER_KEY,
6-
TIME_WINDOW_FILTER_KEY,
7-
TARGETING_FILTER_KEY,
8-
DELIMITER
9-
} from "./constants";
4+
import { TIME_WINDOW_FILTER_NAMES, TARGETING_FILTER_NAMES } from "../featureManagement/constants";
5+
import { CUSTOM_FILTER_KEY, TIME_WINDOW_FILTER_KEY, TARGETING_FILTER_KEY, DELIMITER } from "./constants";
106

117
/**
128
* Tracing for tracking feature flag usage.
139
*/
14-
export class FeatureFlagTracing {
15-
#timeWindowFilterNames: string[] = ["TimeWindow", "Microsoft.TimeWindow", "TimeWindowFilter", "Microsoft.TimeWindowFilter"];
16-
#targetingFilterNames: string[] = ["Targeting", "Microsoft.Targeting", "TargetingFilter", "Microsoft.TargetingFilter"];
17-
10+
export class FeatureFlagTracingOptions {
1811
/**
1912
* Built-in feature filter usage.
2013
*/
@@ -29,9 +22,9 @@ export class FeatureFlagTracing {
2922
}
3023

3124
updateFeatureFilterTracing(filterName: string): void {
32-
if (this.#timeWindowFilterNames.some(name => name.toLowerCase() === filterName.toLowerCase())) {
25+
if (TIME_WINDOW_FILTER_NAMES.some(name => name === filterName)) {
3326
this.usesTimeWindowFilter = true;
34-
} else if (this.#targetingFilterNames.some(name => name.toLowerCase() === filterName.toLowerCase())) {
27+
} else if (TARGETING_FILTER_NAMES.some(name => name === filterName)) {
3528
this.usesTargetingFilter = true;
3629
} else {
3730
this.usesCustomFilter = true;

src/requestTracing/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export enum RequestType {
4848
export const KEY_VAULT_CONFIGURED_TAG = "UsesKeyVault";
4949

5050
// Feature Flag Usage Tracing
51+
export const FEATURE_FILTER_TYPE_KEY = "Filter";
5152
export const CUSTOM_FILTER_KEY = "CSTM";
5253
export const TIME_WINDOW_FILTER_KEY = "TIME";
5354
export const TARGETING_FILTER_KEY = "TRGT";

src/requestTracing/utils.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33

44
import { AppConfigurationClient, ConfigurationSettingId, GetConfigurationSettingOptions, ListConfigurationSettingsOptions } from "@azure/app-configuration";
55
import { AzureAppConfigurationOptions } from "../AzureAppConfigurationOptions";
6-
import { FeatureFlagTracing } from "./FeatureFlagTracing";
6+
import { FeatureFlagTracingOptions } from "./FeatureFlagTracingOptions";
77
import {
88
AZURE_FUNCTION_ENV_VAR,
99
AZURE_WEB_APP_ENV_VAR,
1010
CONTAINER_APP_ENV_VAR,
1111
DEV_ENV_VAL,
1212
ENV_AZURE_APP_CONFIGURATION_TRACING_DISABLED,
1313
ENV_KEY,
14+
FEATURE_FILTER_TYPE_KEY,
1415
HOST_TYPE_KEY,
1516
HostType,
1617
KEY_VAULT_CONFIGURED_TAG,
@@ -29,18 +30,18 @@ export function listConfigurationSettingsWithTrace(
2930
requestTracingEnabled: boolean;
3031
initialLoadCompleted: boolean;
3132
appConfigOptions: AzureAppConfigurationOptions | undefined;
32-
featureFlagTracingOptions: FeatureFlagTracing | undefined;
33+
featureFlagTracingOptions: FeatureFlagTracingOptions | undefined;
3334
},
3435
client: AppConfigurationClient,
3536
listOptions: ListConfigurationSettingsOptions
3637
) {
37-
const { requestTracingEnabled, initialLoadCompleted, appConfigOptions } = requestTracingOptions;
38+
const { requestTracingEnabled, initialLoadCompleted, appConfigOptions, featureFlagTracingOptions } = requestTracingOptions;
3839

3940
const actualListOptions = { ...listOptions };
4041
if (requestTracingEnabled) {
4142
actualListOptions.requestOptions = {
4243
customHeaders: {
43-
[CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(appConfigOptions, initialLoadCompleted)
44+
[CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(appConfigOptions, featureFlagTracingOptions, initialLoadCompleted)
4445
}
4546
};
4647
}
@@ -53,26 +54,27 @@ export function getConfigurationSettingWithTrace(
5354
requestTracingEnabled: boolean;
5455
initialLoadCompleted: boolean;
5556
appConfigOptions: AzureAppConfigurationOptions | undefined;
57+
featureFlagTracingOptions: FeatureFlagTracingOptions | undefined;
5658
},
5759
client: AppConfigurationClient,
5860
configurationSettingId: ConfigurationSettingId,
5961
getOptions?: GetConfigurationSettingOptions,
6062
) {
61-
const { requestTracingEnabled, initialLoadCompleted, appConfigOptions } = requestTracingOptions;
63+
const { requestTracingEnabled, initialLoadCompleted, appConfigOptions, featureFlagTracingOptions } = requestTracingOptions;
6264
const actualGetOptions = { ...getOptions };
6365

6466
if (requestTracingEnabled) {
6567
actualGetOptions.requestOptions = {
6668
customHeaders: {
67-
[CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(appConfigOptions, initialLoadCompleted)
69+
[CORRELATION_CONTEXT_HEADER_NAME]: createCorrelationContextHeader(appConfigOptions, featureFlagTracingOptions, initialLoadCompleted)
6870
}
6971
};
7072
}
7173

7274
return client.getConfigurationSetting(configurationSettingId, actualGetOptions);
7375
}
7476

75-
export function createCorrelationContextHeader(options: AzureAppConfigurationOptions | undefined, isInitialLoadCompleted: boolean): string {
77+
export function createCorrelationContextHeader(options: AzureAppConfigurationOptions | undefined, featureFlagTracing: FeatureFlagTracingOptions | undefined, isInitialLoadCompleted: boolean): string {
7678
/*
7779
RequestType: 'Startup' during application starting up, 'Watch' after startup completed.
7880
Host: identify with defined envs
@@ -83,6 +85,7 @@ export function createCorrelationContextHeader(options: AzureAppConfigurationOpt
8385
keyValues.set(REQUEST_TYPE_KEY, isInitialLoadCompleted ? RequestType.WATCH : RequestType.STARTUP);
8486
keyValues.set(HOST_TYPE_KEY, getHostType());
8587
keyValues.set(ENV_KEY, isDevEnvironment() ? DEV_ENV_VAL : undefined);
88+
keyValues.set(FEATURE_FILTER_TYPE_KEY, featureFlagTracing?.usesAnyFeatureFilter() ? featureFlagTracing.createFeatureFiltersString() : undefined);
8689

8790
const tags: string[] = [];
8891
if (options?.keyVaultOptions) {

0 commit comments

Comments
 (0)