Routage par Tags & Tentatives
Les tags Apprise ne font pas que regrouper des services — ils peuvent piloter l’ordre de livraison, les chaînes de secours et le comportement en cas d’échec sans modifier une seule ligne de code applicatif.
Cette page explique comment configurer ces fonctionnalités dans vos fichiers de configuration et comment les contrôler depuis la bibliothèque Python ou la CLI.
Tags de Priorité
Section intitulée « Tags de Priorité »Chaque tag dans un fichier de configuration peut porter un préfixe numérique de priorité séparé par deux-points : N:nomdetag.
Les numéros inférieurs signifient une urgence plus haute — ils sont traités en premier.
# Priorité 1 -- canaux d'alerte principaux (urgence maximale)1:alerts=slack://tokenA/tokenB/tokenC1:alerts=discord://webhook_id/webhook_token
# Priorité 2 -- canaux secondaires (utilisés uniquement si la priorité 1 échoue entièrement)2:alerts=telegram://bottoken/chatid
# Priorité 5 -- dernier recours5:alerts=mailto://user:pass@example.comLes tags sans préfixe de priorité ont par défaut la priorité 0 (urgence maximale).
version: 1urls: # Priorité 1 -- canaux d'alerte principaux (urgence maximale) - slack://tokenA/tokenB/tokenC: tag: 1:alerts
- discord://webhook_id/webhook_token: tag: 1:alerts
# Priorité 2 -- canaux secondaires (utilisés uniquement si la priorité 1 échoue entièrement) - telegram://bottoken/chatid: tag: 2:alerts
# Priorité 5 -- dernier recours - mailto://user:pass@example.com: tag: 5:alertsLes tags sans préfixe de priorité ont par défaut la priorité 0 (urgence maximale).
Fonctionnement de l’Envoi
Section intitulée « Fonctionnement de l’Envoi »Mode Escalade (par défaut)
Section intitulée « Mode Escalade (par défaut) »Lorsque vous déclenchez un tag sans préfixe de priorité, Apprise utilise la chaîne d’escalade :
- Les services sont regroupés par priorité de tag configurée.
- Le groupe au numéro le plus bas (urgence la plus haute) s’exécute en premier.
- Si chaque service de ce groupe réussit, Apprise retourne
Trueimmédiatement — les groupes de numéros supérieurs ne sont jamais déclenchés. - Si un service du groupe échoue, Apprise escalade vers le niveau de priorité suivant.
# Déclencher tous les services 'alerts' avec la chaîne d'escalade.# Les entrées de priorité 1 s'exécutent en premier. Si elles réussissent toutes,# les entrées de priorité 5 ne sont jamais déclenchées.apobj.notify(body="Utilisation disque à 90%", tag="alerts")# Équivalent CLIapprise --config=config.yml --tag="alerts" --body="Utilisation disque à 90%"Formation des Groupes
Section intitulée « Formation des Groupes »Tous les services partageant le même nom de tag et le même numéro de priorité sont traités comme un seul groupe. Le groupe est considéré comme réussi uniquement si chaque service qu’il contient réussit. Si un seul service échoue, Apprise escalade immédiatement vers le groupe au numéro supérieur suivant.
Les tags sans préfixe numérique ont par défaut la priorité 0 — le niveau d’urgence le plus élevé. Cela signifie qu’il est possible de mélanger des versions simples et préfixées d’un même tag pour créer une chaîne d’escalade sans modifier les entrées d’URL existantes :
# Priorité 0 (par défaut, urgence maximale) -- ces deux entrées forment le premier groupeabc=slack://tokenA/tokenB/tokenCabc=discord://webhook_id/webhook_token
# Priorité 1 -- secours si le groupe de priorité 0 échoue1:abc=telegram://bottoken/chatidversion: 1urls: # Priorité 0 (par défaut, urgence maximale) -- ces deux entrées forment le premier groupe - slack://tokenA/tokenB/tokenC: tag: abc
- discord://webhook_id/webhook_token: tag: abc
# Priorité 1 -- secours si le groupe de priorité 0 échoue - telegram://bottoken/chatid: tag: 1:abcLorsque notify(tag="abc") est appelé avec la configuration ci-dessus :
- Le groupe de priorité 0 (Slack + Discord) s’exécute en premier.
- Si les deux réussissent,
Trueest retourné — Telegram n’est jamais contacté. - Si l’un ou l’autre échoue, Apprise escalade vers le groupe de priorité 1 (Telegram).
Les tags sans préfixe ayant par défaut la priorité 0, les définitions abc et 0:abc sont
entièrement équivalentes dans une configuration de service. Toutes deux placent le service dans le
groupe de priorité 0, et un filtre "abc" comme un filtre "0:abc" correspondent aux services
définis avec l’une ou l’autre forme. Si les deux formes figurent dans le même fichier de
configuration, ces services seront toujours distribués ensemble comme un groupe unique.
Mode Exclusif
Section intitulée « Mode Exclusif »Lorsque vous spécifiez un préfixe de priorité dans le filtre, Apprise ignore la chaîne d’escalade et ne notifie que les services dont le tag correspondant porte exactement cette priorité.
# Déclencher UNIQUEMENT les entrées 'alerts' configurées avec la priorité 2.# Les entrées de priorité 1 et 5 ne sont pas affectées.apobj.notify(body="Fenêtre de maintenance planifiée", tag="2:alerts")# Équivalent CLIapprise --config=config.yml --tag="2:alerts" --body="Fenêtre de maintenance planifiée"| Valeur du filtre | Comportement |
|---|---|
"alerts" | Chaîne d’escalade — priorité la plus haute (numéro le plus bas) d’abord |
"2:alerts" | Exclusif — uniquement les entrées alerts de priorité 2 |
"0:alerts" | Exclusif — uniquement les entrées de priorité 0 (alerts et 0:alerts sont identiques) |
Comportement en cas d’echec de chaine
Section intitulée « Comportement en cas d’echec de chaine »Quand notify() execute plusieurs chaines OR independantes en parallele, le comportement par defaut est de laisser chaque chaine se terminer avant de retourner — meme si une chaine a deja echoue. Cela garantit que chaque service configure obtient au moins une tentative.
Pour arreter immediatement tous les rounds d’escalade restants des qu’une chaine epuise ses groupes de priorite sans succes, definissez abort_on_chain_failure=True sur votre AppriseAsset :
from apprise import Apprise, AppriseAsset
asset = AppriseAsset(abort_on_chain_failure=True)apobj = Apprise(asset=asset)
# ...ajout des services...
# Si la chaine 'ops' echoue completement, Apprise s'arrete immediatement# et ne lance pas de nouveaux rounds d'escalade pour la chaine 'securite'.apobj.notify(body="Alerte critique", tag=["ops", "securite"])abort_on_chain_failure | Comportement en cas d’echec d’une chaine |
|---|---|
False (defaut) | Toutes les chaines se terminent ; chaque service est tente |
True | Les rounds restants sont ignores ; False est retourne immediatement |
Tentatives et Délai par Service
Section intitulée « Tentatives et Délai par Service »Chaque service peut être configuré avec son propre nombre de tentatives et délai inter-tentative. Ces paramètres sont indépendants de la chaîne d’escalade et s’appliquent à chaque échec de livraison.
retry— nombre de tentatives supplémentaires après le premier échec (0 = pas de nouvelle tentative).wait— secondes de pause entre les tentatives (décimales acceptées ; 0.0 = pas de pause).
Ajoutez ?retry=N et/ou ?wait=S directement à l’URL sous forme de paramètres de requête.
# jusqu'à 3 nouvelles tentatives, avec 5 secondes d'attente entre chacune1:alerts=slack://tokenA/tokenB/tokenC?retry=3&wait=5
# jusqu'à 2 nouvelles tentatives avec 1,5 seconde d'attente1:alerts=discord://webhook_id/webhook_token?retry=2&wait=1.5
# Canal de secours -- pas besoin de nouvelles tentatives (comportement par défaut)5:alerts=mailto://user:pass@example.comUtilisez les clés retry: et wait: sous chaque entrée d’URL.
version: 1urls: # jusqu'à 3 nouvelles tentatives, avec 5 secondes d'attente entre chacune - slack://tokenA/tokenB/tokenC: tag: 1:alerts retry: 3 wait: 5
# jusqu'à 2 nouvelles tentatives avec 1,5 seconde d'attente - discord://webhook_id/webhook_token: tag: 1:alerts retry: 2 wait: 1.5
# Canal de secours -- pas besoin de nouvelles tentatives - mailto://user:pass@example.com: tag: 5:alertsValeurs acceptées
Section intitulée « Valeurs acceptées »| Paramètre | Type | Contraintes | Par défaut |
|---|---|---|---|
retry | int | 0 à 10 | 0 |
wait | float | 0.0 à 20.0 ; les entiers sont promus en flottant | 0.5 |
Les valeurs invalides (nombres négatifs, chaînes non numériques, inf, nan) sont rejetées et reviennent à la valeur par défaut de l’asset (voir Valeurs par Défaut Globales ci-dessous).
Services Optionnels
Section intitulée « Services Optionnels »Le paramètre optional marque un service comme “souhaitable mais non indispensable”. Lorsque optional=yes est activé sur un service, un échec de livraison pour ce service est silencieusement absorbé — l’appel global à notify() retourne quand même True, tant que chaque service requis (non optionnel) a réussi.
Ce paramètre est utile pour tout service que vous souhaitez notifier opportunistement : envoyer la notification si le point de terminaison est disponible, mais ne pas considérer son absence comme un échec aux yeux de l’application appelante.
Exemple concret — écrans d’affichage domestiques
Section intitulée « Exemple concret — écrans d’affichage domestiques »Imaginons que votre système domotique possède quatre écrans Kodi avec le tag media. Vous souhaitez afficher une notification sur les écrans actuellement allumés, mais vous ne voulez pas qu’un écran éteint déclenche une alerte d’astreinte à trois heures du matin.
# Les quatre écrans sont optionnels -- leur indisponibilité n'est jamais une erreur.media=kodi://192.168.1.10media=kodi://192.168.1.11media=kodi://192.168.1.12media=kodi://192.168.1.13Pour les rendre optionnels, ajoutez ?optional=yes à chaque URL :
media=kodi://192.168.1.10?optional=yesmedia=kodi://192.168.1.11?optional=yesmedia=kodi://192.168.1.12?optional=yesmedia=kodi://192.168.1.13?optional=yesversion: 1urls: - kodi://192.168.1.10: tag: media optional: yes
- kodi://192.168.1.11: tag: media optional: yes
- kodi://192.168.1.12: tag: media optional: yes
- kodi://192.168.1.13: tag: media optional: yes# Retourne True même si tous les écrans sont éteints ou inaccessibles.apobj.notify(body="Le dîner est prêt", tag="media")apprise --config=config.yml --tag="media" --body="Le dîner est prêt"Interaction entre optional et les services requis
Section intitulée « Interaction entre optional et les services requis »Le paramètre est par service. Vous pouvez librement mélanger des services optionnels et requis au sein du même groupe de tags. Le résultat global suit ces règles :
| Services dans le lot | Résultat |
|---|---|
| Tous requis, tous réussissent | True |
| Tous requis, un ou plusieurs échouent | False |
| Tous optionnels, tous échouent | True |
| Tous optionnels, tous réussissent | True |
| Mélange requis/optionnels ; tous les requis réussissent | True |
| Mélange requis/optionnels ; au moins un requis échoue | False |
En résumé : les échecs optionnels sont invisibles pour l’appelant. Seul l’échec d’un service requis peut faire retourner False à notify().
Interaction entre optional et les tentatives
Section intitulée « Interaction entre optional et les tentatives »Activer optional=yes ne saute pas le service et ne contourne pas la logique de tentatives. La livraison est toujours tentée, et si retry est supérieur à zéro, Apprise retentera le nombre de fois configuré avant d’abandonner. Ce n’est qu’après l’épuisement de toutes les tentatives qu’Apprise vérifie le paramètre optional pour décider d’absorber ou non l’échec.
# Ce service est tenté jusqu'à 4 fois (tentative initiale + 3 nouvelles tentatives)# avec une pause de 2 secondes entre chacune. Si les quatre tentatives échouent,# l'échec est silencieusement absorbé grâce à optional=yes.media=kodi://192.168.1.10?optional=yes&retry=3&wait=2- kodi://192.168.1.10: tag: media optional: yes retry: 3 wait: 2Utilisation de optional depuis Python
Section intitulée « Utilisation de optional depuis Python »Vous pouvez définir ce paramètre directement sur n’importe quel objet service chargé, ou le passer en argument lors de la construction manuelle d’objets service :
import apprise
apobj = apprise.Apprise()
# Option 1 -- paramètre de requête URL (fonctionne avec tous les chargeurs de config)apobj.add("kodi://192.168.1.10?optional=yes")
# Option 2 -- définir l'attribut directement après chargementobj = apprise.Apprise.instantiate("kodi://192.168.1.10")obj.optional = Trueapobj.add(obj)
# Option 3 -- argument mot-clé du constructeurfrom apprise.plugins.NotifyJSON import NotifyJSONsvc = NotifyJSON(host="192.168.1.10", optional=True)apobj.add(svc)
# Les trois options produisent le même comportement : les échecs sont silencieusement absorbés.result = apobj.notify(body="Le dîner est prêt")print(result) # True même si chaque point de terminaison était inaccessibleExemples supplémentaires
Section intitulée « Exemples supplémentaires »Journal de débogage non critique associé à un canal d’alerte requis :
# Requis : l'ingénieur d'astreinte doit toujours être averti.alerts=slack://tokenA/tokenB/tokenC
# Optionnel : enregistrer dans le canal de diagnostic interne s'il est disponible,# mais ne jamais considérer son absence comme un échec.alerts=json://diagnostics.internal/api/events?optional=yesversion: 1urls: # Requis : l'ingénieur d'astreinte doit toujours être averti. - slack://tokenA/tokenB/tokenC: tag: alerts
# Optionnel : enregistrer dans le canal de diagnostic interne si disponible. - json://diagnostics.internal/api/events: tag: alerts optional: yes# Retourne True si Slack a réussi, quel que soit l'état du journal JSON.apobj.notify(body="Base de données inaccessible", tag="alerts")Groupe de tags entièrement optionnel — diffusion au mieux :
# Notifier les trois écrans s'ils sont accessibles ; ne jamais échouer s'ils ne le sont pas.affichages=kodi://192.168.1.10?optional=yesaffichages=kodi://192.168.1.11?optional=yesaffichages=kodi://192.168.1.12?optional=yesversion: 1urls: - kodi://192.168.1.10: tag: affichages optional: yes
- kodi://192.168.1.11: tag: affichages optional: yes
- kodi://192.168.1.12: tag: affichages optional: yes# Retourne toujours True quel que soit le nombre d'écrans ayant répondu.apobj.notify(body="Mouvement détecté", tag="affichages")Valeurs par Défaut Globales via AppriseAsset
Section intitulée « Valeurs par Défaut Globales via AppriseAsset »Si vous souhaitez que chaque service d’une session Apprise partage les mêmes valeurs par défaut de tentatives et d’attente sans modifier chaque URL, définissez-les sur AppriseAsset :
from apprise import Apprise, AppriseAsset
asset = AppriseAsset( default_service_retry=2, # jusqu'à 2 nouvelles tentatives en cas d'échec avant d'abandonner default_service_wait=3.0, # attendre 3 secondes entre les tentatives)
apobj = Apprise(asset=asset)apobj.add("slack://tokenA/tokenB/tokenC")apobj.add("discord://webhook_id/webhook_token")
apobj.notify(body="Valeurs par défaut retry/wait appliquées à chaque service")Les valeurs par URL (?retry= / ?wait= ou clés YAML) remplacent les valeurs par défaut de l’asset pour ce service spécifique uniquement. Tous les autres services utilisent toujours les valeurs par défaut de l’asset.
Remplacement du Nombre de Tentatives par Appel
Section intitulée « Remplacement du Nombre de Tentatives par Appel »Un :N en fin de valeur de filtre de tag remplace le nombre de tentatives pour chaque service correspondant, pour cet appel uniquement. La configuration permanente du service n’est pas modifiée.
# Réessayer chaque service correspondant jusqu'à 5 fois pour cet appel uniquementapobj.notify(body="Alerte critique", tag="alerts:5")
# Correspondance exclusive priorité 2 ET jusqu'à 3 tentatives par serviceapobj.notify(body="Priorité 2 uniquement", tag="2:alerts:3")# Équivalents CLIapprise --config=config.yml --tag="alerts:5" --body="Alerte critique"apprise --config=config.yml --tag="2:alerts:3" --body="Priorité 2 uniquement"Le suffixe :N suit les mêmes règles de validation que le paramètre URL retry. Sa spécification n’affecte pas wait — chaque service utilise toujours sa valeur d’attente configurée entre les tentatives.
Filtres OR et AND multi-tags
Section intitulée « Filtres OR et AND multi-tags »Apprise supporte deux façons de combiner des noms de tags dans un seul appel à notify.
| Motif | Signification | Exemple |
|---|---|---|
| OR — plusieurs valeurs de tag séparées | Correspond aux services portant l’un ou l’autre des tags listés | Plusieurs indicateurs --tag dans la CLI ; une liste de chaînes de tags en Python |
| AND — plusieurs noms de tags dans une seule entrée de filtre | Correspond uniquement aux services portant tous les tags listés | Un seul --tag "a, b" dans la CLI ; une liste imbriquée en Python |
Avec OR, chaque nom de tag forme une chaîne d’escalade indépendante.
Toutes les chaînes doivent trouver un groupe de priorité entièrement réussi
avant que notify() retourne True. Un suffixe :N sur un token ne
s’applique qu’aux services correspondant à ce token ; les autres ne sont pas
affectés.
# OR -- les services devops obtiennent retry=3 ; management obtient retry=2.# Chaque chaîne d'escalade de tag s'exécute indépendamment.apobj.notify(body="Alerte équipe", tag=["devops:3", "management:2"])# OR -- plusieurs indicateurs --tag ; chacun est une chaîne indépendante.apprise --config=config.yml \ --tag="devops:3" \ --tag="management:2" \ --body="Alerte équipe"Si tous les services devops réussissent dans leur groupe de priorité le plus
bas, Apprise envoie quand même la chaîne management — les deux chaînes sont
indépendantes l’une de l’autre.
Avec AND, les services doivent porter tous les tags du groupe pour être sélectionnés. Les services correspondant à un filtre AND partagent une seule chaîne d’escalade.
# AND -- le service doit porter "devops" ET "management" pour correspondre.apobj.notify(body="Alerte combinée", tag=[["devops", "management"]])# AND -- valeurs séparées par des virgules dans un seul indicateur --tag.apprise --config=config.yml --tag="devops, management" --body="Alerte combinée"Exemple Complet
Section intitulée « Exemple Complet »L’exemple suivant combine les trois fonctionnalités : escalade par priorité, tentatives/attente par service, et remplacement du nombre de tentatives par appel.
# --- Canaux principaux (priorité 1) ---# jusqu'à 2 nouvelles tentatives, 2 secondes d'attente entre chacune1:alerts=slack://tokenA/tokenB/tokenC?retry=2&wait=21:alerts=discord://webhook_id/webhook_token?retry=2&wait=2
# --- Canal secondaire (priorité 5 -- secours) ---# Une seule tentative suffit ; les canaux principaux ont déjà réessayé5:alerts=mailto://user:pass@pagerduty.example.comversion: 1urls: # Canaux principaux (priorité 1) - slack://tokenA/tokenB/tokenC: tag: 1:alerts retry: 2 wait: 2
- discord://webhook_id/webhook_token: tag: 1:alerts retry: 2 wait: 2
# Canal secondaire (priorité 5 -- secours) # Une seule tentative ; les canaux principaux ont déjà réessayé - mailto://user:pass@pagerduty.example.com: tag: 5:alertsfrom apprise import Apprise, AppriseConfig
config = AppriseConfig()config.add("config.yml")
apobj = Apprise()apobj.add(config)
# Alerte normale -- chaîne d'escalade# Slack et Discord (priorité 1) s'exécutent en premier ; chacun réessaie jusqu'à 2 fois# avec une pause de 2 secondes. Si les deux réussissent, PagerDuty (priorité 5) est ignoré.apobj.notify(body="Utilisation disque à 90%", tag="alerts")
# Incident critique -- jusqu'à 5 nouvelles tentatives pour cet appel uniquementapobj.notify(body="Base de données inaccessible", tag="alerts:5")
# Fenêtre de maintenance -- cibler uniquement le canal email de secours (priorité 5)apobj.notify(body="Coupure planifiée dans 30 min", tag="5:alerts")# Alerte normale -- chaîne d'escaladeapprise --config=config.yml --tag="alerts" \ --body="Utilisation disque à 90%"
# Incident critique -- jusqu'à 5 nouvelles tentatives pour cet appel uniquementapprise --config=config.yml --tag="alerts:5" \ --body="Base de données inaccessible"
# Fenêtre de maintenance -- cibler uniquement le canal email de secours (priorité 5)apprise --config=config.yml --tag="5:alerts" \ --body="Coupure planifiée dans 30 min"Variantes
Section intitulée « Variantes »Les exemples ci-dessous illustrent des schemas de notification courants.
Tag unique avec deux niveaux d’escalade — les valeurs 2 et 50 montrent que les
numeros sont arbitraires ; seul l’ordre importe.
# Premier essai (numero inferieur = urgence superieure)2:alertes=slack://tokenA/tokenB/tokenC
# Secours ; s'execute uniquement si la priorite 2 echoue50:alertes=mailto://user:pass@example.comversion: 1urls: - slack://tokenA/tokenB/tokenC: tag: 2:alertes
- mailto://user:pass@example.com: tag: 50:alertes# Chaine d'escalade : Slack d'abord, e-mail seulement en cas d'echecapobj.notify(body="Alerte", tag="alertes")apprise --config=config.yml --tag="alertes" --body="Alerte"Trois chaines OR avec plusieurs niveaux de priorite — alpha, beta et gamma
sont des chaines independantes dispatchees simultanement. Au sein de chaque chaine,
les groupes de priorite inferieure s’executent en premier ; les echecs escaladent au
niveau suivant. Si une chaine epuise tous ses niveaux sans succes, Apprise s’arrete
immediatement et retourne False sans lancer de nouveaux rounds pour les autres chaines.
# alpha : trois niveaux avec des valeurs de priorite arbitraires1:alpha=slack://tokenA/tokenB/tokenC1:alpha=mailto://user:pass@gmail.com5:alpha=telegram://bottoken/chatid700:alpha=discord://webhook_id/webhook_token
# beta : un seul niveau a la priorite 500500:beta=discord://webhook_id2/webhook_token2
# gamma : deux niveaux ; sans prefixe = priorite 0 (la plus haute)gamma=telegram://bottoken2/chatid2200:gamma=telegram://bottoken3/chatid3version: 1urls: # alpha -- trois niveaux d'escalade - slack://tokenA/tokenB/tokenC: tag: 1:alpha - mailto://user:pass@gmail.com: tag: 1:alpha - telegram://bottoken/chatid: tag: 5:alpha - discord://webhook_id/webhook_token: tag: 700:alpha
# beta -- niveau unique - discord://webhook_id2/webhook_token2: tag: 500:beta
# gamma -- deux niveaux (sans prefixe = priorite 0) - telegram://bottoken2/chatid2: tag: gamma - telegram://bottoken3/chatid3: tag: 200:gammaOrdre de dispatch quand les trois chaines sont combinees en OR :
| Round | alpha | beta | gamma |
|---|---|---|---|
| 1 | Slack + Gmail (priorite 1) | Discord (priorite 500) | Telegram 2 (priorite 0) |
| 2 (si echec au round 1) | Telegram (priorite 5) | — epuise — | Telegram 3 (priorite 200) |
| 3 (si echec au round 2 pour alpha) | Discord (priorite 700) |
apobj.notify(body="Diffusion", tag=["alpha", "beta", "gamma"])apprise --config=config.yml \ --tag="alpha" \ --tag="beta" \ --tag="gamma" \ --body="Diffusion"Deux chaines OR independantes avec surcharge de tentatives par appel — chaque
token porte son propre suffixe :N : les services devops obtiennent trois tentatives
et les services direction en obtiennent deux.
10:devops=slack://tokenA/tokenB/tokenC10:direction=discord://webhook_id/webhook_tokenversion: 1urls: - slack://tokenA/tokenB/tokenC: tag: 10:devops
- discord://webhook_id/webhook_token: tag: 10:direction# devops : retry=3 ; direction : retry=2apobj.notify(body="Alerte equipe", tag=["devops:3", "direction:2"])apprise --config=config.yml \ --tag="devops:3" \ --tag="direction:2" \ --body="Alerte equipe"Filtre AND — seuls les services portant tous les tags listes sont dispatches.
# Les deux tags sur la meme URL ; seul ce service correspond au filtre ANDdevops direction=slack://tokenA/tokenB/tokenC
# Un seul tag "devops" -- ne correspond PAS au filtre ANDdevops=discord://webhook_id/webhook_tokenversion: 1urls: # Les deux tags sur la meme URL - slack://tokenA/tokenB/tokenC: tag: - devops - direction
# Un seul tag -- ne correspond pas au filtre AND - discord://webhook_id/webhook_token: tag: devops# AND -- le service doit porter "devops" ET "direction"apobj.notify(body="Alerte combinee", tag=[["devops", "direction"]])# AND -- valeurs separees par une virgule dans un seul flag --tagapprise --config=config.yml --tag="devops, direction" --body="Alerte combinee"Dispatch exclusif — un prefixe de priorite dans le filtre cible uniquement ce niveau exact. Aucune chaine d’escalade n’est construite ; les services correspon- dants sont dispatches en un seul lot plat.
2:alertes=slack://tokenA/tokenB/tokenC50:alertes=mailto://user:pass@example.comversion: 1urls: - slack://tokenA/tokenB/tokenC: tag: 2:alertes
- mailto://user:pass@example.com: tag: 50:alertes# Exclusif : seules les entrees de priorite 50 s'executent ; Slack est ignoreapobj.notify(body="Maintenance", tag="50:alertes")apprise --config=config.yml --tag="50:alertes" --body="Maintenance"Récapitulatif
Section intitulée « Récapitulatif »| Fonctionnalité | Où le configurer | Portée |
|---|---|---|
| Priorité de tag | N:nomdetag dans le fichier de configuration (TEXT ou YAML) | Par définition de service |
| Nombre de tentatives par service | Paramètre URL ?retry=N ou clé YAML retry: | Par définition de service |
| Délai inter-tentative par service | Paramètre URL ?wait=S ou clé YAML wait: | Par définition de service |
| Service optionnel | Paramètre URL ?optional=yes ou clé YAML optional: yes | Par définition de service |
| Valeurs par défaut globales | AppriseAsset(default_service_retry=N, default_service_wait=S) | Tous les services de la session |
| Envoi en escalade | notify(tag="nomdetag") ou --tag nomdetag (sans préfixe de priorité) | Un appel notify() / CLI |
| Envoi exclusif | notify(tag="N:nomdetag") ou --tag N:nomdetag | Un appel notify() / CLI |
| Remplacement des tentatives | notify(tag="nomdetag:N") ou --tag nomdetag:N | Un appel notify() / CLI |
| Envoi OR multi-tags | notify(tag=["tagA", "tagB"]) ou --tag tagA --tag tagB | Un appel notify() / CLI |
| Envoi AND multi-tags | notify(tag=[["tagA", "tagB"]]) ou --tag "tagA, tagB" | Un appel notify() / CLI |
| Envoi OR multi-tags avec tentatives par tag | notify(tag=["tagA:N", "tagB:M"]) ou --tag tagA:N --tag tagB:M | Un appel notify() / CLI |
| Arret anticipe sur echec de chaine | AppriseAsset(abort_on_chain_failure=True) | Tous les services de la session |
Questions ou commentaires ?
Documentation
Vous avez repéré une faute de frappe ou une erreur ? Signalez-la ou proposez une correction .
Problèmes Techniques
Vous rencontrez un problème avec le code ? Ouvrez un ticket sur GitHub :