# Blackbox-Exporter en 2022
#### Démo Point de Synchro du 21/01/2022
---
# Objectif
- déclaration d'une "probe" dans Blackbox-Exporter (public : Caascad)
- débogage d'une "probe" qui ne fonctionne pas comme souhaité (public : Caascad, nos clients, tout le monde)
- contrôle permanent du bon fonctionnement des "probes" (public : Caascad)
---
# Blackbox Exporter
C'est comme un "curl" :
* configurable
* qui tourne en boucle
* qui met à disposition des métriques pour Prometheus
----
## Liens
- Repo upstream : [https://github.com/prometheus/blackbox_exporter](https://github.com/prometheus/blackbox_exporter)
- Chart helm : [https://git.corp.caascad.com/caascad/applications/caascad-blackbox-exporter](https://git.corp.caascad.com/caascad/applications/caascad-blackbox-exporter)
- Configuration [envs-ng](https://git.corp.caascad.com/caascad/terraform/envs-ng/)
- Documentation : docs-internal -> [Opérations/Applications/Blackbox-Exporter/](https://docs-internal.corp.caascad.com/Op%C3%A9rations/Applications/Blackbox-Exporter/use-blackbox-exporter/)
- Et des serviceMonitors...
----
## Principe de fonctionnement
* URL de probe pour Prometheus : `http://<blackbox_exporter>:9115/probe?module=http_2xx&target=https://mondomaine.fr`
* Les modules (comme `http_2xx`) sont définis dans la configuration de Blackbox-Exporter
----
## Ajouter une URL à monitorer
* Principe : ajouter un servicemonitor
* Documentation :
* doc interne : [Opérations/Applications/Blackbox-Exporter](https://docs-internal.corp.caascad.com/Op%C3%A9rations/Applications/Blackbox-Exporter/use-blackbox-exporter/)
* doc client : [Monitoring/How to/Use Blackbox-Exporter](https://docs.caascad.com/en/monitoring/howto/use-blackbox-exporter.html)
----
## 3 façons...
...d'ajouter un serviceMonitor pour Blackbox-Exporter
* intégré dans une chart helm
* standalone (chart helm `caascad-servicemonitor`)
* `#CaascadServicemonitorBlackboxexporterHelmConfig` dans envs-ng : c'est la méthode préférée pour un serviceMonitor isolé
* `#CaascadServicemonitorHelmConfig` dans envs-ng quand la précédente est trop spécifique, également pour un serviceMonitor isolé
----
## Exemples
* [Jira : `#CaascadServicemonitorBlackboxexporterHelmConfig`](https://git.corp.caascad.com/caascad/terraform/envs-ng/-/blob/master/blackbox-exporter-servicemonitor-jira.cue)
* [Grafana : intégré dans une chart helm](https://git.corp.caascad.com/caascad/applications/caascad-grafana/-/blob/master/helm/caascad-grafana-v1/templates/blackbox-exporter-servicemonitor.yaml)
* Pas d'exemple pour `#CaascadServicemonitorHelmConfig` car l'autre méthode nous a toujours suffi.
----
## Vu de Grafana...
* [Dashboard](https://grafana-infra.ocb-test06.caascad.com/d/bc6db11cbcaascad/blackbox-exporter) "Blackbox-exporter"
* Onglet *explore*. Les métriques sont préfixées de `probe_`. Exemples :
* `probe_success`
* `probe_duration_seconds`
* ...
----
## Déployez
Déployez avec Trackbone, comme d'habitude
Et ça fonctionne !
---
# Débogage d'une probe
... parce que ça ne marche pas toujours du premier coup !
Méthodes :
* Voir les logs<!-- .element: style="font-size: smaller" -->
* Blackbox interactif<!-- .element: style="font-size: smaller" -->
----
## Voir les logs
[Voir les logs](https://docs-internal.corp.caascad.com/Op%C3%A9rations/Applications/Blackbox-Exporter/troubleshooting-blackbox-exporter/) de Blackbox-Exporter en filtrant sur la target qui vient d'être ajoutée.
* avec `kubectl logs` sur le pod blackbox-exporter
* avec Grafana, datasource `Loki` ou `Loki-client`
* directement dans Blackbox (avec un port-forward) : Blackbox interactif
----
## Blackbox interactif
[Principe](https://docs-internal.corp.caascad.com/Op%C3%A9rations/Applications/Blackbox-Exporter/troubleshooting-blackbox-exporter/#interactive-blackbox-exporter) :
```
kubectl -n monitoring port-forward \
svc/blackbox-exporter \
9115:9115
```
http://localhost:9115 dans mon navigateur
Penser à ajouter `&debug=true` dans les URL
---
# Contrôle des "probes"
Objectifs :
* garantir que les serviceMonitors sont bien fonctionnels
* alerter si un serviceMonitor disparaît ou dysfonctionne.
----
## Créer une alerting rule
Editer le fichier [rules/caascad-blackbox-exporter-servicemonitors.cue](https://git.corp.caascad.com/caascad/applications/caascad-prometheus-rules/-/blob/master/rules/caascad-blackbox-exporter-servicemonitors.cue) (repo des prometheusRules)
Ajouter un bloc de code de ce genre :
```
targetDescription: "Grafana infra"
rulesetname: ["cloud-caascad"]
instance: "https://grafana-infra.\(zone_name).caascad.com/http_2xx"
cc_prom_source: ["cloud-caascad"]
severity: "warning"
```
Suivre le [workflow](https://git.corp.caascad.com/caascad/applications/caascad-prometheus-rules/-/blob/master/README.md) habituel de déploiement des PrometheusRules.
---
# Conclusion
Les probes actuellements déployées peuvent servir d'exemple ;
- grafana et grafana client
- karma infra et karma client
- jira (depuis la zone infra)
----
## Probes <img src="/uploads/upload_f4f9af31ffc152208d0538ceba405821.png" width="40" style="border: 0; background: none"> <img src="/uploads/upload_c48700c4e2d0d6d2ea7b0672f732b57c.png" width="40" style="border: 0; background: none">
Probes non gérées par l'équipe Monitoring :
* bastions
* rancher
* vault
* keycloak
----
## Ce qu'il faut faire <img src="/uploads/upload_f4f9af31ffc152208d0538ceba405821.png" width="40" style="border: 0; background: none"> <img src="/uploads/upload_c48700c4e2d0d6d2ea7b0672f732b57c.png" width="40" style="border: 0; background: none">
- **<span>Créer des alertes</span><!-- .element: style="text-decoration: underline" -->** pour s'assurer du bon fonctionnement des "probes" existantes
- Les probes existantes peuvent rester telles quelles. Ou être "converties" au format de la chart helm caascad-servicemonitor.
---
# Merci
<style type="text/css">
p {
font-size: smaller;
}
.reveal ul ul li {
font-size: smaller;
}
.reveal section {
text-align: left;
}
}
.reveal h3 {
color: orange;
text-align: center;
border-bottom: 1px solid orange;
}
.reveal h1 {
color: orange;
text-align: center;
border-bottom: 1px solid orange;
margin-bottom: 0.4em;
}
.reveal code {
color: aquamarine;
font-size: smaller;
}
</style>