SDK du serveur App Configuration pour Python
Le service App Configuration fournit un SDK à intégrer à votre application Python.
Intégration du SDK du serveur pour Python
Le service App Configuration fournit un SDK à intégrer à votre application Python. Vous pouvez évaluer les valeurs de votre indicateur de fonctionnalité ou de votre propriété en intégrant le SDK App Configuration.
-
Utilisez l'une des méthodes suivantes pour installer le kit de développement de logiciels :
Utilisation
pippip install --upgrade ibm-appconfiguration-python-sdkUtilisation
easy_installeasy_install --upgrade ibm-appconfiguration-python-sdk -
Dans votre code d'application Python, incluez le module SDK avec :
from ibm_appconfiguration import AppConfiguration, Feature, Property, ConfigurationType -
Initialisez le sdk pour vous connecter à votre instance de service App Configuration.
appconfig_client = AppConfiguration.get_instance() appconfig_client.init(region='region', guid='guid', apikey='apikey') appconfig_client.set_context(collection_id='airlines-webapp', environment_id='dev')Où :
region: Nom de la région où l'instance de service App Configuration est créée. Voir la liste des lieux pris en charge ici. Ex:-us-south,au-sydetc.guid: GUID du service App Configuration. Vous pouvez l'obtenir à partir de la section des données d'identification du service du tableau de bord de service App Configuration.apikeyApiKey le service App Configuration est un service d'information et de conseil sur la santé et la sécurité au travail. Vous pouvez l'obtenir à partir de la section des données d'identification du service du tableau de bord de service App Configuration.collection_id: ID de la collection créée dans l'instance de service App Configuration.environment_id: ID de l'environnement créé dans l'instance de service App Configuration.
Le
init()etset_context()sont les méthodes d'initialisation et ne doivent être invoquées qu'une seule fois à l'aide de appconfig_client. L'appconfig_client, lorsqu'il est initialisé, peut être obtenu entre les modules à l'aide deAppConfiguration.get_instance(). Pour plus d'informations, voir Extraction de l'élément appconfig_client sur d'autres modules.
Utilisation de noeuds finaux privés
Définissez le SDK pour qu'il se connecte au service App Configuration en utilisant un noeud final privé accessible uniquement via le réseau privé IBM Cloud.
appconfig_client.use_private_endpoint(True);
Cette opération doit être effectuée avant d'appeler la fonction init sur le SDK.
Option permettant d'utiliser une mémoire cache persistante pour la configuration
Pour que votre application et votre SDK continuent à fonctionner même dans le cas improbable d'un arrêt du service App Configuration, à travers le redémarrage de votre application, vous pouvez configurer le SDK pour qu'il fonctionne en utilisant un cache persistant. Le kit de développement de logiciels utilise le cache persistant pour stocker les données App Configuration disponibles lors du redémarrage de votre application.
# 1. default (without persistent cache)
appconfig_client.set_context(collection_id='airlines-webapp', environment_id='dev')
# 2. optional (with persistent cache)
appconfig_client.set_context(collection_id='airlines-webapp', environment_id='dev', options={
'persistent_cache_dir': '/var/lib/docker/volumes/'
})
Où :
-
persistent_cache_dir: Chemin absolu vers un répertoire pour lequel l'utilisateur dispose d'une autorisation de lecture et d'écriture. Le SDK crée un fichier -appconfiguration.json- dans le répertoire spécifié, et l'utilise comme cache persistant pour stocker les informations du service App Configuration.Lorsque le cache persistant est activé, le SDK conserve la dernière bonne configuration connue dans le cache persistant. Si le serveur App Configuration est inaccessible, les dernières configurations du cache persistant sont chargées dans l'application pour qu'elle puisse continuer à fonctionner.
Vérifiez que le fichier cache créé dans le répertoire indiqué n'est pas perdu ou supprimé dans tous les cas. Par exemple, prenez en compte le cas où un pod kubernetes est redémarré et que le fichier cache (appconfiguration.json)
a été stocké dans un volume éphémère du pod. Lorsque le pod est redémarré, kubernetes détruit le volume ephermal dans le pod, ce qui entraîne la suppression du fichier cache. Par conséquent, assurez-vous que le fichier cache créé par le
SDK est toujours stocké dans le volume persistant en fournissant le chemin absolu correct du répertoire persistant.
Options hors ligne
Le kit de développement de logiciels est également conçu pour servir des configurations et effectuer des évaluations de propriété et d'indicateur de fonction sans être connecté au service App Configuration.
appconfig_client.set_context(collection_id='collection_id', environment_id='environment_id', options={
'bootstrap_file': 'saflights/flights.json',
'live_config_update_enabled': False
})
Où :
bootstrap_file: Chemin absolu du fichier JSON, qui contient les détails de la configuration. Veillez à fournir un fichier JSON approprié. Vous pouvez générer ce fichier en utilisant la commandeibmcloud ac exportdu CLI IBM Cloud App Configuration.live_config_update_enabled: Mise à jour en direct de la configuration à partir du serveur. Définissez cette valeur surFalsesi les nouvelles valeurs de configuration ne doivent pas être récupérées sur le serveur. Par défaut, cette valeur est définie sur True.
Exemples d'utilisation des API liées aux fonctions et aux propriétés
Reportez-vous aux exemples répertoriés pour utiliser la fonction et les API associées à la propriété.
Extraction d'une fonctionnalité
feature = appconfig_client.get_feature('online-check-in') # feature can be None incase of an invalid feature id
if feature is not None:
print(f'Feature Name : {0}'.format(feature.get_feature_name()))
print(f'Feature Id : {0}'.format(feature.get_feature_id()))
print(f'Feature Data Type : {0}'.format(feature.get_feature_data_type()))
if feature.is_enabled():
# feature flag is enabled
else:
# feature flag is disabled
Extraction de toutes les fonctionnalités
features_dictionary = appconfig_client.get_features()
Evaluation des fonctionnalités
Vous pouvez utiliser la méthode feature.get_current_value(entity_id, entity_attributes) pour évaluer la valeur de l'indicateur de caractéristique. Cette méthode renvoie l'une des valeurs Activé, Désactivé ou Remplace en fonction
de l'évaluation. Le type de données de la valeur renvoyée correspond à celui de l'indicateur de fonction.
entity_id = "john_doe"
entity_attributes = {
'city': 'Bangalore',
'country': 'India'
}
feature_value = feature.get_current_value(entity_id=entity_id, entity_attributes=entity_attributes)
-
entity_id: ID de l'entité. Il s'agit d'un identificateur de chaîne lié à l'entité par rapport à laquelle la fonction est évaluée. Par exemple, une entité peut être une instance d'une application qui s'exécute sur un appareil mobile, un microservice qui s'exécute sur le cloud ou un composant d'infrastructure qui exécute ce microservice. Pour qu'une entité interagisse avec App Configuration, elle doit fournir un ID d'entité unique. -
entity_attributes: objet JSON composé du nom d'attribut et de ses valeurs qui définissent l'entité spécifiée. Il s'agit d'un paramètre facultatif si l'indicateur de fonction n'est pas configuré avec une définition de ciblage. Si le ciblage est configuré,entity_attributesdoit être fourni pour l'évaluation de la règle. Un attribut est un paramètre utilisé pour définir un segment. Le SDK utilise les valeurs d'attribut pour déterminer si l'entité spécifiée satisfait aux règles de ciblage et renvoie la valeur d'indicateur de fonction appropriée.
Extraction d'une propriété
property = appconfig_client.get_property('check-in-charges') # property can be None incase of an invalid property id
if property is not None:
print(f'Property Name : {0}'.format(property.get_property_name()))
print(f'Property Id : {0}'.format(property.get_property_id()))
print(f'Property Data Type : {0}'.format(property.get_property_data_type()))
Extraction de toutes les propriétés
properties_dictionary = appconfig_client.get_properties()
Evaluation des propriétés
Vous pouvez utiliser la méthode property.get_current_value(entity_id=entity_id, entity_attributes=entity_attributes) pour évaluer la valeur du bien. Cette méthode renvoie la valeur de propriété par défaut ou sa valeur remplacée
en fonction de l'évaluation. Le type de données de la valeur renvoyée correspond à celui de la propriété.
entity_id = "john_doe"
entity_attributes = {
'city': 'Bangalore',
'country': 'India'
}
property_value = property.get_current_value(entity_id=entity_id, entity_attributes=entity_attributes)
-
entity_id: ID de l'entité. Il s'agit d'un identificateur de chaîne lié à l'entité par rapport à laquelle la propriété est évaluée. Par exemple, une entité peut être une instance d'une application qui s'exécute sur un appareil mobile, un microservice qui s'exécute sur le cloud ou un composant d'infrastructure qui exécute ce microservice. Pour qu'une entité interagisse avec App Configuration, elle doit fournir un ID d'entité unique. -
entity_attributes: objet JSON composé du nom d'attribut et de ses valeurs qui définissent l'entité spécifiée. Il s'agit d'un paramètre facultatif si la propriété n'est configurée avec aucune définition de ciblage. Si le ciblage est configuré,entity_attributesdoit être fourni pour l'évaluation de la règle. Un attribut est un paramètre utilisé pour définir un segment. Le SDK utilise les valeurs d'attribut pour déterminer si l'entité spécifiée satisfait aux règles de ciblage et renvoie la valeur de propriété appropriée.
Extraction de appconfig_client sur d'autres modules
Lorsque le SDK est initialisé, l'appconfig_client peut être obtenu à travers d'autres modules comme indiqué :
# **other modules**
from ibm_appconfiguration import AppConfiguration
appconfig_client = AppConfiguration.get_instance()
feature = appconfig_client.get_feature('online-check-in')
enabled = feature.is_enabled()
feature_value = feature.get_current_value(entity_id, entity_attributes)
Types de données pris en charge
Vous pouvez configurer des indicateurs de fonction et des propriétés avec le service App Configuration, en prenant en charge les types de données suivants : Booléen, Numérique et Chaîne. Le type de données Chaîne peut être le format d'une chaîne TEXT, JSON ou YAML. Le kit de développement de logiciels traite chaque format comme indiqué dans le tableau.
| Valeur de la fonction ou de la propriété | Type de données | Format de données | Type de données renvoyées par GetCurrentValue() |
Exemple de sortie |
|---|---|---|---|---|
true |
BOOLEAN | Non applicable | bool |
true |
25 |
NUMERIC | Non applicable | int |
25 |
| "a string text" | CHAINE | TEXT | string |
a string text |
{"firefox": {"name": "Firefox","pref_url": "about:config"} } |
CHAINE | JSON | Dictionary or List of Dictionary |
{'firefox': {'name': 'Firefox', 'pref_url': 'about:config'}} |
men:- John Smith- Bill Joneswomen:- Mary Smith- Susan Williams |
CHAINE | YAML | Dictionary |
{'men': ['John Smith', 'Bill Jones'], 'women': ['Mary Smith', 'Susan Williams']} |
Indicateur de fonction
feature = appconfig_client.get_feature('json-feature')
feature.get_feature_data_type() // STRING
feature.get_feature_data_format() // JSON
feature.get_current_value(entityId, entityAttributes) // returns single dictionary object or list of dictionary object
// Example Below
// input json :- [{"role": "developer", "description": "do coding"},{"role": "tester", "description": "do testing"}]
// expected output :- "do coding"
tar_val = feature.get_current_value(entityId, entityAttributes)
expected_output = tar_val[0]['description']
// input json :- {"role": "tester", "description": "do testing"}
// expected output :- "tester"
tar_val = feature.get_current_value(entityId, entityAttributes)
expected_output = tar_val['role']
feature = appconfig_client.getFeature('yaml-feature')
feature.get_feature_data_type() // STRING
feature.get_feature_data_format() // YAML
feature.get_current_value(entityId, entityAttributes) // returns dictionary object
// Example Below
// input yaml string :- "---\nrole: tester\ndescription: do_testing"
// expected output :- "do_testing"
tar_val = feature.get_current_value(entityId, entityAttributes)
expected_output = tar_val['description']
Propriété
property = appconfig_client.get_property('json-property')
property.get_property_data_type() // STRING
property.get_property_data_format() // JSON
property.get_current_value(entityId, entityAttributes) // returns single dictionary object or list of dictionary object
// Example Below
// input json :- [{"role": "developer", "description": "do coding"},{"role": "tester", "description": "do testing"}]
// expected output :- "do coding"
tar_val = property.get_current_value(entityId, entityAttributes)
expected_output = tar_val[0]['description']
// input json :- {"role": "tester", "description": "do testing"}
// expected output :- "tester"
tar_val = property.get_current_value(entityId, entityAttributes)
expected_output = tar_val['role']
property = appconfig_client.get_property('yaml-property')
property.get_property_data_type() // STRING
property.get_property_data_format() // YAML
property.get_current_value(entityId, entityAttributes) // returns dictionary object
// Example Below
// input yaml string :- "---\nrole: tester\ndescription: do_testing"
// expected output :- "do_testing"
tar_val = property.get_current_value(entityId, entityAttributes)
expected_output = tar_val['description']
Définir le programme d'écoute pour les modifications de données de la fonction et de la propriété
Le SDK fournit un mécanisme de notification en temps réel lorsque la configuration des drapeaux ou des propriétés est modifiée. Vous pouvez vous abonner aux changements de configuration en utilisant le même appconfig_client.
def configuration_update(self):
print('Received updates on configurations')
# **add your code**
# To find the effect of any configuration changes, you can call the feature or property related methods
# feature = appconfig_client.getFeature('online-check-in')
# new_value = feature.get_current_value(entity_id, entity_attributes)
appconfig_client.register_configuration_update_listener(configuration_update)
Extraction des données les plus récentes
appconfig_client.fetch_configurations()