\chapter{Prehľad existujúcich systémov zberu dát}\label{chp:collection_systems}

V~nasledujúcej kapitole popíšem základné modely zberu dát a existujúce systémy
zberu a~agregácie dát z~viacerých zdrojov a~taktiež možnosti ich vzájomného
prepojenia.

\section{Telegraf}

Prvým z~radu takýchto nástrojov je
Telegraf\footnote{\url{https://github.com/influxdata/telegraf}}.
Telegraf je naprogramovaný v~jazyku Go a~používa MIT licenciu.
Taktiež ponúka možnosť nasadenia ako Docker kontajner.

Využíva modulárny systém skladajúci sa z~štyroch typov pluginov, cez ktoré
zozbierané dáta postupne prechádzajú.\;\cite{telegraf_plugins}

\subsection{Vstupné pluginy}

Vstupné pluginy \texten{Input Plugins} slúžia na~samotný zber dát zo~zariadení
a~systémových služieb.
Telegraf samotný má zabudované veľké množstvo vstupných pluginov, napríklad
pre~protokoly Modbus, SNMP, HTTP alebo tiež pre~monitorovanie iných služieb,
napríklad Apache HTTP Server, Dovecot, Fail2Ban, Iptables, Postfix, Systemd
a~iné.\;\cite{telegraf_plugins}
Taktiež dokáže dáta preberať od~iných systémov na~zber dát, napríklad Collectd
alebo Prometheus.\;\cite{telegraf_plugins}

Okrem týchto zabudovaných pluginov umožňuje integráciu vlastných pluginov, buď
priamo naprogramovaných v~jazyku Go alebo ako externé programy predávajúce
namerané hodnoty na~štandardný výstup.
Tieto externé programy môžu byť dvoch typov.

Prvý typom sú takzvané \texten{exec} pluginy.
Tie telegraf spúšťa v~pravidelných intervaloch a~ich úlohou je v~tom momente
zozbierať sledované hodnoty a~okamžite ich vypísať na~štandardný výstup.
Tým ich beh končí, prípadne ich nasilu ukončí Telegraf po~ubehnutí časového
limitu.

Druhým typom sú \texten{execd} pluginy, ktoré Telegraf spustí raz na~začiatku
svojho behu alebo reštartuje po~ich neočakávanom ukončení.
Tie potom môžu fungovať nezávisle na~Telegrafe a~kedykoľvek posielať hodnoty
na~svoj štandardný výstup (\texten{push} model) alebo čakať na~výzvu od~Telegrafu
(\texten{pull} model).
Táto výzva môže mať buď formu signálu zaslaného cez operačný systém alebo
poslanie nového riadku na~štandardný vstup externého pluginu.

\subsection{Spracovateľské pluginy}

Spracovateľské pluginy (\texten{Processor Plugins}) umožňujú úpravu zozbieraných
dát a~ich metadát, napríklad konvertovať ich typy, priradiť geografickú polohu k
IP adresám alebo transformovať reťazce.\;\cite{telegraf_plugins}
Tento typ pluginov tiež umožňuje zozbierané hodnoty filtrovať.
Aj v~tomto prípade je možné funkcionalitu rozšíriť vytvorením vlastného pluginu,
ktorý na~štandardnom vstupe prijíma dáta vo formáte \texten{InfluxDB Line
Protocol}\footnote{\url{https://docs.influxdata.com/telegraf/v1.22/data_formats/input/influx/}}
a~na~štandardný výstup predáva upravené alebo filtrované dáta v~rovnakom
formáte.

\subsection{Agregačné pluginy}

Agregačné pluginy (\texten{Aggregator Plugins}) poskytujú funkcionalitu
na~agregovanie viacerých záznamov so~zhodnými parametrami pomocou rôznych
vstavaných agregačných funkcií.
Medzi ne patria napríklad bežné štatistické funkcie, ako minimum, maximum,
priemer, štandardná odchýlka, ale aj zložitejšie, ako počítanie definovaných
kvantilov alebo odhad derivácií pre~daný časový
interval.\;\cite{telegraf_plugins}
Pre~tento typ pluginy chýba explicitná možnosť vytvoriť vlastný externý plugin,
ale to je možné pomocou vlastného spracovateľského pluginu, keďže z~pohľadu
Telegrafu fungujú oba typy pluginov rovnako.

\subsection{Výstupné pluginy}

Posledným typom sú výstupné pluginy (\texten{Output Plugins}).
Úlohou týchto je uloženie zozbieraných a~spracovaných dát do~cieľového úložiska.
Telegraf má zabudované pluginy pre~rôzne databázy, napríklad InfluxDB,
Prometheus, SQL, MongoDB, služby, napríklad Datadog, Google Cloud BigQuery,
alebo uloženie do~špecifikovaného súboru.\;\cite{telegraf_plugins}
Nechýba taktiež možnosť vytvorenia vlastného pluginu, ktorý prijíma dáta cez
štandardný vstup.

\section{\texten{Prometheus exporter}}

\texten{Prometheus Exporter} je typ aplikácie alebo knižnice, ktorá dokáže
monitorovať alebo čítať dáta z~danej služby, aplikácie, či protokolu a~poskytuje
tieto dáta iným systémom v~Prometheus
formáte\footnote{\url{https://prometheus.io/docs/instrumenting/exposition_formats/}}
cez protokol HTTP.
Ide teda o~skupinu samostatných aplikácií, ktorá každá slúži na~monitorovanie
jedného cieľa.\;\cite{prometheus_exporters}

Z~pohľadu týchto exportérskych aplikácií je možné použiť oba modely na~zber dát
zo~samotných zariadení.
Tým že, tieto aplikácie poskytujú zozbierané dáta ako odpoveď na~HTTP
požiadavku, z~pohľadu ďalších systémov podporujú iba \texten{pull} model a~nevedia
dáta odoslať ďalej samé v~momente ich dostupnosti.

Tento formát má širokú podporu a~veľa aplikácií a~systémov dokáže poskytovať
telemetrické dáta o~svojom fungovaní, ale aj iné informácie takýmto spôsobom buď
ako vstavanú funkcionalitu alebo pomocou voliteľných rozšírení.
Medzi ne patria napríklad Ceph, Collectd, Dovecot, GitLab alebo Telegraf.
Zároveň pre~ostatné zdroje existuje mnoho neoficiálnych exportérskych aplikácií,
ktoré s~nimi dokážu komunikovať a~poskytnúť tak potrebné informácie, napríklad
MySQL, PostgreSQL, Modbus, Apache, SNMP a~iné.\;\cite{prometheus_exporters}

\section{Collectd}

Collectd\footnote{\url{https://collectd.org/}} je ďalším nástrojom určeným
na~zber dát.
Naprogramovaný je v~jazyku C.
Podobne, ako v~prípade nástroja Telegraf, ide o~modulárnu
aplikáciu.\;\cite{collectd_features}
Na~rozdiel od~spomenutého nástroja, ale pluginy nemajú možnosť zozbierané dáta
upraviť, filtrovať alebo ich agregovať.

Okrem jazyka C je pluginy možné napísať aj v~iných jazykoch.
Priamo Collectd má podporu interpretov jazykov Python a Perl,
JVM (\texten{Java Virtual Machine}) pre~pluginy v~jazyku Java a~taktiež
podporu pre~akýkoľvek spustiteľný program, s~ktorým potom komunikuje cez
štandardný výstup spusteného programu.\;\cite{collectd_features}

Pluginy podľa funkcionality môžeme rozdeliť na~dve hlavné skupiny, čítanie a
zápis.
Ďalej existujú dve menšie skupiny, zaznamenávanie ladiacich výpisov samotného
nástroja a~ostatných pluginov a~posielanie oznámení.
Tieto skupiny nie sú disjunktné a~plugin môže patriť do~viacerých z~nich, podľa
implementovanej funkcionality.

\subsection{Čítacie pluginy}

Čítacie pluginy pri inicializácii zaregistrujú funkcie určené pre čítanie hodnôt
zo~sledovaných zariadení a~Collectd ich v~pravidelných intervaloch spúšťa a~číta
tak hodnoty.
Z~pohľadu vzťahu medzi týmto nástrojom s~monitorovanými
zariadeniami tak ide o~\texten{pull} model.\;\cite{collectd_plugin_dev}

Samotný nástroj Collectd taktiež obsahuje mnoho pluginov umožňujúcich čítanie,
napríklad Apache, Iptables, Modbus, MySQL, PostgreSQL, SNMP, ale aj iné
systémové štatistiky, napríklad využitie procesora alebo
pamäte.\;\cite{collectd_plugins}

\subsection{Zapisovacie pluginy}

Zapisovacie pluginy podobne ako čítacie zaregistrujú vlastné funkcie, ktoré
Collectd spustí pre každú prečítanú hodnotu.
Ich úlohou je tak hodnotu uložiť alebo sprístupniť inému
systému.\;\cite{collectd_plugin_dev}

Priamo Collectd ponúka podporu pre uloženie dát v~CSV súbore, RRD databáze,
sprístupnenie iným systémom vo~formáte Prometheus alebo odoslanie dát ďalším
serverom v~sieti pomocou \texten{unicast} alebo \texten{multicast}
prenosu.\;\cite{collectd_plugins}

\subsection{Notifikačné pluginy}

Collectd taktiež umožňuje reagovať na~prekročenie definovanej hodnoty nejakej
sledovanej premennej.
Notifikačné pluginy taktiež zaregistrujú pri inicializácii funkciu, ktorej
úlohou je vzniknuté oznámenia o~prekročení hodnoty spracovať a~doručiť ďalej.
Nástroj Collectd na~to poskytuje pluginy pre odoslanie oznámení e-mailom,
zobrazenie oznámenia pomocou knižnice libnotify alebo odoslanie oznámenia
do~systému Nagios.\;\cite{collectd_features}
