Telegraf — zaawansowane pluginy i własne metryki monitorowania
Opublikowano: 10 kwietnia 2026 · Kategoria: VPS
Telegraf to agent monitorowania od InfluxData z ponad 300 pluginami wejściowymi — zbiera metryki z systemu, baz danych, kontenerów, sieci i własnych skryptów. W tym artykule omówimy zaawansowane pluginy i wzorce konfiguracji wykraczające poza podstawowe CPU/RAM/dysk.
Instalacja i podstawowa konfiguracja
# Ubuntu/Debian wget -q https://repos.influxdata.com/influxdata-archive_compat.key echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c \ influxdata-archive_compat.key' | sha256sum --check cat influxdata-archive_compat.key | gpg --dearmor | \ tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] \ https://repos.influxdata.com/debian stable main' | \ tee /etc/apt/sources.list.d/influxdata.list apt update && apt install telegraf systemctl enable --now telegraf
inputs.procstat — monitoring procesów aplikacji
procstat śledzi konkretne procesy bez potrzeby modyfikacji aplikacji:
# /etc/telegraf/telegraf.d/procstat.conf
# Monitoring Nginx przez PID file
[[inputs.procstat]]
pid_file = "/var/run/nginx.pid"
[inputs.procstat.tags]
service = "nginx"
# Monitoring PHP-FPM przez pattern (wszystkie procesy php-fpm)
[[inputs.procstat]]
pattern = "php-fpm"
[inputs.procstat.tags]
service = "php-fpm"
# Monitoring konkretnej aplikacji przez systemd unit
[[inputs.procstat]]
systemd_unit = "myapp.service"
[inputs.procstat.tags]
service = "myapp"
Kluczowe metryki procstat: procstat_cpu_usage, procstat_memory_rss, procstat_num_fds, procstat_num_threads, procstat_write_bytes, procstat_read_bytes.
inputs.docker — metryki kontenerów
[[inputs.docker]]
endpoint = "unix:///var/run/docker.sock"
gather_services = false
total = false
# Filtruj kontenery (domyślnie: wszystkie)
container_name_include = []
container_name_exclude = ["telegraf"]
# Etykiety jako tagi
docker_label_include = ["com.docker.compose.service"]
perdevice_include = ["cpu"] # cpu per-device (per kontener)
total_include = ["cpu", "blkio", "network"]
[inputs.docker.tags]
environment = "production" inputs.postgresql — monitoring bazy danych
[[inputs.postgresql]]
address = "postgres://telegraf:password@localhost/postgres?sslmode=disable"
# Monitoruj wszystkie bazy
databases = []
# Dodatkowe metryki pg_stat_bgwriter, pg_stat_database
ignored_databases = ["template0", "template1"]
# Zaawansowane metryki przez zapytania SQL
[[inputs.postgresql_extensible]]
address = "postgres://telegraf:password@localhost/postgres?sslmode=disable"
[[inputs.postgresql_extensible.query]]
sqlquery = """
SELECT schemaname, tablename,
n_tup_ins as inserts, n_tup_upd as updates, n_tup_del as deletes,
n_live_tup as live_rows, n_dead_tup as dead_rows
FROM pg_stat_user_tables
"""
version = 901
withdbname = false
tagvalue = "schemaname,tablename" inputs.exec — własne metryki przez skrypt
Plugin exec uruchamia dowolny skrypt i parsuje output. Format InfluxDB Line Protocol:
measurement,tag1=val1 field1=val1 timestamp:
# /etc/telegraf/scripts/custom_metrics.sh
#!/bin/bash
# Liczba aktywnych połączeń PHP-FPM z socket
FPM_STATS=$(curl -s --unix-socket /run/php/php8.2-fpm.sock \
"http://localhost/fpm-status?json" 2>/dev/null)
ACTIVE=$(echo $FPM_STATS | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['active processes'])" 2>/dev/null || echo 0)
IDLE=$(echo $FPM_STATS | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['idle processes'])" 2>/dev/null || echo 0)
TOTAL=$(echo $FPM_STATS | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['total processes'])" 2>/dev/null || echo 0)
# Output w InfluxDB Line Protocol
echo "php_fpm,host=${HOSTNAME} active_processes=${ACTIVE}i,idle_processes=${IDLE}i,total_processes=${TOTAL}i" # telegraf.conf — użyj skryptu [[inputs.exec]] commands = ["/etc/telegraf/scripts/custom_metrics.sh"] timeout = "10s" data_format = "influx" interval = "30s"
Starlark processor — zaawansowane transformacje
[[processors.starlark]]
namepass = ["nginx"]
source = '''
def apply(metric):
# Oblicz error rate z pól http_5xx i http_total
http_5xx = metric.fields.get("http_5xx", 0)
http_total = metric.fields.get("http_total", 1)
if http_total > 0:
metric.fields["error_rate"] = float(http_5xx) / float(http_total) * 100
else:
metric.fields["error_rate"] = 0.0
# Dodaj tag na podstawie wartości pola
if metric.fields.get("error_rate", 0) > 5.0:
metric.tags["alert"] = "error_rate_high"
return metric
''' Multi-output: InfluxDB V2 + Prometheus
# Output 1 — InfluxDB V2 [[outputs.influxdb_v2]] urls = ["http://influxdb:8086"] token = "$INFLUXDB_TOKEN" organization = "myorg" bucket = "telegraf" # Output 2 — Prometheus scrape endpoint # Prometheus skrapuje http://agent:9273/metrics [[outputs.prometheus_client]] listen = ":9273" metric_version = 2 expiration_interval = "60s" # Output 3 — debug do konsoli (do testów) # [[outputs.file]] # files = ["stdout"] # data_format = "influx"
Telegraf vs Prometheus Node Exporter — porównanie
| Cecha | Telegraf | Node Exporter |
|---|---|---|
| Model danych | Push (agent wysyła) | Pull (Prometheus pobiera) |
| Liczba pluginów | 300+ (bazy, docker, cloud) | ~20 (głównie Linux) |
| Custom metryki | inputs.exec (dowolny skrypt) | Textfile collector |
| Transformacje | Starlark, Regex, JSON Path | Brak (Prometheus relabeling) |
| Backend | InfluxDB, Prometheus, Graphite, Kafka, S3 | Tylko Prometheus |
| Kiedy wybrać | Wiele backendów, custom metrics, non-Linux | Pure Prometheus stack, Linux system |