« Prometheus » : différence entre les versions
| (459 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
= Serveur = | = Serveur Prometheus = | ||
{{Barre_de_progression|95|largeur=400px|hauteur=10|couleur1 = green|texte = Partie serveur quasiment achevée, reste à voir les alertes par SMS..}} | |||
{{Barre_de_progression| | == Prometheus LXC Alpine == | ||
== LXC Alpine | |||
=== Installation serveur de base === | === Installation serveur de base === | ||
# apk update && apk upgrade | # apk update && apk upgrade | ||
| Ligne 8 : | Ligne 7 : | ||
# rc-update add prometheus default | # rc-update add prometheus default | ||
# service prometheus start | # service prometheus start | ||
On test en se rendant sur l'adresse '''<nowiki>http://IP_PROMETHEUS | On test en se rendant sur l'adresse '''<nowiki>http://</nowiki><font color = blue>IP_PROMETHEUS</font>:9090''' : | ||
[[File:Prometheus firstco.PNG|border|Le serveur fonctionne!]] | [[File:Prometheus firstco.PNG|border|Le serveur fonctionne!]] | ||
| Ligne 25 : | Ligne 24 : | ||
| niveau = modéré | | niveau = modéré | ||
| icône = important | | icône = important | ||
| texte = Par | | texte = Par défaut tout circule en clair. | ||
}} | }} | ||
| Ligne 31 : | Ligne 30 : | ||
| niveau = information | | niveau = information | ||
| icône = loupe | | icône = loupe | ||
| texte = '''Ici on va uniquement sécuriser l'accès au serveur''' | | texte = '''Ici on va uniquement sécuriser l'accès au serveur''', mais il est également possible de passer par [https://0x63.me/tls-between-prometheus-and-its-exporters/ '''stunnel'''] pour avoir les exportateurs qui envoient les données via Internet dans un tunnel crypté.. (certains exportateurs peuvent le gérer nativement également) | ||
}} | }} | ||
==== Proxy Local ==== | |||
On installe un proxy local pour sécuriser le flux : | On installe un proxy local pour sécuriser le flux : | ||
# apk add nginx | # apk add nginx | ||
# rc-update add nginx default | # rc-update add nginx default | ||
# service nginx start | # service nginx start | ||
==== Configuration ==== | |||
On crée un .htpasswd pour l'utilsateur "admin" et son mot de passe : | On crée un .htpasswd pour l'utilsateur "admin" et son mot de passe : | ||
# apk add apache2-utils | # apk add apache2-utils | ||
| Ligne 57 : | Ligne 57 : | ||
On configure le vhost : | On configure le vhost : | ||
---- | |||
* Alpine Linux 3.12 | |||
# vi /etc/nginx/conf.d/prometheus.conf | # vi /etc/nginx/conf.d/prometheus.conf | ||
* Alpine Linux 3.13 | |||
# vi /etc/nginx/http.d/prometheus.conf | |||
{{Méta bandeau | |||
| niveau = modéré | |||
| icône = important | |||
| texte = Voir [[UpgradeAlpine#NGINX|'''ce lien''']] | |||
}} | |||
---- | |||
server { | server { | ||
listen '''9191''' ssl; | listen '''9191''' ssl; | ||
| Ligne 75 : | Ligne 84 : | ||
# service nginx restart | # service nginx restart | ||
On configure prometheus en rajoutant ces <font color= | On configure prometheus en rajoutant ces <font color=blue>trois lignes</font> : | ||
{{Méta bandeau | {{Méta bandeau | ||
| niveau = | | niveau = information | ||
| icône = important | | icône = important | ||
| texte = bien respecter | | texte = bien respecter les empalcements. | ||
}} | }} | ||
# vi /etc/init.d/prometheus | # vi /etc/init.d/prometheus | ||
... | <font color= gray>...</font> | ||
command_args="--config.file=$prometheus_config_file \ | command_args="--config.file=$prometheus_config_file \ | ||
<font color= | <font color=blue>--web.listen-address="127.0.0.1:9090" \ | ||
--web.external-url=<nowiki>https://127.0.0.1:</nowiki>'''9191''' \ | --web.external-url=<nowiki>https://127.0.0.1:</nowiki>'''9191''' \ | ||
--web.route-prefix="/" \</font> | --web.route-prefix="/" \</font> | ||
--storage.tsdb.path=$prometheus_storage_path \ | --storage.tsdb.path=$prometheus_storage_path \ | ||
... | <font color= gray>...</font> | ||
# service prometheus restart | # service prometheus restart | ||
| Ligne 100 : | Ligne 109 : | ||
| niveau = information | | niveau = information | ||
| icône = important | | icône = important | ||
| texte = Le serveur <u>ne doit plus</u> être accessible via '''<nowiki>http://ip_prometheus | | texte = Le serveur <u>ne doit plus</u> être accessible via '''<nowiki>http://</nowiki><font color=blue>ip_prometheus</font>:9090''' mais le sera via '''<nowiki>https://</nowiki><font color=blue>ip_prometheus</font>:9191''' avec l'utilisateur "admin". | ||
}} | }} | ||
=== (Optionnel) Rétention de données === | === (Optionnel) Rétention de données === | ||
[https://www.robustperception.io/configuring-prometheus-storage-retention Source] | [https://www.robustperception.io/configuring-prometheus-storage-retention Source] | ||
| Ligne 112 : | Ligne 122 : | ||
| niveau = information | | niveau = information | ||
| icône = loupe | | icône = loupe | ||
| texte = Il est également possible d'exporter les métriques. | | texte = Il est également possible d'exporter les métriques sur une BDD distante. | ||
}} | }} | ||
Dans cette exemple nous allons modifier la rétention pour stocker jusqu'a 5Gb de données : | Dans cette exemple nous allons modifier la rétention pour stocker jusqu'a 5Gb de données : | ||
| Ligne 118 : | Ligne 128 : | ||
On remplace la ligne '''--storage.tsdb.retention.time=$prometheus_retention_time"''' | On remplace la ligne '''--storage.tsdb.retention.time=$prometheus_retention_time"''' | ||
... | <font color= gray>...</font> | ||
--storage.tsdb.path=$prometheus_storage_path \ | --storage.tsdb.path=$prometheus_storage_path \ | ||
<font color= | <font color=blue>--storage.tsdb.retention.size="<font color=green>5GB</font>""</font> | ||
command_user="prometheus:prometheus" | command_user="prometheus:prometheus" | ||
... | <font color= gray>...</font> | ||
{{Méta bandeau | {{Méta bandeau | ||
| niveau = information | | niveau = information | ||
| icône = important | | icône = important | ||
| texte = Bien | | texte = Bien noter le double '''""''' à la fin de la ligne. | ||
}} | }} | ||
# service prometheus restart | |||
= AlerManager = | |||
[https://prometheus.io/docs/alerting/latest/configuration/ Source] [https://medium.com/devops-dudes/prometheus-alerting-with-alertmanager-e1bbba8e6a8e Autre Source] [https://itnext.io/prometheus-alertmanager-web-ui-alerts-silence-2d34fbf2d252 Autre Source] [https://devconnected.com/alertmanager-and-prometheus-complete-setup-on-linux/ Encore une] | [https://prometheus.io/docs/alerting/latest/configuration/ Source] [https://medium.com/devops-dudes/prometheus-alerting-with-alertmanager-e1bbba8e6a8e Autre Source] [https://itnext.io/prometheus-alertmanager-web-ui-alerts-silence-2d34fbf2d252 Autre Source] [https://devconnected.com/alertmanager-and-prometheus-complete-setup-on-linux/ Encore une] | ||
== AlertManager LXC Alpine == | |||
=== Installation de base === | |||
# apk add alertmanager | |||
# rc-update add alertmanager default | |||
# service alertmanager start | |||
Se rendre sur '''<nowiki>http://</nowiki><font color = blue>IP_SERVEUR</font>:9093''' pour vérifier le bon fonctionnement : | |||
[[File:Alertmanager welcome.PNG|border|écran d'accueil d'Arlermanager]] | |||
=== Liaison Prometheus/Alertmanager === | |||
Si "Prometheus" et "Alertmanager" sont sur le même serveur : | |||
# vi /etc/prometheus/prometheus.yml | |||
On configure prometheus en rajoutant ces <font color=blue>trois lignes</font> : | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
# Alertmanager configuration | |||
alerting: | |||
alertmanagers: | |||
- static_configs: | |||
- targets: | |||
<font color = blue>- localhost</font>:<font color = blue>9093</font> | |||
# service prometheus restart | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = remplacer "'''localhost'''" par l'adresse IP du serveur abritant "Alermanager" le cas échéant. | |||
}} | |||
On peut se rendre sur son serveur "Prometheus" et vérifier le bon fonctionnement : | |||
[[File:Laison prometheus.PNG|border|Tout semble fonctionner..]] | |||
=== Sécurisation === | |||
{{Méta bandeau | |||
| niveau = modéré | |||
| icône = loupe | |||
| texte = Ici configuration sur le même serveur que le [[Prometheus#.28Optionnel.29_Securisation_serveur|Prometheus sécurisé]]. Nous ne reprendront pas l'installation du [[Prometheus#Proxy_Local|proxy Nginx local]] ou [[Prometheus#Configuration|la création du mot de passe HTTP]]. | |||
}} | |||
On prépare le cryptage : | |||
# mkdir -p /root/certs/alertmanager/ && cd /root/certs/alertmanager | |||
# openssl req \ | |||
-x509 \ | |||
-newkey rsa:4096 \ | |||
-nodes \ | |||
-keyout alertmanager.key \ | |||
-out alertmanager.crt | |||
On configure le vhost : | |||
---- | |||
* Alpine Linux 3.12 | |||
# vi /etc/nginx/conf.d/alertmanager.conf | |||
* Alpine Linux 3.13 | |||
# vi /etc/nginx/http.d/alertmanager.conf | |||
{{Méta bandeau | |||
| niveau = modéré | |||
| icône = important | |||
| texte = Voir [[UpgradeAlpine#NGINX|'''ce lien''']] | |||
}} | |||
---- | |||
server { | |||
listen '''9193''' ssl; | |||
ssl_certificate /root/certs/alertmanager/alertmanager.crt; | |||
ssl_certificate_key /root/certs/alertmanager/alertmanager.key; | |||
location / { | |||
auth_basic "alertmanager"; | |||
auth_basic_user_file /etc/nginx/.htpasswd; | |||
proxy_pass <nowiki>http://localhost:9093/</nowiki>; | |||
} | |||
} | |||
# service nginx restart | |||
On configure AlertManager : | |||
# vi /etc/init.d/alertmanager | |||
On ajoute les lignes suivantes : | |||
<font color= gray>...</font> | |||
command_args="--config.file=$alertmanager_config_file \ | |||
--storage.path=$alertmanager_storage_path \ | |||
<font color = blue>--web.listen-address="127.0.0.1:9093" \ | |||
--web.external-url=<nowiki>https://</nowiki><font color = blue>127.0.0.1</font>:9193 \ | |||
--web.route-prefix="/" \</font> | |||
$alertmanager_args" | |||
command_user="prometheus:prometheus" | |||
<font color= gray>...</font> | |||
# service alertmanager restart | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = Le serveur <u>ne doit plus</u> être accessible via '''<nowiki>http://</nowiki><font color = blue>ip_alertmanager</font>:9093''' mais le sera via '''<nowiki>https://</nowiki><font color = blue>ip_alertmanager</font>:9193''' avec l'utilisateur "admin". | |||
}} | |||
=== Liaison sécurisé Prometheus/Alertmanager === | |||
==== Installation sur le même serveur ==== | |||
Auncunes modifications nécessaire. | |||
==== Alertmanager sécurisé distant ==== | |||
[https://prometheus.io/docs/prometheus/latest/configuration/configuration/#alertmanager_config Source] | |||
On configure "Prometheus" : | |||
Prometheus:/# vi /etc/prometheus/prometheus.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
<font color= gray>...</font> | |||
# Alertmanager configuration | |||
alerting: | |||
alertmanagers: | |||
<font color = blue> - scheme: https | |||
tls_config: | |||
insecure_skip_verify: true | |||
static_configs: | |||
- targets: | |||
- <font color = green>IP_ALERTMANAGER</font>:9193 | |||
basic_auth: | |||
username: <font color = green>admin</font> | |||
password: <font color = green>motdepasse</font></font> | |||
<font color= gray>...</font> | |||
Prometheus:/# service prometheus restart | |||
== Envoie d'alertes par courriels == | |||
[https://codewizardly.com/prometheus-on-aws-ec2-part4/ Source] [https://prometheus.io/docs/alerting/latest/configuration/#email-receiver-email_config Source officiele] | |||
Editer le fichier de configuration et remplacer la configuration par défaut : | |||
# vi /etc/alertmanager/alertmanager.yml | |||
=== Exemple avec "office365" === | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = AlertManager n'est pas compatible avec les serveurs SMTP distant non crypté. (Je n'ai pas réussit à utiliser "aspmx.l.google.com" au moment d'écrire ces lignes) | |||
}} | |||
# alertmanager.yml | |||
global: | |||
# The smarthost and SMTP sender used for mail notifications. | |||
smtp_smarthost: '<font color = blue>smtp.office365.com:587</font>' | |||
smtp_from: '<font color = blue>mail365valide@exemple.net</font>' | |||
smtp_auth_username: '<font color = blue>mail365valide@exemple.net</font>' | |||
smtp_auth_password: '<font color = blue>supermotdepasse</font>' | |||
route: | |||
# When a new group of alerts is created by an incoming alert, wait at | |||
# least 'group_wait' to send the initial notification. | |||
# This way ensures that you get multiple alerts for the same group that start | |||
# firing shortly after another are batched together on the first | |||
# notification. | |||
group_wait: 10s | |||
# When the first notification was sent, wait 'group_interval' to send a batch | |||
# of new alerts that started firing for that group. | |||
group_interval: 30s | |||
# If an alert has successfully been sent, wait 'repeat_interval' to | |||
# resend them. | |||
<font color = blue>repeat_interval: <font color = green>30m</font></font> | |||
group_by: ['alertname', 'cluster', 'service'] | |||
# defalt receiver | |||
receiver: email-me | |||
receivers: | |||
- name: email-me | |||
email_configs: | |||
- to: '<font color = blue>monmaildereception@exemple.net</font>' | |||
send_resolved: true | |||
# service alertmanager restart | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Il est possible d'utiliser plusieurs destinataires avec envoie suivant divers critères. | |||
}} | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = La ligne "repeat_interval" fixe le délai des mails pour une même alerte, pensez à le réduire temporairement lorsque vous testez de nouvelles alertes. | |||
}} | |||
===Avoir des lien des courriels d'alertes qui renvoient sur un serveur AlertManager exposé sur Internet=== | |||
Pour que les courriels d'alertes d'AlertManager vous redirigent correctement : | |||
AlertManager:/# vi /etc/init.d/alertmanager | |||
--web.listen-address="127.0.0.1:9093" \ | |||
--web.external-url=https://<font color = blue>alertmanagerdns.exemple.net:3000</font> \ | |||
--web.route-prefix="/" \ | |||
AlertManager:/# service alertmanager restart | |||
== Alertes == | |||
[https://awesome-prometheus-alerts.grep.to/ '''Source de nombreuses alertes'''] [https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/ '''Source officielle'''] [https://medium.com/devops-dudes/prometheus-alerting-with-alertmanager-e1bbba8e6a8e '''Autre source'''] | |||
=== Configuration de Prometheus === | |||
On édite Prometheus pour activer le fichier de règles "'''rules.yml'''" | |||
Prometheus:/# vi /etc/prometheus/prometheus.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
<font color= gray>...</font> | |||
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. | |||
rule_files: | |||
<font color = blue>- /etc/prometheus/rules.yml</font> | |||
# - "first_rules.yml" | |||
# - "second_rules.yml" | |||
<font color= gray>...</font> | |||
On recharge pour activer la nouvelle configuration : | |||
Prometheus:/# service alertmanager restart | |||
=== Exemples d'alertes === | |||
==== Surveillance des exportateurs de métriques ==== | |||
Si un exportateur ou plus est inaccessible plus de 3 minutes on envoie une alerte de niveau critique (critical) | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
- alert: InstanceDown | |||
expr: up == 0 | |||
for: 3m | |||
labels: | |||
severity: 'critical' | |||
annotations: | |||
summary: "Exportateur <nowiki>{{ $labels.instance }}</nowiki> inaccessible" | |||
description: "Un exportateur de métriques est inaccessible depuis plus de 3mn. <nowiki>({{ $labels.instance }} du job: {{ $labels.job }})</nowiki>" | |||
Prometheus:/# service prometheus restart | |||
==== Node-Exporter ==== | |||
Voir [[#Prometheus_Node-Exporter|installation]]. | |||
===== Utilisation CPU===== | |||
On active une alerte (niveau "warning") lorsque le CPU est utilisé à plus de 80% plus de 5 minutes. | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: HostHighCPULoad | |||
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > <font color= blue>80</font> | |||
for: <font color= blue>5m</font> | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: "Le CPU de l'instance <nowiki>{{ $labels.instance }}</nowiki>) a depasse les 80% d'utilisation depuis plus de 5 minutes" | |||
description: "Le CPU est occuppe a plus de 80% <nowiki>({{ $labels.instance }}</nowiki>)"</font> | |||
Prometheus:/# service prometheus restart | |||
===== Perfomance CPU libre pour les VM (Host CPU steal noisy neighbor)===== | |||
Utile pour la virtualisation. On vérifie que l'utilsation CPU du serveur ne cannibalise pas plus de 10% des ressources processeurs pour les machine virtuelles. | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: HostCpuStealNoisyNeighbor | |||
expr: avg by(instance) (rate(node_cpu_seconds_total{mode="steal"}[5m])) * 100 > 10 | |||
for: 0m | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: Utilisation CPU hote empiete sur les perfomances VM <nowiki>{{ $labels.instance }})</nowiki> | |||
description: "Cannibalisation CPU > 10%. Performances des VM fortement impactees.<nowiki>{{ $labels.instance }}"</nowiki></font> | |||
Prometheus:/# service prometheus restart | |||
===== Mémoire RAM disponible ===== | |||
On envoie un avertissement lorsque la mémoire RAM disponible est inférieur à 10% (plus de 2 minutes). | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: HostOutOfMemory | |||
expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < <font color = blue>10</font> | |||
for: <font color = blue>2m</font> | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: "Le serveur <nowiki>'{{ $labels.instance }}'</nowiki> arrive a court de RAM disponible" | |||
description: Le serveur <nowiki>'{{ $labels.instance }}' ({{ $labels.job }} </nowiki>) dispose de moins de 10% de RAM disponible</font> | |||
Prometheus:/# service prometheus restart | |||
===== Espace Disque===== | |||
On active un avertissement ("warning") lorsque l'espace disque est inférieur à 20% et une alerte critique lorsqu'il est inférieur à 10% (plus de 2 minutes). | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: HostOutOfDiskSpace | |||
expr: (node_filesystem_avail_bytes * 100) / node_filesystem_size_bytes < <font color= blue>20</font> and ON (instance, device, mountpoint) node_filesystem_readonly == 0 | |||
for: <font color = blue>2m</font> | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: "L'espace disponible de '<nowiki>{{ $labels.mountpoint }}' du serveur {{ $labels.instance }} ({{ $labels.job }})</nowiki> est inferieur a 20%." | |||
description: "l'espace '<nowiki>{{ $labels.mountpoint }}' ({{ $labels.device }} {{ $labels.fstype }}) du serveur {{ $labels.instance }} ({{ $labels.job }})</nowiki> va manquer de place, espace disponible inferieur a 20%" | |||
- alert: HostOutOfDiskSpaceCrit | |||
expr: (node_filesystem_avail_bytes * 100) / node_filesystem_size_bytes < <font color= blue>10</font> and ON (instance, device, mountpoint) node_filesystem_readonly == 0 | |||
for: <font color = blue>2m</font> | |||
labels: | |||
severity: critical | |||
annotations: | |||
summary: "L'espace disponible de '<nowiki>{{ $labels.mountpoint }}' du serveur {{ $labels.instance }} ({{ $labels.job }})</nowiki> est inferieur a 10%." | |||
description: "l'espace '<nowiki>{{ $labels.mountpoint }}' ({{ $labels.device }} {{ $labels.fstype }}) du serveur {{ $labels.instance }} ({{ $labels.job }})</nowiki> va manquer de place, espace disponible inferieur a 10%"</font> | |||
Prometheus:/# service prometheus restart | |||
===== Latence Disque===== | |||
On active deux alertes (Avertissement ou "warning") lorsque la latence d'écriture ou de lecture dépasse les 100ms | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: HostUnusualDiskReadLatency | |||
expr: rate(node_disk_read_time_seconds_total[1m]) / rate(node_disk_reads_completed_total[1m]) > <font color = blue>0.1</font> and rate(node_disk_reads_completed_total[1m]) > 0 | |||
for: 2m | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: Latence lecture disque elevee <nowiki>{{ $labels.instance }} '{{ $labels.device }}' ({{ $labels.job }}</nowiki>) | |||
description: "Augmentation latence disque (lecture) <nowiki>{{ $labels.instance }} '{{ $labels.device }}' ({{ $labels.job }}</nowiki>)" | |||
- alert: HostUnusualDiskWriteLatency | |||
expr: rate(node_disk_write_time_seconds_total[1m]) / rate(node_disk_writes_completed_total[1m]) > <font color = blue>0.1</font> and rate(node_disk_writes_completed_total[1m]) > 0 | |||
for: 2m | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: Latence ecriture disque elevee <nowiki>{{ $labels.instance }} '{{ $labels.device }}' ({{ $labels.job }}</nowiki>) | |||
description: "Augmentation latence disque (ecriture) <nowiki>{{ $labels.instance }} '{{ $labels.device }}' ({{ $labels.job }}</nowiki>)"</font> | |||
Prometheus:/# service prometheus restart | |||
===== Inodes Disque (index) ===== | |||
On active un avertissement si un point de montage à moins de 10% d'inode disponible (plus de deux minutes). | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: HostOutOfInodes | |||
expr: node_filesystem_files_free / node_filesystem_files * 100 < 10 and ON (instance, device, mountpoint) node_filesystem_readonly == 0 | |||
for: <font color = blue>2m</font> | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: "Le point de montage <nowiki>'{{ $labels.mountpoint }}' ({{ $labels.fstype }}) sur '{{ $labels.instance }}' ({{ $labels.job }})</nowiki> arrive a court d'inodes" | |||
description: Le point de montage '<nowiki>{{ $labels.mountpoint }}' ({{ $labels.fstype }} {{ $labels.device }}) sur '{{ $labels.instance }}' ({{ $labels.job }})</nowiki> a moins de 10% d'inodes disponible.</font> | |||
Prometheus:/# service prometheus restart | |||
===== Utilisation "swap" (espace d'échange)===== | |||
On active une alerte lorsque que l'espace "swap" atteint les 80% de remplissage plus de deux minutes. | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: HostSwapIsFillingUp | |||
expr: (1 - (node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes)) * 100 > <font color = blue>80</font> | |||
for: <font color = blue>2m</font> | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: L'espace swap se remplit dangereusement sur <nowiki>'{{ $labels.instance }}' ({{ $labels.job }})</nowiki> | |||
description: "L'espace swap a depasse les 80% de remplissage <nowiki>{{ $labels.instance }} ({{ $labels.job }}</nowiki>)"</font> | |||
Prometheus:/# service prometheus restart | |||
===== Service systemd===== | |||
On active une alerte (niveau "warning") lorsque un service de "systemd" a crashé. | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: HostSystemdServiceCrashed | |||
expr: node_systemd_unit_state{state="failed"} == 1 | |||
for: 0m | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: Le service <nowiki>'{{ $labels.name }}' de '{{ $labels.instance }}' ({{ $labels.job }})</nowiki> a crashe | |||
description: "Le service <nowiki>'{{ $labels.name }}' de '{{ $labels.instance }}' ({{ $labels.job }})</nowiki> a crashe"</font> | |||
Prometheus:/# service prometheus restart | |||
===== Pression Mémoire ===== | |||
On active un avertissement lorsque la mémoire est sous forte pression plus de deux minutes. | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: HostMemoryUnderMemoryPressure | |||
expr: rate(node_vmstat_pgmajfault[1m]) > 1000 | |||
for: <font color = blue>2m</font> | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: Memoire sous forte pression <nowiki>{{ $labels.instance }} ({{ $labels.job }}</nowiki>) | |||
description: "Forte pression memoire, haut taux d'erreurs de page majeur (major page fault) <nowiki>{{ $labels.instance }} ({{ $labels.job }}</nowiki>)"</font> | |||
Prometheus:/# service prometheus restart | |||
===== Surveillance erreurs réseau ===== | |||
On active deux avertissements en cas d'erreur réseau en réception ou en transmission sur une interface réseau: | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: HostNetworkReceiveErrors | |||
expr: rate(node_network_receive_errs_total[2m]) / rate(node_network_receive_packets_total[2m]) > 0.01 | |||
for: 2m | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: L'interface <nowiki>'{{ $labels.device }}' sur {{ $labels.instance }} ({{ $labels.job }})</nowiki> a rencontre des erreurs de reception | |||
description: "L'interface <nowiki>'{{ $labels.device }}' sur {{ $labels.instance }} ({{ $labels.job }})</nowiki> a rencontre des erreurs de reception dans les 5 dernieres minutes" | |||
- alert: HostNetworkTransmitErrors | |||
expr: rate(node_network_transmit_errs_total[2m]) / rate(node_network_transmit_packets_total[2m]) > 0.01 | |||
for: 2m | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: L'interface <nowiki>'{{ $labels.device }}' sur {{ $labels.instance }} ({{ $labels.job }})</nowiki> a rencontre des erreurs de transmission | |||
description: "L'interface <nowiki>'{{ $labels.device }}' sur {{ $labels.instance }} ({{ $labels.job }})</nowiki> a rencontre des erreurs de transmission dans les 5 dernieres minutes"</font> | |||
Prometheus:/# service prometheus restart | |||
===== Alèrte alarme température ===== | |||
On active une alerte critique lorsque le serveur actionne une alerte de température. | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: HostNodeOvertemperatureAlarm | |||
expr: node_hwmon_temp_crit_alarm_celsius * on(chip, instance, sensor) group_left(label) node_hwmon_sensor_label == 1 | |||
for: 0m | |||
labels: | |||
severity: critical | |||
annotations: | |||
summary: DANGER Alarme surchauffe active pour <nowiki>'{{ $labels.label }}' sur '{{ $labels.instance }}' ({{ $labels.job }} {{ $labels.chip }}</nowiki>) | |||
description: "DANGER la machine a activee une alarme de surchauffe pour <nowiki>'{{ $labels.label }}' sur '{{ $labels.instance }}' ({{ $labels.job }} {{ $labels.chip }}</nowiki>)"</font> | |||
Prometheus:/# service prometheus restart | |||
==Grafana == | ===== Alerte température ===== | ||
=== Importation | On active un avertissement lorsque la température d'un capteur atteint 90% du seuil maximum recommandé et une alarme critique lorsqu'il atteint 90% du seuil critique. | ||
[[File:Grafana Prometheus SelfSigned.PNG|border| | Prometheus:/# vi /etc/prometheus/rules.yml | ||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: HostMaxtTempWarning | |||
expr: node_hwmon_temp_celsius / node_hwmon_temp_max_celsius *100 * on(chip, instance, sensor) group_left(label) node_hwmon_sensor_label >= <font color= blue>90</font> | |||
for: 0m | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: "Un composant monte en temperature. <nowiki>'{{ $labels.label }}' ({{ $labels.instance }} {{ $labels.job }})</nowiki>." | |||
description: "le capteur '<nowiki>{{ $labels.label }}' ({{ $labels.sensor }}) sur '{{ $labels.instance }}' ({{ $labels.job }}</nowiki>) se rapproche de sa temperature maximale " | |||
- alert: HostMaxtTempCrit | |||
expr: node_hwmon_temp_celsius / node_hwmon_temp_crit_celsius *100 * on(chip, instance, sensor) group_left(label) node_hwmon_sensor_label >= <font color= blue>90</font> | |||
for: 0m | |||
labels: | |||
severity: critical | |||
annotations: | |||
summary: "DANGER. Un composant monte dangereusement en temperature. <nowiki>'{{ $labels.label }}' ({{ $labels.instance }} {{ $labels.job }})</nowiki>." | |||
description: "le capteur '<nowiki>{{ $labels.label }}' ({{ $labels.sensor }}) sur '{{ $labels.instance }}' ({{ $labels.job }}</nowiki>) se rapproche de sa temperature critique "</font> | |||
Prometheus:/# service prometheus restart | |||
===== Surveillance état des "pool ZFS" ( "zpool" )===== | |||
{{Méta bandeau | |||
| niveau = grave | |||
| icône = important | |||
| texte = Nécessite au minimum [https://github.com/prometheus/node_exporter/releases la verion '1.1.0' de 'prometheus-node-exporter']. | |||
}} | |||
{{Méta bandeau | |||
| niveau = grave | |||
| icône = important | |||
| texte = <b>Ne fonctionne plus</b> depuis ZFS 2.1. | |||
}} | |||
---- | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = <u>Inutile depuis ProxMox 7.</u> | |||
}} | |||
Sur ProxMox/Debian il possible de passer par l'[[Debian_APT|'''activation du dépôt "Testing"''']] et ensuite installer une version plus récente via la commande : | |||
# apt install prometheus-node-exporter'''/testing''' | |||
---- | |||
On active une alarme critique dès qu'un RAID ZFS se trouve dans un état dégradé, en échec, supprimé, hors ligne ou non disponible. | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: NodeZpoolStateAlert | |||
expr: node_zfs_zpool_state{state="degraded"} == 1 or node_zfs_zpool_state{state="faulted"} == 1 or node_zfs_zpool_state{state="offline"} == 1 or node_zfs_zpool_state{state="removed"} == 1 or node_zfs_zpool_state{state="unavail"} == 1 | |||
for: 0m | |||
labels: | |||
severity: critical | |||
annotations: | |||
summary: "DANGER, le pool <nowiki>'{{ $labels.zpool }}' sur '{{ $labels.instance }}' est dans l'etat '{{ $labels.state }}'</nowiki>" | |||
description: "DANGER, le pool <nowiki>'{{ $labels.zpool }}' est dans l'etat '{{ $labels.state }}' sur '{{ $labels.instance }}' ({{ $labels.job }})</nowiki>"</font> | |||
Prometheus:/# service prometheus restart | |||
==== Prometheus Proxmox VE Exporter ==== | |||
Voir [[#Prometheus_PVE_Exporter_.28ProxMox.29|installation]]. | |||
===== Surveillance Espace Disque VM/LXC ===== | |||
On active une alerte de niveau avertissement lorsque l'espace disque atteint, plus de 5mn, les 80% d'occupation et une autre de niveau critique lorsqu'il atteint les 90%. | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: PxMxVMDiskWarning | |||
expr: pve_disk_usage_bytes / pve_disk_size_bytes *100 * on (id, instance) group_left(name) pve_guest_info > <font color= blue>80</font> | |||
for: <font color= blue>5m</font> | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: "Espace disque inferieur a 20% sur <nowiki>'{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }} ({{ $labels.job}})'</nowiki>" | |||
description: "Attention. Espace disque occupe a plus de 80% sur l'hote <nowiki>'{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }} ({{ $labels.job}})'</nowiki>" | |||
- alert: PxMxVMDiskCrit | |||
expr: pve_disk_usage_bytes / pve_disk_size_bytes *100 * on (id, instance) group_left(name) pve_guest_info > <font color= blue>90</font> | |||
for: <font color= blue>5m</font> | |||
labels: | |||
severity: critical | |||
annotations: | |||
summary: "Espace disque inferieur a 10% pour l'hote <nowiki>'{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }} ({{ $labels.job}})'</nowiki>" | |||
description: "DANGER. Espace disque occupe a plus de 90% sur l'hote <nowiki>'{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }} ({{ $labels.job}})'</nowiki>"</font> | |||
Prometheus:/# service prometheus restart | |||
===== Surveillance Mémoire RAM VM/LXC ===== | |||
On active une alerte de niveau avertissement lorsque la RAM disponible est inférieur à 10% plus de 2 minutes. | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: PxMxVMRAMWarning | |||
expr: (pve_memory_usage_bytes / pve_memory_size_bytes *100 * on(id, instance) group_left(name, type) pve_guest_info) > <font color = blue>90</font> and on(id, instance) pve_up == 1 | |||
for: <font color= blue>2m</font> | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: "RAM disponible inferieur a 10% sur <nowiki>'{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }}'</nowiki>" | |||
description: "Attention. Memoire RAM occupee a plus de 90% sur l'hote <nowiki>'{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }} ({{ $labels.job}})'</nowiki>"</font> | |||
Prometheus:/# service prometheus restart | |||
===== Surveillance CPU VM/LXC ===== | |||
On active une alerte de niveau avertissement lorsque le processeur est occupé a plus de 80% plus de 5mn.. | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: PxMxVMCPUWarning | |||
expr: pve_cpu_usage_ratio *100 * on(id, instance) group_left(name, type) pve_guest_info > <font color = blue>80</font> and on(id, instance) pve_up == 1 | |||
for: <font color= blue>5m</font> | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: "Charge CPU importante sur <nowiki>'{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }}'</nowiki>" | |||
description: "Attention. CPU occupe a plus de 80% depuis 5mn sur l'hote <nowiki>'{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }} ({{ $labels.job}})'</nowiki>"</font> | |||
Prometheus:/# service prometheus restart | |||
==== NVidia (nvidia_gpu_prometheus_exporter) ==== | |||
Voir [[#Exportateur_Nvidia_.28nvidia_gpu_prometheus_exporter.29|installation]]. | |||
===== Surveillance Consommation mémoire===== | |||
On active une alerte (niveau "warning") lorsque la mémoire du GPU se remplit à plus de 80% plus de 3 minutes. | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: GPUOutOfMemory | |||
expr: nvidia_gpu_memory_used_bytes / nvidia_gpu_memory_total_bytes *100 > <font color= blue>80</font> | |||
for: <font color= blue>3m</font> | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: "Le GPU <nowiki>{{ $labels.name }}</nowiki> remplit sa memoire dangereusement " | |||
description: "Le GPU <nowiki>{{ $labels.name }} du serveur {{ $labels.instance }} ({{ $labels.job }})</nowiki> a depasse les 80% d'utilisation memoire depuis plus de 3 minutes"</font> | |||
Prometheus:/# service prometheus restart | |||
===== Surveillance Température GPU ===== | |||
On active une alerte de niveau avertissement lorsque le GPU atteint les 75°c et une autre de niveau critique lorsqu'il atteint les 85°c. (Adapter selon GPU) | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: GPUTempAlert | |||
expr: nvidia_gpu_temperature_celsius >= <font color= blue>75</font> | |||
for: 0m | |||
labels: | |||
severity: warning | |||
annotations: | |||
summary: "Le GPU <nowiki>{{ $labels.name }}</nowiki> chauffe dangereusement " | |||
description: "Le GPU <nowiki>{{ $labels.name }} du serveur {{ $labels.instance }} ({{ $labels.job }}</nowiki>) a atteint les 75c" | |||
- alert: GPUTempAlertCrit | |||
expr: nvidia_gpu_temperature_celsius >= <font color= blue>85</font> | |||
for: 0m | |||
labels: | |||
severity: critical | |||
annotations: | |||
summary: "Alerte. Le GPU <nowiki>{{ $labels.name }}</nowiki> atteint des niveaux de temperatures critiques" | |||
description: "Alerte. Le GPU <nowiki>{{ $labels.name }} du serveur {{ $labels.instance }} ({{ $labels.job }}</nowiki>) a atteint les 85c"</font> | |||
Prometheus:/# service prometheus restart | |||
==== SyncThing ==== | |||
Voir [[Prometheus#SyncThing_2|installation]] | |||
===== Surveillance Fonctionnement Instance ===== | |||
On active une alerte de niveau critique lorsqu'une instance de SyncThing ne fonctionne plus : | |||
Prometheus:/# vi /etc/prometheus/rules.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
groups: | |||
- name: <font color = blue>nomdugroupe</font> | |||
rules: | |||
<font color= gray>...</font> | |||
<font color = green>- alert: SyncThingInstanceUP | |||
expr: syncthing_rest_system_connections_up == 0 | |||
for: 0m | |||
labels: | |||
severity: critical | |||
annotations: | |||
summary: "L'instance SyncThing <nowiki>'{{ $labels.service }}'</nowiki> n'est plus accessible" | |||
description: "L'instance SyncThing <nowiki>'{{ $labels.service }}' ({{ $labels.instance }} {{ $labels.job }})</nowiki> n'est plus accessible"</font> | |||
Prometheus:/# service prometheus restart | |||
===== Surveillance Equipement Distant ===== | |||
syncthing_rest_system_connections_remote_device_is_paused == 1 | |||
=Grafana = | |||
== Grafana LXC Alpine Linux == | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Alpine Linux ne fait pas parti des distributions recommandées par Grafana. Cependant le programme est disponible dans les dépôts et Alpine sert de base pour de nombreux Docker Grafana. | |||
}} | |||
=== Installation de base === | |||
# apk update && apk upgrade | |||
# apk add grafana | |||
# rc-update add grafana default | |||
# service grafana start | |||
==== Résolution de bugs (Alpine 3.13 / grafana 7.3.6)==== | |||
=====Répertoire manquant===== | |||
On répare un premier bug qui apparait dans les logs.. : | |||
# mkdir /var/lib/grafana/provisioning/plugins | |||
# chown grafana. /var/lib/grafana/provisioning/plugins | |||
# service grafana restart | |||
=====Grafana accessible uniquement localement===== | |||
======(Première méthode) Proxy Local====== | |||
{{Méta bandeau | |||
| niveau = modéré | |||
| icône = important | |||
| texte = Dans cet exemple le proxy local est sécurisé, [[Prometheus#.28Optionnel.29_S.C3.A9curisation_de_Grafana|la sécurisation local]] n'est donc pas nécessaire | |||
}} | |||
Ensuite le paquet grafana actuel outrepasse grafana.ini pour forcer l'écoute uniquement sur 127.0.0.1, donc inaccessible depuis l'extérieur. On va donc passer par un [[Prometheus#Proxy_Local|proxy Nginx local]] | |||
* On édite le fichier grafana.ini : | |||
# vi /etc/grafana.ini | |||
On modifie les lignes suivantes : | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = Attention à bien supprimer le <font color = green>''';'''</font> devant les lignes à activer! | |||
}} | |||
* On bloque l'écoute extérieur en cas de MAJ qui règle le bug que nous utilisons : | |||
# The ip address to bind to, empty will bind to all interfaces | |||
<font color = blue>http_addr = <font color = green>127.0.0.1</font></font> | |||
* On change le port d'écoute pour conserver le port 3000 depuis l'extérieur : | |||
# The http port to use | |||
<font color = blue>http_port = <font color = green>3001</font></font> | |||
# service grafana restart | |||
On prépare le cryptage : | |||
# mkdir -p /root/certs/grafana/ && cd /root/certs/grafana | |||
# openssl req \ | |||
-x509 \ | |||
-newkey rsa:4096 \ | |||
-nodes \ | |||
-keyout grafana.key \ | |||
-out grafana.crt | |||
On créé le vhost local : | |||
# vi /etc/nginx/http.d/grafana.conf | |||
server { | |||
listen 3000 ssl; | |||
ssl_certificate /root/certs/grafana/grafana.crt; | |||
ssl_certificate_key /root/certs/grafana/grafana.key; | |||
location / { | |||
proxy_pass <nowiki>http://</nowiki>localhost:3001/; | |||
} | |||
} | |||
# service nginx reload | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Grafana est maintenant accessible sur <nowiki>https://</nowiki><font color = blue>IP_GRAFANA</font>:3000 | |||
}} | |||
======(seconde méthode) Modification du script d'initialisation====== | |||
On modifie le script de démarrage pour outrepasser la commande qui bloque l'écoute de Grafana sur "127.0.0.1" | |||
# vi /etc/init.d/grafana | |||
<font color= gray>...</font> | |||
command="/usr/sbin/grafana-server" | |||
command_args="$GRAFANA_OPTS <font color = blue>cfg:server.http_addr=0.0.0.0</font>" | |||
<font color= gray>...</font> | |||
# service grafana restart | |||
===(Optionnel) Sécurisation de Grafana=== | |||
On prépare le cryptage : | |||
# mkdir /var/lib/grafana/certs && cd /var/lib/grafana/certs/ | |||
# openssl req \ | |||
-x509 \ | |||
-newkey rsa:4096 \ | |||
-nodes \ | |||
-keyout grafana.key \ | |||
-out grafana.crt | |||
# chown -R grafana. /var/lib/grafana/certs | |||
Puis on édite le fichier grafana.ini : | |||
# vi /etc/grafana.ini | |||
On modifie les lignes suivantes : | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = Attention à bien supprimer le <font color = blue>''';'''</font> devant les lignes à activer! | |||
}} | |||
* On active https : | |||
# Protocol (http, https, h2, socket) | |||
<font color = blue>protocol = https</font> | |||
* On renseigne le certificat et la clef de cryptage : | |||
# https certs & key file | |||
<font color = blue>cert_file = /var/lib/grafana/certs/grafana.crt | |||
cert_key = /var/lib/grafana/certs/grafana.key</font> | |||
# service grafana restart | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Grafana ne sera plus accessible via <nowiki>http://</nowiki><font color = blue>IP_GRAFANA</font>:3000 mais via <u>http<font color = red>s</u></font><nowiki>://</nowiki><font color = blue>IP_GRAFANA</font>:3000 | |||
}} | |||
=== Exemple vhost reverse-proxy Nginx === | |||
Voir [[Nginx_ReverseProxy_LXC_Alpine_Linux|'''reverse proxy Nginx''']] | |||
server { | |||
listen 80; | |||
listen [::]:80; | |||
server_name <font color = blue>grafana.exemple.net</font>; | |||
# return 404; | |||
return 301 <nowiki>https://</nowiki>$host$request_uri; | |||
} | |||
server { | |||
server_name <font color = blue>grafana.exemple.net</font>; | |||
error_page 403 https://<font color = blue>grafana.exemple.net</font>; | |||
location / { | |||
proxy_set_header X-Real-IP $remote_addr; | |||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | |||
proxy_set_header X-Forwarded-Proto https; | |||
proxy_set_header X-Forwarded-Port 443; | |||
proxy_set_header Host $http_host; | |||
proxy_pass http<font color = red>s</font>://<font color = blue>IP_GRAFANA</font>:3000; #https si grafana sécurisé | |||
} | |||
listen [::]:443 ssl; # managed by Certbot | |||
listen 443 ssl; # managed by Certbot | |||
ssl_certificate /etc/letsencrypt/live/<font color = blue>grafana.exemple.net</font>/fullchain.pem; | |||
ssl_certificate_key /etc/letsencrypt/live/<font color = blue>grafana.exemple.net</font>/privkey.pem; | |||
include /etc/letsencrypt/options-ssl-nginx.conf; | |||
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; | |||
add_header Strict-Transport-Security "max-age=31536000" always; | |||
ssl_trusted_certificate /etc/letsencrypt/live/<font color = blue>grafana.exemple.net</font>/chain.pem; | |||
ssl_stapling on; | |||
ssl_stapling_verify on; | |||
server_tokens off; | |||
add_header X-Frame-Options "SAMEORIGIN"; | |||
add_header X-XSS-Protection "1; mode=block"; | |||
add_header X-Content-Type-Options "nosniff"; | |||
} | |||
== Configuration == | |||
=== Première connexion === | |||
*Lors de la première connexion il faut se connecter avec l'utilisateur "'''admin'''" et le mot de passe par défaut "'''admin'''" : | |||
[[File:Grafana 1er co.PNG|border|Page de connexion Grafana.]] | |||
*Grafana vous demandera de modifier le mot de passe par défaut pour d'évidentes raisons de sécurité : | |||
[[File:Grafana 1er co adminpsswd.PNG|border|Remplacer le mot de passe par défaut.]] | |||
*Nous voila enfin sur la page d'accueil : | |||
[[File:Grafana accueil.PNG|border|Page d'accueil Grafana.]] | |||
=== Import source de donnés === | |||
* Se rendre dans "'''Configuration'''" (roue dentée) -> "'''Data Sources'''" : | |||
[[File:Grafana Datasources.PNG|border|Menu Data Sources]] | |||
* Cliquer sur "'''Add data source'''" : | |||
[[File:Grafana Datasources2.PNG|border|Menu d'ajout de sources de données.]] | |||
==== Importation Source Prometheus Distant (Certificat autosigné) ==== | |||
*Sélectionner une source de données de type "'''Prometheus'''" : | |||
[[File:Grafana Source Prometheus.PNG|border|On choisit la source de type Prometheus]] | |||
*Renseigner les champs et options suivantes : | |||
[[File:Grafana Prometheus SelfSigned.PNG|border|Configuration pour Prometheus distant.]] | |||
*Valider et tester : | |||
[[File:Grafana Source Prometheus save.PNG|border|Valider et tester la configuration.]] | |||
*Un message doit confirmer le bon fonctionnement : | |||
[[File:Grafana Source Prometheus work.PNG|border|Message de validation!]] | |||
==== Importation Source Prometheus Locale ==== | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Par "locale" entendre que Grafana fonctionne sur le même serveur que la source Prometheus cible. | |||
}} | |||
*Sélectionner une source de données de type "'''Prometheus'''" : | |||
[[File:Grafana Source Prometheus.PNG|border|On choisit la source de type Prometheus]] | |||
*Renseigner les champs et options suivantes : | |||
[[File:Grafana Source Prometheus local.PNG|border|Configuration pour Prometheus local.]] | |||
*Valider et tester : | |||
[[File:Grafana Source Prometheus save.PNG|border|Valider et tester la configuration.]] | |||
*Un message doit confirmer le bon fonctionnement : | |||
[[File:Grafana Source Prometheus work.PNG|border|Message de validation!]] | |||
=== Import "Dashboard" (Tableau de Bord) === | |||
Pour économiser du temps il est possible d'importer des "dashboards" préparées par d'autres utilisateurs et de les adapter à son installation. On peut utiliser [https://grafana.com/grafana/dashboards '''ce moteur de recherche'''] pour trouver son bohneur. | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Nous allons utiliser le tableau de bord "[https://grafana.com/grafana/dashboards/10347 Proxmox via Prometheus]" (Id: 10347) dans cet exemple. | |||
}} | |||
==== identification du tableau de bord cible==== | |||
*Se rendre sur '''https://grafana.com/grafana/dashboards''', un moteur de recherche est disponible, exemple : | |||
[[File:Grafana Dashboard1.PNG|border|Résultat de la recherche "ProxMox" avec source de données "Prometheus"]] | |||
*On note le numéro d'identification du tableau de bord (10347) : | |||
[[File:Grafana Dashboard2.PNG|border| On note le numéro pour l'importation dans Grafana!]] | |||
==== Import dans Grafana ==== | |||
*Se rendre dans "'''Create'''" (symbole '''+''') -> "'''Import'''" : | |||
[[File:Grafana Dashboard3.PNG|border|Menu import.]] | |||
*Renseigner l'ID et importer : | |||
[[File:Grafana Dashboard4.PNG|border|On renseigne l'ID et on charge.]] | |||
*Il faut renseigner une source de données à attacher, il est possible de modifier le nom, etc. | |||
[[File:Grafana Dashboard5.PNG|border|Il faut au minimum renseigner une source de données.]] | |||
=== Rendre un tableau de bord Multi-source === | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Pour cet exemple nous continuons avec le tableau de bord "[https://grafana.com/grafana/dashboards/10347 Proxmox via Prometheus]" (Id: 10347) | |||
}} | |||
Pour ne pas importer des tableaux de bord identiques pour diverses sources, il est possible d'ajouter un onglet de sélection. | |||
==== (Optionnel) Suppression de la source par défaut ==== | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Si une source à le statut "par défaut", elle apparaitra deux fois dans l'onglet de sélection, en tant que tel et en tant que "default". | |||
}} | |||
* Se rendre dans "'''Configuration'''" (roue dentée) -> "'''Data Sources'''" : | |||
[[File:Grafana Datasources.PNG|border|Menu Data Sources]] | |||
*Sélectionner la base avec l'attribut "default" : | |||
[[File:Grafana Dashboard6.PNG|border|On va enlever le vilain tag..]] | |||
*Décocher l'attribut "default" : | |||
[[File:Grafana Dashboard7.PNG|border|On te tiens malandrin!]] | |||
*Puis sauvegarder : | |||
[[File:Grafana Source Prometheus save.PNG|border|Terminé.]] | |||
==== Ajout de la nouvelle source ==== | |||
*Se rendre sur le tableau de bord à modifier et sélectionner le menu "'''Dashboards settings'''" (roue dentée) : | |||
[[File:Grafana Dashboard Multi1.PNG|border|Menu "dashboards settings"]] | |||
* Sélectionner le menu "'''Variables'''" -> "'''New'''" | |||
[[File:Grafana Dashboard Multi2.PNG|border|On va ajouter une variable..]] | |||
*Dans "'''General'''", sélectionner un nom ("'''name'''") puis '''Type : Datasource''', Ensuite dans "'''Data source options'''" sélectionner '''Type : Prometheus''', enfin valider avec "'''Add'''" | |||
[[File:Grafana Dashboard Multi3.PNG|border|On renseigne la nouvelle variable..]] | |||
*De retour sur le tableau de bord un nouvel onglet est disponible : | |||
[[File:Grafana Dashboard Multi4.PNG|border|Un nouvelle onglet est disponible!]] | |||
*Il faut encore éditer <u>'''tous'''</u> les panneaux du tableau de bord de la façon suivante : | |||
[[File:Grafana Dashboard Multi5.PNG|border|On édite le panneau]] | |||
*Dans "'''Query'''" remplacer la source de données sélectionnée par "'''$Datasource'''" | |||
[[File:Grafana Dashboard Multi6.PNG|border|On change la source par une source variable..]] | |||
*Répéter l'opération pour chaque panneaux. | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Le tableau de bord "[https://grafana.com/grafana/dashboards/10347 Proxmox via Prometheus]" (Id: 10347) est multi-instance, il faudra également éditer la variable instance pour qu'elle prenne en compte plusieurs sources. Voir ci-dessous. | |||
}} | |||
=== Variable "Instance" (query) multi-source === | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = Ici, la requête qui sélectionne l'instance (serveur physique ici) à pour nom choisit, par le créateur, "instance", mais cela pourrait être différend sur d'autres tableaux de bord.. | |||
}} | |||
*Se rendre sur le tableau de bord à modifier et sélectionner le menu "'''Dashboards settings'''" (roue dentée) : | |||
[[File:Grafana Dashboard Multi1.PNG|border|Menu "dashboards settings"]] | |||
*Dans "'''Variables'''" sélectionner la variable "'''Instance'''" : | |||
[[File:Grafana Dashboard Multi7.PNG|border|Choisir la variable à modifier]] | |||
* Modifier la source par la variable "'''$Datasource'''", confirmer la requête "'''Query'''" avec "'''label_values(pve_node_info, instance)'''"* et mettre à jour avec "'''Update'''" : | |||
[[File:Grafana Dashboard Multi8.PNG|border|On renseigne les nouvelles valeurs]] | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Il faudra probablement rééditer la variable après avoir confirmé le changement de la source pour renseigner de nouveau la requête "'''label_values(pve_node_info, instance)'''" | |||
}} | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Sur des tableaux de bords plus complexes il peut avoir plusieurs variables à éditer.. | |||
}} | |||
=== Plugin AlertManager=== | |||
==== Installation du Plugin ==== | |||
Sur le serveur de Grafana : | |||
Grafana:/# grafana-cli plugins install camptocamp-prometheus-alertmanager-datasource | |||
Grafana:/# service grafana restart | |||
==== Installation de la source de données ==== | |||
* Se rendre dans "'''Configuration'''" (roue dentée) -> "'''Data Sources'''" : | |||
[[File:Grafana Datasources.PNG|border|Menu Data Sources]] | |||
* Cliquer sur "'''Add data source'''" : | |||
[[File:Grafana AlertManager Plugin0.PNG|border|Menu d'ajout de sources de données.]] | |||
* Sélectionner une source de données de type "Prometheus AlertManager" : | |||
[[File:Grafana AlertManager Plugin1.PNG|border|On sélectionne la nouvelle source de données..]] | |||
===== Importation Source "Prometheus AlertManager" Distant (Certificat autosigné) ===== | |||
*Renseigner les champs et options suivantes : | |||
[[File:Grafana AlertManager Plugin2.PNG|border|Configuration pour "Prometheus AlertManager" distant.]] | |||
*Valider et tester : | |||
[[File:Grafana Source Prometheus save.PNG|border|Valider et tester la configuration.]] | |||
*Un message doit confirmer le bon fonctionnement : | |||
[[File:Grafana Source Prometheus work.PNG|border|Message de validation!]] | |||
===== Importation Source "Prometheus AlertManager" Locale ===== | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Par "locale" entendre que Grafana fonctionne sur le même serveur que la source AlertManager cible. | |||
}} | |||
*Renseigner les champs et options suivantes : | |||
[[File:Grafana AlertManager Plugin3.PNG|border|Configuration pour Prometheus local.]] | |||
*Valider et tester : | |||
[[File:Grafana Source Prometheus save.PNG|border|Valider et tester la configuration.]] | |||
*Un message doit confirmer le bon fonctionnement : | |||
[[File:Grafana Source Prometheus work.PNG|border|Message de validation!]] | |||
=== Tableau de Bord=== | |||
Voir [[Prometheus#Import_.22Dashboard.22_.28Tableau_de_Bord.29|Importation de tableau de bord]] | |||
[https://grafana.com/grafana/dashboards/8010 Prometheus AlertManager (ID: 8010)] | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Les alertes peuvent être regroupées par leurs noms dans AlertManager, par défaut trois catégories sont déjà assignées ("NodeDown", "NodeMemoryUsage" et ""NodeCPUUsage"), à vous de changer/modifier/jouer avec.. | |||
}} | |||
= Export = | = Export = | ||
== Prometheus Node-Exporter == | |||
{{Méta bandeau | {{Méta bandeau | ||
| niveau = information | | niveau = information | ||
| icône = loupe | | icône = loupe | ||
| texte = | | texte = Exportateur de métriques orientés matériel | ||
}} | }} | ||
=== Installation Exportateur === | |||
==== ProxMox ==== | ==== ProxMox / Debian / Ubuntu ==== | ||
On installe l'exportateur : | |||
ProxMox:~# apt install prometheus-node-exporter | ProxMox:~# apt install prometheus-node-exporter | ||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Pour obtenir le status des "pool ZFS" il faudra au minimum [[#Surveillance_.C3.A9tat_des_.22pool_ZFS.22_.28_.22zpool.22_.29|la version '1.1.0' de 'prometheus-node-exporter']] | |||
}} | |||
On crée un fichier de configuration avec l'adresse et port d'écoute : | On crée un fichier de configuration avec l'adresse et port d'écoute : | ||
ProxMox:~# echo 'ARGS=--web.listen-address=<font color= | ProxMox:~# echo 'ARGS=--web.listen-address=<font color=blue>12.34.56.789</font>:<font color=blue>9100</font>' > /etc/prometheus.conf | ||
On active le fichier de configuration en modifiant le script : | On active le fichier de configuration en modifiant le script : | ||
ProxMox:~# vi /lib/systemd/system/prometheus-node-exporter.service | ProxMox:~# vi /lib/systemd/system/prometheus-node-exporter.service | ||
EnvironmentFile=<font color= | <font color= gray>...</font> | ||
EnvironmentFile=<font color=blue>/etc/prometheus.conf</font> | |||
<font color= gray>...</font> | |||
Pour éviter que le service plante au démarrage on peut ajouter cette ligne : | |||
<font color= gray>...</font> | |||
Restart=always | |||
<font color= blue>RestartSec=3</font> | |||
User=prometheus | |||
<font color= gray>...</font> | |||
ProxMox:~# systemctl daemon-reload | ProxMox:~# systemctl daemon-reload | ||
ProxMox:~# service prometheus-node-exporter restart | ProxMox:~# service prometheus-node-exporter restart | ||
=== | |||
=== Importation Prometheus === | |||
Prometheus:~# vi /etc/prometheus/prometheus.yml | Prometheus:~# vi /etc/prometheus/prometheus.yml | ||
| Ligne 162 : | Ligne 1 339 : | ||
| niveau = information | | niveau = information | ||
| icône = important | | icône = important | ||
| texte = | | texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation). | ||
}} | }} | ||
... | <font color= gray>...</font> | ||
- job_name: node | - job_name: node | ||
static_configs: | static_configs: | ||
- targets: [<font color= | - targets: [<font color=blue>12.34.56.789</font>:<font color=blue>9100</font>] | ||
<font color=green>labels: | |||
instance: '<font color=blue>nomduserveur</font>'</font> | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = La partie "<font color=green>labels</font>" est optionnel mais permet de remplacer l'adresse IP par un nom plus simple à identifier dans les rapports. | |||
}} | |||
Prometheus:~# service prometheus restart | Prometheus:~# service prometheus restart | ||
On vérifie que l' | On vérifie que l'exportateur est "up" en se rendant sur son serveur Prometheus dans "Status" -> "Targets" | ||
[[File:Prometheus menu targets.PNG|border| Menu "targets"]] | [[File:Prometheus menu targets.PNG|border| Menu "targets"]] | ||
== Prometheus PVE Exporter== | === Tableau de bord Grafana === | ||
Voir [[Prometheus#Import_.22Dashboard.22_.28Tableau_de_Bord.29|Importation de tableau de bord]] | |||
[https://grafana.com/grafana/dashboards/1860 Node Exporter Full (ID : 1860)] Attention semble buggé.. | |||
[https://grafana.com/grafana/dashboards/11074 1 Node Exporter for Prometheus Dashboard EN v20201010 (ID : 11074)] Le job Prometheus doit s'appeler "node" comme dans ce tuto.. | |||
=== AlertManager === | |||
Voir [[Prometheus#Node-Exporter|exemples d'alertes]] | |||
== Prometheus PVE Exporter (ProxMox) == | |||
[https://blog.zwindler.fr/2020/01/06/proxmox-ve-prometheus/ source en français de qualitay] | [https://blog.zwindler.fr/2020/01/06/proxmox-ve-prometheus/ source en français de qualitay] | ||
{{Méta bandeau | {{Méta bandeau | ||
| niveau = information | | niveau = information | ||
| icône = loupe | | icône = loupe | ||
| texte = | | texte = Exportateur de métriques orientés virtualisation | ||
}} | }} | ||
=== | === Installation Exportateur === | ||
On crée un groupe et un utilisateur avec les droits d'accès au monitoring : | On crée un groupe et un utilisateur avec les droits d'accès au monitoring : | ||
| Ligne 193 : | Ligne 1 386 : | ||
ProxMox:~# pveum usermod pve_exporter@pve -group monitoring | ProxMox:~# pveum usermod pve_exporter@pve -group monitoring | ||
ProxMox:~# pveum passwd pve_exporter@pve | ProxMox:~# pveum passwd pve_exporter@pve | ||
On installe l' | On installe l'exportateur : | ||
ProxMox:~# apt-get install python3-pip | ProxMox:~# apt-get install python3-pip | ||
ProxMox:~# pip3 install prometheus-pve-exporter | ProxMox:~# pip3 install prometheus-pve-exporter | ||
| Ligne 204 : | Ligne 1 397 : | ||
| niveau = information | | niveau = information | ||
| icône = important | | icône = important | ||
| texte = | | texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation). | ||
}} | }} | ||
default: | default: | ||
user: pve_exporter@pve | user: pve_exporter@pve | ||
password: <font color= | password: <font color=blue>MOTDEPASSE</font> | ||
verify_ssl: false | verify_ssl: '''false''' | ||
On créé le fichier pour systemd : | On créé le fichier pour systemd : | ||
ProxMox:~# vi /etc/systemd/system/pve_exporter.service | ProxMox:~# vi /etc/systemd/system/pve_exporter.service | ||
| Ligne 223 : | Ligne 1 414 : | ||
Restart=on-failure | Restart=on-failure | ||
WorkingDirectory=/usr/share/pve_exporter | WorkingDirectory=/usr/share/pve_exporter | ||
ExecStart=/usr/local/bin/pve_exporter /usr/share/pve_exporter/pve_exporter.yml <font color= | ExecStart=/usr/local/bin/pve_exporter --config.file /usr/share/pve_exporter/pve_exporter.yml --web.listen-adress <font color=blue>12.34.56.789</font>:<font color=green>9221</font> | ||
[Install] | [Install] | ||
WantedBy=multi-user.target | WantedBy=multi-user.target | ||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = <font color=blue>ip interface d'écoute</font>:<font color=green>Port</font> | |||
}} | |||
ProxMox:~# systemctl daemon-reload | ProxMox:~# systemctl daemon-reload | ||
ProxMox:~# systemctl enable pve_exporter | ProxMox:~# systemctl enable pve_exporter | ||
ProxMox:~# systemctl start pve_exporter | ProxMox:~# systemctl start pve_exporter | ||
=== Prometheus === | === Importation Prometheus === | ||
Prometheus:~# vi /etc/prometheus/prometheus.yml | Prometheus:~# vi /etc/prometheus/prometheus.yml | ||
| Ligne 239 : | Ligne 1 434 : | ||
| niveau = information | | niveau = information | ||
| icône = important | | icône = important | ||
| texte = | | texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation). | ||
}} | }} | ||
<font color= gray>...</font> | |||
- job_name: 'pve' | - job_name: 'pve' | ||
static_configs: | static_configs: | ||
- targets: | - targets: [<font color=blue><font color=blue>12.34.56.789</font>:<font color=blue>9221</font></font>] | ||
<font color=green>labels: | |||
instance: '<font color=blue>nomduserveur</font>'</font> | |||
metrics_path: /pve | metrics_path: /pve | ||
params: | params: | ||
module: [default] | module: [default] | ||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = La partie "<font color=green>labels</font>" est optionnel mais permet de remplacer l'adresse IP par un nom plus simple à identifier dans les rapports. | |||
}} | |||
Prometheus:~# service prometheus restart | |||
On vérifie que l'exportateur est "up" en se rendant sur son serveur Prometheus dans "Status" -> "Targets" | |||
[[File:Prometheus menu targets.PNG|border| Menu "targets"]] | |||
=== Tableau de bord Grafana === | |||
[https://grafana.com/grafana/dashboards/10347 Proxmox via Prometheus (10347)]. [[Prometheus#Import_.22Dashboard.22_.28Tableau_de_Bord.29|Tableau de bord pris pour exemple]] | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Astuce : Pour les jauges d'occupation disques, dans "'''legend'''" remplacer '''<nowiki>"{{name}}"</nowiki>''' par '''<nowiki>"{{storage}}"</nowiki>''' pour plus de visibilité | |||
}} | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Astuce : Remplacer la requête CPU par " '''pve_cpu_usage_ratio *100 * on(id, instance) group_left(name, type) pve_guest_info and on(id, instance) pve_up == 1''' " | |||
}} | |||
=== AlertManager === | |||
Voir [[#Prometheus_Proxmox_VE_Exporter|exemples d'alertes]] | |||
== Exportateur Nvidia (nvidia_gpu_prometheus_exporter) == | |||
[https://github.com/mindprince/nvidia_gpu_prometheus_exporter Source] | |||
=== Installation Exportateur === | |||
==== Commandes Docker/PodMan ==== | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Testé sur Debian, adapter si besoin.. | |||
}} | |||
pull mindprince/nvidia_gpu_prometheus_exporter:0.1 | |||
run --name nvexport -p <font color = blue>IP_INTERFACE_D_ECOUTE</font>:<font color = green>9445:9445</font> -d --restart=always -e LD_LIBRARY_PATH=<font color = blue>/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1</font> --volume <font color = blue>/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1</font>:<font color = blue>/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1</font> --privileged mindprince/nvidia_gpu_prometheus_exporter:0.1 | |||
==== Installation type Debian ==== | |||
On récupère le programme : | |||
# apt update && apt upgrade | |||
# apt install golang | |||
# mkdir /usr/local/nvidia_gpu_prometheus_exporter | |||
# export GOPATH=/usr/local/nvidia_gpu_prometheus_exporter | |||
# go get github.com/mindprince/nvidia_gpu_prometheus_exporter | |||
# chown -R root. /usr/local/nvidia_gpu_prometheus_exporter/* | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = L'exportateur est maintenant disponible sous "/usr/local/nvidia_gpu_prometheus_exporter/bin/nvidia_gpu_prometheus_exporter" | |||
}} | |||
==== Service Systemd ==== | |||
On crée un utilisateur pour exécuter le service : | |||
# useradd -r nvidia_gpu_prometheus_exporter --shell=/bin/false | |||
On crée le service : | |||
# vi /etc/systemd/system/nvidia_gpu_prometheus_exporter.service | |||
[Unit] | |||
Description=NVIDIA GPU Prometheus Exporter | |||
After=network.target | |||
[Service] | |||
Type=simple | |||
User=nvidia_gpu_prometheus_exporter | |||
Group=nvidia_gpu_prometheus_exporter | |||
ExecStart=/usr/local/nvidia_gpu_prometheus_exporter/bin/nvidia_gpu_prometheus_exporter -web.listen-address <font color=blue>123.45.67.89</font>:<font color=green>9445</font> | |||
Restart=on-failure | |||
[Install] | |||
WantedBy=multi-user.target | |||
On active le service au démarrage et immédiatement: | |||
# systemctl enable nvidia_gpu_prometheus_exporter | |||
# systemctl start nvidia_gpu_prometheus_exporter | |||
=== Importation Prometheus === | |||
Prometheus:~# vi /etc/prometheus/prometheus.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation). | |||
}} | |||
<font color= gray>...</font> | |||
- job_name: 'nvidia' | |||
static_configs: | |||
- targets: [<font color=blue>12.34.56.789</font>:<font color=blue>9445</font>] | |||
<font color=green>labels: | |||
instance: '<font color=blue>nomduserveur</font>'</font> | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = La partie "<font color=green>labels</font>" est optionnel mais permet de remplacer l'adresse IP par un nom plus simple à identifier dans les rapports. | |||
}} | |||
Prometheus:~# service prometheus restart | |||
On vérifie que l'exportateur est "up" en se rendant sur son serveur Prometheus dans "Status" -> "Targets" | |||
[[File:Prometheus menu targets.PNG|border| Menu "targets"]] | |||
=== Tableau de bord Grafana === | |||
Voir [[Prometheus#Import_.22Dashboard.22_.28Tableau_de_Bord.29|Importation de tableau de bord]] | |||
[https://grafana.com/grafana/dashboards/10703 Nvidia GPU (id: 10703)] | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Nécessite de modifier la jauge mémoire ("nvidia_gpu_memory_used_bytes / nvidia_gpu_memory_total_bytes *100" / instant:yes / décimales : 2), on peut facilement ajouter une jauge vitesse ventilateur & indicateur de température ("nvidia_gpu_fanspeed_percent" / instant:yes & "nvidia_gpu_temperature_celsius" / instant:yes) | |||
}} | |||
===AlertManager=== | |||
Voir [[Prometheus#NVidia_.28nvidia_gpu_prometheus_exporter.29|exemples d'alertes]] | |||
== SyncThing == | |||
[https://github.com/f100024/syncthing_exporter f100024/syncthing_exporter] | |||
=== Récupération / Création de la clef API === | |||
Pour pouvoir connecter l'exportateur à votre instance SyncThing, et récupérer les données de surveillance, il faut connaitre la clef API. | |||
* Depuis la GUI de SyncThing se rendre dans "'''Actions'''" -> "'''Configuration'''" : | |||
[[File:SyncThing API1.PNG|border|On se rend dans le menu de configuration..]] | |||
* La clef est accessible, <font color = green>optionnellement</font> on peut en générer une nouvelle : | |||
[[File:SyncThing API2.PNG|border|La clef API indispensable pour récupérer les métriques.]] | |||
===Installation Exportateur === | |||
==== Docker (Portainer) / Open Media Vault ==== | |||
On utilise l'image [https://github.com/f100024/syncthing_exporter f100024/syncthing_exporter] | |||
*Réseau du container de type "'''Host'''" : | |||
[[File:SyncThing OMV Exporter1.PNG|border|Réglage réseau]] | |||
*Dans les variables d'environnement, on renseigne l'adresse de l'instance SyncThing via "'''SYNCTHING_URI'''" et la clef API via "'''SYNCTHING_TOKEN'''". <font color = green>Optionnellement</font> on peut renseigner l'IP et le port d'écoute (par défaut port '9093' sur toutes les interfaces réseaux) : | |||
[[File:SyncThing OMV Exporter2.PNG|border|Variables d'environnement du container..]] | |||
*Enfin on renseigne la politique de redémarrage sur "'''Unless stopped'''" : | |||
[[File:SyncThing OMV Exporter3.PNG|border|L'exportateur doit toujours redémarrer sauf si stoppé manuellement..]] | |||
==== Linux ==== | |||
On peut récupérer le programme [https://github.com/f100024/syncthing_exporter/releases '''à cette adresse''']. | |||
# wget <nowiki>https://</nowiki>github.com/f100024/syncthing_exporter/releases/download/v<font color = green>0.3.0</font>/syncthing_exporter-<font color = green>0.3.0</font>.linux-amd64.tar.gz | |||
# tar zxvf syncthing_exporter-<font color = green>0.3.0</font>.linux-amd64.tar.gz -C /usr/local/ | |||
# mv /usr/local/syncthing_exporter-<font color = green>0.3.0</font>.linux-amd64 /usr/local/syncthing_exporter | |||
# chown root. /usr/local/syncthing_exporter/* | |||
# rm syncthing_exporter-<font color = green>0.3.0</font>.linux-amd64.tar.gz | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = L'exportateur est maintenant disponible dans "/usr/local/syncthing_exporter/syncthing_exporter". | |||
}} | |||
===== Script init.d Alpine Linux ===== | |||
[https://wiki.alpinelinux.org/wiki/Writing_Init_Scripts Source] | |||
On crée un utilisateur système et son groupe pour utiliser le programme : | |||
# addgroup -S syncthing_exporter && adduser -SH -s /sbin/nologin -G syncthing_exporter syncthing_exporter | |||
On crée le script : | |||
# vi /etc/init.d/syncthing_exporter | |||
#!/sbin/openrc-run | |||
name="syncthing_exporter" | |||
description="Syncthing metrics exporter for prometheus" | |||
command=/usr/local/syncthing_exporter/syncthing_exporter | |||
command_args="--syncthing.uri="http<font color = red>s</font>://<font color = blue>IP_SYNCTHING</font>:<font color = blue>8384</font>" \ | |||
--syncthing.token="<font color = blue>clef_API_SyncThing</font>" \ | |||
--web.listen-address="<font color = blue>IP_D_ECOUTE</font>:<font color = green>9093</font>"" | |||
command_user="syncthing_exporter" | |||
pidfile="/run/$RC_SVCNAME/$RC_SVCNAME.pid" | |||
command_background="yes" | |||
depend() { | |||
need net | |||
} | |||
start_pre() { | |||
checkpath --directory --owner $command_user:$command_user --mode 0775 \ | |||
/run/$RC_SVCNAME /var/log/$RC_SVCNAME | |||
} | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = Le port par défaut de l'exportateur (9093) est le même que le port par défaut d'AlertManager, penser à adapter si besoin. | |||
}} | |||
On rend exécutable le script : | |||
# chmod +x /etc/init.d/syncthing_exporter | |||
On ajoute le script au démarrage du système : | |||
# rc-update add syncthing_exporter default | |||
On démarre le script : | |||
# service syncthing_exporter start | |||
=== Jail OpenBSD TrueNAS === | |||
[https://dev.to/jeremycmorgan/how-to-install-golang-in-freebsd-in-5-minutes-1862 Source] | |||
On prend le contrôle du "jail" du plugin SyncThing : | |||
# iocage console <font color = blue>SyncThing</font> | |||
On récupère l'environnement "Goland" à [https://go.dev/dl/ '''cette adresse'''] : | |||
# cd /tmp | |||
# pkg install wget | |||
Ignore the mismatch and continue? [y/N]: '''y''' | |||
Proceed with this action? [y/N]: '''y''' | |||
# wget <nowiki>https://</nowiki>go.dev/dl/go<font color = green>1.22.0</font>.freebsd-amd64.tar.gz | |||
# tar zxvf go<font color = green>1.22.0</font>.freebsd-amd64.tar.gz | |||
On récupère les sources de l'exportateur à [https://github.com/f100024/syncthing_exporter/releases '''cette adresse'''] : | |||
# wget <nowiki>https://</nowiki>github.com/f100024/syncthing_exporter/archive/refs/tags/v<font color = green>0.3.6</font>.tar.gz | |||
# tar zxvf v<font color = green>0.3.6</font>.tar.gz | |||
On compile l'exportateur : | |||
# cd syncthing_exporter-<font color = green>0.3.6</font> | |||
# /tmp/go/bin/go build . | |||
On déplace le programme : | |||
# mkdir /usr/local/syncthing_exporter | |||
# mv syncthing_exporter /usr/local/syncthing_exporter/ | |||
On attribue les droits : | |||
# chown root:wheel /usr/local/syncthing_exporter/syncthing_exporter | |||
On peut nettoyer le Jail : | |||
# cd / | |||
# rm -r /tmp/syncthing_exporter* | |||
# rm -r /tmp/go* | |||
# rm -r /tmp/v<font color = green>0.3.6</font>.tar.gz | |||
# pkg delete wget libunistring libidn2 indexinfo gettext-runtime | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = L'exportateur est maintenant disponible sous "/usr/local/syncthing_exporter/syncthing_exporter". | |||
}} | |||
==== Script rc.d ==== | |||
On crée un utilisateur pour utiliser l'exportateur : | |||
# pw adduser syncthing_exporter -d /nonexistent -s /usr/sbin/nologin -c "syncthing_exporter user" | |||
On crée le script : | |||
# vi /usr/local/etc/rc.d/syncthing-exporter | |||
#!/bin/sh | |||
# PROVIDE: syncthing_exporter | |||
# REQUIRE: DAEMON | |||
# KEYWORD: shutdown | |||
. /etc/rc.subr | |||
name="syncthingexporter" | |||
rcvar="syncthingexporter_enable" | |||
syncthingexporter_user="syncthing_exporter" | |||
syncthingexporter_group="syncthing_exporter" | |||
syncthingexporter_command="/usr/local/syncthing_exporter/syncthing_exporter" | |||
pidfile="/var/run/${name}.pid" | |||
command="/usr/sbin/daemon" | |||
command_args="-f -P ${pidfile} ${syncthingexporter_command} --syncthing.uri="<nowiki>https://</nowiki><font color = green>127.0.0.1</font>:<font color = green>8384</font>" --syncthing.token="<font color = blue>clef_API_SyncThing</font>" --web.listen-address="<font color = violet>0.0.0.0</font>:<font color = green>9093</font>"" | |||
load_rc_config $name | |||
: ${syncthingexporter_enable:=no} | |||
start_precmd=syncthingexporter_startprecmd | |||
syncthingexporter_startprecmd() | |||
{ | |||
if [ ! -e ${pidfile} ]; then | |||
install -o ${syncthingexporter_user} -g ${syncthingexporter_group} /dev/null ${pidfile}; | |||
fi | |||
} | |||
run_rc_command "$1" | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = <font color = violet>0.0.0.0</font> indispensable si votre jail à une connexion réseau de type "bridge", il faudra également ouvrir le port dans le menu "jails" -> "MODIFIER" -> "Propriétés du réseau" | |||
}} | |||
On rend exécutable le script : | |||
# chmod +x /usr/local/etc/rc.d/syncthing-exporter | |||
On autorise le script : | |||
# echo 'syncthingexporter_enable="YES"' >> /etc/rc.conf | |||
On démarre le script : | |||
# service syncthing-exporter start | |||
=== Importation Prometheus === | |||
Prometheus:~# vi /etc/prometheus/prometheus.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation). | |||
}} | |||
<font color = grey>...</font> | |||
- job_name: 'syncthing_server' | |||
metrics_path: /metrics | |||
static_configs: | |||
- targets: ['<font color = blue>IP_EXPORTATEUR</font>:<font color = blue>9093</font>'] | |||
labels: | |||
service: <font color = blue>nom_serveur_syncthing</font> | |||
Prometheus:~# service prometheus restart | |||
On vérifie que l'exportateur est "up" en se rendant sur son serveur Prometheus dans "Status" -> "Targets" | |||
[[File:Prometheus menu targets.PNG|border| Menu "targets"]] | |||
== NextCloud == | |||
[https://github.com/xperimental/nextcloud-exporter xperimental/nextcloud-exporter] | |||
=== (Obsolète) Méthode Utilisateur & Mot de Passe === | |||
{{Méta bandeau | |||
| niveau = grave | |||
| icône = important | |||
| texte = A partir de Nextcloud 22 préférer [[#Méthode_authentification_par_jeton_(token)|la méthode d'authentification par jeton]] | |||
}} | |||
==== Utilisateur NextCloud-Exporter ==== | |||
Il faut un compte administrateur sur votre NextCloud pour utiliser l'exportateur, il est conseillé d'utiliser un compte dédié : | |||
* Se rendre dans le menu "Utilisateurs" de "admin" : | |||
[[File:NextCloud-Exporter1.PNG|border|Menu utilisateurs..]] | |||
*Créer un utilisateur "nextcloud-exporter" avec un mot de passe et membre du groupe "admin" : | |||
[[File:NextCloud-Exporter2.PNG|border|Membre du groupe "admin"...]] | |||
*Déconnecter admin et se connecter avec le nouvel utilisateur "nextcloud-exporter" pour la suite. | |||
==== Intallation exportateur ==== | |||
On récupère la dernière version depuis [https://github.com/xperimental/nextcloud-exporter/releases cette page] : | |||
# mkdir /usr/local/nextcloud-exporter | |||
# wget <nowiki>https://</nowiki>github.com/xperimental/nextcloud-exporter/releases/download/v<font color = green>0.4.0</font>/nextcloud-exporter-<font color = green>0.4.0</font>-amd64.bz2 | |||
# bunzip2 nextcloud-exporter-<font color = green>0.4.0</font>-amd64.bz2 | |||
# mv nextcloud-exporter-<font color = green>0.4.0</font>-amd64 /usr/local/nextcloud-exporter/nextcloud-exporter | |||
# chmod +x /usr/local/nextcloud-exporter/nextcloud-exporter | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = L'exportateur est maintenant disponible sous "/usr/local/nextcloud-exporter/nextcloud-exporter". | |||
}} | |||
==== Liaison Exportateur/NextCloud ==== | |||
On lance la commande suivante pour générer le lien de connexion de l'exportateur à NextCloud: | |||
# /usr/local/nextcloud-exporter/nextcloud-exporter --login --server <nowiki>https://</nowiki><font color = blue>nextcloud.example.net</font> | |||
On obtiens un <font color = red>lien</font> à rentrer dans un navigateur déjà connecté avec [[#Utilisateur_NextCloud-Exporter|l'utilisateur "nextcloud-exporter" précédement créé]] : | |||
<font color = darkcyan>INFO</font> nextcloud-exporter <font color = green>0.4.0</font> | |||
<font color = darkcyan>INFO</font> Starting interactive login on: <nowiki>https://</nowiki><font color = blue>nextcloud.exemple.net</font> | |||
<font color = darkcyan>INFO</font> Please open this URL in a browser: <font color = red><nowiki>https://</nowiki><font color = blue>nextcloud.exemple.net</font>/login/v2/flow/********************************************************************</font> | |||
<font color = darkcyan>INFO</font> Waiting for login ... (Ctrl-C to abort) | |||
En utilisant le lien généré on arrive sur les pages d'autorisation : | |||
[[File:NextCloud-Exporter3.PNG|border|Première fenêtre d'autorisation..]] | |||
[[File:NextCloud-Exporter4.PNG|border|Deuxième fenêtre d'autorisation..]] | |||
[[File:NextCloud-Exporter5.PNG|border|Liaison effectuée!]] | |||
L'exportateur affichera alors le '''mot de passe d'application''' dans la console : | |||
<font color = grey>... | |||
INFO Waiting for login ... (Ctrl-C to abort)</font> | |||
<font color = darkcyan>INFO</font> Username: nextcloud-exporter | |||
<font color = darkcyan>INFO</font> Password: *************************************************** | |||
Après avoir généré (et noté) le mot de passe d'application il est possible, par sécurité, de supprimer l'accès au gestionnaire de ficher pour l'exportateur : | |||
*Se rendre dans le menu "Paramètres" de l'utilisateur "nextcloud-exporter" : | |||
[[File:NextCloud-Exporter6.PNG|border|Menu Paramètres..]] | |||
* Décocher "Autoriser l'accès au gestionnaire de fichiers" dans le menu "Sécurité" : | |||
[[File:NextCloud-Exporter7.PNG|border|On supprime l'accès par sécurité..]] | |||
==== Configuration du service NextCloud-Exporter (Ubuntu/Debian) ==== | |||
On créé le fichier de configuration : | |||
# vi /usr/local/nextcloud-exporter/nextcloud-exporter.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
# required | |||
server: "https://<font color = blue>nextcloud.exemple.net</font>" | |||
username: "nextcloud-exporter" | |||
password: "<font color = blue>************************************</font>" | |||
# optional | |||
listenAddress: "<font color = blue>IP_INTERFACE_D_ECOUTE</font>:<font color = green>9205</font>" | |||
timeout: "5s" | |||
tlsSkipVerify: false | |||
On crée l'utilsateur système pour utiliser le service SystemD : | |||
# useradd -r nextcloud-exporter --shell=/bin/false | |||
On crée le service : | |||
# vi /etc/systemd/system/nextcloud-exporter.service | |||
[Unit] | |||
Description=NextCloud Prometheus Exporter | |||
After=network.target | |||
[Service] | |||
Type=simple | |||
User=nextcloud-exporter | |||
Group=nextcloud-exporter | |||
ExecStart=/usr/local/nextcloud-exporter/nextcloud-exporter -c /usr/local/nextcloud-exporter/nextcloud-exporter.yml | |||
Restart=on-failure | |||
[Install] | |||
WantedBy=multi-user.target | |||
On active le service au démarrage et immédiatement: | |||
# systemctl enable nextcloud-exporter | |||
# systemctl start nextcloud-exporter | |||
=== Méthode authentification par jeton (token) === | |||
==== Jeton ==== | |||
Il faut d'abord créer un jeton, par exemple via "openssl" : | |||
# TOKEN=$(openssl rand -hex 32) | |||
Puis configurer NextCloud pour l'utiliser : | |||
# sudo -u www-data php /var/www/nextcloud/occ config:app:set serverinfo token --value "$TOKEN" | |||
<font color = green>Config value token for app serverinfo set to</font> <font color = blue>MON_NUMERO_DE_JETON</font> | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = Noter le numéro de jeton généré pour le fichier de configuration | |||
}} | |||
==== Intallation exportateur ==== | |||
On récupère la dernière version depuis [https://github.com/xperimental/nextcloud-exporter/releases cette page] : | |||
# mkdir /usr/local/nextcloud-exporter | |||
# wget <nowiki>https://</nowiki>github.com/xperimental/nextcloud-exporter/releases/download/v<font color = green>0.5.1</font>/nextcloud-exporter-<font color = green>0.5.1</font>-amd64.bz2 | |||
# bunzip2 nextcloud-exporter-<font color = green>0.5.1</font>-amd64.bz2 | |||
# mv nextcloud-exporter-<font color = green>0.5.1</font>-amd64 /usr/local/nextcloud-exporter/nextcloud-exporter | |||
# chmod +x /usr/local/nextcloud-exporter/nextcloud-exporter | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = L'exportateur est maintenant disponible sous "/usr/local/nextcloud-exporter/nextcloud-exporter". | |||
}} | |||
==== Configuration du service NextCloud-Exporter (Ubuntu/Debian) ==== | |||
On créé le fichier de configuration : | |||
# vi /usr/local/nextcloud-exporter/nextcloud-exporter.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation) | |||
}} | |||
# required | |||
server: "https://<font color = blue>nextcloud.exemple.net</font>" | |||
authToken: "<font color = blue>MON_NUMERO_DE_JETON</font>" | |||
# optional | |||
listenAddress: "<font color = blue>IP_INTERFACE_D_ECOUTE</font>:<font color = green>9205</font>" | |||
timeout: "5s" | |||
tlsSkipVerify: false | |||
On crée l'utilsateur système pour utiliser le service SystemD : | |||
# useradd -r nextcloud-exporter --shell=/bin/false | |||
On crée le service : | |||
# vi /etc/systemd/system/nextcloud-exporter.service | |||
[Unit] | |||
Description=NextCloud Prometheus Exporter | |||
After=network.target | |||
[Service] | |||
Type=simple | |||
User=nextcloud-exporter | |||
Group=nextcloud-exporter | |||
ExecStart=/usr/local/nextcloud-exporter/nextcloud-exporter -c /usr/local/nextcloud-exporter/nextcloud-exporter.yml | |||
Restart=on-failure | |||
[Install] | |||
WantedBy=multi-user.target | |||
On active le service au démarrage et immédiatement: | |||
# systemctl enable --now nextcloud-exporter | |||
=== Importation Prometheus === | |||
Prometheus:~# vi /etc/prometheus/prometheus.yml | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = important | |||
| texte = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation). | |||
}} | |||
<font color= gray>...</font> | |||
- job_name: 'nextcloud' | |||
scrape_interval: 90s | |||
static_configs: | |||
- targets: ['<font color = blue>IP_EXPORTATEUR</font>:<font color = blue>9205</font>'] | |||
<font color=green>labels: | |||
instance: '<font color=blue>nomduserveurnextcloud</font>'</font> | |||
{{Méta bandeau | |||
| niveau = information | |||
| icône = loupe | |||
| texte = La partie "<font color=green>labels</font>" est optionnel mais permet de remplacer l'adresse IP par un nom plus simple à identifier dans les rapports. | |||
}} | |||
Prometheus:~# service prometheus restart | Prometheus:~# service prometheus restart | ||
On vérifie que l' | On vérifie que l'exportateur est "up" en se rendant sur son serveur Prometheus dans "Status" -> "Targets" | ||
[[File:Prometheus menu targets.PNG|border| Menu "targets"]] | [[File:Prometheus menu targets.PNG|border| Menu "targets"]] | ||
=== Tableau de bord Grafana === | |||
Voir [[Prometheus#Import_.22Dashboard.22_.28Tableau_de_Bord.29|Importation de tableau de bord]] | |||
[https://grafana.com/grafana/dashboards/9632 Nextcloud by ochorocho (id: 9632)] Très sommaire.. | |||
[https://grafana.com/grafana/dashboards/11033 Nextcloud Exporter Prometheus Dashboard (id: 11033)] Entièrement à reconfigurer.. | |||
Version actuelle datée du 26 mars 2024 à 16:38
Serveur Prometheus
95 % Partie serveur quasiment achevée, reste à voir les alertes par SMS..
Prometheus LXC Alpine
Installation serveur de base
# apk update && apk upgrade # apk add prometheus # rc-update add prometheus default # service prometheus start
On test en se rendant sur l'adresse http://IP_PROMETHEUS:9090 :
Facile!
(Optionnel) Securisation serveur
Proxy Local
On installe un proxy local pour sécuriser le flux :
# apk add nginx # rc-update add nginx default # service nginx start
Configuration
On crée un .htpasswd pour l'utilsateur "admin" et son mot de passe :
# apk add apache2-utils # htpasswd -c /etc/nginx/.htpasswd admin
New password:
On prépare le cryptage (self signed) :
# apk add openssl # mkdir -p /root/certs/prometheus/ && cd /root/certs/prometheus
# openssl req \
-x509 \
-newkey rsa:4096 \
-nodes \
-keyout prometheus.key \
-out prometheus.crt
On configure le vhost :
- Alpine Linux 3.12
# vi /etc/nginx/conf.d/prometheus.conf
- Alpine Linux 3.13
# vi /etc/nginx/http.d/prometheus.conf
server {
listen 9191 ssl;
ssl_certificate /root/certs/prometheus/prometheus.crt;
ssl_certificate_key /root/certs/prometheus/prometheus.key;
location / {
auth_basic "Prometheus";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:9090/;
}
}
# service nginx restart
On configure prometheus en rajoutant ces trois lignes :
# vi /etc/init.d/prometheus
...
command_args="--config.file=$prometheus_config_file \
--web.listen-address="127.0.0.1:9090" \
--web.external-url=https://127.0.0.1:9191 \
--web.route-prefix="/" \
--storage.tsdb.path=$prometheus_storage_path \
...
# service prometheus restart
* Caching service dependencies ... [ ok ] * Starting prometheus ... [ ok ]
(Optionnel) Rétention de données
Par défaut Prometheus conserve les données 15 jours, il est possible de modifier cela de plusieurs façons :
- --storage.tsdb.retention.size [EXPERIMENTAL] : Limiter la taille maximal conservée (B, KB, MB, GB, TB, PB, EB).
- --storage.tsdb.retention.time : Limiter le temps de rétention maximal.
Si vous indiquez plusieurs valeurs la première limitation atteinte fera autorité.
Dans cette exemple nous allons modifier la rétention pour stocker jusqu'a 5Gb de données :
# vi /etc/init.d/prometheus
On remplace la ligne --storage.tsdb.retention.time=$prometheus_retention_time"
...
--storage.tsdb.path=$prometheus_storage_path \
--storage.tsdb.retention.size="5GB""
command_user="prometheus:prometheus"
...
# service prometheus restart
AlerManager
Source Autre Source Autre Source Encore une
AlertManager LXC Alpine
Installation de base
# apk add alertmanager # rc-update add alertmanager default # service alertmanager start
Se rendre sur http://IP_SERVEUR:9093 pour vérifier le bon fonctionnement :
Liaison Prometheus/Alertmanager
Si "Prometheus" et "Alertmanager" sont sur le même serveur :
# vi /etc/prometheus/prometheus.yml
On configure prometheus en rajoutant ces trois lignes :
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
# service prometheus restart
On peut se rendre sur son serveur "Prometheus" et vérifier le bon fonctionnement :
Sécurisation
On prépare le cryptage :
# mkdir -p /root/certs/alertmanager/ && cd /root/certs/alertmanager
# openssl req \
-x509 \
-newkey rsa:4096 \
-nodes \
-keyout alertmanager.key \
-out alertmanager.crt
On configure le vhost :
- Alpine Linux 3.12
# vi /etc/nginx/conf.d/alertmanager.conf
- Alpine Linux 3.13
# vi /etc/nginx/http.d/alertmanager.conf
server {
listen 9193 ssl;
ssl_certificate /root/certs/alertmanager/alertmanager.crt;
ssl_certificate_key /root/certs/alertmanager/alertmanager.key;
location / {
auth_basic "alertmanager";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:9093/;
}
}
# service nginx restart
On configure AlertManager :
# vi /etc/init.d/alertmanager
On ajoute les lignes suivantes :
...
command_args="--config.file=$alertmanager_config_file \
--storage.path=$alertmanager_storage_path \
--web.listen-address="127.0.0.1:9093" \
--web.external-url=https://127.0.0.1:9193 \
--web.route-prefix="/" \
$alertmanager_args"
command_user="prometheus:prometheus"
...
# service alertmanager restart
Liaison sécurisé Prometheus/Alertmanager
Installation sur le même serveur
Auncunes modifications nécessaire.
Alertmanager sécurisé distant
On configure "Prometheus" :
Prometheus:/# vi /etc/prometheus/prometheus.yml
...
# Alertmanager configuration
alerting:
alertmanagers:
- scheme: https
tls_config:
insecure_skip_verify: true
static_configs:
- targets:
- IP_ALERTMANAGER:9193
basic_auth:
username: admin
password: motdepasse
...
Prometheus:/# service prometheus restart
Envoie d'alertes par courriels
Editer le fichier de configuration et remplacer la configuration par défaut :
# vi /etc/alertmanager/alertmanager.yml
Exemple avec "office365"
# alertmanager.yml
global:
# The smarthost and SMTP sender used for mail notifications.
smtp_smarthost: 'smtp.office365.com:587'
smtp_from: 'mail365valide@exemple.net'
smtp_auth_username: 'mail365valide@exemple.net'
smtp_auth_password: 'supermotdepasse'
route:
# When a new group of alerts is created by an incoming alert, wait at
# least 'group_wait' to send the initial notification.
# This way ensures that you get multiple alerts for the same group that start
# firing shortly after another are batched together on the first
# notification.
group_wait: 10s
# When the first notification was sent, wait 'group_interval' to send a batch
# of new alerts that started firing for that group.
group_interval: 30s
# If an alert has successfully been sent, wait 'repeat_interval' to
# resend them.
repeat_interval: 30m
group_by: ['alertname', 'cluster', 'service']
# defalt receiver
receiver: email-me
receivers:
- name: email-me
email_configs:
- to: 'monmaildereception@exemple.net'
send_resolved: true
# service alertmanager restart
Avoir des lien des courriels d'alertes qui renvoient sur un serveur AlertManager exposé sur Internet
Pour que les courriels d'alertes d'AlertManager vous redirigent correctement :
AlertManager:/# vi /etc/init.d/alertmanager
--web.listen-address="127.0.0.1:9093" \
--web.external-url=https://alertmanagerdns.exemple.net:3000 \
--web.route-prefix="/" \
AlertManager:/# service alertmanager restart
Alertes
Source de nombreuses alertes Source officielle Autre source
Configuration de Prometheus
On édite Prometheus pour activer le fichier de règles "rules.yml"
Prometheus:/# vi /etc/prometheus/prometheus.yml
... # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: - /etc/prometheus/rules.yml # - "first_rules.yml" # - "second_rules.yml" ...
On recharge pour activer la nouvelle configuration :
Prometheus:/# service alertmanager restart
Exemples d'alertes
Surveillance des exportateurs de métriques
Si un exportateur ou plus est inaccessible plus de 3 minutes on envoie une alerte de niveau critique (critical)
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
- alert: InstanceDown
expr: up == 0
for: 3m
labels:
severity: 'critical'
annotations:
summary: "Exportateur {{ $labels.instance }} inaccessible"
description: "Un exportateur de métriques est inaccessible depuis plus de 3mn. ({{ $labels.instance }} du job: {{ $labels.job }})"
Prometheus:/# service prometheus restart
Node-Exporter
Voir installation.
Utilisation CPU
On active une alerte (niveau "warning") lorsque le CPU est utilisé à plus de 80% plus de 5 minutes.
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: HostHighCPULoad
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Le CPU de l'instance {{ $labels.instance }}) a depasse les 80% d'utilisation depuis plus de 5 minutes"
description: "Le CPU est occuppe a plus de 80% ({{ $labels.instance }})"
Prometheus:/# service prometheus restart
Perfomance CPU libre pour les VM (Host CPU steal noisy neighbor)
Utile pour la virtualisation. On vérifie que l'utilsation CPU du serveur ne cannibalise pas plus de 10% des ressources processeurs pour les machine virtuelles.
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: HostCpuStealNoisyNeighbor
expr: avg by(instance) (rate(node_cpu_seconds_total{mode="steal"}[5m])) * 100 > 10
for: 0m
labels:
severity: warning
annotations:
summary: Utilisation CPU hote empiete sur les perfomances VM {{ $labels.instance }})
description: "Cannibalisation CPU > 10%. Performances des VM fortement impactees.{{ $labels.instance }}"
Prometheus:/# service prometheus restart
Mémoire RAM disponible
On envoie un avertissement lorsque la mémoire RAM disponible est inférieur à 10% (plus de 2 minutes).
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: HostOutOfMemory
expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10
for: 2m
labels:
severity: warning
annotations:
summary: "Le serveur '{{ $labels.instance }}' arrive a court de RAM disponible"
description: Le serveur '{{ $labels.instance }}' ({{ $labels.job }} ) dispose de moins de 10% de RAM disponible
Prometheus:/# service prometheus restart
Espace Disque
On active un avertissement ("warning") lorsque l'espace disque est inférieur à 20% et une alerte critique lorsqu'il est inférieur à 10% (plus de 2 minutes).
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: HostOutOfDiskSpace
expr: (node_filesystem_avail_bytes * 100) / node_filesystem_size_bytes < 20 and ON (instance, device, mountpoint) node_filesystem_readonly == 0
for: 2m
labels:
severity: warning
annotations:
summary: "L'espace disponible de '{{ $labels.mountpoint }}' du serveur {{ $labels.instance }} ({{ $labels.job }}) est inferieur a 20%."
description: "l'espace '{{ $labels.mountpoint }}' ({{ $labels.device }} {{ $labels.fstype }}) du serveur {{ $labels.instance }} ({{ $labels.job }}) va manquer de place, espace disponible inferieur a 20%"
- alert: HostOutOfDiskSpaceCrit
expr: (node_filesystem_avail_bytes * 100) / node_filesystem_size_bytes < 10 and ON (instance, device, mountpoint) node_filesystem_readonly == 0
for: 2m
labels:
severity: critical
annotations:
summary: "L'espace disponible de '{{ $labels.mountpoint }}' du serveur {{ $labels.instance }} ({{ $labels.job }}) est inferieur a 10%."
description: "l'espace '{{ $labels.mountpoint }}' ({{ $labels.device }} {{ $labels.fstype }}) du serveur {{ $labels.instance }} ({{ $labels.job }}) va manquer de place, espace disponible inferieur a 10%"
Prometheus:/# service prometheus restart
Latence Disque
On active deux alertes (Avertissement ou "warning") lorsque la latence d'écriture ou de lecture dépasse les 100ms
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: HostUnusualDiskReadLatency
expr: rate(node_disk_read_time_seconds_total[1m]) / rate(node_disk_reads_completed_total[1m]) > 0.1 and rate(node_disk_reads_completed_total[1m]) > 0
for: 2m
labels:
severity: warning
annotations:
summary: Latence lecture disque elevee {{ $labels.instance }} '{{ $labels.device }}' ({{ $labels.job }})
description: "Augmentation latence disque (lecture) {{ $labels.instance }} '{{ $labels.device }}' ({{ $labels.job }})"
- alert: HostUnusualDiskWriteLatency
expr: rate(node_disk_write_time_seconds_total[1m]) / rate(node_disk_writes_completed_total[1m]) > 0.1 and rate(node_disk_writes_completed_total[1m]) > 0
for: 2m
labels:
severity: warning
annotations:
summary: Latence ecriture disque elevee {{ $labels.instance }} '{{ $labels.device }}' ({{ $labels.job }})
description: "Augmentation latence disque (ecriture) {{ $labels.instance }} '{{ $labels.device }}' ({{ $labels.job }})"
Prometheus:/# service prometheus restart
Inodes Disque (index)
On active un avertissement si un point de montage à moins de 10% d'inode disponible (plus de deux minutes).
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: HostOutOfInodes
expr: node_filesystem_files_free / node_filesystem_files * 100 < 10 and ON (instance, device, mountpoint) node_filesystem_readonly == 0
for: 2m
labels:
severity: warning
annotations:
summary: "Le point de montage '{{ $labels.mountpoint }}' ({{ $labels.fstype }}) sur '{{ $labels.instance }}' ({{ $labels.job }}) arrive a court d'inodes"
description: Le point de montage '{{ $labels.mountpoint }}' ({{ $labels.fstype }} {{ $labels.device }}) sur '{{ $labels.instance }}' ({{ $labels.job }}) a moins de 10% d'inodes disponible.
Prometheus:/# service prometheus restart
Utilisation "swap" (espace d'échange)
On active une alerte lorsque que l'espace "swap" atteint les 80% de remplissage plus de deux minutes.
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: HostSwapIsFillingUp
expr: (1 - (node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes)) * 100 > 80
for: 2m
labels:
severity: warning
annotations:
summary: L'espace swap se remplit dangereusement sur '{{ $labels.instance }}' ({{ $labels.job }})
description: "L'espace swap a depasse les 80% de remplissage {{ $labels.instance }} ({{ $labels.job }})"
Prometheus:/# service prometheus restart
Service systemd
On active une alerte (niveau "warning") lorsque un service de "systemd" a crashé.
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: HostSystemdServiceCrashed
expr: node_systemd_unit_state{state="failed"} == 1
for: 0m
labels:
severity: warning
annotations:
summary: Le service '{{ $labels.name }}' de '{{ $labels.instance }}' ({{ $labels.job }}) a crashe
description: "Le service '{{ $labels.name }}' de '{{ $labels.instance }}' ({{ $labels.job }}) a crashe"
Prometheus:/# service prometheus restart
Pression Mémoire
On active un avertissement lorsque la mémoire est sous forte pression plus de deux minutes.
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: HostMemoryUnderMemoryPressure
expr: rate(node_vmstat_pgmajfault[1m]) > 1000
for: 2m
labels:
severity: warning
annotations:
summary: Memoire sous forte pression {{ $labels.instance }} ({{ $labels.job }})
description: "Forte pression memoire, haut taux d'erreurs de page majeur (major page fault) {{ $labels.instance }} ({{ $labels.job }})"
Prometheus:/# service prometheus restart
Surveillance erreurs réseau
On active deux avertissements en cas d'erreur réseau en réception ou en transmission sur une interface réseau:
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: HostNetworkReceiveErrors
expr: rate(node_network_receive_errs_total[2m]) / rate(node_network_receive_packets_total[2m]) > 0.01
for: 2m
labels:
severity: warning
annotations:
summary: L'interface '{{ $labels.device }}' sur {{ $labels.instance }} ({{ $labels.job }}) a rencontre des erreurs de reception
description: "L'interface '{{ $labels.device }}' sur {{ $labels.instance }} ({{ $labels.job }}) a rencontre des erreurs de reception dans les 5 dernieres minutes"
- alert: HostNetworkTransmitErrors
expr: rate(node_network_transmit_errs_total[2m]) / rate(node_network_transmit_packets_total[2m]) > 0.01
for: 2m
labels:
severity: warning
annotations:
summary: L'interface '{{ $labels.device }}' sur {{ $labels.instance }} ({{ $labels.job }}) a rencontre des erreurs de transmission
description: "L'interface '{{ $labels.device }}' sur {{ $labels.instance }} ({{ $labels.job }}) a rencontre des erreurs de transmission dans les 5 dernieres minutes"
Prometheus:/# service prometheus restart
Alèrte alarme température
On active une alerte critique lorsque le serveur actionne une alerte de température.
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: HostNodeOvertemperatureAlarm
expr: node_hwmon_temp_crit_alarm_celsius * on(chip, instance, sensor) group_left(label) node_hwmon_sensor_label == 1
for: 0m
labels:
severity: critical
annotations:
summary: DANGER Alarme surchauffe active pour '{{ $labels.label }}' sur '{{ $labels.instance }}' ({{ $labels.job }} {{ $labels.chip }})
description: "DANGER la machine a activee une alarme de surchauffe pour '{{ $labels.label }}' sur '{{ $labels.instance }}' ({{ $labels.job }} {{ $labels.chip }})"
Prometheus:/# service prometheus restart
Alerte température
On active un avertissement lorsque la température d'un capteur atteint 90% du seuil maximum recommandé et une alarme critique lorsqu'il atteint 90% du seuil critique.
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: HostMaxtTempWarning
expr: node_hwmon_temp_celsius / node_hwmon_temp_max_celsius *100 * on(chip, instance, sensor) group_left(label) node_hwmon_sensor_label >= 90
for: 0m
labels:
severity: warning
annotations:
summary: "Un composant monte en temperature. '{{ $labels.label }}' ({{ $labels.instance }} {{ $labels.job }})."
description: "le capteur '{{ $labels.label }}' ({{ $labels.sensor }}) sur '{{ $labels.instance }}' ({{ $labels.job }}) se rapproche de sa temperature maximale "
- alert: HostMaxtTempCrit
expr: node_hwmon_temp_celsius / node_hwmon_temp_crit_celsius *100 * on(chip, instance, sensor) group_left(label) node_hwmon_sensor_label >= 90
for: 0m
labels:
severity: critical
annotations:
summary: "DANGER. Un composant monte dangereusement en temperature. '{{ $labels.label }}' ({{ $labels.instance }} {{ $labels.job }})."
description: "le capteur '{{ $labels.label }}' ({{ $labels.sensor }}) sur '{{ $labels.instance }}' ({{ $labels.job }}) se rapproche de sa temperature critique "
Prometheus:/# service prometheus restart
Surveillance état des "pool ZFS" ( "zpool" )
Sur ProxMox/Debian il possible de passer par l'activation du dépôt "Testing" et ensuite installer une version plus récente via la commande :
# apt install prometheus-node-exporter/testing
On active une alarme critique dès qu'un RAID ZFS se trouve dans un état dégradé, en échec, supprimé, hors ligne ou non disponible.
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: NodeZpoolStateAlert
expr: node_zfs_zpool_state{state="degraded"} == 1 or node_zfs_zpool_state{state="faulted"} == 1 or node_zfs_zpool_state{state="offline"} == 1 or node_zfs_zpool_state{state="removed"} == 1 or node_zfs_zpool_state{state="unavail"} == 1
for: 0m
labels:
severity: critical
annotations:
summary: "DANGER, le pool '{{ $labels.zpool }}' sur '{{ $labels.instance }}' est dans l'etat '{{ $labels.state }}'"
description: "DANGER, le pool '{{ $labels.zpool }}' est dans l'etat '{{ $labels.state }}' sur '{{ $labels.instance }}' ({{ $labels.job }})"
Prometheus:/# service prometheus restart
Prometheus Proxmox VE Exporter
Voir installation.
Surveillance Espace Disque VM/LXC
On active une alerte de niveau avertissement lorsque l'espace disque atteint, plus de 5mn, les 80% d'occupation et une autre de niveau critique lorsqu'il atteint les 90%.
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: PxMxVMDiskWarning
expr: pve_disk_usage_bytes / pve_disk_size_bytes *100 * on (id, instance) group_left(name) pve_guest_info > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Espace disque inferieur a 20% sur '{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }} ({{ $labels.job}})'"
description: "Attention. Espace disque occupe a plus de 80% sur l'hote '{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }} ({{ $labels.job}})'"
- alert: PxMxVMDiskCrit
expr: pve_disk_usage_bytes / pve_disk_size_bytes *100 * on (id, instance) group_left(name) pve_guest_info > 90
for: 5m
labels:
severity: critical
annotations:
summary: "Espace disque inferieur a 10% pour l'hote '{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }} ({{ $labels.job}})'"
description: "DANGER. Espace disque occupe a plus de 90% sur l'hote '{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }} ({{ $labels.job}})'"
Prometheus:/# service prometheus restart
Surveillance Mémoire RAM VM/LXC
On active une alerte de niveau avertissement lorsque la RAM disponible est inférieur à 10% plus de 2 minutes.
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: PxMxVMRAMWarning
expr: (pve_memory_usage_bytes / pve_memory_size_bytes *100 * on(id, instance) group_left(name, type) pve_guest_info) > 90 and on(id, instance) pve_up == 1
for: 2m
labels:
severity: warning
annotations:
summary: "RAM disponible inferieur a 10% sur '{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }}'"
description: "Attention. Memoire RAM occupee a plus de 90% sur l'hote '{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }} ({{ $labels.job}})'"
Prometheus:/# service prometheus restart
Surveillance CPU VM/LXC
On active une alerte de niveau avertissement lorsque le processeur est occupé a plus de 80% plus de 5mn..
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: PxMxVMCPUWarning
expr: pve_cpu_usage_ratio *100 * on(id, instance) group_left(name, type) pve_guest_info > 80 and on(id, instance) pve_up == 1
for: 5m
labels:
severity: warning
annotations:
summary: "Charge CPU importante sur '{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }}'"
description: "Attention. CPU occupe a plus de 80% depuis 5mn sur l'hote '{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }} ({{ $labels.job}})'"
Prometheus:/# service prometheus restart
NVidia (nvidia_gpu_prometheus_exporter)
Voir installation.
Surveillance Consommation mémoire
On active une alerte (niveau "warning") lorsque la mémoire du GPU se remplit à plus de 80% plus de 3 minutes.
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: GPUOutOfMemory
expr: nvidia_gpu_memory_used_bytes / nvidia_gpu_memory_total_bytes *100 > 80
for: 3m
labels:
severity: warning
annotations:
summary: "Le GPU {{ $labels.name }} remplit sa memoire dangereusement "
description: "Le GPU {{ $labels.name }} du serveur {{ $labels.instance }} ({{ $labels.job }}) a depasse les 80% d'utilisation memoire depuis plus de 3 minutes"
Prometheus:/# service prometheus restart
Surveillance Température GPU
On active une alerte de niveau avertissement lorsque le GPU atteint les 75°c et une autre de niveau critique lorsqu'il atteint les 85°c. (Adapter selon GPU)
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: GPUTempAlert
expr: nvidia_gpu_temperature_celsius >= 75
for: 0m
labels:
severity: warning
annotations:
summary: "Le GPU {{ $labels.name }} chauffe dangereusement "
description: "Le GPU {{ $labels.name }} du serveur {{ $labels.instance }} ({{ $labels.job }}) a atteint les 75c"
- alert: GPUTempAlertCrit
expr: nvidia_gpu_temperature_celsius >= 85
for: 0m
labels:
severity: critical
annotations:
summary: "Alerte. Le GPU {{ $labels.name }} atteint des niveaux de temperatures critiques"
description: "Alerte. Le GPU {{ $labels.name }} du serveur {{ $labels.instance }} ({{ $labels.job }}) a atteint les 85c"
Prometheus:/# service prometheus restart
SyncThing
Voir installation
Surveillance Fonctionnement Instance
On active une alerte de niveau critique lorsqu'une instance de SyncThing ne fonctionne plus :
Prometheus:/# vi /etc/prometheus/rules.yml
groups:
- name: nomdugroupe
rules:
...
- alert: SyncThingInstanceUP
expr: syncthing_rest_system_connections_up == 0
for: 0m
labels:
severity: critical
annotations:
summary: "L'instance SyncThing '{{ $labels.service }}' n'est plus accessible"
description: "L'instance SyncThing '{{ $labels.service }}' ({{ $labels.instance }} {{ $labels.job }}) n'est plus accessible"
Prometheus:/# service prometheus restart
Surveillance Equipement Distant
syncthing_rest_system_connections_remote_device_is_paused == 1
Grafana
Grafana LXC Alpine Linux
Installation de base
# apk update && apk upgrade # apk add grafana # rc-update add grafana default # service grafana start
Résolution de bugs (Alpine 3.13 / grafana 7.3.6)
Répertoire manquant
On répare un premier bug qui apparait dans les logs.. :
# mkdir /var/lib/grafana/provisioning/plugins # chown grafana. /var/lib/grafana/provisioning/plugins # service grafana restart
Grafana accessible uniquement localement
(Première méthode) Proxy Local
Ensuite le paquet grafana actuel outrepasse grafana.ini pour forcer l'écoute uniquement sur 127.0.0.1, donc inaccessible depuis l'extérieur. On va donc passer par un proxy Nginx local
- On édite le fichier grafana.ini :
# vi /etc/grafana.ini
On modifie les lignes suivantes :
- On bloque l'écoute extérieur en cas de MAJ qui règle le bug que nous utilisons :
# The ip address to bind to, empty will bind to all interfaces http_addr = 127.0.0.1
- On change le port d'écoute pour conserver le port 3000 depuis l'extérieur :
# The http port to use http_port = 3001
# service grafana restart
On prépare le cryptage :
# mkdir -p /root/certs/grafana/ && cd /root/certs/grafana
# openssl req \
-x509 \
-newkey rsa:4096 \
-nodes \
-keyout grafana.key \
-out grafana.crt
On créé le vhost local :
# vi /etc/nginx/http.d/grafana.conf
server {
listen 3000 ssl;
ssl_certificate /root/certs/grafana/grafana.crt;
ssl_certificate_key /root/certs/grafana/grafana.key;
location / {
proxy_pass http://localhost:3001/;
}
}
# service nginx reload
(seconde méthode) Modification du script d'initialisation
On modifie le script de démarrage pour outrepasser la commande qui bloque l'écoute de Grafana sur "127.0.0.1"
# vi /etc/init.d/grafana
... command="/usr/sbin/grafana-server" command_args="$GRAFANA_OPTS cfg:server.http_addr=0.0.0.0" ...
# service grafana restart
(Optionnel) Sécurisation de Grafana
On prépare le cryptage :
# mkdir /var/lib/grafana/certs && cd /var/lib/grafana/certs/
# openssl req \
-x509 \
-newkey rsa:4096 \
-nodes \
-keyout grafana.key \
-out grafana.crt
# chown -R grafana. /var/lib/grafana/certs
Puis on édite le fichier grafana.ini :
# vi /etc/grafana.ini
On modifie les lignes suivantes :
- On active https :
# Protocol (http, https, h2, socket) protocol = https
- On renseigne le certificat et la clef de cryptage :
# https certs & key file cert_file = /var/lib/grafana/certs/grafana.crt cert_key = /var/lib/grafana/certs/grafana.key
# service grafana restart
Exemple vhost reverse-proxy Nginx
Voir reverse proxy Nginx
server {
listen 80;
listen [::]:80;
server_name grafana.exemple.net;
# return 404;
return 301 https://$host$request_uri;
}
server {
server_name grafana.exemple.net;
error_page 403 https://grafana.exemple.net;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Host $http_host;
proxy_pass https://IP_GRAFANA:3000; #https si grafana sécurisé
}
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/grafana.exemple.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/grafana.exemple.net/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
add_header Strict-Transport-Security "max-age=31536000" always;
ssl_trusted_certificate /etc/letsencrypt/live/grafana.exemple.net/chain.pem;
ssl_stapling on;
ssl_stapling_verify on;
server_tokens off;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
}
Configuration
Première connexion
- Lors de la première connexion il faut se connecter avec l'utilisateur "admin" et le mot de passe par défaut "admin" :
- Grafana vous demandera de modifier le mot de passe par défaut pour d'évidentes raisons de sécurité :
- Nous voila enfin sur la page d'accueil :
Import source de donnés
- Se rendre dans "Configuration" (roue dentée) -> "Data Sources" :
- Cliquer sur "Add data source" :
Importation Source Prometheus Distant (Certificat autosigné)
- Sélectionner une source de données de type "Prometheus" :
- Renseigner les champs et options suivantes :
- Valider et tester :
- Un message doit confirmer le bon fonctionnement :
Importation Source Prometheus Locale
- Sélectionner une source de données de type "Prometheus" :
- Renseigner les champs et options suivantes :
- Valider et tester :
- Un message doit confirmer le bon fonctionnement :
Import "Dashboard" (Tableau de Bord)
Pour économiser du temps il est possible d'importer des "dashboards" préparées par d'autres utilisateurs et de les adapter à son installation. On peut utiliser ce moteur de recherche pour trouver son bohneur.
identification du tableau de bord cible
- Se rendre sur https://grafana.com/grafana/dashboards, un moteur de recherche est disponible, exemple :
- On note le numéro d'identification du tableau de bord (10347) :
Import dans Grafana
- Se rendre dans "Create" (symbole +) -> "Import" :
- Renseigner l'ID et importer :
- Il faut renseigner une source de données à attacher, il est possible de modifier le nom, etc.
Rendre un tableau de bord Multi-source
Pour ne pas importer des tableaux de bord identiques pour diverses sources, il est possible d'ajouter un onglet de sélection.
(Optionnel) Suppression de la source par défaut
- Se rendre dans "Configuration" (roue dentée) -> "Data Sources" :
- Sélectionner la base avec l'attribut "default" :
- Décocher l'attribut "default" :
- Puis sauvegarder :
Ajout de la nouvelle source
- Se rendre sur le tableau de bord à modifier et sélectionner le menu "Dashboards settings" (roue dentée) :
- Sélectionner le menu "Variables" -> "New"
- Dans "General", sélectionner un nom ("name") puis Type : Datasource, Ensuite dans "Data source options" sélectionner Type : Prometheus, enfin valider avec "Add"
- De retour sur le tableau de bord un nouvel onglet est disponible :
- Il faut encore éditer tous les panneaux du tableau de bord de la façon suivante :
- Dans "Query" remplacer la source de données sélectionnée par "$Datasource"
- Répéter l'opération pour chaque panneaux.
Variable "Instance" (query) multi-source
- Se rendre sur le tableau de bord à modifier et sélectionner le menu "Dashboards settings" (roue dentée) :
- Dans "Variables" sélectionner la variable "Instance" :
- Modifier la source par la variable "$Datasource", confirmer la requête "Query" avec "label_values(pve_node_info, instance)"* et mettre à jour avec "Update" :
Plugin AlertManager
Installation du Plugin
Sur le serveur de Grafana :
Grafana:/# grafana-cli plugins install camptocamp-prometheus-alertmanager-datasource Grafana:/# service grafana restart
Installation de la source de données
- Se rendre dans "Configuration" (roue dentée) -> "Data Sources" :
- Cliquer sur "Add data source" :
- Sélectionner une source de données de type "Prometheus AlertManager" :
Importation Source "Prometheus AlertManager" Distant (Certificat autosigné)
- Renseigner les champs et options suivantes :
- Valider et tester :
- Un message doit confirmer le bon fonctionnement :
Importation Source "Prometheus AlertManager" Locale
- Renseigner les champs et options suivantes :
- Valider et tester :
- Un message doit confirmer le bon fonctionnement :
Tableau de Bord
Voir Importation de tableau de bord
Prometheus AlertManager (ID: 8010)
Export
Prometheus Node-Exporter
Installation Exportateur
ProxMox / Debian / Ubuntu
On installe l'exportateur :
ProxMox:~# apt install prometheus-node-exporter
On crée un fichier de configuration avec l'adresse et port d'écoute :
ProxMox:~# echo 'ARGS=--web.listen-address=12.34.56.789:9100' > /etc/prometheus.conf
On active le fichier de configuration en modifiant le script :
ProxMox:~# vi /lib/systemd/system/prometheus-node-exporter.service
... EnvironmentFile=/etc/prometheus.conf ...
Pour éviter que le service plante au démarrage on peut ajouter cette ligne :
... Restart=always RestartSec=3 User=prometheus ...
ProxMox:~# systemctl daemon-reload ProxMox:~# service prometheus-node-exporter restart
Importation Prometheus
Prometheus:~# vi /etc/prometheus/prometheus.yml
...
- job_name: node
static_configs:
- targets: [12.34.56.789:9100]
labels:
instance: 'nomduserveur'
Prometheus:~# service prometheus restart
On vérifie que l'exportateur est "up" en se rendant sur son serveur Prometheus dans "Status" -> "Targets"
Tableau de bord Grafana
Voir Importation de tableau de bord
Node Exporter Full (ID : 1860) Attention semble buggé..
1 Node Exporter for Prometheus Dashboard EN v20201010 (ID : 11074) Le job Prometheus doit s'appeler "node" comme dans ce tuto..
AlertManager
Voir exemples d'alertes
Prometheus PVE Exporter (ProxMox)
source en français de qualitay
Installation Exportateur
On crée un groupe et un utilisateur avec les droits d'accès au monitoring :
ProxMox:~# pveum groupadd monitoring -comment 'Monitoring group' ProxMox:~# pveum aclmod / -group monitoring -role PVEAuditor ProxMox:~# pveum useradd pve_exporter@pve ProxMox:~# pveum usermod pve_exporter@pve -group monitoring ProxMox:~# pveum passwd pve_exporter@pve
On installe l'exportateur :
ProxMox:~# apt-get install python3-pip ProxMox:~# pip3 install prometheus-pve-exporter
On va ensuite créer un fichier de configuration :
ProxMox:~# mkdir -p /usr/share/pve_exporter/
ProxMox:~# vi /usr/share/pve_exporter/pve_exporter.yml
default:
user: pve_exporter@pve
password: MOTDEPASSE
verify_ssl: false
On créé le fichier pour systemd :
ProxMox:~# vi /etc/systemd/system/pve_exporter.service
[Unit] Description=Proxmox VE Prometheus Exporter After=network.target Wants=network.target [Service] Restart=on-failure WorkingDirectory=/usr/share/pve_exporter ExecStart=/usr/local/bin/pve_exporter --config.file /usr/share/pve_exporter/pve_exporter.yml --web.listen-adress 12.34.56.789:9221 [Install] WantedBy=multi-user.target
ProxMox:~# systemctl daemon-reload ProxMox:~# systemctl enable pve_exporter ProxMox:~# systemctl start pve_exporter
Importation Prometheus
Prometheus:~# vi /etc/prometheus/prometheus.yml
...
- job_name: 'pve'
static_configs:
- targets: [12.34.56.789:9221]
labels:
instance: 'nomduserveur'
metrics_path: /pve
params:
module: [default]
Prometheus:~# service prometheus restart
On vérifie que l'exportateur est "up" en se rendant sur son serveur Prometheus dans "Status" -> "Targets"
Tableau de bord Grafana
Proxmox via Prometheus (10347). Tableau de bord pris pour exemple
AlertManager
Voir exemples d'alertes
Exportateur Nvidia (nvidia_gpu_prometheus_exporter)
Installation Exportateur
Commandes Docker/PodMan
pull mindprince/nvidia_gpu_prometheus_exporter:0.1
run --name nvexport -p IP_INTERFACE_D_ECOUTE:9445:9445 -d --restart=always -e LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 --volume /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1:/usr/lib/x86_64-linux-gnu/libnvidia-ml.so.1 --privileged mindprince/nvidia_gpu_prometheus_exporter:0.1
Installation type Debian
On récupère le programme :
# apt update && apt upgrade # apt install golang # mkdir /usr/local/nvidia_gpu_prometheus_exporter # export GOPATH=/usr/local/nvidia_gpu_prometheus_exporter # go get github.com/mindprince/nvidia_gpu_prometheus_exporter # chown -R root. /usr/local/nvidia_gpu_prometheus_exporter/*
Service Systemd
On crée un utilisateur pour exécuter le service :
# useradd -r nvidia_gpu_prometheus_exporter --shell=/bin/false
On crée le service :
# vi /etc/systemd/system/nvidia_gpu_prometheus_exporter.service
[Unit] Description=NVIDIA GPU Prometheus Exporter After=network.target [Service] Type=simple User=nvidia_gpu_prometheus_exporter Group=nvidia_gpu_prometheus_exporter ExecStart=/usr/local/nvidia_gpu_prometheus_exporter/bin/nvidia_gpu_prometheus_exporter -web.listen-address 123.45.67.89:9445 Restart=on-failure [Install] WantedBy=multi-user.target
On active le service au démarrage et immédiatement:
# systemctl enable nvidia_gpu_prometheus_exporter # systemctl start nvidia_gpu_prometheus_exporter
Importation Prometheus
Prometheus:~# vi /etc/prometheus/prometheus.yml
...
- job_name: 'nvidia'
static_configs:
- targets: [12.34.56.789:9445]
labels:
instance: 'nomduserveur'
Prometheus:~# service prometheus restart
On vérifie que l'exportateur est "up" en se rendant sur son serveur Prometheus dans "Status" -> "Targets"
Tableau de bord Grafana
Voir Importation de tableau de bord
AlertManager
Voir exemples d'alertes
SyncThing
Récupération / Création de la clef API
Pour pouvoir connecter l'exportateur à votre instance SyncThing, et récupérer les données de surveillance, il faut connaitre la clef API.
- Depuis la GUI de SyncThing se rendre dans "Actions" -> "Configuration" :
- La clef est accessible, optionnellement on peut en générer une nouvelle :
Installation Exportateur
Docker (Portainer) / Open Media Vault
On utilise l'image f100024/syncthing_exporter
- Réseau du container de type "Host" :
- Dans les variables d'environnement, on renseigne l'adresse de l'instance SyncThing via "SYNCTHING_URI" et la clef API via "SYNCTHING_TOKEN". Optionnellement on peut renseigner l'IP et le port d'écoute (par défaut port '9093' sur toutes les interfaces réseaux) :
- Enfin on renseigne la politique de redémarrage sur "Unless stopped" :
Linux
On peut récupérer le programme à cette adresse.
# wget https://github.com/f100024/syncthing_exporter/releases/download/v0.3.0/syncthing_exporter-0.3.0.linux-amd64.tar.gz # tar zxvf syncthing_exporter-0.3.0.linux-amd64.tar.gz -C /usr/local/ # mv /usr/local/syncthing_exporter-0.3.0.linux-amd64 /usr/local/syncthing_exporter # chown root. /usr/local/syncthing_exporter/* # rm syncthing_exporter-0.3.0.linux-amd64.tar.gz
Script init.d Alpine Linux
On crée un utilisateur système et son groupe pour utiliser le programme :
# addgroup -S syncthing_exporter && adduser -SH -s /sbin/nologin -G syncthing_exporter syncthing_exporter
On crée le script :
# vi /etc/init.d/syncthing_exporter
#!/sbin/openrc-run
name="syncthing_exporter"
description="Syncthing metrics exporter for prometheus"
command=/usr/local/syncthing_exporter/syncthing_exporter
command_args="--syncthing.uri="https://IP_SYNCTHING:8384" \
--syncthing.token="clef_API_SyncThing" \
--web.listen-address="IP_D_ECOUTE:9093""
command_user="syncthing_exporter"
pidfile="/run/$RC_SVCNAME/$RC_SVCNAME.pid"
command_background="yes"
depend() {
need net
}
start_pre() {
checkpath --directory --owner $command_user:$command_user --mode 0775 \
/run/$RC_SVCNAME /var/log/$RC_SVCNAME
}
On rend exécutable le script :
# chmod +x /etc/init.d/syncthing_exporter
On ajoute le script au démarrage du système :
# rc-update add syncthing_exporter default
On démarre le script :
# service syncthing_exporter start
Jail OpenBSD TrueNAS
On prend le contrôle du "jail" du plugin SyncThing :
# iocage console SyncThing
On récupère l'environnement "Goland" à cette adresse :
# cd /tmp # pkg install wget
Ignore the mismatch and continue? [y/N]: y
Proceed with this action? [y/N]: y
# wget https://go.dev/dl/go1.22.0.freebsd-amd64.tar.gz # tar zxvf go1.22.0.freebsd-amd64.tar.gz
On récupère les sources de l'exportateur à cette adresse :
# wget https://github.com/f100024/syncthing_exporter/archive/refs/tags/v0.3.6.tar.gz # tar zxvf v0.3.6.tar.gz
On compile l'exportateur :
# cd syncthing_exporter-0.3.6 # /tmp/go/bin/go build .
On déplace le programme :
# mkdir /usr/local/syncthing_exporter # mv syncthing_exporter /usr/local/syncthing_exporter/
On attribue les droits :
# chown root:wheel /usr/local/syncthing_exporter/syncthing_exporter
On peut nettoyer le Jail :
# cd / # rm -r /tmp/syncthing_exporter* # rm -r /tmp/go* # rm -r /tmp/v0.3.6.tar.gz # pkg delete wget libunistring libidn2 indexinfo gettext-runtime
Script rc.d
On crée un utilisateur pour utiliser l'exportateur :
# pw adduser syncthing_exporter -d /nonexistent -s /usr/sbin/nologin -c "syncthing_exporter user"
On crée le script :
# vi /usr/local/etc/rc.d/syncthing-exporter
#!/bin/sh
# PROVIDE: syncthing_exporter
# REQUIRE: DAEMON
# KEYWORD: shutdown
. /etc/rc.subr
name="syncthingexporter"
rcvar="syncthingexporter_enable"
syncthingexporter_user="syncthing_exporter"
syncthingexporter_group="syncthing_exporter"
syncthingexporter_command="/usr/local/syncthing_exporter/syncthing_exporter"
pidfile="/var/run/${name}.pid"
command="/usr/sbin/daemon"
command_args="-f -P ${pidfile} ${syncthingexporter_command} --syncthing.uri="https://127.0.0.1:8384" --syncthing.token="clef_API_SyncThing" --web.listen-address="0.0.0.0:9093""
load_rc_config $name
: ${syncthingexporter_enable:=no}
start_precmd=syncthingexporter_startprecmd
syncthingexporter_startprecmd()
{
if [ ! -e ${pidfile} ]; then
install -o ${syncthingexporter_user} -g ${syncthingexporter_group} /dev/null ${pidfile};
fi
}
run_rc_command "$1"
On rend exécutable le script :
# chmod +x /usr/local/etc/rc.d/syncthing-exporter
On autorise le script :
# echo 'syncthingexporter_enable="YES"' >> /etc/rc.conf
On démarre le script :
# service syncthing-exporter start
Importation Prometheus
Prometheus:~# vi /etc/prometheus/prometheus.yml
...
- job_name: 'syncthing_server'
metrics_path: /metrics
static_configs:
- targets: ['IP_EXPORTATEUR:9093']
labels:
service: nom_serveur_syncthing
Prometheus:~# service prometheus restart
On vérifie que l'exportateur est "up" en se rendant sur son serveur Prometheus dans "Status" -> "Targets"
NextCloud
xperimental/nextcloud-exporter
(Obsolète) Méthode Utilisateur & Mot de Passe
Utilisateur NextCloud-Exporter
Il faut un compte administrateur sur votre NextCloud pour utiliser l'exportateur, il est conseillé d'utiliser un compte dédié :
- Se rendre dans le menu "Utilisateurs" de "admin" :
- Créer un utilisateur "nextcloud-exporter" avec un mot de passe et membre du groupe "admin" :
- Déconnecter admin et se connecter avec le nouvel utilisateur "nextcloud-exporter" pour la suite.
Intallation exportateur
On récupère la dernière version depuis cette page :
# mkdir /usr/local/nextcloud-exporter # wget https://github.com/xperimental/nextcloud-exporter/releases/download/v0.4.0/nextcloud-exporter-0.4.0-amd64.bz2 # bunzip2 nextcloud-exporter-0.4.0-amd64.bz2 # mv nextcloud-exporter-0.4.0-amd64 /usr/local/nextcloud-exporter/nextcloud-exporter # chmod +x /usr/local/nextcloud-exporter/nextcloud-exporter
Liaison Exportateur/NextCloud
On lance la commande suivante pour générer le lien de connexion de l'exportateur à NextCloud:
# /usr/local/nextcloud-exporter/nextcloud-exporter --login --server https://nextcloud.example.net
On obtiens un lien à rentrer dans un navigateur déjà connecté avec l'utilisateur "nextcloud-exporter" précédement créé :
INFO nextcloud-exporter 0.4.0 INFO Starting interactive login on: https://nextcloud.exemple.net INFO Please open this URL in a browser: https://nextcloud.exemple.net/login/v2/flow/******************************************************************** INFO Waiting for login ... (Ctrl-C to abort)
En utilisant le lien généré on arrive sur les pages d'autorisation :
L'exportateur affichera alors le mot de passe d'application dans la console :
... INFO Waiting for login ... (Ctrl-C to abort) INFO Username: nextcloud-exporter INFO Password: ***************************************************
Après avoir généré (et noté) le mot de passe d'application il est possible, par sécurité, de supprimer l'accès au gestionnaire de ficher pour l'exportateur :
- Se rendre dans le menu "Paramètres" de l'utilisateur "nextcloud-exporter" :
- Décocher "Autoriser l'accès au gestionnaire de fichiers" dans le menu "Sécurité" :
Configuration du service NextCloud-Exporter (Ubuntu/Debian)
On créé le fichier de configuration :
# vi /usr/local/nextcloud-exporter/nextcloud-exporter.yml
# required server: "https://nextcloud.exemple.net" username: "nextcloud-exporter" password: "************************************" # optional listenAddress: "IP_INTERFACE_D_ECOUTE:9205" timeout: "5s" tlsSkipVerify: false
On crée l'utilsateur système pour utiliser le service SystemD :
# useradd -r nextcloud-exporter --shell=/bin/false
On crée le service :
# vi /etc/systemd/system/nextcloud-exporter.service
[Unit] Description=NextCloud Prometheus Exporter After=network.target [Service] Type=simple User=nextcloud-exporter Group=nextcloud-exporter ExecStart=/usr/local/nextcloud-exporter/nextcloud-exporter -c /usr/local/nextcloud-exporter/nextcloud-exporter.yml Restart=on-failure [Install] WantedBy=multi-user.target
On active le service au démarrage et immédiatement:
# systemctl enable nextcloud-exporter # systemctl start nextcloud-exporter
Méthode authentification par jeton (token)
Jeton
Il faut d'abord créer un jeton, par exemple via "openssl" :
# TOKEN=$(openssl rand -hex 32)
Puis configurer NextCloud pour l'utiliser :
# sudo -u www-data php /var/www/nextcloud/occ config:app:set serverinfo token --value "$TOKEN"
Config value token for app serverinfo set to MON_NUMERO_DE_JETON
Intallation exportateur
On récupère la dernière version depuis cette page :
# mkdir /usr/local/nextcloud-exporter # wget https://github.com/xperimental/nextcloud-exporter/releases/download/v0.5.1/nextcloud-exporter-0.5.1-amd64.bz2 # bunzip2 nextcloud-exporter-0.5.1-amd64.bz2 # mv nextcloud-exporter-0.5.1-amd64 /usr/local/nextcloud-exporter/nextcloud-exporter # chmod +x /usr/local/nextcloud-exporter/nextcloud-exporter
Configuration du service NextCloud-Exporter (Ubuntu/Debian)
On créé le fichier de configuration :
# vi /usr/local/nextcloud-exporter/nextcloud-exporter.yml
# required server: "https://nextcloud.exemple.net" authToken: "MON_NUMERO_DE_JETON" # optional listenAddress: "IP_INTERFACE_D_ECOUTE:9205" timeout: "5s" tlsSkipVerify: false
On crée l'utilsateur système pour utiliser le service SystemD :
# useradd -r nextcloud-exporter --shell=/bin/false
On crée le service :
# vi /etc/systemd/system/nextcloud-exporter.service
[Unit] Description=NextCloud Prometheus Exporter After=network.target [Service] Type=simple User=nextcloud-exporter Group=nextcloud-exporter ExecStart=/usr/local/nextcloud-exporter/nextcloud-exporter -c /usr/local/nextcloud-exporter/nextcloud-exporter.yml Restart=on-failure [Install] WantedBy=multi-user.target
On active le service au démarrage et immédiatement:
# systemctl enable --now nextcloud-exporter
Importation Prometheus
Prometheus:~# vi /etc/prometheus/prometheus.yml
...
- job_name: 'nextcloud'
scrape_interval: 90s
static_configs:
- targets: ['IP_EXPORTATEUR:9205']
labels:
instance: 'nomduserveurnextcloud'
Prometheus:~# service prometheus restart
On vérifie que l'exportateur est "up" en se rendant sur son serveur Prometheus dans "Status" -> "Targets"
Tableau de bord Grafana
Voir Importation de tableau de bord
Nextcloud by ochorocho (id: 9632) Très sommaire..
Nextcloud Exporter Prometheus Dashboard (id: 11033) Entièrement à reconfigurer..