378 lines
11 KiB
Markdown
378 lines
11 KiB
Markdown
---
|
|
categories: monitoring
|
|
title: Howto Collectd
|
|
...
|
|
|
|
* Documentation : <https://collectd.org/documentation.shtml>
|
|
|
|
[Collectd](https://collectd.org/) est un démon collectant des métriques systèmes et applications à intervalles réguliers. Il peut ensuite stocker ces métriques de différentes manières. Nous l'utilisons en combinaison avec [InfluxDB](HowtoInfluxDB) et [Grafana](HowtoGrafana).
|
|
|
|
Nous préférons collectd à [telegraf](https://www.influxdata.com/time-series-platform/telegraf/), ce dernier n'ayant pas de paquet disponible sous OpenBSD.
|
|
|
|
|
|
## Installation
|
|
|
|
### Debian
|
|
|
|
~~~
|
|
# apt install collectd
|
|
|
|
$ apt list collectd
|
|
Listing... Done
|
|
collectd/stable,now 5.12.0-7 amd64 [installed]
|
|
|
|
$ systemctl status collectd
|
|
● collectd.service - Statistics collection and monitoring daemon
|
|
Loaded: loaded (/lib/systemd/system/collectd.service; enabled; vendor preset: enabled)
|
|
Active: active (running) since Mon 2021-10-18 15:17:31 CEST; 26min ago
|
|
Docs: man:collectd(1)
|
|
man:collectd.conf(5)
|
|
https://collectd.org
|
|
Main PID: 74080 (collectd)
|
|
Tasks: 12 (limit: 2340)
|
|
Memory: 36.2M
|
|
CPU: 2.134s
|
|
CGroup: /system.slice/collectd.service
|
|
└─74080 /usr/sbin/collectd
|
|
~~~
|
|
|
|
### OpenBSD
|
|
|
|
~~~
|
|
# pkg_add collectd
|
|
|
|
$ pkg_info -Q collectd
|
|
collectd-5.8.1p0 (installed)
|
|
~~~
|
|
|
|
## Configuration
|
|
|
|
Collectd fonctionne à l'aide de plugins à activer selon ses besoins.
|
|
|
|
~~~
|
|
Interval 60
|
|
Timeout 2
|
|
Retries 3
|
|
|
|
LoadPlugin foo
|
|
|
|
<Plugin foo>
|
|
Option value
|
|
</Plugin>
|
|
~~~
|
|
|
|
### Plugin network
|
|
|
|
Le plugin [network](https://collectd.org/documentation/manpages/collectd.conf.5.shtml#plugin_network) est indispensable et permet de spécifier vers où envoyer les métriques collectées.
|
|
|
|
~~~
|
|
LoadPlugin network
|
|
|
|
<Plugin network>
|
|
Server "127.0.0.1" "25826"
|
|
</Plugin>
|
|
~~~
|
|
|
|
Si l'authentification est configurée du côté de la base de données (par exemple sur [InfluxDB](/HowtoInfluxDB#authentification-1)), on peut la configurer ainsi :
|
|
|
|
~~~
|
|
<Plugin network>
|
|
<Server "127.0.0.1" "25826">
|
|
SecurityLevel "sign"
|
|
Username "username"
|
|
Password "password"
|
|
</Server>
|
|
</Plugin>
|
|
~~~
|
|
|
|
Attention à ce que le fichier de configuration ne soit lisible que par `root`, vu que le mot de passe est en clair.
|
|
|
|
### Plugin syslog
|
|
|
|
Le plugin [syslog](https://collectd.org/documentation/manpages/collectd.conf.5.shtml#plugin_syslog) permet d'écrire des logs dans syslog, en y choisissant le log-level du démon. S'il n'est pas activé, aucun log ne sera présent dans syslog.
|
|
|
|
~~~
|
|
LoadPlugin syslog
|
|
|
|
<Plugin syslog>
|
|
LogLevel warning
|
|
</Plugin>
|
|
~~~
|
|
|
|
### Plugin logfile
|
|
|
|
Le plugin [logfile](https://collectd.org/documentation/manpages/collectd.conf.5.shtml#plugin_logfile) permet d'écrire des logs dans fichier texte défini, en y choisissant le log-level du démon.
|
|
|
|
~~~
|
|
LoadPlugin logfile
|
|
|
|
<Plugin "logfile">
|
|
LogLevel "warning"
|
|
File "/var/log/collectd.log"
|
|
Timestamp true
|
|
PrintSeverity true
|
|
</Plugin>
|
|
~~~
|
|
|
|
### Plugin exec
|
|
|
|
Le plugin [exec](https://collectd.org/documentation/manpages/collectd-exec.5.shtml) est intéressant puisqu'il permet d'exécuter n'importe quel script afin de récupérer toutes sortes de métriques non prises en charge par un autre plugin.
|
|
|
|
~~~
|
|
<LoadPlugin exec>
|
|
Interval 300
|
|
</LoadPlugin>
|
|
|
|
<Plugin exec>
|
|
Exec "user" "/path/to/script" "arg0" "arg1"
|
|
</Plugin>
|
|
~~~
|
|
|
|
La sortie du script doit respecter un format particulier :
|
|
|
|
~~~
|
|
PUTVAL host/plugin-instance/type-instance date:value
|
|
~~~
|
|
|
|
Avec :
|
|
|
|
* `host` : le nom de la machine associée à la mesure ;
|
|
* `plugin` : le nom de la mesure ;
|
|
* `instance` (facultatif) : un tag pouvant caractériser la mesure ;
|
|
* `type` : le type de mesure, parmi ceux présents dans le fichier `/usr/share/collectd/types.db` (ou `/usr/local/share/collectd/types.db` sous OpenBSD), et définissant le format de `value` ;
|
|
* `instance` (facultatif) : un tag pouvant caractériser la mesure ;
|
|
* `date` : la date à laquelle la mesure est récupérée, utiliser `N` pour remplacer par la date actuelle ;
|
|
* `value` : la valeur à récupérer.
|
|
|
|
Par exemple, pour récupérer le nombre de préfixes BGP partagés par un voisin :
|
|
|
|
~~~
|
|
PUTVAL $(hostname)/bgp_prefixes/count-${PEER} N:${CURRENT_PREFIXES}
|
|
~~~
|
|
|
|
### Plugin snmp
|
|
|
|
Le plugin [snmp](https://collectd.org/documentation/manpages/collectd-snmp.5.shtml) permet de faire des requêtes SNMP à des machines spécifiques.
|
|
Un block `Data` définit l'OID et sous quel format stocker les valeurs récupérées, et un block `Host` définit quelles machines interroger ainsi que la configuration SNMP.
|
|
|
|
Exemple pour récupérer le débit et le nombre de paquets unicast d'un switch, la charge d'un APC, et la fréquence, la tension, l'intensité, la source préférée et le statut d'un ATS.
|
|
Sous debian, le paquet `snmp` est nécessaire.
|
|
|
|
~~~
|
|
# apt install snmp
|
|
~~~
|
|
|
|
~~~
|
|
LoadPlugin snmp
|
|
|
|
<Plugin snmp>
|
|
# Switch
|
|
<Data "ifmib_if_octets64">
|
|
Type "if_octets"
|
|
Table true
|
|
Instance "1.3.6.1.2.1.31.1.1.1.18"
|
|
Values "1.3.6.1.2.1.31.1.1.1.6" "1.3.6.1.2.1.31.1.1.1.10"
|
|
</Data>
|
|
<Data "ifmib_if_packets64">
|
|
Type "if_packets"
|
|
Table true
|
|
Instance "1.3.6.1.2.1.31.1.1.1.18"
|
|
Values "1.3.6.1.2.1.31.1.1.1.7" "1.3.6.1.2.1.31.1.1.1.11"
|
|
</Data>
|
|
<Data "ifmib_if_errors">
|
|
Type "if_errors"
|
|
Table true
|
|
Instance "1.3.6.1.2.1.31.1.1.1.18"
|
|
Values "1.3.6.1.2.1.2.2.1.14" "1.3.6.1.2.1.2.2.1.20"
|
|
</Data>
|
|
<Data "ifmib_if_dropped">
|
|
Type "if_dropped"
|
|
Table true
|
|
Instance "1.3.6.1.2.1.31.1.1.1.18"
|
|
Values "1.3.6.1.2.1.2.2.1.13" "1.3.6.1.2.1.2.2.1.19"
|
|
</Data>
|
|
# https://www.cisco.com/c/en/us/support/docs/ip/simple-network-management-protocol-snmp/15215-collect-cpu-util-snmp.html
|
|
<Data "cpu_5s">
|
|
Type "cpufreq"
|
|
Instance "cpu_5s"
|
|
Values "1.3.6.1.4.1.9.9.109.1.1.1.1.6.1"
|
|
</Data>
|
|
<Data "cpu_1m">
|
|
Type "cpufreq"
|
|
Instance "cpu_1m"
|
|
Values "1.3.6.1.4.1.9.9.109.1.1.1.1.7.1"
|
|
</Data>
|
|
<Data "cpu_5m">
|
|
Type "cpufreq"
|
|
Instance "cpu_5m"
|
|
Values "1.3.6.1.4.1.9.9.109.1.1.1.1.8.1"
|
|
</Data>
|
|
# https://community.ipswitch.com/s/article/What-SNMP-OID-does-WhatsUp-Use-for-Cisco-Memory-and-CPU
|
|
<Data "memory_used">
|
|
Type "memory"
|
|
Table true
|
|
Instance "1.3.6.1.4.1.9.9.48.1.1.1.2"
|
|
InstancePrefix "Used - "
|
|
Values "1.3.6.1.4.1.9.9.48.1.1.1.5"
|
|
</Data>
|
|
<Data "memory_free">
|
|
Type "memory"
|
|
Table true
|
|
Instance "1.3.6.1.4.1.9.9.48.1.1.1.2"
|
|
InstancePrefix "Free - "
|
|
Values "1.3.6.1.4.1.9.9.48.1.1.1.6"
|
|
</Data>
|
|
# https://community.cisco.com/t5/switching/snmp-uptime/td-p/939932
|
|
<Data "uptime">
|
|
Type "uptime"
|
|
Instance "uptime"
|
|
Values ".1.3.6.1.6.3.10.2.1.3.0"
|
|
</Data>
|
|
|
|
<Host "Switch">
|
|
Address "192.0.2.1"
|
|
Version 2
|
|
Community "public"
|
|
Collect "ifmib_if_octets64" "ifmib_if_packets64" "ifmib_if_errors" "ifmib_if_dropped" "memory_used" "memory_free" "uptime"
|
|
</Host>
|
|
|
|
# APC
|
|
<Data "apc_current_load">
|
|
Type "current"
|
|
Instance "apc_current_load"
|
|
Scale 0.1
|
|
Values ".1.3.6.1.4.1.318.1.1.12.2.3.1.1.2.1"
|
|
</Data>
|
|
<Data "apc_current_low">
|
|
Type "current"
|
|
Instance "apc_current_low"
|
|
Values ".1.3.6.1.4.1.318.1.1.12.2.2.1.1.2.1"
|
|
</Data>
|
|
<Data "apc_current_near">
|
|
Type "current"
|
|
Instance "apc_current_near"
|
|
Values ".1.3.6.1.4.1.318.1.1.12.2.2.1.1.3.1"
|
|
</Data>
|
|
<Data "apc_current_overload">
|
|
Type "current"
|
|
Instance "apc_current_overload"
|
|
Values ".1.3.6.1.4.1.318.1.1.12.2.2.1.1.4.1"
|
|
</Data>
|
|
# Pour les APCs avec compteurs par prises
|
|
<Data "apc_outlet_current">
|
|
Type "current"
|
|
Table true
|
|
Instance ".1.3.6.1.4.1.318.1.1.26.9.4.3.1.1"
|
|
Scale 0.1
|
|
Values ".1.3.6.1.4.1.318.1.1.26.9.4.3.1.6"
|
|
</Data>
|
|
<Data "apc_outlet_watt">
|
|
Type "energy"
|
|
Table true
|
|
Instance ".1.3.6.1.4.1.318.1.1.26.9.4.3.1.1"
|
|
Values ".1.3.6.1.4.1.318.1.1.26.9.4.3.1.7"
|
|
</Data>
|
|
<Data "apc_outlet_total_energy">
|
|
Type "energy_wh"
|
|
Table true
|
|
Instance ".1.3.6.1.4.1.318.1.1.26.9.4.3.1.1"
|
|
Scale 0.1
|
|
Values ".1.3.6.1.4.1.318.1.1.26.9.4.3.1.11"
|
|
</Data>
|
|
|
|
|
|
<Host "APC classique">
|
|
Address "192.0.2.2"
|
|
Version 2
|
|
Community "public"
|
|
Collect "apc_current_load" "apc_current_low" "apc_current_near" "apc_current_overload"
|
|
Interval 1800
|
|
</Host>
|
|
<Host "APC avec compteurs par prises">
|
|
Address "192.0.2.2"
|
|
Version 2
|
|
Community "public"
|
|
Collect "apc_current_load" "apc_current_low" "apc_current_near" "apc_current_overload" "apc_outlet_current" "apc_outlet_watt" "apc_outlet_total_energy"
|
|
Interval 1800
|
|
</Host>
|
|
|
|
# ATS
|
|
<Data "ats_input_freq_a">
|
|
Type "frequency"
|
|
Instance "ats_input_freq_a"
|
|
Values ".1.3.6.1.4.1.318.1.1.8.5.3.2.1.4.1"
|
|
</Data>
|
|
<Data "ats_input_volt_a">
|
|
Type "voltage"
|
|
Instance "ats_input_volt_a"
|
|
Values ".1.3.6.1.4.1.318.1.1.8.5.3.3.1.3.1.1.1"
|
|
</Data>
|
|
<Data "ats_input_freq_b">
|
|
Type "frequency"
|
|
Instance "ats_input_freq_b"
|
|
Values ".1.3.6.1.4.1.318.1.1.8.5.3.2.1.4.2"
|
|
</Data>
|
|
<Data "ats_input_volt_b">
|
|
Type "voltage"
|
|
Instance "ats_input_volt_b"
|
|
Values ".1.3.6.1.4.1.318.1.1.8.5.3.3.1.3.2.1.1"
|
|
</Data>
|
|
|
|
<Data "ats_output_volt">
|
|
Type "voltage"
|
|
Instance "ats_output_volt"
|
|
Values ".1.3.6.1.4.1.318.1.1.8.5.4.3.1.3.1.1.1"
|
|
</Data>
|
|
<Data "ats_output_current">
|
|
Type "current"
|
|
Instance "ats_output_current"
|
|
Scale 0.1
|
|
Values ".1.3.6.1.4.1.318.1.1.8.5.4.3.1.4.1.1.1"
|
|
</Data>
|
|
<Data "ats_output_freq">
|
|
Type "frequency"
|
|
Instance "ats_output_freq"
|
|
Values ".1.3.6.1.4.1.318.1.1.8.5.4.2.1.4.1"
|
|
</Data>
|
|
|
|
<Data "ats_source_preferred">
|
|
Type "count"
|
|
Instance "ats_source_preferred"
|
|
Values ".1.3.6.1.4.1.318.1.1.8.4.2.0"
|
|
</Data>
|
|
<Data "ats_source_status">
|
|
Type "count"
|
|
Instance "ats_source_status"
|
|
Values ".1.3.6.1.4.1.318.1.1.8.5.1.2.0"
|
|
</Data>
|
|
|
|
<Data "ats_status_redundancy">
|
|
Type "count"
|
|
Instance "ats_status_redundancy"
|
|
Values ".1.3.6.1.4.1.318.1.1.8.5.1.3.0"
|
|
</Data>
|
|
<Data "ats_status_current_state">
|
|
Type "current"
|
|
Instance "ats_status_current_state"
|
|
Values ".1.3.6.1.4.1.318.1.1.8.5.1.4.0"
|
|
</Data>
|
|
<Data "ats_status_current_limit">
|
|
Type "current"
|
|
Instance "ats_status_current_limit"
|
|
Values ".1.3.6.1.4.1.318.1.1.8.4.6.0"
|
|
</Data>
|
|
|
|
<Host "ATS">
|
|
Address "192.0.2.3"
|
|
Version 2
|
|
Community "public"
|
|
Collect "ats_input_freq_a" "ats_input_volt_a" "ats_input_freq_b" "ats_input_volt_b" "ats_output_volt" "ats_output_current" "ats_output_freq" "ats_source_preferred" "ats_source_status" "ats_status_redundancy" "ats_status_current_state" "ats_status_current_limit"
|
|
Interval 1800
|
|
</Host>
|
|
</Plugin>
|
|
~~~
|
|
|
|
Pour les switchs, si on veut identifier chaque interfaces avec son nom (par exemple Gi0/1) plutôt que sa description (définie avec la commande "description" dans la configuration de l'interface), il faut modifier les lignes de configuration `Instance "1.3.6.1.2.1.31.1.1.1.18"` par `Instance "1.3.6.1.2.1.31.1.1.1.1"` pour les blocs `ifmib_if_octets64`, `ifmib_if_packets64`, `ifmib_if_errors`, et
|
|
`ifmib_if_dropped`.
|
|
|
|
Dans ce cas, au lieu que seules les interfaces ayant une description remontent des données, toutes les interfaces en remonteront (à 0 si rien n'est branché). |