Jak agregować logi za pomocą ELK i Beats?

Jak używać Filebeat i Metricbeat do zbierania danych z logów oraz metryk systemowych, które potem będzie przetwarzał ELK? Dowiecie się tego z naszego kolejnego wpisu na temat stosu ELK.

Hubert International Expansion Unit

9 listopada 2021

To mój drugi wpis na temat agregacji logów z użyciem stosu ELK. Poprzedni dotyczył samej konfiguracji ELK-a, natomiast dzisiaj napiszę, w jaki sposób dostarczyć mu dane za pomocą konkretnych narzędzi.

Skonfigurowaliśmy ELK Stack. Mamy już niezbędne narzędzia do zbierania logów, ale nie mamy tychże. Te nadal leżą sobie w różnych miejscach, a żeby wykorzystać możliwości Elastica, Logstasha i Kibany, musimy dostarczyć im dane. Zagadnienie wytłumaczę na przykładzie dwóch narzędzi: filebeat oraz metricbeat.

Filebeat i Metricbeat

Filebeat jest jednym z wielu narzędzi należących do szerokiej rodziny beats. Służy on, jak nazwa wskazuje, do cyklicznego zbierania danych z plików (między innymi). Alternatywą jest tutaj wysyłanie logów bezpośrednio do Elastica lub Logstasha, natomiast takie podejście ma swoje wady. Jednym z nich jest ryzyko utraty logów w przypadku problemów sieciowych lub konieczności aktualizacji któregoś z komponentów ELK, jeżeli blue-green z różnych powodów nie może być przeprowadzone.

Możliwości filebeata są bardzo duże, obok licznych modułów dostępnych już w podstawowej wersji, istnieje możliwość tworzenia własnych, opartych o libbeat.

Metricbeat z kolei służy do zbierania wszelakiej maści metryk. W pierwszych zdaniach tego wpisu wspomniałem o zbieraniu i agregowaniu logów. Tutaj metryki potraktuję analogicznie. Informacja o działaniu systemu może pomóc w podjęciu decyzji o skalowaniu wertykalnym lub horyzontalnym.

Konfiguracja

Ponownie wykorzystamy Ansible, ale tym razem niezbędne narzędzia będą zainstalowane bezpośrednio na maszynie wirtualnej. Na potrzeby testów podłączymy logi systemowe oraz te pochodzące z Dockera. Zbieranie logów bezpośrednio z kontenerów to jeden ze sposobów na zasilenie Elastica danymi. Inną drogą jest logowanie z kontenera do pliku, zamontowanie katalogu w postaci wolumenu, a następnie skonfigurowanie filebeata do czytania znajdujących się tam plików.

Zaczniemy od konfiguracji roli instalującej filebeata. Cały kod użyty w tym artykule znajduje się w tym repozytorium. W poprzednim artykule omówiłem mniej więcej składnię ról w Ansible, więc dla zwiększenia czytelności tutaj to pominę.

- name: install filebeat
apt:
deb: https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-{{ filebeat.version }}-amd64.deb

- name: deploy filebeat configuration
copy:
src: filebeat.yml
dest: "{{ filebeat.conf_dir }}/filebeat.yml"

- name: restart filebeat
systemd:
daemon_reload: yes
name: filebeat
state: restarted

Czyli – instalujemy filebeata z paczki dostępnej na stronie elastic.co, następnie wrzucamy konfigurację, a na zakończenie całego procesu – restartujemy usługę, by zmiana została zaczytana.

filebeat.inputs[1]:
- type: log
paths:
- /var/log/syslog
- type: docker
combine_partial: true
containers:
path: /var/lib/docker/containers
stream: stdout
ids:
- '*'
output.logstash[2]:
hosts: ['127.0.0.1:5044']

Konfigurujemy wejścia – w tym przypadku interesują nas konkretnie dwa rodzaje: log oraz docker. W pierwszym przypadku podajemy tylko ścieżkę do loga systemowego, w drugim – ścieżkę, gdzie znajdują się kontenery, identyfikatory tych kontenerów oraz typ strumienia. Aby nie zaciemniać obrazu możemy przyjąć, że “tak ma być”. Zainteresowanych tematem odsyłam do oficjalnej dokumentacji.

Rola służąca do zainstalowania metricbeata wygląda praktycznie identycznie:

- name: install metricbeat
apt:
deb: https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-{{ metricbeat.version }}-amd64.deb

- name: deploy metricbeat configuration
copy:
src: metricbeat.yml
dest: "{{ metricbeat.conf_dir }}/metricbeat.yml"

- name: restart metricbeat
systemd:
daemon_reload: yes
name: metricbeat
state: restarted

Natomiast konfiguracja wygląda już inaczej:

metricbeat.modules:
- module: docker[1]
metricsets:
- 'container'
- 'cpu'
- 'diskio'
- 'event'
- 'healthcheck'
- 'info'
- 'memory'
- 'network'
hosts: [ "unix:///var/run/docker.sock" ][2]
period: 10s[3]
enabled: true[4]

output.logstash:
hosts: ['127.0.0.1:5044']

Tutaj konfigurujemy jeden moduł – docker[1], podpinamy się pod socket[2], co 10 sekund zbieramy dane[3], a nasz moduł, rzecz jasna, jest włączony[4]. Wyjście, podobnie jak w przypadku filebeata, ustawiliśmy na Logstasha.

Konfiguracja Kibany

Dane już płyną do Elastica, ale musimy jeszcze skonfigurować Kibanę, by je zobaczyć. Wchodzimy zatem z przeglądarki na adres IP naszej maszyny wirtualnej. Jeżeli korzystasz z domyślnej konfiguracji Vagranta, która znajduje się w podlinkowanym repozytorium, będzie to http://172.168.0.2:5601/.

Jeżeli uruchamiasz Kibanę po raz pierwszy, powinieneś zobaczyć okienko powitalne:

Wybieramy opcję Explore on my own. Po zamknięciu okienka rozwijamy menu boczne (przycisk znajduje się w lewym górnym rogu), przewijamy na dół i wybieramy Stack management.

Po kliknięciu pojawi się następujący widok, gdzie klikamy Index Patterns. Elasticsearch już zbiera dane, ale musimy je jeszcze wyświetlić i do tego służy właśnie index pattern.

Po wybraniu opcji Index Patterns, zostajemy przeniesieni do kolejnego ekranu, gdzie wybieramy opcję Create index pattern.

Jeżeli prawidłowo skonfigurowaliśmy metricbeata i filebeata, pojawi się lista dostępnych indeksów. W wyszukiwarce wpisujemy zatem nazwę jednego z nich, a dokładniej – pattern pasujący do jednego konkretnego indeksu, na przykład filebeat* obejmie indeks filebeat-7.12.1. Klikamy Next step.

W następnej formatce wybieramy pole zawierające timestamp, na podstawie którego Kibana będzie w stanie określić, które pole tym timestampem jest. Pól z timestampami może być więcej, więc musimy jednoznacznie określić, które pole ma być tym głównym. O ile w przypadku filebeata i metricbeata będzie się ono nazywać po prostu @timestamp, o tyle w przypadku innych źródeł niekoniecznie tak musi być.

Po zatwierdzeniu operacji poprzez kliknięcie przycisku Create index pattern powinien wyświetlić się ekran zawierający wszystkie pola dostępne do wyszukiwania.

Dla metricbeata konfiguracja wygląda dokładnie tak samo. Jeżeli wszystko wykonaliśmy prawidłowo, można już podejrzeć nasze dane. Rozwijamy ponownie menu po lewej stronie (przypominam – lewy górny róg), w sekcji Analytics wybieramy opcję Discover. Naszym oczom powinien ukazać się widok podobny do tego:

Tym sposobem dotarliśmy do końca konfiguracji ELK, skonfigurowaliśmy zbieranie logów systemowych, metryk z Dockera oraz logów z kontenerów. Zachęcam do eksperymentowania z Kibaną i tworzenia dashboardów z zebranych danych. Filebeat i metricbeat mogą zbierać dane z wielu źródeł, istnieje możliwość cyklicznego zbierania danych z endpointów HTTP. Przy odrobinie chęci i samozaparcia można utworzyć dashboard wyświetlający dane pogodowe, kursy walut czy nawet ceny akcji na giełdzie.

Podsumowanie

Alternatywnym rozwiązaniem jest też Graylog, który pod spodem również korzysta z Elasticsearch, natomiast Kibana i Logstash cieszą się niesłabnącą popularnością. Zbieranie danych z różnych źródeł, często rozproszonych, bywa nieocenioną pomocą przy administracji systemami informatycznymi i nie tylko. Informacje zawarte w tym wpisie są jedynie wierzchołkiem góry lodowej, którą to są możliwości zarówno samego ELK Stack, jak i narzędzi z rodziny beats.

bannerbanner

Your software development experts

We’re a team of experienced and skilled software developers – and people you’ll enjoy working with.

Start Your Projectadd