<!-- .slide: class="center" -->
# Agent Telegraf Azure

<!-- .element: style="text-align: center" -->
---
<section style="text-align: left;">
## Objectifs
- Découvrir Telegraf
- Tester l'agent Telegraf pour envoyer les métriques dans :
- Prometheus
- Azure Monitor
- Comparer l'agent natif d'Azure et Telegraf
---
<section style="text-align: left;">
## Prérequis
Nous allons faire dans cette présentation l'impasse sur :
- l'installation/configuration de l'agent Télégraf
- le fonctionnement de Telegraf
qui ont déjà étaient abordés dans l'excellente présentation vidéo, disponible [ICI](https://orange0-my.sharepoint.com/:v:/g/personal/mor_fall_orange_com/EYCDYFtUO-FApXyieIfg_sMBsbkMLVt21SvYR6WiGHZpZg)
---
## Concepts de base Telegraf

---
<section style="text-align: left;">
## C'est quoi une métrique dans Télégraf ?
Une métrique est composé d'un nom (name), de balise (tags), de champs (fields).
```
> cpu,client=pf_pf-866,cluster=pf_azure,cpu=cpu0,host=pf-791-linux,os=pf_linux usage_guest=0,usage_guest_nice=0,usage_idle=95.99999999999534,usage_iowait=2.000000000000199,usage_irq=0,usage_nice=0,usage_softirq=0,usage_steal=0,usage_system=0,usage_user=1.9999999999998437 1651214259000000000
```
Les valeurs sont présentées en key=value avec l'horodatage en dernier.
* Name => cpu
* Tags => client=pf_pf-866,[...],os=pf_linux
* Fields => usage_guest=0 etc...
---
<section style="text-align: left;">
## Authentification pour envoyer dans Azure Monitor
- Création d'une identitée managée pour la VM (comme pour l'agent Azure Monitor)
- Une identité est automatiquement crée pour la VM dans Azure AD
- Seule cette ressource Azure peut utiliser cette identité pour demander des tokens à Azure AD
- Côté Telegraf, pas de configuration spécifique à faire
---
<section style="text-align: left;">
## Métriques dans Azure Monitor (1/4)
- Le plugin de type output `azure_monitor` envoie les métriques vers Azure Monitor
- Le plugin est encore en preview
- Il aggrége les métriques récupérées en tranches d'une minute
- Ensuite les tranches sont envoyées à Azure Monitor à chaque intervalle de flush
---
## Métriques dans Azure Monitor (2/4)
Exemple de configuration
```
[[outputs.azure_monitor]]
## Set the namespace prefix, defaults to "Telegraf/<input-name>".
# namespace_prefix = "Telegraf/"
## Azure Monitor doesn't have a string value type, so convert string
## fields to dimensions (a.k.a. tags) if enabled
# strings_as_dimensions = false
## Azure Region to publish metrics against.
## ex: region = "southcentralus"
# region = ""
# resource_id = ""
# endpoint_url = "https://monitoring.core.usgovcloudapi.net"
```
---
<section style="text-align: left;">
## Métriques dans Azure Monitor (3/4)

---
<section style="text-align: left;">
## Métriques dans Azure Monitor (4/4)

---
<section style="text-align: left;">
## Métriques dans Prometheus (push) (1/3)
Le plugin de type output `http` envoie les données dans un message http, dans un format `prometheusremotewrite`. Le header `Authorization` associé permet l'authentification dans Rancher.
```
[[outputs.http]]
alias = "prometheus-0"
url = "https://rancher.ocb-test06[...]/prometheus-0[...]/v1/write"
data_format = "prometheusremotewrite"
[outputs.http.headers]
Authorization = "Bearer xxx"
Content-Type = "application/x-protobuf"
Content-Encoding = "snappy"
X-Prometheus-Remote-Write-Version = "0.1.0"
```
---
<section style="text-align: left;">
## Métriques dans Prometheus (push) (2/3)

---
<section style="text-align: left;">
## Métriques dans Prometheus (push) (3/3)

---
<section style="text-align: left;">
## Métriques dans Prometheus (pull)
Le plugin de type output `prometheus_client` expose les métriques sur un endpoint http (par défaut : `/metrics`). Un serveur Prometheus va ensuite récupérer les données par pulling.
Ce mode de fonctionnement est à privilégier dans le cas de métriques de type `Summary` et `Histogram`.
```
# Configuration for the Prometheus client to spawn
[[outputs.prometheus_client]]
## Address to listen on.
listen = ":9273"
```
---
<section style="text-align: left;">
## Monitoring de Telegraf : output health (1/2)
Permet d'avoir un healtcheck http
Différents tests peuvent être réalisés :
- `compares` : ça compare la valeur d'un field à une valeur en dure
- `contains` : ça vérifie que la métrique contient bien un field
Si :
- échec : code retour 503
- succès : code retour 200
---
<section style="text-align: left;">
## Monitoring de Telegraf : output health (2/2)
### Exemple de configuration
```bas
[[outputs.health]]
service_address = "http://localhost:8080"
namepass = ["internal_agent", "internal_write"]
[[outputs.health.compares]]
field = "gather_errors"
lt = 5.0
[[outputs.health.contains]]
field = "buffer_size"
```
---
<section style="text-align: left;">
## Monitoring de Telegraf : input internal (1/2)
### Permet d'avoir des métriques sur Telegraf lui-même :
- le nombre de métriques collectées
- le nombre de métriques écrites
- la taille limite du buffer
- la taille du buffer
- des stats sur la mémoire
- ...
---
<section style="text-align: left;">
## Monitoring de Telegraf : input internal (2/2)
- Configuration :
```bas
# Collect statistics about itself
[[inputs.internal]]
## If true, collect telegraf memory stats.
# collect_memstats = true
```
- Dashboard upstream disponible (à améliorer)
---
<section style="text-align: left;">
## Monitoring de Telegraf : mix des deux solutions
Les deux plugins utilisés séparément ne permettent pas de valider la chaine de bout en bout.
On pourrait utiliser les deux plugins pour monitorer Telegraf.
- internal pour récupérer les métriques internes de Telegraf
- health pour vérifier que le plugin internal fonctionne comme attendu
---
<section style="text-align: left;">
## Problème connu avec Azure Monitor (1/3)
### Description
- Azure Monitor n'accepte pas les valeurs négatives (contrairement à Prometheus ou Cloudwatch)
- Une seule métrique avec une valeur négative -> toutes les écritures sur Azure Monitor sont bloquées
---
<section style="text-align: left;">
## Problème connu avec Azure Monitor (2/3)
### Solutions
- Filtrer les métriques ayant une valeur négative `fielddrop = ["tcp_maxconn"]`
- Toutes les valeurs négatives -> 0
```bas
[[processors.execd]]
command = ["sed", "s/=-[0-9]*i/=0i/"]
```
- Faire un patch upstream pour que les valeurs négatives ne soient plus envoyées dans Azure Monitor
---
<section style="text-align: left;">
## Problème connu avec Azure Monitor (3/3)
**Supervision de ce problème** :

---
<section style="text-align: left;">
## Limitations
- Le problème des valeurs négatives
- Le plugin output Azure monitor est en preview. Il ne fonctionne pas avec toutes les régions.
---
<section style="text-align: left;">
## Ressources utilisées (CPU/RAM)


---
<section style="text-align: left;">
## Comparaison entre Telegraf et l'agent Azure Monitor

<style type="text/css">
p {
font-size: smaller;
}
.reveal ul ul li {
font-size: smaller;
}
.reveal ol li {
font-size: smaller;
}
.reveal ol li ul li {
font-size: smaller;
}
.reveal section {
text-align: left;
}
}
.reveal h3 {
color: orange;
text-align: center;
border-bottom: 1px solid orange;
}
.reveal h2 {
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>