Skip to content

Commit a5c9ae4

Browse files
Merge pull request #311388 from mrm9084/PythonMissingRefrenceSections
App Config Python Provider - Missing Reference Features
2 parents 8f3bdd8 + 557b2aa commit a5c9ae4

3 files changed

Lines changed: 99 additions & 10 deletions

File tree

articles/azure-app-configuration/configuration-provider-overview.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ author: zhiyuanliang-ms
77
ms.author: zhiyuanliang
88
ms.service: azure-app-configuration
99
ms.topic: overview
10-
ms.date: 01/22/2025
10+
ms.date: 02/04/2026
1111
#Customer intent: I want to learn about the configuration provider libraries of different languages, specifically to track their feature development status.
1212
ms.custom:
1313
- build-2025
@@ -52,26 +52,26 @@ Connection String Authentication | [GA](./reference-dotnet-provider.md#load-conf
5252
Entra ID Authentication | [GA](./reference-dotnet-provider.md#load-configuration) | [GA](/azure/developer/java/spring-framework/app-configuration-support#spring-cloud-azure-configuration) | GA | [GA](./reference-python-provider.md?tabs=entra-id#load-configuration) | [GA](./reference-javascript-provider.md#load-configuration) | [GA](./reference-go-provider.md#load-configuration)
5353
Dynamic Refresh (Poll Mode) | [GA](./reference-dotnet-provider.md#refresh-on-sentinel-key) | [GA](/azure/developer/java/spring-framework/app-configuration-support#pull-based-refresh) | GA | [GA](./reference-python-provider.md#configuration-refresh) | [GA](./reference-javascript-provider.md#refresh-on-sentinel-key) | [GA](./reference-go-provider.md#refresh-on-sentinel-key)
5454
Dynamic Refresh (Push Mode) | GA | [GA](/azure/developer/java/spring-framework/app-configuration-support#push-based-refresh-not-recommended) | N/A | N/A | N/A | N/A
55-
Dynamic Refresh (Collection Monitoring) | [GA](./reference-dotnet-provider.md#configuration-refresh) | GA | GA | WIP | [GA](./reference-javascript-provider.md#configuration-refresh) | [GA](./reference-go-provider.md#configuration-refresh)
55+
Dynamic Refresh (Collection Monitoring) | [GA](./reference-dotnet-provider.md#configuration-refresh) | WIP | GA | WIP | [GA](./reference-javascript-provider.md#configuration-refresh) | [GA](./reference-go-provider.md#configuration-refresh)
5656
JSON Content Type Handling | [GA](./reference-dotnet-provider.md#json-content-type-handling) | [GA](/azure/developer/java/spring-framework/app-configuration-support#json) | GA | [GA](./reference-python-provider.md#json-content-type-handling) | [GA](./reference-javascript-provider.md#json-content-type-handling) | [GA](./reference-go-provider.md#json-content-type-handling)
57-
JSON with Comments | [GA](./reference-dotnet-provider.md#json-content-type-handling) | GA | GA | GA | [GA](./reference-javascript-provider.md#json-content-type-handling) | [GA](./reference-go-provider.md#json-content-type-handling)
58-
Configuration Setting Mapping | [GA](./reference-dotnet-provider.md#configuration-setting-mapping) | N/A | N/A | GA | N/A | N/A
57+
JSON with Comments | [GA](./reference-dotnet-provider.md#json-content-type-handling) | GA | GA | [GA](./reference-python-provider.md#json-content-type-handling) | [GA](./reference-javascript-provider.md#json-content-type-handling) | [GA](./reference-go-provider.md#json-content-type-handling)
58+
Configuration Setting Mapping | [GA](./reference-dotnet-provider.md#configuration-setting-mapping) | N/A | N/A | [GA](./reference-python-provider.md#configuration-setting-mapping) | N/A | N/A
5959
Key Vault References | [GA](./reference-dotnet-provider.md#key-vault-reference) | [GA](/azure/developer/java/spring-framework/app-configuration-support#key-vault-references) | GA | [GA](./reference-python-provider.md#key-vault-reference) | [GA](./reference-javascript-provider.md#key-vault-reference) | [GA](./reference-go-provider.md#key-vault-reference)
60-
Key Vault Secret Refresh | [GA](./reference-dotnet-provider.md#key-vault-secret-refresh) | WIP | GA | GA | [GA](./reference-javascript-provider.md#key-vault-secret-refresh) | [GA](./reference-go-provider.md#key-vault-secret-refresh)
60+
Key Vault Secret Refresh | [GA](./reference-dotnet-provider.md#key-vault-secret-refresh) | WIP | GA | [GA](./reference-python-provider.md#key-vault-secret-refresh) | [GA](./reference-javascript-provider.md#key-vault-secret-refresh) | [GA](./reference-go-provider.md#key-vault-secret-refresh)
6161
Custom Key Vault Secret Resolution | [GA](./reference-dotnet-provider.md#key-vault-reference) | [GA](/azure/developer/java/spring-framework/app-configuration-support#resolve-non-key-vault-secrets) | GA | [GA](./reference-python-provider.md#secret-resolver) | [GA](./reference-javascript-provider.md#key-vault-reference) | [GA](./reference-go-provider.md#custom-secret-resolver)
6262
Parallel Secret Resolution | WIP | N/A | WIP | N/A | [GA](./reference-javascript-provider.md#parallel-secret-resolution) | GA
6363
Feature Flags | [GA](./reference-dotnet-provider.md#feature-flag) | [GA](/azure/developer/java/spring-framework/app-configuration-support#feature-management) | GA | [GA](./reference-python-provider.md#feature-flag-refresh) | [GA](./reference-javascript-provider.md#feature-flag) | [GA](./reference-go-provider.md#feature-flags)
6464
Variant Feature Flags | [GA](./reference-dotnet-provider.md#feature-flag) | GA | GA | GA | [GA](./reference-javascript-provider.md#feature-flag) | [GA](./reference-go-provider.md#feature-flags)
65-
Feature Flag Telemetry | [GA](./reference-dotnet-provider.md#feature-flag-telemetry) | GA | GA | GA | GA | WIP
65+
Feature Flag Telemetry | [GA](./reference-dotnet-provider.md#feature-flag-telemetry) | GA | GA | [GA](./reference-python-provider.md#feature-flag-telemetry) | GA | WIP
6666
Key Prefix Trim | [GA](./reference-dotnet-provider.md#trim-prefix-from-keys) | GA | GA | [GA](./reference-python-provider.md#trimming-keys) | [GA](./reference-javascript-provider.md#trim-prefix-from-keys) | [GA](./reference-go-provider.md#trim-prefix-from-keys)
6767
Configurable Startup Time-out | [GA](./reference-dotnet-provider.md#startup-retry) | WIP | N/A | WIP | [GA](./reference-javascript-provider.md#startup-retry) | [GA](./reference-go-provider.md#startup-retry)
6868
Replica Auto Discovery | [GA](./reference-dotnet-provider.md#geo-replication) | [GA](/azure/developer/java/spring-framework/app-configuration-support#geo-replication) | GA | [GA](./reference-python-provider.md#geo-replication) | [GA](./reference-javascript-provider.md#geo-replication) | [GA](./reference-go-provider.md#geo-replication)
6969
Replica Failover | [GA](./reference-dotnet-provider.md#geo-replication) | [GA](/azure/developer/java/spring-framework/app-configuration-support#geo-replication) | GA | [GA](./reference-python-provider.md#geo-replication) | [GA](./reference-javascript-provider.md#geo-replication) | [GA](./reference-go-provider.md#geo-replication)
70-
Replica Load Balancing | [GA](./reference-dotnet-provider.md#geo-replication) | GA | GA | GA | [GA](./reference-javascript-provider.md#geo-replication) | [GA](./reference-go-provider.md#geo-replication)
70+
Replica Load Balancing | [GA](./reference-dotnet-provider.md#geo-replication) | GA | GA | [GA](./reference-python-provider.md#geo-replication) | [GA](./reference-javascript-provider.md#geo-replication) | [GA](./reference-go-provider.md#geo-replication)
7171
Snapshots | [GA](./reference-dotnet-provider.md#snapshot) | GA | GA | [GA](./reference-python-provider.md#load-configuration-from-snapshots) | [GA](./reference-javascript-provider.md#snapshot) | [GA](./reference-go-provider.md#snapshot)
7272
Distributed Tracing | [GA](./reference-dotnet-provider.md#distributed-tracing) | WIP | WIP | WIP | WIP | N/A
7373
Health Check | [GA](./reference-dotnet-provider.md#health-check) | [GA](/azure/developer/java/spring-framework/app-configuration-support#health-indicator) | WIP | WIP | WIP | N/A
74-
Select by Tag Filters | [GA](./reference-dotnet-provider.md#load-specific-key-values-using-selectors) | WIP | GA | GA | [GA](./reference-javascript-provider.md#tag-filters) | [GA](./reference-go-provider.md#tag-filters)
74+
Select by Tag Filters | [GA](./reference-dotnet-provider.md#load-specific-key-values-using-selectors) | WIP | GA | [GA](./reference-python-provider.md#tag-filters) | [GA](./reference-javascript-provider.md#tag-filters) | [GA](./reference-go-provider.md#tag-filters)
7575
Snapshot Reference | [GA](./reference-dotnet-provider.md#snapshot-reference) | WIP | WIP | WIP | [GA](./reference-javascript-provider.md#snapshot-reference) | WIP
7676
Load from Azure Front Door | [Preview](./reference-dotnet-provider.md#connect-to-azure-front-door) | WIP | WIP | WIP | [Preview](./reference-javascript-provider.md#connect-to-azure-front-door) | WIP
7777

articles/azure-app-configuration/feature-management-overview.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ author: zhiyuanliang-ms
77
ms.author: zhiyuanliang
88
ms.service: azure-app-configuration
99
ms.topic: overview
10-
ms.date: 01/22/2025
10+
ms.date: 02/04/2026
1111
#Customer intent: I want to learn about the feature management libraries of different languages, specifically to track their feature development status.
1212
ms.custom:
1313
- build-2025

articles/azure-app-configuration/reference-python-provider.md

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ ms.service: azure-app-configuration
99
ms.devlang: python
1010
ms.custom: devx-track-python
1111
ms.topic: tutorial
12-
ms.date: 12/11/2025
12+
ms.date: 02/04/2026
1313
#Customer intent: I want to learn how to use Azure App Configuration Python client library.
1414
---
1515

@@ -94,6 +94,9 @@ size = appConfig["font"]["size"]
9494
color = appConfig["font"]["color"]
9595
```
9696

97+
> [!NOTE]
98+
> Starting with version *2.2.0* of `azure-appconfiguration-provider`, the configuration provider allows comments, as defined in ([JSONC](https://jsonc.org/)), in key-values with an `application/json` content type.
99+
97100
### Load specific key-values using selectors
98101

99102
By default, the `load` method loads all configurations with no label from the configuration store. You can configure the behavior of the `load` method through the optional parameter of `selects`, which is a list of `SettingSelector`s.
@@ -113,6 +116,21 @@ config = load(endpoint=endpoint, credential=DefaultAzureCredential(), selects=se
113116
> [!NOTE]
114117
> Key-values are loaded in the order in which the selectors are listed. If multiple selectors retrieve key-values with the same key, the value from the last one overrides any previously loaded value.
115118
119+
#### Tag filters
120+
121+
The tag filters parameter selects key-values with specific tags. A key-value is only loaded if it has all of the tags and corresponding values specified in the filters.
122+
123+
```python
124+
from azure.appconfiguration.provider import load, SettingSelector
125+
from azure.identity import DefaultAzureCredential
126+
tag_filters = [{"env": "prod"}, {"region": "us"}]
127+
selects = [SettingSelector(key_filter="*", label_filter="*", tag_filters=tag_filters)]
128+
config = load(endpoint=endpoint, credential=DefaultAzureCredential(), selects=selects)
129+
```
130+
131+
> [!NOTE]
132+
> The characters asterisk (`*`), comma (`,`), and backslash (`\`) are reserved and must be escaped with a backslash when used in a tag filter.
133+
116134
### Load configuration from snapshots
117135

118136
You can load configuration settings from [snapshots](./concept-snapshots.md) by using the `snapshot_name` parameter in `SettingSelector`. When you specify a snapshot name, all configuration settings from that snapshot are loaded. The `snapshot_name` parameter can't be used with `key_filter`, `label_filter`, or `tag_filters`.
@@ -142,6 +160,43 @@ config = load(endpoint=endpoint, credential=DefaultAzureCredential(), trim_prefi
142160
print(config["message"]) # Access the key "message" instead of "/application/message"
143161
```
144162

163+
### Configuration setting mapping
164+
165+
The `configuration_mapper` parameter allows you to transform configuration settings before they're processed and added to the provider. The mapper function receives each `ConfigurationSetting` object and can modify it in-place.
166+
167+
```python
168+
from azure.appconfiguration.provider import load
169+
from azure.identity import DefaultAzureCredential
170+
171+
def my_mapper(setting):
172+
if setting.key == "message":
173+
setting.value = "transformed value"
174+
175+
config = load(endpoint=endpoint, credential=DefaultAzureCredential(), configuration_mapper=my_mapper)
176+
```
177+
178+
The mapper function is called for each configuration setting loaded from the store, allowing you to:
179+
180+
- Modify setting values before they're added
181+
- Transform or decrypt values
182+
- Perform custom processing based on the setting key, label, or content type
183+
184+
> [!NOTE]
185+
> The mapper is invoked before key trimming is applied. Use the original key when checking conditions in your mapper function.
186+
187+
For async operations, provide an async mapper function:
188+
189+
```python
190+
from azure.appconfiguration.provider.aio import load
191+
from azure.identity.aio import DefaultAzureCredential
192+
193+
async def my_async_mapper(setting):
194+
if setting.key == "secret_message":
195+
setting.value = await decrypt_value(setting.value)
196+
197+
config = await load(endpoint=endpoint, credential=DefaultAzureCredential(), configuration_mapper=my_async_mapper)
198+
```
199+
145200
## Configuration refresh
146201

147202
The provider can be configured to pull the latest settings from the App Configuration store without having to restart the application. You can use the `refresh_on` parameter to enable this behavior. The `refresh_on` parameter is a `List[WatchKey]`, which specifies the one or more key/labels to watch for changes. The loaded configuration is updated when any change of selected key-values is detected on the server. By default, a refresh interval of 30 seconds is used, but you can override it with the `refresh_interval` parameter.
@@ -225,6 +280,16 @@ print(f"Beta is: {feature_manager.is_enabled("Beta")}")
225280

226281
For more information about how to use the Python feature management library, go to the [feature flag quickstart](./quickstart-feature-flag-python.md).
227282

283+
### Feature flag telemetry
284+
285+
When feature flag telemetry is enabled, the Azure App Configuration provider injects additional properties to feature flag telemetry data. These properties provide more context about the feature flag and its evaluation:
286+
287+
- **AllocationID**: A unique identifier representing the state of the feature flag's allocation.
288+
- **ETag**: The current ETag for the feature flag.
289+
- **FeatureFlagReference**: A reference to the feature flag in the format of `<your_store_endpoint>kv/<feature_flag_key>`. When a label is present, the reference includes it as a query parameter: `<your_store_endpoint>kv/<feature_flag_key>?label=<feature_flag_label>`.
290+
291+
The full schema can be found in the [App Configuration Feature Evaluation Event schema definition](https://github.com/microsoft/FeatureManagement/blob/main/Schema/FeatureEvaluationEvent/AppConfigurationFeatureEvaluationEvent.v1.0.0.schema.json). For more information about how to use the feature flag telemetry, go to the [enable telemetry for feature flags](./howto-telemetry.md) walkthrough.
292+
228293
### Feature flag refresh
229294

230295
To enable refresh for feature flags, you need to set `feature_flag_refresh_enabled=True`. This parameter allows the provider to refresh feature flags the same way it refreshes configurations. Unlike configurations, all loaded feature flags are monitored for changes and cause a refresh. Refresh of configuration settings and feature flags are independent of each other. Both configuration settings and feature flags are updated by the `refresh` method, but a feature flag changing doesn't cause a refresh of configurations and vice versa. Also, if refresh for configuration settings isn't enabled, feature flags can still be enabled for refresh.
@@ -293,6 +358,30 @@ def secret_resolver(uri):
293358
config = load(endpoint=endpoint, credential=DefaultAzureCredential(), secret_resolver=secret_resolver)
294359
```
295360

361+
362+
### Key Vault secret refresh
363+
364+
Azure App Configuration enables you to configure secret refresh intervals independently of your configuration refresh cycle. This is crucial for security because while the Key Vault reference URI in App Configuration remains unchanged, the underlying secret in Key Vault might be rotated as part of your security practices.
365+
366+
To ensure your application always uses the most current secret values, configure the `secret_refresh_interval` key word in `load`. This forces the provider to retrieve fresh secret values from Key Vault when:
367+
368+
- Your application calls `refresh`
369+
- The configured refresh interval for the secret has elapsed
370+
371+
This mechanism works even when no changes are detected in your App Configuration store, ensuring your application stays in sync with rotated secrets.
372+
373+
```python
374+
from azure.appconfiguration.provider import load
375+
from azure.identity import DefaultAzureCredential
376+
377+
config = load(
378+
endpoint=endpoint,
379+
credential=DefaultAzureCredential(),
380+
keyvault_credential=DefaultAzureCredential(),
381+
secret_refresh_interval=7200 # 2 hours
382+
)
383+
```
384+
296385
## Geo-replication
297386

298387
The Azure App Configuration Provider library automatically discovers the provided configuration store's replicas and uses the replicas if any issue arises. For more information, see [geo-replication](./howto-geo-replication.md).

0 commit comments

Comments
 (0)