Aller au contenu principal

NotificationChannel

Bêta

Fonctionnalité en cours de déploiement. L'interface décrite ici est celle de la prochaine livraison : elle peut encore évoluer, et n'est pas forcément activée sur votre tenant.

La supervision est en cours de déploiement ; le type Email n'est pas encore disponible.

apiVersionmonitoring.stackngo.io/v1alpha1
kindNotificationChannel
Appliqué parsng apply
Commandes liéessng template gen NotificationChannel, sng apply, sng kind list NotificationChannel, sng kind delete NotificationChannel NAME ; sng monitor create --channel NAME pour y relier un moniteur

À quoi ça sert​

Un NotificationChannel est une destination d'alertes : un webhook HTTPS, un canal Slack, Discord ou Microsoft Teams, ou des adresses e-mail. Les Monitor le référencent par son nom dans notificationChannelRefs. Quand l'un d'eux tombe, revient, ou que son certificat TLS approche de l'expiration, le canal reçoit une notification, puis un rappel toutes les repeatInterval tant que l'incident dure.

Exemple minimal​

ops.yml
apiVersion: monitoring.stackngo.io/v1alpha1
kind: NotificationChannel
metadata:
name: ops
spec:
type: Webhook
webhook:
url: https://hooks.example.com/uptime
sng apply ops.yml
sng monitor create api --http https://api.example.com/health --interval 5m --channel ops

Exemple complet commenté​

slack.yml
apiVersion: monitoring.stackngo.io/v1alpha1
kind: NotificationChannel
metadata:
name: slack # nom référencé par les moniteurs (label DNS)
spec:
type: Slack # Webhook, Slack, Discord, MSTeams ou Email
slack:
webhookSecretRef: # l'URL Slack est un secret : jamais en clair
name: slack-webhook # secret du tenant
key: value # clé qui contient l'URL https://hooks.slack.com/…
channel: "#ops" # optionnel : canal ou @utilisateur
sendResolved: true # notifie aussi le retour à la normale (défaut true)
repeatInterval: 4h # rappel tant que l'alerte dure : <entier>m ou <entier>h (défaut 4h)

Autres destinations :

spec:
type: Discord # MSTeams : même forme, bloc "msteams"
discord:
url: https://discord.com/api/webhooks/123/abc # ou urlSecretRef: {name, key}
---
spec:
type: Webhook
webhook:
urlSecretRef: { name: ops-webhook, key: value }
---
spec:
type: Email # pas encore disponible (NotSupported)
email:
to: [ops@example.com, astreinte@example.com] # 1 à 10 adresses

Champs​

Règles de validation croisées​

Le schéma refuse, dès sng apply :

  • un bloc de destination qui ne correspond pas au type : webhook est requis pour Webhook et interdit sinon ; de même slack, discord, msteams et email ;
  • pour webhook, discord et msteams : ni url ni urlSecretRef, ou les deux ;
  • une url qui ne commence pas par https:// (2048 caractères au plus) ;
  • slack.channel hors de la forme #nom, @nom ou nom (minuscules, chiffres, -_., 80 caractères au plus) ;
  • email.to vide, de plus de 10 adresses, ou une adresse sans @ ni domaine ;
  • repeatInterval qui n'est pas un entier suivi de m ou h.

La plateforme refuse en plus, après application (Accepted=False) :

  • un canal Email tant qu'aucun relais e-mail n'est configuré (NotSupported) ;
  • un canal au-delà du nombre autorisé par le tier : les plus récents sont refusés (QuotaExceeded) ;
  • un canal dont le secret référencé est introuvable ou n'a pas de valeur sous la clé indiquée (SecretNotFound), ou dont la valeur n'est pas une URL https:// (Invalid). Seul ce canal est écarté : les autres canaux du tenant continuent d'envoyer leurs alertes.

NotificationChannel​

NotificationChannel déclare une destination pour les alertes de vos monitors.

ChampDescriptionDéfautValidation
apiVersion stringmonitoring.stackngo.io/v1alpha1
kind stringNotificationChannel
metadata ObjectMetaSeul metadata.name est à renseigner (nom de la ressource dans votre tenant).
spec NotificationChannelSpec
status NotificationChannelStatus

NotificationChannelSpec​

NotificationChannelSpec décrit où envoyer les alertes de vos monitors. Renseignez le bloc qui correspond à type, et lui seul.

ChampDescriptionDéfautValidation
type ChannelTypeType de destination.Enum: [Webhook Slack Discord MSTeams Email]
webhook URLDestinationURL appelée en POST à chaque alerte (type Webhook).Optional: {}
slack SlackDestinationWebhook entrant Slack (type Slack).Optional: {}
discord URLDestinationWebhook Discord (type Discord).Optional: {}
msteams URLDestinationWebhook Microsoft Teams (type MSTeams).Optional: {}
email EmailDestinationDestinataires e-mail (type Email).Optional: {}
sendResolved booleanNotifie aussi le retour à la normale.true
repeatInterval stringRappel tant que l'alerte reste active.4hPattern: ^([1-9][0-9]*)(m|h)$

NotificationChannelStatus​

NotificationChannelStatus : acceptation du canal par la plateforme.

ChampDescriptionDéfautValidation
observedGeneration integerDernière version du manifeste prise en compte.Optional: {}
conditions Condition arrayConditions : Accepted (canal valide et utilisable).Optional: {}

ChannelType​

Type sous-jacent : string

ChannelType : destination des notifications : Webhook, Slack, Discord, MSTeams ou Email.

Règles de validation :

  • Enum: [Webhook Slack Discord MSTeams Email]
ValeurDescription
WebhookAppel HTTP vers l'adresse de votre choix.
SlackMessage dans un canal Slack.
DiscordMessage dans un canal Discord.
MSTeamsMessage dans un canal Microsoft Teams.
EmailCourriel envoyé aux adresses indiquées.

URLDestination​

URLDestination : URL https, en clair ou lue dans un secret de votre tenant (exactement l'un des deux).

ChampDescriptionDéfautValidation
url stringURL https en clair.MaxLength: 2048
Optional: {}
urlSecretRef SecretKeySelectorClé d'un secret de votre tenant qui contient l'URL (recommandé quand l'URL vaut un jeton).Optional: {}

SlackDestination​

SlackDestination : webhook entrant Slack. Son URL est secrète : elle est toujours lue dans un secret.

ChampDescriptionDéfautValidation
webhookSecretRef SecretKeySelectorClé d'un secret de votre tenant qui contient l'URL du webhook.
channel stringCanal Slack (#canal ou @utilisateur). Vide : canal du webhook.Pattern: ^[#@]?[-_a-z0-9.]\{1,80\}$
Optional: {}

EmailDestination​

EmailDestination : alertes envoyées par e-mail par la plateforme.

ChampDescriptionDéfautValidation
to string arrayAdresses des destinataires (1 à 10).MaxItems: 10
MinItems: 1
items:Pattern: ^[^@\s]+@[^@\s]+\.[^@\s]+$

SecretKeySelector​

SecretKeySelector désigne une clé d'un secret de votre tenant.

ChampDescriptionDéfautValidation
name stringName est le nom du secret.Pattern: ^[a-z0-9]([-.a-z0-9]\{0,251\}[a-z0-9])?$
key stringKey est la clé du secret qui contient la valeur.Pattern: ^[-._a-zA-Z0-9]\{1,253\}$

Statut et conditions​

ConditionTrue quandFalse quand
Acceptedle canal est admis (raison Accepted)refus de la plateforme (raisons ci-dessous) ; les moniteurs qui le référencent restent sondés et attendent ce canal pour leurs alertes (WaitingForChannel)
reasonExplicationAction
AcceptedCanal admis—
QuotaExceededNombre de canaux du tier atteint (2 en 3XS, 5 en 2XS, 10 en XS/S/M, 20 en L/XL, 50 au-delà)Supprimer un canal, ou changer de tier
NotSupportedtype: Email sans relais e-mail sur la plateformeUtiliser un webhook
SecretNotFoundLe secret de urlSecretRef / webhookSecretRef est introuvable, ou n'a pas de valeur sous la clé indiquée. Ce canal n'envoie rien ; les autres ne sont pas affectésCréer le secret ou corriger name / key ; le canal reprend tout seul
InvalidLa valeur du secret n'est pas une URL https://Corriger la valeur du secret

Exemple de message pour SecretNotFound : secret "slack-webhook" introuvable ou sans valeur pour la clé "value" : aucune notification n'est envoyée par ce canal, les autres canaux ne sont pas affectés ; le canal reprendra automatiquement une fois le secret créé.

Accepted=True ne garantit pas la livraison : la destination elle-même peut refuser le message. Dans cette version, sng kind get NotificationChannel ops affiche le manifeste enregistré sans l'état du canal (# status: not observed yet).

Ce qui se passe à l'application​

Création. Le canal est admis puis ajouté à la configuration d'alerte du tenant, dès qu'au moins un moniteur admis le référence ; un canal sans moniteur n'envoie rien. Les URL de urlSecretRef / webhookSecretRef sont lues dans les secrets du tenant à ce moment.

Si le secret d'un canal est absent, n'a pas la clé indiquée ou ne contient pas une URL https://, seul ce canal est écarté (Accepted=False, SecretNotFound ou Invalid) : les autres canaux et vos autres changements s'appliquent normalement. Le canal reprend tout seul dès que le secret est corrigé.

Secret utilisé par un canal

Le secret désigné par urlSecretRef ou webhookSecretRef doit être déclaré par un SSMSecret avec materialize: true : c'est ce qui le rend utilisable par un canal de notification. Sans ce champ, un secret n'est mis à disposition que des Apps qui le référencent, et le canal reste écarté (SecretNotFound).

Mise à jour. Un nouveau sng apply remplace la destination ; la configuration d'alerte est réécrite. Un secret modifié est relu au plus tard dix minutes après.

Ce qui se passe quand vous supprimez​

sng kind delete NotificationChannel ops : le canal n'envoie plus rien ; les moniteurs qui le référencent encore restent sondés mais n'alertent plus (WaitingForChannel). Retirez la référence des moniteurs dans le même sng apply.

Erreurs fréquentes​

SymptômeCauseCorrection
sng apply refuse : webhook : requis pour le type Webhook, interdit sinonBloc absent ou d'un autre typeUn seul bloc, celui du type
sng apply refuse : url ou urlSecretRef : exactement un des deuxLes deux, ou aucunEn garder un
sng apply refuse : url : https:// requishttp://Passer en HTTPS
Moniteurs en WaitingForChannel après l'ajout d'un canalCanal refusé (QuotaExceeded, NotSupported) ou nom mal orthographiéCorriger le canal ou le nom
Canal Accepted=False, SecretNotFoundSecret introuvable, clé absente ou vide, ou secret déclaré sans materialize: trueDéclarer le secret avec materialize: true, corriger name / key ; voir l'encadré ci-dessus
Canal Accepted=False, InvalidLa valeur du secret n'est pas une URL https://Corriger la valeur
Aucune notification reçue, canal Accepted=TrueAucun moniteur admis ne référence le canal, ou destination qui refuse le messageVérifier notificationChannelRefs ; tester l'URL avec curl
Pas de notification de retoursendResolved: false, ou moniteur supprimé ou suspendu pendant la pannesendResolved: true ; laisser le moniteur revenir Up

Voir aussi​