« Prometheus » : différence entre les versions

De Le Wiki de Lug
Aller à la navigation Aller à la recherche
 
(140 versions intermédiaires par le même utilisateur non affichées)
Ligne 7 : 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://</nowiki><font color = green>IP_PROMETHEUS</font>:9090''' :
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 24 : Ligne 24 :
   | niveau = modéré
   | niveau = modéré
   | icône = important
   | icône = important
   | texte  = Par default tout circule en clair.
   | texte  = Par défaut tout circule en clair.
  }}
  }}


Ligne 30 : Ligne 30 :
   | niveau = information
   | niveau = information
   | icône = loupe
   | icône = loupe
   | texte  = '''Ici on va uniquement sécuriser l'accès au serveur''' (je récupère les données sur un réseau virtuel non exposé, donc pas d'exporteurs joignables, plus simple), mais il est également possible de passer par [https://0x63.me/tls-between-prometheus-and-its-exporters/ '''stunnel'''] pour avoir les exporteurs directement avec cryptage sur Internet..
   | 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 ====
==== Proxy Local ====
Ligne 180 : Ligne 180 :
   | niveau = modéré
   | niveau = modéré
   | icône = loupe
   | 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]].
   | 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 :
On prépare le cryptage :
Ligne 378 : Ligne 378 :
     annotations:
     annotations:
       summary: "Exportateur <nowiki>{{ $labels.instance }}</nowiki> inaccessible"
       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>"
       description: "Un exportateur de métriques est inaccessible depuis plus de 3mn. <nowiki>({{ $labels.instance }} du job: {{ $labels.job }})</nowiki>"


  Prometheus:/# service prometheus restart
  Prometheus:/# service prometheus restart
==== Node-Exporter ====
==== Node-Exporter ====
Voir [[#Prometheus_Node-Exporter|installation]].
Voir [[#Prometheus_Node-Exporter|installation]].
Ligne 397 : Ligne 398 :
   <font color = green>- alert: HostHighCPULoad
   <font color = green>- alert: HostHighCPULoad
     expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > <font color= blue>80</font>
     expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > <font color= blue>80</font>
     for: 1m
     for: <font color= blue>5m</font>
     labels:
     labels:
       severity: warning
       severity: warning
Ligne 405 : Ligne 406 :


  Prometheus:/# service prometheus restart
  Prometheus:/# service prometheus restart
===== Perfomance CPU libre pour les VM (Host CPU steal noisy neighbor)=====
===== 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.
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.
Ligne 428 : Ligne 430 :
  Prometheus:/# service prometheus restart
  Prometheus:/# service prometheus restart
===== Mémoire RAM disponible =====
===== Mémoire RAM disponible =====
On envoie un avertissement lorsque la mémoire RAM disponible est inférieur à 10%.
On envoie un avertissement lorsque la mémoire RAM disponible est inférieur à 10% (plus de 2 minutes).
  Prometheus:/# vi /etc/prometheus/rules.yml
  Prometheus:/# vi /etc/prometheus/rules.yml
{{Méta bandeau
{{Méta bandeau
Ligne 441 : Ligne 443 :
   <font color = green>- alert: HostOutOfMemory
   <font color = green>- alert: HostOutOfMemory
     expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < <font color = blue>10</font>
     expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < <font color = blue>10</font>
     for: 2m
     for: <font color = blue>2m</font>
     labels:
     labels:
       severity: warning
       severity: warning
Ligne 451 : Ligne 453 :


===== Espace Disque=====
===== 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%.
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
  Prometheus:/# vi /etc/prometheus/rules.yml
{{Méta bandeau
{{Méta bandeau
Ligne 464 : Ligne 466 :
   <font color = green>- alert: HostOutOfDiskSpace
   <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
     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: 2m
     for: <font color = blue>2m</font>
     labels:
     labels:
       severity: warning
       severity: warning
Ligne 472 : Ligne 474 :
   - alert: HostOutOfDiskSpaceCrit
   - 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
     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: 2m
     for: <font color = blue>2m</font>
     labels:
     labels:
       severity: critical
       severity: critical
Ligne 513 : Ligne 515 :


===== Inodes Disque (index) =====
===== Inodes Disque (index) =====
On active un avertissement si un point de montage à moins de 10% d'inode disponible.
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
  Prometheus:/# vi /etc/prometheus/rules.yml
{{Méta bandeau
{{Méta bandeau
Ligne 526 : Ligne 528 :
   <font color = green>- alert: HostOutOfInodes
   <font color = green>- alert: HostOutOfInodes
     expr: node_filesystem_files_free / node_filesystem_files * 100 < 10 and ON (instance, device, mountpoint) node_filesystem_readonly == 0
     expr: node_filesystem_files_free / node_filesystem_files * 100 < 10 and ON (instance, device, mountpoint) node_filesystem_readonly == 0
     for: 2m
     for: <font color = blue>2m</font>
     labels:
     labels:
       severity: warning
       severity: warning
Ligne 536 : Ligne 538 :


===== Utilisation "swap" (espace d'échange)=====
===== Utilisation "swap" (espace d'échange)=====
On active une alerte lorsque que l'espace "swap" atteint les 80% de remplissage.
On active une alerte lorsque que l'espace "swap" atteint les 80% de remplissage plus de deux minutes.
  Prometheus:/# vi /etc/prometheus/rules.yml
  Prometheus:/# vi /etc/prometheus/rules.yml
{{Méta bandeau
{{Méta bandeau
Ligne 549 : Ligne 551 :
   <font color = green>- alert: HostSwapIsFillingUp
   <font color = green>- alert: HostSwapIsFillingUp
     expr: (1 - (node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes)) * 100 > <font color = blue>80</font>
     expr: (1 - (node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes)) * 100 > <font color = blue>80</font>
     for: 2m
     for: <font color = blue>2m</font>
     labels:
     labels:
       severity: warning
       severity: warning
Ligne 582 : Ligne 584 :


===== Pression Mémoire =====
===== Pression Mémoire =====
On active un avertissement lorsque la mémoire est sous forte pression.
On active un avertissement lorsque la mémoire est sous forte pression plus de deux minutes.
  Prometheus:/# vi /etc/prometheus/rules.yml
  Prometheus:/# vi /etc/prometheus/rules.yml
{{Méta bandeau
{{Méta bandeau
Ligne 595 : Ligne 597 :
   <font color = green>- alert: HostMemoryUnderMemoryPressure
   <font color = green>- alert: HostMemoryUnderMemoryPressure
     expr: rate(node_vmstat_pgmajfault[1m]) > 1000
     expr: rate(node_vmstat_pgmajfault[1m]) > 1000
     for: 2m
     for: <font color = blue>2m</font>
     labels:
     labels:
       severity: warning
       severity: warning
Ligne 635 : Ligne 637 :
  Prometheus:/# service prometheus restart
  Prometheus:/# service prometheus restart


===== Alarme température =====
===== Alèrte alarme température =====
On active une alerte critique lorsque le serveur actionne une alerte de température.
On active une alerte critique lorsque le serveur actionne une alerte de température.
  Prometheus:/# vi /etc/prometheus/rules.yml
  Prometheus:/# vi /etc/prometheus/rules.yml
Ligne 688 : Ligne 690 :


  Prometheus:/# service prometheus restart
  Prometheus:/# service prometheus restart
 
===== Surveillance état des "pool ZFS" ( "zpool" )=====
==== Prometheus Proxmox VE Exporter ====
{{Méta bandeau
Voir [[#Prometheus_PVE_Exporter_.28ProxMox.29|installation]].
  | niveau = grave
===== Surveillance Espace Disque VM/LXC =====
  | icône = important
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%.
  | texte = Nécessite au minimum [https://github.com/prometheus/node_exporter/releases la verion '1.1.0' de 'prometheus-node-exporter'].  
  Prometheus:/# vi /etc/prometheus/rules.yml
}}
{{Méta bandeau
{{Méta bandeau
   | niveau = information
   | niveau = grave
   | icône = important
   | icône = important
   | texte  = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation)
   | texte  = <b>Ne fonctionne plus</b> depuis ZFS 2.1.
  }}
  }}
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
{{Méta bandeau
   | niveau = information
   | niveau = information
   | icône = important
  | icône = loupe
   | texte  = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation)
  | 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:
  groups:
Ligne 734 : Ligne 721 :
   rules:
   rules:
  <font color= gray>...</font>
  <font color= gray>...</font>
   <font color = green>- alert: PxMxVMRAMWarning
   <font color = green>- alert: NodeZpoolStateAlert
     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
     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: <font color= blue>2m</font>
     for: 0m
     labels:
     labels:
       severity: warning
       severity: critical
     annotations:
     annotations:
       summary: "RAM disponible inferieur a 10% sur <nowiki>'{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }}'</nowiki>"
       summary: "DANGER, le pool <nowiki>'{{ $labels.zpool }}' sur '{{ $labels.instance }}' est dans l'etat '{{ $labels.state }}'</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>
       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:/# service prometheus restart


===== Surveillance CPU VM/LXC =====
==== Prometheus Proxmox VE Exporter ====
On active une alerte de niveau avertissement lorsque le processeur est occupé a plus de 80% plus de 5mn..
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
  Prometheus:/# vi /etc/prometheus/rules.yml
{{Méta bandeau
{{Méta bandeau
Ligne 757 : Ligne 746 :
   rules:
   rules:
  <font color= gray>...</font>
  <font color= gray>...</font>
   <font color = green>- alert: PxMxVMCPUWarning
   <font color = green>- alert: PxMxVMDiskWarning
     expr: ((pve_cpu_usage_ratio / pve_cpu_usage_limit)*1000 * on(id, instance) group_left(name, type) pve_guest_info) > <font color = blue>80</font> and on(id, instance) pve_up == 1
     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>
     for: <font color= blue>5m</font>
     labels:
     labels:
       severity: warning
       severity: warning
     annotations:
     annotations:
       summary: "Charge CPU importante sur <nowiki>'{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }}'</nowiki>"
       summary: "Espace disque inferieur a 20% sur <nowiki>'{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }} ({{ $labels.job}})'</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>
       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
  Prometheus:/# service prometheus restart


==== NVidia (nvidia_gpu_prometheus_exporter) ====
===== Surveillance Mémoire RAM VM/LXC =====
Voir [[#Exportateur_Nvidia_.28nvidia_gpu_prometheus_exporter.29|installation]].
On active une alerte de niveau avertissement lorsque la RAM disponible est inférieur à 10% plus de 2 minutes.
===== 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
  Prometheus:/# vi /etc/prometheus/rules.yml
{{Méta bandeau
{{Méta bandeau
Ligne 782 : Ligne 777 :
   rules:
   rules:
  <font color= gray>...</font>
  <font color= gray>...</font>
   <font color = green>- alert: GPUOutOfMemory
   <font color = green>- alert: PxMxVMRAMWarning
     expr: nvidia_gpu_memory_used_bytes / nvidia_gpu_memory_total_bytes *100 > <font color= blue>80</font>
     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>3m</font>
     for: <font color= blue>2m</font>
     labels:
     labels:
       severity: warning
       severity: warning
     annotations:
     annotations:
       summary: "Le GPU <nowiki>{{ $labels.name }}</nowiki> remplit sa memoire dangereusement "
       summary: "RAM disponible inferieur a 10% sur <nowiki>'{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }}'</nowiki>"
       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>
       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
  Prometheus:/# service prometheus restart


===== Surveillance Température GPU =====
===== Surveillance CPU VM/LXC =====
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)
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
  Prometheus:/# vi /etc/prometheus/rules.yml
{{Méta bandeau
{{Méta bandeau
Ligne 805 : Ligne 800 :
   rules:
   rules:
  <font color= gray>...</font>
  <font color= gray>...</font>
   <font color = green>- alert: GPUTempAlert
   <font color = green>- alert: PxMxVMCPUWarning
     expr: nvidia_gpu_temperature_celsius >= <font color= blue>75</font>
     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: 0m
     for: <font color= blue>5m</font>
     labels:
     labels:
       severity: warning
       severity: warning
     annotations:
     annotations:
       summary: "Le GPU <nowiki>{{ $labels.name }}</nowiki> chauffe dangereusement "
       summary: "Charge CPU importante sur <nowiki>'{{ $labels.name }} ({{ $labels.id }})' serveur '{{ $labels.instance }}'</nowiki>"
      description: "Le GPU <nowiki>{{ $labels.name }} du serveur {{ $labels.instance }} ({{ $labels.job }}</nowiki>) a atteint les 75c"
       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>
  - 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
  Prometheus:/# service prometheus restart


=Grafana =
==== NVidia (nvidia_gpu_prometheus_exporter) ====
== Grafana LXC Alpine Linux ==
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
{{Méta bandeau
   | niveau = information
   | 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
   | 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
   | texte  = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation)
  }}
  }}
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]]
groups:
* On édite le fichier grafana.ini :
- name: <font color = blue>nomdugroupe</font>
  # vi /etc/grafana.ini
  rules:
On modifie les lignes suivantes :
<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
{{Méta bandeau
   | niveau = information
   | niveau = information
   | icône = important
   | icône = important
   | texte  = Attention à bien supprimer le <font color = green>''';'''</font> devant les lignes à activer!
   | texte  = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation)
  }}
  }}
* On bloque l'écoute extérieur en cas de MAJ qui règle le bug que nous utilisons :
groups:
  # The ip address to bind to, empty will bind to all interfaces
  - name: <font color = blue>nomdugroupe</font>
<font color = blue>http_addr = <font color = green>127.0.0.1</font></font>
  rules:
* On change le port d'écoute pour conserver le port 3000 depuis l'extérieur :
<font color= gray>...</font>
# The http port  to use
  <font color = green>- alert: GPUTempAlert
<font color = blue>http_port = <font color = green>3001</font></font>
    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>


  # service grafana restart
  Prometheus:/# service prometheus restart
 
==== SyncThing ====
On prépare le cryptage :
Voir [[Prometheus#SyncThing_2|installation]]
  # mkdir -p /root/certs/grafana/ && cd /root/certs/grafana
===== 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>


  # openssl req \
  Prometheus:/# service prometheus restart
    -x509 \
    -newkey rsa:4096 \
    -nodes \
    -keyout grafana.key \
    -out grafana.crt


On créé le vhost local :
===== Surveillance Equipement Distant =====
  # vi /etc/nginx/http.d/grafana.conf
  syncthing_rest_system_connections_remote_device_is_paused == 1


server {
=Grafana =
        listen              3000 ssl;
== Grafana LXC Alpine Linux ==
        ssl_certificate    /root/certs/grafana/grafana.crt;
{{Méta bandeau
        ssl_certificate_key /root/certs/grafana/grafana.key;
        location / {
        proxy_pass <nowiki>http://</nowiki>localhost:3001/;
        }
    }
 
# service nginx reload
{{Méta bandeau
   | niveau = information
   | niveau = information
   | icône = loupe
   | icône = loupe
   | texte  = Grafana est maintenant accessible sur <nowiki>https://</nowiki><font color = blue>IP_GRAFANA</font>:3000
   | 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 ===
======(seconde méthode) Modification du script d'initialisation======
# apk update && apk upgrade
On modifie le script de démarrage pour outrepasser la commande qui bloque l'écoute de Grafana sur "127.0.0.1"
# apk add grafana
  # vi /etc/init.d/grafana
# rc-update add grafana default
 
# service grafana start
  <font color= gray>...</font>
==== Résolution de bugs (Alpine 3.13 / grafana 7.3.6)====
command="/usr/sbin/grafana-server"
=====Répertoire manquant=====
command_args="$GRAFANA_OPTS <font color = blue>cfg:server.http_addr=0.0.0.0</font>"
On répare un premier bug qui apparait dans les logs.. :
<font color= gray>...</font>
  # mkdir /var/lib/grafana/provisioning/plugins
 
  # chown grafana. /var/lib/grafana/provisioning/plugins
  # service grafana restart
  # service grafana restart
 
=====Grafana accessible uniquement localement=====
===(Optionnel) Sécurisation de Grafana===
======(Première méthode) Proxy Local======
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
{{Méta bandeau
   | niveau = information
   | niveau = modéré
   | icône = important
   | icône = important
   | texte  = Attention à bien supprimer le <font color = blue>''';'''</font> devant les lignes à activer!
   | 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
  }}
  }}
* On active https :
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]]
# Protocol (http, https, h2, socket)
* On édite le fichier grafana.ini :
<font color = blue>protocol = https</font>
  # vi /etc/grafana.ini
* On renseigne le certificat et la clef de cryptage :
On modifie les lignes suivantes :
  # 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
{{Méta bandeau
   | niveau = information
   | niveau = information
   | icône = loupe
   | icône = important
   | 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
   | 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>


=== Exemple vhost por reverse proxy NGINX ===
# service grafana restart
Voir [[NGINX_ReverseProxy_LXC_Alpine_Linux|'''reverse proxy NGINX''']]
 
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 {
  server {
listen 80;
        listen             3000 ssl;
    listen [::]:80;
        ssl_certificate     /root/certs/grafana/grafana.crt;
    server_name     <font color = blue>grafana.exemple.net</font>;
        ssl_certificate_key /root/certs/grafana/grafana.key;
    # return 404;
   
    return 301 <nowiki>https://</nowiki>$host$request_uri;
        location / {
  }
   
   
server {
        proxy_pass <nowiki>http://</nowiki>localhost:3001/;
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;
  # service nginx reload
            proxy_set_header X-Forwarded-Port 443;
{{Méta bandeau
            proxy_pass http<font color = red>s</font>://<font color = blue>IP_GRAFANA</font>:3000; #https si grafana sécurisé
  | niveau = information
    }
  | icône = loupe
  | texte  = Grafana est maintenant accessible sur <nowiki>https://</nowiki><font color = blue>IP_GRAFANA</font>:3000
    listen [::]:443 ssl; # managed by Certbot
}}
    listen 443 ssl; # managed by Certbot
 
======(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"
    ssl_certificate /etc/letsencrypt/live/<font color = blue>grafana.exemple.net</font>/fullchain.pem;
# vi /etc/init.d/grafana
    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 ==
<font color= gray>...</font>
=== Première connexion ===
command="/usr/sbin/grafana-server"
*Lors de la première connexion il faut se connecter avec l'utilisateur "'''admin'''" et le mot de passe par défaut "'''admin'''" :
command_args="$GRAFANA_OPTS <font color = blue>cfg:server.http_addr=0.0.0.0</font>"
<font color= gray>...</font>


[[File:Grafana 1er co.PNG|border|Page de connexion Grafana.]]
# service grafana restart


*Grafana vous demandera de modifier le mot de passe par défaut pour d'évidentes raisons de sécurité :
===(Optionnel) Sécurisation de Grafana===
On prépare le cryptage :
# mkdir /var/lib/grafana/certs && cd /var/lib/grafana/certs/


[[File:Grafana 1er co adminpsswd.PNG|border|Remplacer le mot de passe par défaut.]]
# openssl req \
    -x509 \
    -newkey rsa:4096 \
    -nodes \
    -keyout grafana.key \
    -out grafana.crt


*Nous voila enfin sur la page d'accueil :
# chown -R grafana. /var/lib/grafana/certs
 
Puis on édite le fichier grafana.ini :
[[File:Grafana accueil.PNG|border|Page d'accueil Grafana.]]
# vi /etc/grafana.ini
=== Import source de donnés ===
On modifie les lignes suivantes :  
* Se rendre dans "'''Configuration'''" (roue dentée) -> "'''Data Sources'''" :
{{Méta bandeau
 
  | niveau = information
[[File:Grafana Datasources.PNG|border|Menu Data Sources]]
  | 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>


* Cliquer sur "'''Add data source'''" :
# 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
}}


[[File:Grafana Datasources2.PNG|border|Menu d'ajout de sources de données.]]
=== Exemple vhost reverse-proxy Nginx ===
Voir [[Nginx_ReverseProxy_LXC_Alpine_Linux|'''reverse proxy Nginx''']]


==== Importation Source Prometheus Distant (Certificat autosigné) ====
server {
*Sélectionner une source de données de type "'''Prometheus'''" :
listen 80;
 
    listen [::]:80;
[[File:Grafana Source Prometheus.PNG|border|On choisit la source de type Prometheus]]
    server_name    <font color = blue>grafana.exemple.net</font>;
 
    # return 404;
*Renseigner les champs et options suivantes :
    return 301 <nowiki>https://</nowiki>$host$request_uri;
 
}
[[File:Grafana Prometheus SelfSigned.PNG|border|Configuration pour Prometheus distant.]]
 
server {
*Valider et tester :
server_name    <font color = blue>grafana.exemple.net</font>;
 
    error_page 403  https://<font color = blue>grafana.exemple.net</font>;
[[File:Grafana Source Prometheus save.PNG|border|Valider et tester la configuration.]]
 
    location / {
*Un message doit confirmer le bon fonctionnement :
            proxy_set_header X-Real-IP  $remote_addr;
 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
[[File:Grafana Source Prometheus work.PNG|border|Message de validation!]]
            proxy_set_header X-Forwarded-Proto https;
 
            proxy_set_header X-Forwarded-Port 443;
==== Importation Source Prometheus Locale ====
            proxy_set_header Host $http_host;
{{Méta bandeau
            proxy_pass http<font color = red>s</font>://<font color = blue>IP_GRAFANA</font>:3000; #https si grafana sécurisé
  | niveau = information
    }
  | icône = loupe
  | texte = Par "locale" entendre que Grafana fonctionne sur le même serveur que la source Prometheus cible.
    listen [::]:443 ssl; # managed by Certbot
  }}
    listen 443 ssl; # managed by Certbot
*Sélectionner une source de données de type "'''Prometheus'''" :
 
 
[[File:Grafana Source Prometheus.PNG|border|On choisit la source de type Prometheus]]
    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;
*Renseigner les champs et options suivantes :
    include /etc/letsencrypt/options-ssl-nginx.conf;
 
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
[[File:Grafana Source Prometheus local.PNG|border|Configuration pour Prometheus local.]]
    add_header Strict-Transport-Security "max-age=31536000" always;
 
    ssl_trusted_certificate /etc/letsencrypt/live/<font color = blue>grafana.exemple.net</font>/chain.pem;
*Valider et tester :
    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.]]


[[File:Grafana Source Prometheus save.PNG|border|Valider et tester la configuration.]]
*Grafana vous demandera de modifier le mot de passe par défaut pour d'évidentes raisons de sécurité :


*Un message doit confirmer le bon fonctionnement :
[[File:Grafana 1er co adminpsswd.PNG|border|Remplacer le mot de passe par défaut.]]


[[File:Grafana Source Prometheus work.PNG|border|Message de validation!]]
*Nous voila enfin sur la page d'accueil :


=== Import "Dashboard" (Tableau de Bord) ===
[[File:Grafana accueil.PNG|border|Page d'accueil Grafana.]]
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.
=== Import source de donnés ===
{{Méta bandeau
* Se rendre dans "'''Configuration'''" (roue dentée) -> "'''Data Sources'''" :
  | 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"]]
[[File:Grafana Datasources.PNG|border|Menu Data Sources]]


*On note le numéro d'identification du tableau de bord (10347) :
* Cliquer sur "'''Add data source'''" :


[[File:Grafana Dashboard2.PNG|border| On note le numéro pour l'importation dans Grafana!]]
[[File:Grafana Datasources2.PNG|border|Menu d'ajout de sources de données.]]
==== Import dans Grafana ====
*Se rendre dans "'''Create'''" (symbole '''+''') -> "'''Import'''" :


[[File:Grafana Dashboard3.PNG|border|Menu import.]]
==== Importation Source Prometheus Distant (Certificat autosigné) ====
*Sélectionner une source de données de type "'''Prometheus'''" :


*Renseigner l'ID et importer :
[[File:Grafana Source Prometheus.PNG|border|On choisit la source de type Prometheus]]


[[File:Grafana Dashboard4.PNG|border|On renseigne l'ID et on charge.]]
*Renseigner les champs et options suivantes :


*Il faut renseigner une source de données à attacher, il est possible de modifier le nom, etc.
[[File:Grafana Prometheus SelfSigned.PNG|border|Configuration pour Prometheus distant.]]


[[File:Grafana Dashboard5.PNG|border|Il faut au minimum renseigner une source de données.]]
*Valider et tester :
=== Rendre un tableau de bord Multi-source ===
 
[[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
{{Méta bandeau
   | niveau = information
   | niveau = information
   | icône = loupe
   | 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)
   | texte  = Par "locale" entendre que Grafana fonctionne sur le même serveur que la source Prometheus cible.
  }}
  }}
Pour ne pas importer des tableaux de bord identiques pour diverses sources, il est possible d'ajouter un onglet de sélection.
*Sélectionner une source de données de type "'''Prometheus'''" :
==== (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]]
[[File:Grafana Source Prometheus.PNG|border|On choisit la source de type Prometheus]]


*Sélectionner la base avec l'attribut "default" :
*Renseigner les champs et options suivantes :


[[File:Grafana Dashboard6.PNG|border|On va enlever le vilain tag..]]
[[File:Grafana Source Prometheus local.PNG|border|Configuration pour Prometheus local.]]


*Décocher l'attribut "default" :
*Valider et tester :


[[File:Grafana Dashboard7.PNG|border|On te tiens malandrin!]]
[[File:Grafana Source Prometheus save.PNG|border|Valider et tester la configuration.]]


*Puis sauvegarder :
*Un message doit confirmer le bon fonctionnement :


[[File:Grafana Source Prometheus save.PNG|border|Terminé.]]
[[File:Grafana Source Prometheus work.PNG|border|Message de validation!]]


==== Ajout de la nouvelle source ====
=== Import "Dashboard" (Tableau de Bord) ===
*Se rendre sur le tableau de bord à modifier et sélectionner le menu "'''Dashboards settings'''" (roue dentée) :
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 Dashboard Multi1.PNG|border|Menu "dashboards settings"]]
[[File:Grafana Dashboard1.PNG|border|Résultat de la recherche "ProxMox" avec source de données "Prometheus"]]


* Sélectionner le menu "'''Variables'''" -> "'''New'''"
*On note le numéro d'identification du tableau de bord (10347) :


[[File:Grafana Dashboard Multi2.PNG|border|On va ajouter une variable..]]
[[File:Grafana Dashboard2.PNG|border| On note le numéro pour l'importation dans Grafana!]]
==== Import dans Grafana ====
*Se rendre dans "'''Create'''" (symbole '''+''') -> "'''Import'''" :


*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 Dashboard3.PNG|border|Menu import.]]


[[File:Grafana Dashboard Multi3.PNG|border|On renseigne la nouvelle variable..]]
*Renseigner l'ID et importer :


*De retour sur le tableau de bord un nouvel onglet est disponible :
[[File:Grafana Dashboard4.PNG|border|On renseigne l'ID et on charge.]]


[[File:Grafana Dashboard Multi4.PNG|border|Un nouvelle onglet est disponible!]]
*Il faut renseigner une source de données à attacher, il est possible de modifier le nom, etc.


*Il faut encore éditer <u>'''tous'''</u> les panneaux du tableau de bord de la façon suivante :
[[File:Grafana Dashboard5.PNG|border|Il faut au minimum renseigner une source de données.]]
 
=== Rendre un tableau de bord Multi-source ===
[[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
{{Méta bandeau
   | niveau = information
   | niveau = information
   | icône = loupe
   | 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.
   | 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.
=== Variable "Instance" (query) multi-source ===
==== (Optionnel) Suppression de la source par défaut ====
{{Méta bandeau
{{Méta bandeau
   | niveau = information
   | niveau = information
   | icône = important
   | icône = loupe
   | 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..
   | 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 sur le tableau de bord à modifier et sélectionner le menu "'''Dashboards settings'''" (roue dentée) :
* 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 Dashboard Multi1.PNG|border|Menu "dashboards settings"]]
[[File:Grafana Dashboard6.PNG|border|On va enlever le vilain tag..]]


*Dans "'''Variables'''" sélectionner la variable "'''Instance'''" :
*Décocher l'attribut "default" :


[[File:Grafana Dashboard Multi7.PNG|border|Choisir la variable à modifier]]
[[File:Grafana Dashboard7.PNG|border|On te tiens malandrin!]]


* Modifier la source par la variable "'''$Datasource'''", confirmer la requête "'''Query'''" avec "'''label_values(pve_node_info, instance)'''"* et mettre à jour avec "'''Update'''" :
*Puis sauvegarder :


[[File:Grafana Dashboard Multi8.PNG|border|On renseigne les nouvelles valeurs]]
[[File:Grafana Source Prometheus save.PNG|border|Terminé.]]


{{Méta bandeau
==== Ajout de la nouvelle source ====
  | niveau = information
*Se rendre sur le tableau de bord à modifier et sélectionner le menu "'''Dashboards settings'''" (roue dentée) :
  | 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===
[[File:Grafana Dashboard Multi1.PNG|border|Menu "dashboards settings"]]
==== 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]]
* Sélectionner le menu "'''Variables'''" -> "'''New'''"


* Cliquer sur "'''Add data source'''" :
[[File:Grafana Dashboard Multi2.PNG|border|On va ajouter une variable..]]


[[File:Grafana AlertManager Plugin0.PNG|border|Menu d'ajout de sources de données.]]
*Dans "'''General'''", sélectionner un nom ("'''name'''") puis '''Type : Datasource''', Ensuite dans "'''Data source options'''" sélectionner '''Type : Prometheus''', enfin valider avec "'''Add'''"


* Sélectionner une source de données de type "Prometheus AlertManager" :
[[File:Grafana Dashboard Multi3.PNG|border|On renseigne la nouvelle variable..]]


[[File:Grafana AlertManager Plugin1.PNG|border|On sélectionne la nouvelle source de données..]]
*De retour sur le tableau de bord un nouvel onglet est disponible :


===== Importation Source "Prometheus AlertManager" Distant (Certificat autosigné) =====
[[File:Grafana Dashboard Multi4.PNG|border|Un nouvelle onglet est disponible!]]
*Renseigner les champs et options suivantes :


[[File:Grafana AlertManager Plugin2.PNG|border|Configuration pour "Prometheus AlertManager" distant.]]
*Il faut encore éditer <u>'''tous'''</u> les panneaux du tableau de bord de la façon suivante :


*Valider et tester :
[[File:Grafana Dashboard Multi5.PNG|border|On édite le panneau]]


[[File:Grafana Source Prometheus save.PNG|border|Valider et tester la configuration.]]
*Dans "'''Query'''" remplacer la source de données sélectionnée par "'''$Datasource'''"


*Un message doit confirmer le bon fonctionnement :
[[File:Grafana Dashboard Multi6.PNG|border|On change la source par une source variable..]]


[[File:Grafana Source Prometheus work.PNG|border|Message de validation!]]
*Répéter l'opération pour chaque panneaux.
 
===== Importation Source "Prometheus AlertManager" Locale =====
{{Méta bandeau
{{Méta bandeau
   | niveau = information
   | niveau = information
   | icône = loupe
   | icône = loupe
   | texte  = Par "locale" entendre que Grafana fonctionne sur le même serveur que la source AlertManager cible.
   | 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.
  }}
  }}
*Renseigner les champs et options suivantes :


[[File:Grafana AlertManager Plugin3.PNG|border|Configuration pour Prometheus local.]]
=== 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) :


*Valider et tester :
[[File:Grafana Dashboard Multi1.PNG|border|Menu "dashboards settings"]]


[[File:Grafana Source Prometheus save.PNG|border|Valider et tester la configuration.]]
*Dans "'''Variables'''" sélectionner la variable "'''Instance'''" :


*Un message doit confirmer le bon fonctionnement :
[[File:Grafana Dashboard Multi7.PNG|border|Choisir la variable à modifier]]


[[File:Grafana Source Prometheus work.PNG|border|Message de validation!]]
* Modifier la source par la variable "'''$Datasource'''", confirmer la requête "'''Query'''" avec "'''label_values(pve_node_info, instance)'''"* et mettre à jour avec "'''Update'''" :


=== Tableau de Bord===
[[File:Grafana Dashboard Multi8.PNG|border|On renseigne les nouvelles valeurs]]
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
{{Méta bandeau
   | niveau = information
   | niveau = information
   | icône = loupe
   | 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..
   | 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)'''"
  }}
  }}
= Export =
==  Prometheus Node-Exporter ==
{{Méta bandeau
{{Méta bandeau
   | niveau = information
   | niveau = information
   | icône = loupe
   | icône = loupe
   | texte  = Exportateur de métriques orientés matériel
   | texte  = Sur des tableaux de bords plus complexes il peut avoir plusieurs variables à éditer..
  }}
  }}
=== Installation Exportateur ===
==== ProxMox / Debian / Ubuntu ====
On installe xsensors pour pouvoir lire les températures :
# apt install xsensors
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=<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 :
ProxMox:~# vi /lib/systemd/system/prometheus-node-exporter.service


<font color= gray>...</font>
=== Plugin AlertManager===
EnvironmentFile=<font color=blue>/etc/prometheus.conf</font>
==== Installation du Plugin ====
<font color= gray>...</font>
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'''" :


Pour éviter que le service plante au démarrage on peut ajouter cette ligne :
[[File:Grafana Datasources.PNG|border|Menu Data Sources]]


<font color= gray>...</font>
* Cliquer sur "'''Add data source'''" :
Restart=always
<font color= blue>RestartSec=3</font>
User=prometheus
<font color= gray>...</font>


ProxMox:~# systemctl daemon-reload
[[File:Grafana AlertManager Plugin0.PNG|border|Menu d'ajout de sources de données.]]
ProxMox:~# service prometheus-node-exporter restart


=== Importation Prometheus ===
* Sélectionner une source de données de type "Prometheus AlertManager" :
Prometheus:~# vi /etc/prometheus/prometheus.yml


{{Méta bandeau
[[File:Grafana AlertManager Plugin1.PNG|border|On sélectionne la nouvelle source de données..]]
  | 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>
===== Importation Source "Prometheus AlertManager" Distant (Certificat autosigné) =====
  - job_name: node
*Renseigner les champs et options suivantes :
    static_configs:
    - 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


On vérifie que l'exportateur est "up" en se rendant sur son serveur Prometheus dans "Status" -> "Targets"
[[File:Grafana AlertManager Plugin2.PNG|border|Configuration pour "Prometheus AlertManager" distant.]]


[[File:Prometheus menu targets.PNG|border| Menu "targets"]]
*Valider et tester :


=== Tableau de bord Grafana ===
[[File:Grafana Source Prometheus save.PNG|border|Valider et tester la configuration.]]
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)]
*Un message doit confirmer le bon fonctionnement :
=== AlertManager ===
 
Voir [[Prometheus#Node-Exporter|exemples d'alertes]]
[[File:Grafana Source Prometheus work.PNG|border|Message de validation!]]


== Prometheus PVE Exporter (ProxMox) ==
===== Importation Source "Prometheus AlertManager" Locale =====
[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  = Exportateur de métriques orientés virtualisation
   | texte  = Par "locale" entendre que Grafana fonctionne sur le même serveur que la source AlertManager cible.
  }}
  }}
*Renseigner les champs et options suivantes :


=== Installation Exportateur ===
[[File:Grafana AlertManager Plugin3.PNG|border|Configuration pour Prometheus local.]]


On crée un groupe et un utilisateur avec les droits d'accès au monitoring :
*Valider et tester :


ProxMox:~# pveum groupadd monitoring -comment 'Monitoring group'
[[File:Grafana Source Prometheus save.PNG|border|Valider et tester la configuration.]]
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
*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
{{Méta bandeau
   | niveau = information
   | niveau = information
   | icône = important
   | icône = loupe
   | texte  = fichier "yml" : bien respecter les aligments / toujours utiliser de vrais espaces (pas d'espace avec tabulation).
   | 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..
  }}
  }}


default:
= Export =
    user: pve_exporter@pve
    password: <font color=blue>MOTDEPASSE</font>
    verify_ssl: false


On créé le fichier pour systemd :
== Prometheus Node-Exporter ==
  ProxMox:~# vi /etc/systemd/system/pve_exporter.service
{{Méta bandeau
 
  | niveau = information
[Unit]
  | icône = loupe
Description=Proxmox VE Prometheus Exporter
  | texte = Exportateur de métriques orientés matériel
After=network.target
  }}
  Wants=network.target
=== Installation Exportateur ===
   
==== ProxMox / Debian / Ubuntu ====
[Service]
On installe l'exportateur :
Restart=on-failure
  ProxMox:~# apt install prometheus-node-exporter
WorkingDirectory=/usr/share/pve_exporter
ExecStart=/usr/local/bin/pve_exporter /usr/share/pve_exporter/pve_exporter.yml <font color=green>9221</font> <font color=blue>12.34.56.789</font>
  [Install]
WantedBy=multi-user.target
{{Méta bandeau
{{Méta bandeau
   | niveau = information
   | niveau = information
   | icône = loupe
   | icône = loupe
   | texte  = <font color=green>Port</font> / <font color=blue>ip interface d'écoute</font>
   | 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']]
  }}
  }}
  ProxMox:~# systemctl daemon-reload
On crée un fichier de configuration avec l'adresse et port d'écoute :
ProxMox:~# systemctl enable pve_exporter
  ProxMox:~# echo 'ARGS=--web.listen-address=<font color=blue>12.34.56.789</font>:<font color=blue>9100</font>' > /etc/prometheus.conf
  ProxMox:~# systemctl start pve_exporter
On active le fichier de configuration en modifiant le script :
  ProxMox:~# vi /lib/systemd/system/prometheus-node-exporter.service


=== Importation Prometheus ===
<font color= gray>...</font>
EnvironmentFile=<font color=blue>/etc/prometheus.conf</font>
<font color= gray>...</font>


  Prometheus:~# vi /etc/prometheus/prometheus.yml
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:~# service prometheus-node-exporter restart
 
=== Importation Prometheus ===
  Prometheus:~# vi /etc/prometheus/prometheus.yml


{{Méta bandeau
{{Méta bandeau
Ligne 1 362 : Ligne 1 342 :
  }}
  }}


   - job_name: 'pve'
<font color= gray>...</font>
   - job_name: node
     static_configs:
     static_configs:
      - targets: [<font color=blue><font color=blue>12.34.56.789</font>:<font color=blue>9221</font></font>]
    - targets: [<font color=blue>12.34.56.789</font>:<font color=blue>9100</font>]
        <font color=green>labels:
      <font color=green>labels:
          instance: '<font color=blue>nomduserveur</font>'</font>
        instance: '<font color=blue>nomduserveur</font>'</font>
    metrics_path: /pve
    params:
      module: [default]
{{Méta bandeau
{{Méta bandeau
   | niveau = information
   | niveau = information
Ligne 1 382 : Ligne 1 360 :


=== Tableau de bord Grafana ===
=== 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]]
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]
{{Méta bandeau
{{Méta bandeau
   | niveau = information
   | niveau = information
   | icône = loupe
   | 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é
   | texte  = Exportateur de métriques orientés virtualisation
  }}
  }}
{{Méta bandeau
 
   | niveau = information
=== Installation Exportateur ===
   | icône = loupe
 
   | texte  = Astuce : Il faut multiplier par 10 les résultats CPU pour des résultats correct : "'''pve_cpu_usage_ratio{instance="$instance"} / pve_cpu_usage_limit <font color = blue>*10</font> and on(id) pve_node_info'''" & "'''((pve_cpu_usage_ratio{instance="$instance"} / pve_cpu_usage_limit)<font color = blue>*10</font> * on(id, instance) group_left(name, type) pve_guest_info) and on(id, instance) pve_up == 1'''"
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
 
{{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 ===
default:
Voir [[#Prometheus_Proxmox_VE_Exporter|exemples d'alertes]]
    user: pve_exporter@pve
 
    password: <font color=blue>MOTDEPASSE</font>
== Exportateur Nvidia (nvidia_gpu_prometheus_exporter) ==
    verify_ssl: '''false'''
[https://github.com/mindprince/nvidia_gpu_prometheus_exporter Source]
On créé le fichier pour systemd :
=== Installation Exportateur ===
ProxMox:~# vi /etc/systemd/system/pve_exporter.service
==== Commandes Docker/PodMan ====
 
{{Méta bandeau
[Unit]
   | niveau = information
Description=Proxmox VE Prometheus Exporter
   | icône = loupe
After=network.target
   | texte  = Testé sur Debian, adapter si besoin..
Wants=network.target
  }}
  pull mindprince/nvidia_gpu_prometheus_exporter:0.1
[Service]
 
Restart=on-failure
  run --name nvexport -p <font color = blue>IP_INTERFACE_EXPOSE</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
WorkingDirectory=/usr/share/pve_exporter
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]
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 enable pve_exporter
ProxMox:~# systemctl start pve_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: 'pve'
    static_configs:
      - 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
    params:
      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
 
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]]


=== Tableau de bord Grafana ===
[https://grafana.com/grafana/dashboards/9632 Nextcloud by ochorocho (id: 9632)] Très sommaire..
Voir [[Prometheus#Import_.22Dashboard.22_.28Tableau_de_Bord.29|Importation de tableau de bord]]


[https://grafana.com/grafana/dashboards/10703 Nvidia GPU (id: 10703)]
[https://grafana.com/grafana/dashboards/11033 Nextcloud Exporter Prometheus Dashboard (id: 11033)] Entièrement à reconfigurer..
{{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 ==
=== Open Media Vault ===
[https://github.com/f100024/syncthing_exporter f100024/syncthing_exporter]

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 :

Le serveur fonctionne!

Facile!

(Optionnel) Securisation serveur

source autre source

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

Source

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 :

é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 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 :

Tout semble fonctionner..

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

Source

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

Source Source officiele

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" :

Page de connexion Grafana.

  • Grafana vous demandera de modifier le mot de passe par défaut pour d'évidentes raisons de sécurité :

Remplacer le mot de passe par défaut.

  • Nous voila enfin sur la page d'accueil :

Page d'accueil Grafana.

Import source de donnés

  • Se rendre dans "Configuration" (roue dentée) -> "Data Sources" :

Menu Data Sources

  • Cliquer sur "Add data source" :

Menu d'ajout de sources de données.

Importation Source Prometheus Distant (Certificat autosigné)

  • Sélectionner une source de données de type "Prometheus" :

On choisit la source de type Prometheus

  • Renseigner les champs et options suivantes :

Configuration pour Prometheus distant.

  • Valider et tester :

Valider et tester la configuration.

  • Un message doit confirmer le bon fonctionnement :

Message de validation!

Importation Source Prometheus Locale

  • Sélectionner une source de données de type "Prometheus" :

On choisit la source de type Prometheus

  • Renseigner les champs et options suivantes :

Configuration pour Prometheus local.

  • Valider et tester :

Valider et tester la configuration.

  • Un message doit confirmer le bon fonctionnement :

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 ce moteur de recherche pour trouver son bohneur.

identification du tableau de bord cible

Résultat de la recherche "ProxMox" avec source de données "Prometheus"

  • On note le numéro d'identification du tableau de bord (10347) :

On note le numéro pour l'importation dans Grafana!

Import dans Grafana

  • Se rendre dans "Create" (symbole +) -> "Import" :

Menu import.

  • Renseigner l'ID et importer :
On renseigne l'ID et on charge.
  • Il faut renseigner une source de données à attacher, il est possible de modifier le nom, etc.

Il faut au minimum renseigner une source de données.

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" :

Menu Data Sources

  • Sélectionner la base avec l'attribut "default" :

On va enlever le vilain tag..

  • Décocher l'attribut "default" :

On te tiens malandrin!

  • Puis sauvegarder :

Terminé.

Ajout de la nouvelle source

  • Se rendre sur le tableau de bord à modifier et sélectionner le menu "Dashboards settings" (roue dentée) :

Menu "dashboards settings"

  • Sélectionner le menu "Variables" -> "New"

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"

On renseigne la nouvelle variable..

  • De retour sur le tableau de bord un nouvel onglet est disponible :

Un nouvelle onglet est disponible!

  • Il faut encore éditer tous les panneaux du tableau de bord de la façon suivante :

On édite le panneau

  • Dans "Query" remplacer la source de données sélectionnée par "$Datasource"

On change la source par une source variable..

  • 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) :

Menu "dashboards settings"

  • Dans "Variables" sélectionner la variable "Instance" :

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" :

On renseigne les nouvelles valeurs

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" :

Menu Data Sources

  • Cliquer sur "Add data source" :

Menu d'ajout de sources de données.

  • Sélectionner une source de données de type "Prometheus AlertManager" :

On sélectionne la nouvelle source de données..

Importation Source "Prometheus AlertManager" Distant (Certificat autosigné)
  • Renseigner les champs et options suivantes :

Configuration pour "Prometheus AlertManager" distant.

  • Valider et tester :

Valider et tester la configuration.

  • Un message doit confirmer le bon fonctionnement :

Message de validation!

Importation Source "Prometheus AlertManager" Locale
  • Renseigner les champs et options suivantes :

Configuration pour Prometheus local.

  • Valider et tester :

Valider et tester la configuration.

  • Un message doit confirmer le bon fonctionnement :

Message de validation!

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"

Menu "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"

Menu "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)

Source

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"

Menu "targets"

Tableau de bord Grafana

Voir Importation de tableau de bord

Nvidia GPU (id: 10703)

AlertManager

Voir exemples d'alertes

SyncThing

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" :

On se rend dans le menu de configuration..

  • La clef est accessible, optionnellement on peut en générer une nouvelle :

La clef API indispensable pour récupérer les métriques.

Installation Exportateur

Docker (Portainer) / Open Media Vault

On utilise l'image f100024/syncthing_exporter

  • Réseau du container de type "Host" :

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". Optionnellement on peut renseigner l'IP et le port d'écoute (par défaut port '9093' sur toutes les interfaces réseaux) :

Variables d'environnement du container..

  • Enfin on renseigne la politique de redémarrage sur "Unless stopped" :

L'exportateur doit toujours redémarrer sauf si stoppé manuellement..

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

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="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

Source

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"

Menu "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" :

Menu utilisateurs..

  • Créer un utilisateur "nextcloud-exporter" avec un mot de passe et membre du groupe "admin" :

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 :

Première fenêtre d'autorisation..

Deuxième fenêtre d'autorisation..

Liaison effectuée!

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" :

Menu Paramètres..

  • Décocher "Autoriser l'accès au gestionnaire de fichiers" dans le menu "Sécurité" :

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
# 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"

Menu "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..