# Rules avec NGOT<!-- .element: style="font-size: 2.5em" -->
#### Démo Point de synchro du 02/06/23
---
# Plan
- Rappels (4 slides)
- NGOT : changements (1 slide)
- NGOT : création et déploiement (5 slides)
- NGOT : labels dans les expressions (4 slides)
- Blackbox-Exporter sur NGOT (1 slide)
- Bonnes pratiques (2 slides)
- Conclusion (1 slide)
---
# Rappels (1/4)
### C'est quoi une "rule" ?
Une rule évalue une expression (au format PromQL)
- une "recording rule" génère une nouvelle métrique avec cette expression
- une "alerting rule" génère une alerte et l'envoie à Alertmanager
Une rule est évaluée par Prometheus. Une alerte est donc créée sur Prometheus (avant d'être envoyée à Alertmanager).
---
# Rappels (2/4)
### Les rules sur Caascad
Nous avons distingué 2 types de rules :
- un jeu de rules issues de sources upstream, mises en place et gérées par l'équipe Monitoring
- des rules dites "custom",
- dans le repo https://git.corp.caascad.com/caascad/applications/caascad-prometheus-rules
- dans le sous-répertoire `rules/rules/`
---
<!-- .slide: class="prez-slide-format-rules-caascad" -->
# Rappels (3/4)
### Le format des rules sur Caascad
```
rulesets: [RulesetName= "infra" | "cloud-caascad"]: apps: "thanos": groups: {
ThanosCompactBucketOperationFailure: {
rules: [
{
alert: "ThanosCompactBucketOperationFailure"
expr: "sum(rate(thanos_objstore_bucket_operation_failures_total{job=~\"thanos.*-compactor\"}[5m])) by (\(aggregation_label), namespace, pod, bucket) > 0"
for: "5m"
labels: severity: "warning"
annotations: {
message: "Thanos Compact has failing storage operations."
}
},
]
}
}
```
---
# Rappels (4/4)
### Le déploiement des rules
```
trackbone apply -c prometheus-rules -z <zone infra|cloud>
```
Les rules sont toutes déployés dans le namespace `prometheusrules`
(sauf les rules "upstream" : `prometheusrules-dashboards-upstream`)
---
# NGOT : changements (1/1)
### Qu'est-ce qui change avec NGOT ?
Réponse : rien ne change ! Il n'y a que des ajouts !
1. On a juste ajouté 2 nouveaux noms de rulesets pour NGOT :
- `cluster-ngot`
- `service-ngot`
2. Pour les `service-ngot`,
- le nom de l'`apps` prend de l'importance...
- il faut ajouter la configuration `prometheus-rules` au service
```
---
<!-- .slide: class="prez-slide-format-rules-caascad" -->
# NGOT : création et déploiement (1/5)
### Le format des rules sur Caascad et NGOT
```
rulesets: [RulesetName= "infra" | "cloud-caascad" | "service-ngot"]: apps: "thanos": groups: {
ThanosCompactBucketOperationFailure: {
rules: [
{
alert: "ThanosCompactBucketOperationFailure"
expr: "sum(rate(thanos_objstore_bucket_operation_failures_total{job=~\"thanos.*-compactor\"}[5m])) by (\(aggregation_label), namespace, pod, bucket) > 0"
for: "5m"
labels: severity: "warning"
annotations: {
message: "Thanos Compact has failing storage operations."
}
},
]
}
}
```
Noter l'ajout de `service-ngot`
---
<!-- .slide: class="prez-slide-servicengot-principes" -->
# NGOT : création et déploiement (2/5)
### service-ngot
Les services sont un concept nouveau car ils ne sont pas déployés sur tous les clusters. C'est pareil pour les rules.
Il faut donc ajouter la configuration `prometheus-rules` à la définition du service avec la liste des `apps` dont il faut déployer les rules.
Principes :
* les rules sont déployées sur les clusters NGOT, mais seulement ceux concernés par le service indiqué via l'`apps`
* les rules sont évaluées par les Prometheus des clusters
* les métriques concernées sont celles du service indiqué via l'`apps`
---
<!-- .slide: class="prez-slide-servicengot-envscue" -->
# NGOT : création et déploiement (3/5)
### service-ngot
Exemple : [contexts/ngot/envs.cue](https://git.corp.caascad.com/caascad/terraform/envs-ng/-/blob/6d1f6d192f4a3391a56f0eabd374ac51e96eae12/contexts/ngot/envs.cue#L115-118)
```
#NgotServiceZones: "grafana": {
zone: _
infra_zone: _
admin_zone: _
configurations: close({
.....
"prometheus-rules": _ & {_rule_apps: [
"grafana",
"thanos-query",
]}
.....
})
}
```
---
<!-- .slide: class="prez-slide-servicengot-principes" -->
# NGOT : création et déploiement (4/5)
### cluster-ngot
Les rules `cluster-ngot` sont très similaires aux rules `infra-caascad` ou `cloud-caascad` : elles concernent les applicatifs propres aux clusters.
Principes :
* les rules sont déployées sur tous les clusters NGOT
* les rules sont évaluées par les Prometheus des clusters
* les métriques concernées sont celles qu'on retrouve sur tous les clusters
C'est simple.
Note : les Prometheus centraux évaluent peu de rules : ce sont des cas particuliers gérés par l'équipe Monitoring
---
# NGOT : création et déploiement (5/5)
### Le déploiement des rules
```
trackbone apply -c prometheus-rules -z <zone>
```
Les rules
- sont déployés dans le namespace `prometheusrules`
- (sauf les rules "upstream" : `prometheusrules-dashboards-upstream` mais ce namespace devrait changer dans quelques semaines)
- sont évaluées par le Prometheus du cluster
- alertent via les 2 Alertmanagers centraux
---
# NGOT : labels dans les expressions (1/4)
### Labels nécessaires
Les labels nécessaires sont :
- `obs_client` : nom du client.
- `cluster` : nom du cluster sur lequel la rule est évaluée
- `namespace` : namespace du composant en erreur
Les labels suivants sont nécessaires pour les services seulement :
- `ngot_contract` : nom du contrat
- `ngot_service` : nom du service
---
<!-- .slide: class="prez-slide-ngot-labels" -->
# NGOT : labels dans les expressions (2/4)
### Comment poser simplement les labels nécessaires
Normalement, les labels nécessaires doivent déjà être posés sur les métriques. Il n'y a donc rien à faire au niveau des rules.
Pour poser les labels sur les métriques, la [documentation](https://docs-internal.corp.caascad.com/NGOT/pf-ngot/Applications/Prometheus/collect_metrics_from_new_applications/#servicemonitor-in-envs-ng) mentionne :
* pour les labels Prometheus :
```
_relabelings: #ServiceMonitorNgotRelabelings[zone.type] & {"\(zone.name)": _}
relabelings: _relabelings[zone.name]
```
* pour les labels K8S du PrometheusRules :
```
labels: #ServiceMonitorNgotLabels
```
---
# NGOT : labels dans les expressions (3/4)
### Cas du label `cluster`
Le label `cluster` n'existe pas sur les Prometheus des clusters. Il est posé en tant qu'_external label_.
Conséquence:
- il est inutile de l'utiliser dans les expressions
- il ne faut pas l'utiliser avec `absent()` (sinon la fonction retourne systématiquement 1)
- bien qu'absent, il sera posé sur les rules lorsqu'elles sont envoyées à Alertmanager.
---
# NGOT : labels dans les expressions (4/4)
### Cas des rules `absent()`
La fonction `absent()` retourne 1 lorsque la métrique (avec ses labels) n'existe pas. Cette fonction sert beaucoup pour alerter lorsqu'un exporter dysfonctionne ou n'est pas déployé.
Les labels de la métrique indiquée à la fonction `absent()` doivent être spécifiés explicitement (sauf le label `cluster`).
La création de ces rules est plus délicate que les autres. Mais il existe des exemples. N'hésitez pas à demander de l'aide à l'équipe Monitoring.
---
# Blackbox-Exporter sur NGOT (1/1)
### Rules
Pré-requis : les métriques Blackbox-Exporter doivent être présentes (une présentation aura lieu ultérieurement sur ce sujet).
L'alerte `BlackboxHTTPDown` fonctionne pour toutes les métriques, il n'y a rien à configurer.
Il est conseillé d'ajouter une vérification de vos métriques. On peut s'inspirer de celles qui existent déjà dans le fichier [rules/rules/blackbox-exporter-absent.cue](https://git.corp.caascad.com/caascad/applications/caascad-prometheus-rules/-/blob/master/rules/rules/blackbox-exporter-absent.cue) (NGOT seulement).
---
# Bonnes pratiques (1/2)
### La documentation
- [Opérations/Alerting : page d'accueil](https://docs-internal.corp.caascad.com/Op%C3%A9rations/Alerting/)
- [Opérations/Alerting : Workflow for writing Prometheus Rules](https://docs-internal.corp.caascad.com/Op%C3%A9rations/Alerting/050_workflow/)
- [Opérations/Alerting : Writing Prometheus Rules](https://docs-internal.corp.caascad.com/Op%C3%A9rations/Alerting/100_writing_rules/)
- [NGOT/pf-ngot/Architecture/Nomenclature : Labels Monitoring](https://docs-internal.corp.caascad.com/NGOT/pf-ngot/Architecture/Nomenclature/monitoring-labels/)
- [NGOT/pf-ngot/Applications/Prometheus : Collect metrics from new applications](https://docs-internal.corp.caascad.com/NGOT/pf-ngot/Applications/Prometheus/collect_metrics_from_new_applications/#servicemonitor-in-envs-ng)
---
<!-- .slide: class="prez-slide-dernier-rappel" -->
# Bonnes pratiques (2/2)
### Ne bloquez pas vos collègues !
Les créations et modifications de rules se passent sur le repo [caascad-prometheus-rules](https://git.corp.caascad.com/caascad/applications/caascad-prometheus-rules).
Lorsqu'une modification y est _mergée_, elle bloque le déploiement de toute modification ultérieure tant qu'elle n'a pas été déployée (ce qui est problématique en cas d'incident de Production).
**Ne bloquez pas vos collègues !**
- faites valider votre MR, ne la _mergez_ **pas tout de suite** !
- préparez votre MR envs-ng et votre CAASCHR/stg
- _mergez_ votre MR et réalisez votre CAASCHR/stg **le même jour** si possible
- essayez de réaliser votre CAASCHR/prd dès **le lendemain**
---
# Conclusion
### Ce qu'il faut retenir
Caascad :
- pas de changement
NGOT :
- métriques "cluster" : `cluster-ngot` et c'est tout
- métriques "services" : `service-ngot` et ajouter `prometheus-rules` et le nom de l'`apps` dans `envs.cue`
Merci pour votre attention.
<style type="text/css">
p {
font-size: 0.8em;
}
.reveal ul li {
font-size: 0.8em;
}
.reveal ul ul li {
font-size: 0.6em;
}
.reveal ol li {
font-size: 0.8em;
}
.reveal section {
text-align: left;
}
}
.reveal h3 {
color: orange;
text-align: center;
border-bottom: 1px solid orange;
font-size: 1em;
}
.reveal h1 {
color: orange;
text-align: center;
border-bottom: 1px solid orange;
margin-bottom: 0.4em;
font-size: 1.2em;
}
.reveal code {
color: aquamarine;
font-size: smaller;
}
.prez-slide-format-rules-caascad code {
font-size: 0.7em;
line-height: 1.2em;
}
.prez-slide-servicengot-principes p {
font-size: 0.6em;
margin-bottom: 0;
}
.prez-slide-servicengot-principes ul li {
font-size: 0.6em;
margin-bottom: 0;
}
.prez-slide-servicengot-envscue p {
font-size: 0.6em;
margin-bottom: 0;
}
.prez-slide-servicengot-envscue pre {
margin: 0;
font-size: 0.5em;
}
.prez-slide-ngot-labels p {
font-size: 0.7em;
margin-bottom: 0;
}
.prez-slide-ngot-labels ul li {
font-size: 0.6em;
margin: 0;
}
.prez-slide-ngot-labels pre {
margin: 0;
padding: 0;
}
.prez-slide-dernier-rappel p {
font-size: 0.7em;
margin-bottom: 0;
}
.prez-slide-dernier-rappel ul li {
font-size: 0.6em;
margin: 0;
}
</style>