Slajd 1/45
Stos Grafana, Prometheus, Node Exporter i SNMP Exporter
Cel slajdu: Przedstawienie celu modułu, składu czterokontenerowego stosu oraz miejsca metryk w nadzorze sieci.

Monitoring metryk w kontenerach

Moduł opisuje kompletny, kontenerowy stos do zbierania i wizualizacji metryk: Prometheus gromadzi szeregi czasowe, eksportery udostępniają dane, a Grafana prezentuje je w postaci paneli. Całość uruchamia się jednym plikiem Compose na dowolnym hoście z Dockerem.

  • Skład stosu: Prometheus, Grafana, node-exporter oraz snmp-exporter w jednej sieci Docker; każdy kontener pełni jedną rolę
  • Wymagania: 64-bitowy Linux z Docker Engine i wtyczką Compose, około 2 GB wolnego miejsca na obrazy oraz dostęp do monitorowanych urządzeń przez SNMP
  • Obiekty nadzoru: Sam host z Dockerem przez node-exporter oraz dowolny router lub przełącznik przez SNMP w wersji v2c
  • Efekt końcowy: Panele Grafana z obciążeniem procesora, pamięcią hosta i ruchem na interfejsach sieciowych, odpytywane na żywo z Prometheusa
Stos metryk (Metrics stack): Zestaw współpracujących usług, w którym eksportery wystawiają pomiary w formacie tekstowym, Prometheus je okresowo pobiera i składuje, a Grafana wykonuje zapytania i rysuje wykresy.
Zrzut ekranu: slajd 1
Zrzut: cztery kontenery w docker ps albo schemat stosu.
Stos metryk Prometheus GrafanaPrometheus:9090baza TSDBzapytaniaGrafana:3000panelewykresynode-exp:9100CPU/RAMsnmp-exp:9116SNMP-HTTPSerwer Linuxhost z Dockeremproc, sysRouter SNMPdowolny MikroTikv2c, UDP 161
Slajd 2/45
Spis treści modułu
Cel slajdu: Przedstawienie układu materiału prowadzącego od instalacji Dockera po gotowe panele w Grafanie.

Układ materiału i plan zajęć

Materiał podzielono na pięć bloków: instalacja Dockera, gotowe pliki stosu, uruchomienie i organizacja danych, działanie każdego elementu oraz budowa paneli z diagnostyką. Bloki przerabiasz po kolei od góry, bo każdy następny korzysta z plików i pojęć poprzedniego.

  • Blok 1: Instalacja Dockera: Oficjalna procedura dla Ubuntu, repozytorium producenta i weryfikacja (slajdy 7-8)
  • Blok 2: Pliki stosu: Skąd wziąć pliki, pełny docker-compose.yml oraz prometheus.yml do skopiowania (slajdy 9-11)
  • Blok 3: Start i rozbudowa: Uruchomienie, anatomia konfiguracji, dopisywanie hostów, routerów i portów (slajdy 12-16)
  • Blok 4 i 5: Dane i panele: Wolumeny, model pobierania, eksportery, SNMP, RouterOS, Grafana, PromQL i diagnostyka (slajdy 17-45)
Plan dydaktyczny modułu: Sekwencja od instalacji silnika, przez gotowe pliki i zrozumienie przepływu metryk, po samodzielną budowę wykresów.
Zrzut ekranu: slajd 2
Zrzut: spis treści lub strona startowa kursu.
Plan modułu1. Instalacjaslajdy 7-8: Dockerrepo, hello-world2. Pliki stosuslajdy 9-11compose, yml3. Startslajdy 12-16up, hosty, porty4. Paneleslajdy 17-44Grafana, PromQL
Slajd 3/45
Po co osobny stos metryk
Cel slajdu: Wyjaśnienie różnicy między logami, monitoringiem dostępności a liczbowymi szeregami czasowymi.

Logi mówią co się stało, metryki pokazują jak system pracuje

Log systemowy opisuje pojedyncze zdarzenie, natomiast metryka to wartość liczbowa próbkowana w czasie, na przykład obciążenie procesora co 15 sekund. Dopiero wykres takiej serii ujawnia trendy i anomalie. W praktyce oba źródła łączą się w jedno okno diagnostyki: metryka pokazuje kiedy coś się działo, a log mówi co dokładnie.

  • Trzy filary obserwowalności: Metryki (liczby w czasie), logi (zdarzenia tekstowe) oraz ślady rozproszone; moduł dotyczy pierwszego filaru
  • Przykład praktyczny: Log powie, że interfejs zmienił stan, a metryka ifInOctets pokaże, że ruch narastał przez godzinę przed awarią
  • Zaleta Prometheusa: Wielowymiarowe etykiety, na przykład ifDescr z nazwą interfejsu, pozwalają jednym zapytaniem objąć wszystkie porty routera
  • Rola Grafany: Panel łączy wiele zapytań w jeden czytelny obraz: wykres, miernik i tabelę
Szereg czasowy (Time series): Ciąg par znacznik czasu i wartość liczbowa identyfikowany nazwą metryki oraz zestawem etykiet, przechowywany w bazie TSDB Prometheusa.
Zrzut ekranu: slajd 3
Zrzut: wykres metryki obok pliku logu.
Metryki, logi i śladyMetrykiliczby + czasPrometheusLogitekst + zdarzeniersyslogŚladyprzebieg żądaniatemponode_load1{host="serwer"} 0.42ifInOctets{ifDescr="ether1"} 2281275351nazwa + etykiety + wartość + czas
Slajd 4/45
Architektura stosu i przepływ danych
Cel slajdu: Pokazanie czterech kontenerów, kierunków połączeń oraz protokołów na każdym odcinku.

Cztery kontenery i jeden kierunek inicjacji

Wszystkie połączenia inicjuje Prometheus wewnątrz sieci Docker. Grafana pyta Prometheusa, Prometheus odpytuje eksportery, a snmp-exporter tłumaczy odpowiedzi SNMP z routera na format tekstowy. Dzięki temu zapora na monitorowanych hostach przepuszcza tylko ruch do eksporterów, a hasła nie opuszczają centrali.

  • Kontener prometheus: Port 9090, baza w wolumenie prometheus_data oraz konfiguracja z pliku prometheus.yml
  • Kontener grafana: Port 3000, dane w wolumenie grafana_data, źródło Prometheus dodane automatycznie
  • Eksportery: node-exporter na porcie 9100 czyta jądro Linuksa, snmp-exporter na porcie 9116 tłumaczy SNMP na HTTP
  • Obiekty zewnętrzne: Host z Dockerem przez interfejs proc oraz router przez UDP 161 o wspólnocie SNMP v2c
Model pobierania (Pull model): Architektura, w której to serwer monitorujący inicjuje połączenia do monitorowanych celów, w przeciwieństwie do modelu wypychania, gdzie cele same wysyłają dane.
Zrzut ekranu: slajd 4
Zrzut: strzałki przepływu danych między usługami.
Przepływ danych w stosieGrafana:3000pytaPrometheus:9090pytanode-exp:9100metrykisnmp-exp:9116tłumaczLinuxproc, sysRouterUDP 161
Slajd 5/45
Zależności między kontenerami
Cel slajdu: Omówienie kolejności startu, mechanizmu depends_on oraz odporności na chwilowe awarie.

Kolejność startu ma znaczenie tylko przy starcie

Kontener Grafana zależy od Prometheusa, więc Compose uruchamia go później. Po starcie usługi działają niezależnie i odtwarzają połączenie po każdej przerwie, dlatego chwilowy brak Prometheusa nie wymaga restartu Grafany. W praktyce oznacza to odporność na restart pojedynczej usługi bez odtwarzania całego stosu.

  • depends_on w Compose: Wpis przy usłudze grafana wymusza start kontenera prometheus jako pierwszego przy poleceniu up -d
  • Brak twardego oczekiwania: Grafana ponawia próby połączenia ze źródłem, a Prometheus ponawia pobieranie celów oznaczonych jako down
  • restart: unless-stopped: Każdy kontener wraca po restarcie hosta; stan sprawdza się poleceniem docker ps
  • Sieć monitorująca: Wewnętrzne nazwy prometheus, grafana i snmp-exporter działają dzięki wbudowanemu DNS Dockera
Zależność startowa (depends_on): Deklaracja kolejności tworzenia kontenerów w pliku Compose; nie jest to mechanizm sprawdzania gotowości aplikacji.
Zrzut ekranu: slajd 5
Zrzut: depends_on w pliku Compose i kolejność startu.
Zależności startoweprometheusstart 1port 9090grafanastart 2depends_oneksporteryrównolegle9100/9116awaria jednego celu nie zatrzymuje pobierania pozostałychrestart: unless-stoppedsieć: monitoring (DNS: prometheus, grafana)
Slajd 6/45
Przepływ danych krok po kroku
Cel slajdu: Prześledzenie pojedynczego cyklu pobrania od zapytania HTTP po zapis w bazie TSDB.

Sześć kroków jednego cyklu pobrania

Cykl zaczyna się od zapytania HTTP GET do punktu metrics. Eksporter odpowiada tekstem, Prometheus parsuje go, dopisuje etykiety i zapisuje próbki w bazie. Grafana później czyta te próbki zapytaniami PromQL.

  • Krok 1-2: Prometheus co 15 sekund wykonuje GET http://node-exporter:9100/metrics i otrzymuje tekst z setkami linii
  • Krok 3-4: W zadaniu snmp Prometheus pyta snmp-exporter z parametrami module, auth i target, a eksporter wykonuje spacer SNMP po routerze
  • Krok 5: Parser dopisuje etykiety job, instance oraz własne, na przykład nazwę urządzenia
  • Krok 6: Próbki trafiają do bloków TSDB w wolumenie danych z wybraną retencją, na przykład 30 dni
Punkt metrics: Adres HTTP, pod którym eksporter wystawia aktualne pomiary w formacie tekstowym Prometheus exposition format.
Zrzut ekranu: slajd 6
Zrzut: zapytanie HTTP do punktu metrics w przeglądarce.
Cykl pobrania metryk1. GET node-exporter:9100/metrics (co 15 s)2. GET snmp-exporter:9116/snmp?module=if_mib&target=ROUTER3. spacer SNMP: zapytanie UDP 161, odpowiedź PDU4. parsowanie + etykiety job/instance5. zapis TSDB, retencja 30 dniGrafana czyta przez PromQLwykresy, panele, alerty
Slajd 7/45
Instalacja Dockera
Cel slajdu: Przedstawienie oficjalnej procedury instalacji silnika kontenerów na Ubuntu.

Silnik kontenerów jako fundament stosu

Zalecana metoda to instalacja z oficjalnego repozytorium APT producenta. Procedura polega na dodaniu klucza GPG i repozytorium, instalacji pakietów oraz weryfikacji testem hello-world. Producent wspiera 64-bitowe wydania Ubuntu LTS, w tym 22.04, 24.04 i 26.04.

  • Krok 1: Pakiety ca-certificates curl, katalog /etc/apt/keyrings oraz klucz z adresu download.docker.com
  • Krok 2: Dodanie repozytorium APT z kryptonimem wydania i instalacja docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  • Krok 3: Weryfikacja poleceniami docker --version, docker compose version oraz sudo docker run hello-world
  • Praca bez sudo: Dodanie użytkownika do grupy docker i ponowne logowanie (pełny listing na następnym slajdzie)
Silnik Docker (Docker Engine): Usługa systemowa budująca, uruchamiająca i izolująca kontenery przy użyciu przestrzeni nazw jądra Linuksa i grup kontrolnych.
Zrzut ekranu: slajd 7
Zrzut: wynik docker --version i hello-world.
Instalacja Dockera$ sudo apt install docker-ce docker-ce-cli ...$ docker --versionDocker version 29.x$ sudo docker run hello-worldHello from Docker!Repozytoriumkeyrings/docker.ascapt sourcePakietydocker-cecompose-plugin
Slajd 8/45
Instalacja Dockera krok po kroku
Cel slajdu: Podanie kompletnej, gotowej do wklejenia sekwencji poleceń dla Ubuntu.

Wklej linijka po linijce

Poniższe polecenia wykonuje się w terminalu Ubuntu z uprawnieniami sudo. Pierwszy blok dodaje repozytorium producenta, drugi instaluje pakiety, trzeci weryfikuje działanie, a czwarty nadaje pracę bez sudo. Każdą komendę wklejasz osobno i czekasz na jej koniec; całość trwa kilka minut na zwykłym łączu.

  • Blok repozytorium: Aktualizacja APT, pakiety pomocnicze, klucz GPG oraz plik docker.sources z kryptonimem wydania
  • Blok instalacji: Pięć pakietów jednym poleceniem apt install, potem odświeżenie listy pakietów przed instalacją
  • Weryfikacja: Kontener hello-world pobiera się i wypisuje potwierdzenie, a polecenia version pokazują silnik i wtyczkę Compose
  • Grupa docker: Polecenie usermod działa dopiero po ponownym zalogowaniu; do tego czasu używa się sudo
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin
sudo docker run hello-world
docker --version
docker compose version
Repozytorium APT: Wpis w sources.list.d wskazujący serwer pakietów producenta; system pobiera stąd silnik i jego aktualizacje.
Zrzut ekranu: slajd 8
Zrzut: terminal z wykonywaniem komend instalacji.
Polecenia instalacjiUbuntu 22.04, 24.04 lub 26.04, 64 bitysudo apt update && sudo apt install -y ca-certificates curlsudo install -m 0755 -d /etc/apt/keyringssudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o .../docker.ascsudo tee /etc/apt/sources.list.d/docker.sources (deb, stable)sudo apt update && sudo apt install -y docker-ce ...sudo docker run hello-worldsudo usermod -aG docker $USER # + ponowne logowanie
Slajd 9/45
Skąd wziąć pliki stosu
Cel slajdu: Wskazanie gotowych plików w materiałach oraz struktury katalogów do utworzenia.

Trzy pliki wystarczą do startu

Do uruchomienia stosu potrzebne są trzy pliki: docker-compose.yml, prometheus.yml oraz provisioning źródła danych. Czwarty, snmp.yml, dostarcza sam obraz snmp-exporter, więc nie trzeba go pisać. Pliki znajdują się w katalogu _grafana_stack dołączonym do materiałów.

Przykładowy zestaw stosu kontenerów możesz pobrać z github za pomocą polecenia git clone https://github.com/IgorBrzezek/simpleGRAFANA.

  • Katalog _grafana_stack/: Gotowy zestaw: docker-compose.yml, prometheus/prometheus.yml oraz grafana/provisioning/datasources/prometheus.yml
  • Wariant ręczny: Utworzenie tej samej struktury trzema poleceniami mkdir i skopiowanie listingów z dwóch następnych slajdów
  • Jedyna zmiana: Adres routera w prometheus.yml (przykładowy 192.168.1.1) podmienia się na własny przed startem
  • Hasło Grafany: Wartość zmien-mnie w sekcji environment podmienia się na własne przed pierwszym startem
Provisioning: Pliki konfiguracyjne montowane do Grafany przy starcie; rejestrują źródło danych bez klikania w interfejsie.
Zrzut ekranu: slajd 9
Zrzut: drzewo katalogu monitoring w menedżerze plików.
Struktura plików_grafana_stack/├── docker-compose.yml├── prometheus/prometheus.yml└── grafana/provisioning/datasources/prometheus.ymlmkdir -p prometheus grafana/provisioning/datasourcescd _grafana_stack && docker compose up -dGotowe pliki_grafana_stack/skopiuj, podmień IPRęczniemkdir, wklejslajdy 10-11
Slajd 10/45
Przykładowy docker-compose.yml
Cel slajdu: Podanie kompletnego pliku Compose gotowego do skopiowania.

Cały stos w jednym pliku

Poniższy listing to kompletna zawartość pliku docker-compose.yml. Jawne wersje obrazów gwarantują powtarzalność, a montowania ro dostarczają konfigurację bez wbudowywania jej w obrazy. Plik przechodzi sprawdzenie składni poleceniem docker compose config.

  • Cztery usługi: prometheus, node-exporter, snmp-exporter i grafana, każda z publikacją jednego portu
  • Dwa wolumeny: prometheus_data na bazę TSDB oraz grafana_data na panele i użytkowników
  • Dwa dowiązania ro: Pliki prometheus.yml i provisioning, tylko do odczytu dla kontenerów
  • snmp.yml z obrazu: Brak montowania oznacza użycie pełnego pliku wbudowanego w obraz snmp-exporter
name: grafana-stack
networks:
  monitoring: {}
volumes:
  prometheus_data: {}
  grafana_data: {}
services:
  prometheus:
    image: prom/prometheus:v3.5.0
    container_name: prometheus
    command:
      - --config.file=/etc/prometheus/prometheus.yml
      - --storage.tsdb.path=/prometheus
      - --storage.tsdb.retention.time=30d
      - --web.enable-lifecycle
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prometheus_data:/prometheus
    ports:
      - "9090:9090"
    networks:
      - monitoring
    restart: unless-stopped
  node-exporter:
    image: prom/node-exporter:v1.9.1
    container_name: node-exporter
    command:
      - --path.rootfs=/host
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/host:ro,rslave
    ports:
      - "9100:9100"
    networks:
      - monitoring
    restart: unless-stopped
  snmp-exporter:
    image: prom/snmp-exporter:v0.28.0
    container_name: snmp-exporter
    ports:
      - "9116:9116"
    networks:
      - monitoring
    restart: unless-stopped
  grafana:
    image: grafana/grafana:11.6.5
    container_name: grafana
    environment:
      GF_SECURITY_ADMIN_USER: admin
      GF_SECURITY_ADMIN_PASSWORD: "zmien-mnie"
      GF_USERS_ALLOW_SIGN_UP: "false"
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning:ro
    ports:
      - "3000:3000"
    networks:
      - monitoring
    restart: unless-stopped
    depends_on:
      - prometheus
Znacznik obrazu (Image tag): Jawna wersja po dwukropku, na przykład v3.5.0; przeciwieństwo zmiennego latest.
Zrzut ekranu: slajd 10
Zrzut: otwarty plik docker-compose.yml w edytorze.
Listing docker-compose.ymlplik: _grafana_stack/docker-compose.ymlname: grafana-stack; sieć i wolumeny monitoringuprometheus: prom/prometheus:v3.5.0, port 9090node-exporter: prom/node-exporter:v1.9.1, port 9100/proc, /sys, /host: ro + path.rootfs=/hostsnmp-exporter: prom/snmp-exporter:v0.28.0, port 9116grafana: grafana/grafana:11.6.5, port 3000environment: admin + własne hasło, depends_on: prometheuspełny plik w katalogu _grafana_stack/ dołączonym do materiałów
Slajd 11/45
Przykładowy prometheus.yml
Cel slajdu: Podanie kompletnego pliku konfiguracji pobierania oraz provisioning Grafany.

Pięć zadań i jedno źródło danych

Poniżej pełna treść pliku prometheus.yml: dwa wpisy node-exporter, dwa wpisy snmp dla interfejsów oraz po jednym wpisie na moduły mikrotik i UCD Linuksa. Każdy wpis to osobny cel na stronie Targets; przykładowe adresy podmieniasz na własne.

  • Wpis 1-2, node-exporter: Kontener node-exporter:9100 (host: docker-host) oraz drugi host 192.168.1.10:9100 (host: serwer-2)
  • Wpis 1-2, snmp if_mib: Routery 192.168.1.1 i 192.168.1.2; ten sam moduł obsłuży też Cisco i switche
  • snmp-mikrotik: Moduł mikrotik dla MikroTika: kondycja, wireless i DHCP (metryki mtxr)
  • snmp-linux: Moduły ucd_la_table, ucd_memory, ucd_system_stats dla Linuksa z demonem snmpd; CPU Cisco wymaga modułu z generatora
  • Provisioning: Adres http://prometheus:9090 jako domyślne źródło; flaga isDefault eliminuje klikanie

Plik 1 z 2: _grafana_stack/prometheus/prometheus.yml (konfiguracja Prometheusa)

# Konfiguracja Prometheusa dla stosu NMS.
# Adresy 192.168.1.x sa przykladowe: podmien je na wlasne hosty i routery.
# SNMP: w urzadzeniach wlacz usluge SNMP v2c (np. MikroTik: /snmp set enabled=yes,
# Cisco: snmp-server community <wspolnota> RO, Linux: pakiet snmpd + rocommunity).
global:
  scrape_interval: 15s
  scrape_timeout: 10s
  evaluation_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["prometheus:9090"]

  - job_name: "node-exporter"
    static_configs:
      - targets: ["node-exporter:9100"]
        labels:
          host: "docker-host"
      # Drugi host z node-exporterem na porcie 9100:
      - targets: ["192.168.1.10:9100"] # PODMIEN na adres drugiego hosta
        labels:
          host: "serwer-2"

  # Interfejsy dowolnych urzadzen SNMP (MikroTik, Cisco, switche): modul if_mib.
  - job_name: "snmp"
    metrics_path: /snmp
    params:
      module: [if_mib]
      auth: [public_v2]
    static_configs:
      - targets: ["192.168.1.1"] # PODMIEN na adres pierwszego routera
        labels:
          urzadzenie: "router-glowny"
      - targets: ["192.168.1.2"] # PODMIEN na adres drugiego routera
        labels:
          urzadzenie: "router-oddzial"
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: snmp-exporter:9116
    scrape_interval: 60s
    scrape_timeout: 55s

  # Dane specyficzne MikroTika (kondycja, wireless, DHCP): modul mikrotik.
  - job_name: "snmp-mikrotik"
    metrics_path: /snmp
    params:
      module: [mikrotik]
      auth: [public_v2]
    static_configs:
      - targets: ["192.168.1.1"] # PODMIEN na adres urzadzenia MikroTik
        labels:
          urzadzenie: "router-glowny"
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: snmp-exporter:9116
    scrape_interval: 60s
    scrape_timeout: 55s

  # Linux z demonem snmpd: obciazenie, pamiec i CPU z MIB UCD-SNMP.
  - job_name: "snmp-linux"
    metrics_path: /snmp
    params:
      module: [ucd_la_table, ucd_memory, ucd_system_stats]
      auth: [public_v2]
    static_configs:
      - targets: ["192.168.1.20"] # PODMIEN na adres Linuksa z snmpd
        labels:
          host: "serwer-linux-snmp"
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: snmp-exporter:9116
    scrape_interval: 60s
    scrape_timeout: 55s

Plik 2 z 2: _grafana_stack/grafana/provisioning/datasources/prometheus.yml (źródło danych Grafany)

apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    isDefault: true
    url: http://prometheus:9090
    access: proxy
    editable: true
Interwał pobierania (scrape_interval): Jak często Prometheus odpytuje cele; krótszy daje dokładniejsze wykresy kosztem większej bazy.
Zrzut ekranu: slajd 11
Zrzut: otwarty plik prometheus.yml w edytorze.
Listing prometheus.ymlplik: _grafana_stack/prometheus/prometheus.yml5 zadan: prometheus, node x2, snmp x2snmp-mikrotik: modul mikrotik (mtxr)snmp-linux: moduly ucd_* (load, RAM, CPU)labels: host, urzadzenie do filtrowaniarelabel: address -> param target -> instanceinterwały: 15 s host, 60 s SNMPskładnię sprawdza promtool check config
Slajd 12/45
Uruchomienie stosu
Cel slajdu: Pokazanie sekwencji poleceń startu oraz oczekiwanego wyniku.

Od plików do działających kontenerów

Po sprawdzeniu składni poleceniem config stos startuje jednym poleceniem up -d. Kontenery pobierają się z rejestru, a po kilkunastu sekundach wszystkie cztery mają status Up. Układ katalogu pokazano poniżej.

  • Krok 1: docker compose config renderuje i sprawdza składnię pliku bez tworzenia czegokolwiek
  • Krok 2: docker compose up -d tworzy sieć, wolumeny i kontenery: prometheus, node-exporter, snmp-exporter oraz grafana
  • Oczekiwany wynik: Wszystkie kontenery w stanie Up, porty 3000, 9090, 9100 i 9116 wystawione na hoście
  • Krok 3: docker ps potwierdza stan, a curl localhost:9090/-/healthy odpowiada Prometheus Server is Healthy
Tryb odłączony (Detached -d): Uruchomienie kontenerów w tle; logi podgląda się poleceniem logs, a nie na terminalu startowym.
Zrzut ekranu: slajd 12
Zrzut: wynik docker compose up -d i docker ps.
Start stosu_grafana_stack/ docker-compose.ymlprometheus/prometheus.ymlgrafana/provisioning/datasources/*.yml$ docker compose up -dcztery kontenery Started$ curl localhost:9090/-/healthy -> Healthy:9090prometheusUp:3000grafanaUp:9100nodeUp:9116snmpUp
Slajd 13/45
Anatomia pliku prometheus.yml
Cel slajdu: Rozebranie konfiguracji na części i wskazanie, z czego korzysta Prometheus.

Pięć klocków, z których Prometheus korzysta

Prometheus czyta tylko wybrane pola. Globalne interwały decydują o rytmie, zadanie grupuje cele, static_configs wskazuje adresy, params dokleja parametry zapytania, a relabeling przepisuje adresy przed pobraniem. Pól nieopisanych w dokumentacji Prometheus nie czyta, więc literówka w nazwie pola kasuje zadanie po cichu.

  • global: scrape_interval 15 sekund, scrape_timeout 10 sekund i evaluation_interval 15 sekund dla całego serwera
  • job_name: Nazwa zadania widoczna na Targets i w etykiecie job każdej próbki; zadania node, snmp i pochodne
  • static_configs: Jawna lista celów z opcjonalnymi etykietami host i urzadzenie do filtrowania w panelach
  • params i relabel_configs: Tylko w zadaniu snmp: doklejają module i auth oraz kierują pobranie na bramkę snmp-exporter:9116
Zadanie pobierania (Scrape job): Nazwany zestaw celów o wspólnej ścieżce, parametrach i interwale; każdy wpis static_configs to osobny cel.
Zrzut ekranu: slajd 13
Zrzut: global, zadanie, cele i relabeling w pliku.
Budowa konfiguracjiglobalinterwałylimityrytmjob_namenazwaetykietagrupatargetsadresyetykietyceleparamsmodule, authtylko snmprelabelingprzepisaniebramka
Slajd 14/45
Dodawanie hosta krok po kroku
Cel slajdu: Pokazanie pełnej procedury podłączenia drugiego hosta z node-exporterem.

Trzy kroki do nowego celu

Na drugim hoście uruchamia się kontener eksportera, w prometheus.yml dopisuje się jeden wpis z etykietą, a Prometheus przeładowuje konfigurację bez restartu. Po minucie cel ma stan up.

  • Krok 1, drugi host: Jedno polecenie docker run z montowaniami ro i flagą path.rootfs; port 9100 musi być osiągalny z hosta monitorującego
  • Krok 2, wpis: Nowy blok targets z etykietą host w zadaniu node-exporter; nazwa etykiety posłuży do filtrowania paneli
  • Krok 3, reload: Żądanie POST do /-/reload przeładowuje konfigurację; restart kontenera nie jest potrzebny
  • Kontrola: Strona Targets pokazuje nowy wiersz, a zapytanie node_load1{host="serwer-2"} zwraca pierwsze próbki
Przeładowanie (Reload): Wczytanie nowej konfiguracji przez żywy proces po żądaniu do punktu /-/reload; wymaga flagi web.enable-lifecycle.
Zrzut ekranu: slajd 14
Zrzut: uruchomienie eksportera na drugim hoście.
Nowy host w trzech krokachhost 2: kontener, monitoring: wpis + reloadkrok 1: docker run node-exporter (port 9100)krok 2: wpis targets + labels hostkrok 3: POST /-/reload, kontrola TargetsEtykieta hostdocker-hostserwer-2filtr paneliBez restartuPOST /-/reloadup po minucie
Slajd 15/45
Dodawanie routera SNMP krok po kroku
Cel slajdu: Pokazanie pełnej procedury podłączenia kolejnego routera przez SNMP.

Najpierw snmpwalk, potem wpis

Zanim router trafi do konfiguracji, sprawdza się go ręcznie poleceniem snmpwalk. Dopiero poprawna odpowiedź oznacza, że bramka też sobie poradzi. Wpis w zadaniu snmp to adres plus etykieta urządzenia.

  • Krok 1, test: snmpwalk -v2c -c public ADRES 1.3.6.1.2.1.1.5.0; odpowiedź z nazwą urządzenia potwierdza usługę i wspólnotę
  • Włączanie usługi: MikroTik /snmp set enabled=yes, Cisco snmp-server community public RO, Linux pakiet snmpd z linią rocommunity
  • Krok 2, wpis: Nowy blok targets z etykietą urzadzenie w zadaniu snmp; relabeling sam dopisze instance i skieruje na bramkę
  • Kontrola: Zapytanie ifInOctets{instance="ADRES"} zwraca liczniki interfejsów nowego routera
Test łączności SNMP: Ręczne zapytanie snmpwalk przed konfiguracją; brak odpowiedzi oznacza wyłączoną usługę lub złą wspólnotę, nie awarię stosu.
Zrzut ekranu: slajd 15
Zrzut: wynik snmpwalk z nazwą urządzenia.
Nowy router w trzech krokachtest -> wpis -> reload -> metrykikrok 1: snmpwalk, SYSNAME w odpowiedzikrok 2: wpis targets + urzadzeniekrok 3: POST /-/reload, ifInOctetsWłączenie SNMPMikroTik, CiscoLinux snmpdEtykietaurzadzenieinstance auto
Slajd 16/45
Porty: jak zmienić i po co
Cel slajdu: Wyjaśnienie mapowania portów, zmiany publikacji oraz wymagań zapory.

Lewa liczba dla ludzi, prawa dla kontenera

Zapis ports ma postać HOST:KONTENER. Prawa liczba musi zgadzać się z usługą w środku, lewą zmieniasz dowolnie, na przykład gdy port jest zajęty. Wewnątrz sieci Docker usługi widzą się po nazwach i publikacja nie jest im potrzebna.

  • Składnia: "3001:3000" wystawia Grafanę na porcie 3001 hosta; kontener nadal słucha na 3000
  • Kiedy zmieniać: Konflikt z inną usługą na hoście albo ukrywanie standardowych portów przed skanowaniem
  • Zapora na urządzeniach: Drugi host otwiera TCP 9100 dla monitoringu, routery odpowiadają na UDP 161
  • Diagnostyka: Porty eksporterów publikuje się do ręcznych testów poleceniem curl; na produkcji zwykle się je chowa, a pobieranie działa wewnątrz sieci
Publikacja portu: Mapowanie portu kontenera na port hosta; zmiana lewej liczby nie wymaga zmian w konfiguracji usług.
Zrzut ekranu: slajd 16
Zrzut: mapowanie portów w pliku Compose.
Mapowanie portów"3000:3000"Grafanastandard"3001:3000"Grafanapo zmianieHOST:KONTENER - prawa stała, lewa wolnaTCP 9100: drugi host -> monitoringUDP 161: routery -> bramka snmpcurl localhost:PORT/metrics - test
Slajd 17/45
Wolumeny danych
Cel slajdu: Wyjaśnienie różnicy między wolumenem nazwanym a dowiązaniem pliku na przykładzie bazy TSDB.

Dane przeżywają wymianę kontenera

Bez wolumenu usunięcie kontenera kasowałoby historię metryk. Wolumen nazwany trzyma bazę TSDB, a dowiązanie pliku dostarcza konfigurację, dzięki czemu obraz pozostaje niezmienny. W efekcie wymiana obrazu na nowszy nie rusza ani historii pomiarów, ani twojej konfiguracji.

  • Wolumen prometheus_data: Katalog /prometheus w kontenerze, fizycznie pod /var/lib/docker/volumes na hoście z prefiksem nazwy projektu
  • Wolumen grafana_data: Katalog /var/lib/grafana z panelami, użytkownikami i historią alarmów między restartami
  • Dowiązanie konfiguracji: Plik prometheus.yml montowany z flagą ro, więc kontener nie może go nadpisać
  • Weryfikacja: Inspekcja Mounts kontenera pokazuje typ bind dla pliku oraz typ volume dla bazy
Wolumen nazwany (Named volume): Zarządzany przez Dockera obszar dysku niezależny od cyklu życia kontenera; dowiązanie (bind) to wskazanie konkretnego pliku hosta.
Zrzut ekranu: slajd 17
Zrzut: lista wolumenów docker volume ls.
Wolumeny w stosieprometheus_data/prometheusTSDB, 30 dnivolumegrafana_data/var/lib/grafanapanelevolumeprometheus.ymlbind, rokonfiguracjasnmp.ymlobraz domyślnysetki modułówdane rosną, konfiguracja jest statyczna
Slajd 18/45
Retencja i rozmiar bazy
Cel slajdu: Omówienie flagi retention.time oraz praktycznych konsekwencji przechowywania próbek.

Trzydzieści dni historii to świadomy kompromis

Flaga storage.tsdb.retention.time ogranicza bazę, na przykład do 30 dni. Dłuższa retencja ułatwia analizy sezonowe, lecz zwiększa zajętość dysku i czas odpowiedzi zapytań obejmujących duży zakres.

  • Flaga retencji: --storage.tsdb.retention.time=30d w poleceniu startowym kontenera prometheus
  • Co kasuje Prometheus: Bloki starsze niż limit usuwane są automatycznie w tle bez zatrzymywania pobierania
  • Wpływ interwału: Pobranie co 15 sekund daje 5760 próbek dziennie na serię; interwał 60 sekund dla SNMP zmniejsza ten koszt czterokrotnie
  • Kontrola zajętości: Polecenie docker system df oraz wykres wolnego miejsca na hoście ostrzegają przed przepełnieniem
Retencja (Retention): Maksymalny wiek przechowywanych próbek; starsze bloki bazy szeregów czasowych są trwale usuwane.
Zrzut ekranu: slajd 18
Zrzut: flaga retencji i rozmiar katalogu bazy.
Retencja danych15 shost5760/dzieńszczegółowo60 sSNMP1440/dzieńoszczędnie30 dniretencjaautokasowanieim krótszy interwał, tym większa baza--storage.tsdb.path=/prometheus--storage.tsdb.retention.time=30d
Slajd 19/45
Mapa portów stosu
Cel slajdu: Przyporządkowanie czterech portów do usług oraz wskazanie punktów kontrolnych.

Cztery porty i cztery punkty kontrolne

Każdy kontener publikuje jeden port na hoście: Grafana 3000, Prometheus 9090, node-exporter 9100 oraz snmp-exporter 9116. Znajomość tych adresów wystarcza do ręcznej weryfikacji całego łańcucha z poziomu hosta. Zapisz te cztery liczby, bo wracają przy każdym teście diagnostycznym w dalszej części.

  • Port 3000: Interfejs Grafany http://localhost:3000, pierwsze logowanie admin oraz diagnostyka API /api/health
  • Port 9090: Interfejs Prometheusa z zakładkami Graph i Status Targets oraz punktem /-/healthy
  • Port 9100: Surowy tekst node-exportera pod /metrics, czytelny także poleceniem curl bez przeglądarki
  • Port 9116: Bramka SNMP pod /snmp z parametrami module, auth i target
Publikacja portu: Mapowanie portu kontenera na port hosta; wewnątrz sieci Docker usługi widzą się po nazwach bez publikacji.
Zrzut ekranu: slajd 19
Zrzut: cztery porty w docker ps.
Mapa portówGrafanahost:3000/api/healthPrometheushost:9090/-/healthynodehost:9100/metricssnmphost:9116/snmphttp://localhost:3000 Grafanahttp://localhost:9090 Prometheuscurl localhost:9100/metrics | headcurl 'localhost:9116/snmp?module=if_mib...'
Slajd 20/45
Prometheus pyta, nie słucha
Cel slajdu: Wyjaśnienie modelu pobierania, wykrywania celów oraz znaczenia strony Targets.

Serwer monitorujący inicjuje każde połączenie

Prometheus nie czeka na dane, lecz zgodnie z interwałem odpytuje listę celów. Strona Status Targets pokazuje stan każdego celu: zielony up oznacza poprawne pobranie, a czerwony down wskazuje dokładny błąd. Zaglądasz tu jako pierwsze przy każdym braku danych na wykresie.

  • Cel (Target): Adres HTTP z metrykami; w stosie siedem punktów: prometheus, dwa node-exportery, dwa cele if_mib oraz po jednym celu mikrotik i linux
  • Stan docelowy: Po minucie od startu wszystkie siedem celów ma stan up; każdy wpis static_configs to osobny wiersz
  • Interwały: 15 sekund dla hostów i samego Prometheusa, 60 sekund dla SNMP z limitem 55 sekund na odpowiedź
  • API zapytań: Punkt /api/v1/query przyjmuje wyrażenia PromQL i zwraca JSON z wektorem wyników
Cel pobierania (Scrape target): Konkretny punkt końcowy HTTP odpytywany cyklicznie; jego stan zdrowia decyduje o ciągłości serii na wykresach.
Zrzut ekranu: slajd 20
Zrzut: strona Status Targets ze stanami up.
Model pobieraniaPrometheusco 15 s: hostco 60 s: SNMPTargets: 7 x upprometheus2 x node, 4 x snmpGET /api/v1/query?query=node_load1{"status":"success","result":[...]}up = 1, down = 0 (metryka up)
Slajd 21/45
Samodzielny odczyt metryk
Cel slajdu: Pokazanie odpytywania Prometheusa bez Grafany: interfejs Graph oraz API z curla.

Prometheus odpowiada też bez pośredników

Do odczytu metryk nie potrzeba Grafany. Wbudowana przeglądarka zapytań na porcie 9090 oraz endpointy API zwracają te same dane, które później rysują panele. To najszybsza droga sprawdzenia, czy problem leży w danych czy w dashboardzie.

  • Przeglądarka Graph: Adres http://localhost:9090, zakładka Graph, wpisanie wyrażenia i Execute; widok Table pokazuje liczby, Graph rysuje wykres
  • Zapytanie chwilowe: curl -G http://localhost:9090/api/v1/query --data-urlencode 'query=node_load1' zwraca JSON z wektorem
  • Zapytanie zakresowe: Punkt /api/v1/query_range z parametrami query, start, end i step rysuje historię, na przykład do własnego skryptu
  • Metadane: Punkty /api/v1/targets i /api/v1/label/NAZWA/values listują cele oraz dostępne wartości etykiet
  • Składnia PromQL: Filtr w nawiasach {job="snmp"}, funkcje rate() i agregacje avg() by (ifDescr)
API zapytań (Query API): Zestaw punktów HTTP Prometheusa zwracających wyniki PromQL w formacie JSON; podstawa integracji z własnymi narzędziami.
Zrzut ekranu: slajd 21
Zrzut: surowe metryki pod adresem /metrics.
Odczyt bez GrafanyGraph :9090wyrażenieExecuteTableAPI queryJSONcurl -Gwektorquery_rangestart, endstephistoriacurl -G .../api/v1/query --data-urlencode 'query=up'curl '.../query_range?query=node_load1&step=60s...'/api/v1/label/ifDescr/values -> lista portów
Slajd 22/45
Node-exporter mierzy hosta
Cel slajdu: Omówienie kolektorów systemowych oraz przykładowych metryk procesora i pamięci.

Tysiąc metryk z jądra bez agenta w systemie

Kontener montuje katalogi proc i sys hosta w trybie tylko do odczytu i tłumaczy je na tekst. Żadnego oprogramowania nie instaluje się w systemie operacyjnym, cała logika siedzi w kontenerze. Dlatego ten sam kontener mierzy każdy host z osobna bez instalowania czegokolwiek w systemie.

  • Montowania: /proc i /sys jako tylko do odczytu oraz korzeń pod /host z flagą rslave dla kolektora plików
  • Przykłady metryk: node_cpu_seconds_total z etykietami cpu i mode, node_memory_MemTotal_bytes oraz node_load1
  • Drugi host: To samo polecenie docker run na drugiej maszynie, port 9100 otwarty w zaporze oraz wpis z etykietą host w zadaniu
  • Flaga rootfs: Parametr path.rootfs równy /host kieruje kolektor systemu plików na dysk hosta, nie kontenera
Eksporter węzła (Node exporter): Usługa tłumacząca pliki statystyk jądra Linuksa na format metryk Prometheusa; sama niczego nie oblicza.
Zrzut ekranu: slajd 22
Zrzut: wynik zapytania do bramki SNMP.
Pomiary hostanode_cpu_seconds_total{cpu="0",mode="idle"} 122940.84node_memory_MemTotal_bytes 3563872256node_load1{host="serwer"} 0.42Kolektorycpu, meminfoloadavg, filesystemTryb robez zapisuna hoście
Slajd 23/45
SNMP-exporter tłumaczy SNMP na HTTP
Cel slajdu: Wyjaśnienie roli bramki, podziału poświadczeń oraz wymaganego formatu pliku snmp.yml.

Bramka między światem datagramów a światem HTTP

Prometheus nie mówi protokołem SNMP, więc snmp-exporter wykonuje spacer po routerze i oddaje wynik jako tekst. Parametry module, auth i target w adresie decydują, co i gdzie zostanie odpytane. Bez tej bramki Prometheus nie miałby jak zapytać routera, bo protokołu SNMP po prostu nie zna.

  • Zapytanie bramki: /snmp?module=if_mib&auth=public_v2&target=ADRES_ROUTERA zwraca metryki ifInOctets i ifOperStatus
  • Najprostsza droga: Obraz snmp-exporter zawiera gotowy, pełny plik snmp.yml z setkami modułów, więc na początek nie montuje się własnego
  • Format ma znaczenie: W bieżących wydaniach moduł zawiera wyłącznie listę walk, a poświadczenia mieszkają w sekcji auths; stary format kończy się błędem i restartami
  • Zdrowa bramka: Log z wierszem Listening on [::]:9116 oraz odpowiedzią na testowe zapytanie poleceniem curl
Bramka SNMP (SNMP gateway): Usługa tłumacząca: przyjmuje żądanie HTTP, wykonuje operacje SNMP wobec urządzenia i zwraca odpowiedź w formacie Prometheusa.
Zrzut ekranu: slajd 23
Zrzut: sekcje auths i modules w pliku.
Tłumaczenie protokołówPrometheusHTTP GET/snmp?...snmp-expspacer UDPport 161Routerif_mibtablica IFcurl 'localhost:9116/snmp?module=if_mib...'ifInOctets{ifDescr="ether1"} ...INFO Listening on [::]:9116
Slajd 24/45
Plik snmp.yml i moduł if_mib
Cel slajdu: Omówienie struktury poświadczeń i modułów na przykładzie tablicy interfejsów.

Poświadczenia osobno, obiekty osobno

Sekcja auths definiuje wspólnotę w wersji 2, a sekcja modules wskazuje gałęzie MIB do spaceru. Wbudowany plik obrazu zawiera gotowe moduły: if_mib dla każdego sprzętu, mikrotik dla MikroTika oraz ucd_* dla Linuksa z demonem snmpd. Wybór modułu w adresie zapytania decyduje, które gałęzie zostaną odpytywane przy danym pobraniu.

  • Auth public_v2: Para community i version 2 używana w adresie jako auth; nazwę i wspólnotę dobiera się do własnej sieci
  • if_mib: Gałęzie systemowa i interfejsów; działa na MikroTiku, Cisco i switchach bez żadnej konfiguracji
  • mikrotik: Gałąź producenta 1.3.6.1.4.1.14988: kondycja, wireless i DHCP; łączy się go z if_mib w jednym zapytaniu
  • ucd_*: Moduły ucd_la_table, ucd_memory i ucd_system_stats czytają obciążenie, pamięć i CPU Linuksa z snmpd
  • Cisco CPU: MIB CISCO-PROCESS-MIB nie ma w domyślnym pliku, więc moduł cisco buduje się generatorem z repozytorium projektu
  • Brak pliku w paczce: Katalog _grafana_stack nie zawiera snmp.yml, bo kontener używa wbudowanego; własny plik z modułem routeros montuje się dopiero na slajdach 35-36
Moduł (snmp_exporter): Nazwany zestaw obiektów MIB pobieranych jednym spacerem; parametr module w adresie wybiera, które obiekty odpytać.
Zrzut ekranu: slajd 24
Zrzut: trzy reguły relabeling w pliku.
Budowa snmp.ymlauthspublic_v2community: ...version: 2modules: if_mibwalk: .1.3.6.1.2.1.1walk: .1.3.6.1.2.1.2ifInOctets{ifDescr="ether1"} 2.28e+09ifOperStatus{ifDescr="ether1"} 1etykiety: ifIndex, ifName, ifAlias
Slajd 25/45
Mechanizm relabeling w zadaniu snmp
Cel slajdu: Wyjaśnienie trzech reguł podmiany etykiet kierujących pobranie przez bramkę.

Trzy reguły zamieniają cel SNMP w cel HTTP

Prometheus nie łączy się wprost z routerem. Reguły przepisują adres routera do parametru target, kopiują go do etykiety instance, a adresem pobrania czynią snmp-exporter:9116. Dzięki temu jeden wpis z adresem wystarcza, aby router pojawił się w bazie z własną etykietą.

  • Reguła 1: Etykieta address trafia do parametru target żądania, czyli wskazuje router docelowy
  • Reguła 2: Parametr target kopiowany jest do etykiety instance, więc panele grupują po adresie routera
  • Reguła 3: Adres pobrania podmieniany jest na snmp-exporter:9116, czyli na bramkę w sieci Docker
  • Skutek: Dopisanie kolejnego routera to jedna linia w targets bez zmiany bramki
Relabeling: Mechanizm przepisywania etykiet i adresów przed pobraniem; w zadaniu snmp służy do przeadresowania zapytania na bramkę.
Zrzut ekranu: slajd 25
Zrzut: strona Targets z pięcioma celami.
Podmiana adresówtargets: [ADRES_ROUTERA]__address__ -> __param_target__param_target -> instance__address__ = snmp-exporter:9116Jedna bramka, wiele routerówdopisz adres do targetsreszta dzieje się sama
Slajd 26/45
SNMP w praktyce
Cel slajdu: Pokazanie sprawdzenia usługi SNMP na routerze oraz typowych wyników spaceru.

Najpierw snmpwalk, potem eksporter

Zanim router trafi do prometheus.yml, warto odpytać go ręcznie narzędziem snmpwalk z pakietu snmp. Dopiero poprawna odpowiedź na wspólnotę oznacza, że bramka też sobie poradzi.

  • Test ręczny: snmpwalk -v2c -c public ADRES_ROUTERA 1.3.6.1.2.1.1 pokazuje gałąź systemową: opis, nazwę i czas pracy
  • Tablica interfejsów: Gałąź 1.3.6.1.2.1.2.2.1.2 zwraca nazwy portów, na przykład ether1, bridge1 czy lo
  • MikroTik RouterOS: Podgląd /snmp print oraz włączenie /snmp set enabled=yes; usługa bywa domyślnie wyłączona
  • Wspólnota public: Domyślny wpis zezwalający na odczyt, dobry na laboratorium, niedopuszczalny na produkcji
Wspólnota (Community): Hasło protokołu SNMP w wersjach v1 i v2c przesyłane otwartym tekstem; odpowiednik hasła tylko do odczytu.
Zrzut ekranu: slajd 26
Zrzut: wynik snmpwalk z routera.
Testowanie SNMPsnmpwalk-v2c -c publicgałąź systemtablica IFRouterOS/snmp printset enabled=yescommunitysysDescr.0 = STRING: RouterOS ...sysName.0 = STRING: ...ifDescr.1 ether1 ... bridge1
Slajd 27/45
Host Windows bez SNMP
Cel slajdu: Omówienie braku usługi SNMP w Windows oraz alternatywnych eksporterów.

Brak odpowiedzi też jest wynikiem

System Windows nie zawiera domyślnie usługi SNMP, więc zamiast ją doinstalowywać, stosuje się dedykowany windows_exporter na porcie 9182 z własnym zadaniem w Prometheusie. Eksporter czyta te same liczniki wydajności, które pokazuje menedżer zadań Windows.

  • Objaw: Ping i SSH do hosta działają, a snmpwalk zwraca przekroczenie czasu oczekiwania
  • Wniosek: Usługi SNMP w Windows po prostu nie ma i nie warto jej instalować dla jednego ćwiczenia
  • Alternatywa: Eksporter windows_exporter z metrykami windows_cpu_time_total i windows_os_physical_memory_free_bytes
  • Zadanie analogiczne: Osobny job w prometheus.yml o ścieżce /metrics wprost do adresu eksportera Windows
Eksporter systemowy Windows: Odpowiednik node-exportera dla systemu Windows, wystawiający liczniki wydajności w formacie Prometheusa.
Zrzut ekranu: slajd 27
Zrzut: brak usługi SNMP na hoście Windows.
Windows w stosieSNMP w Windowsbrak usługitimeoutnie tędy drogawindows-exporterport 9182job osobny/metricsTimeout: No Response (oczekiwane)windows_cpu_time_total{mode="idle"}bezpośrednie pobranie, bez bramki
Slajd 28/45
Grafana i źródło danych
Cel slajdu: Pokazanie automatycznego provisioning oraz pierwszego logowania do paneli.

Zero klikania przy dodawaniu Prometheusa

Plik provisioning montowany do Grafany rejestruje Prometheusa jako domyślne źródło. Po starcie wystarczy zalogować się na konto admin i budować panele. Od tej pory każde zapytanie panelu domyślnie trafia do Prometheusa bez ręcznego wskazywania źródła.

  • Provisioning: Plik datasources/prometheus.yml z adresem http://prometheus:9090, typem prometheus oraz flagą isDefault
  • Logowanie: Adres http://localhost:3000, użytkownik admin oraz hasło z pliku Compose; diagnostyka przez /api/health
  • Po instalacji: Natychmiastowa zmiana hasła oraz, na produkcji, integracja z centralnym logowaniem
  • Trwałość: Użytkownicy, panele i uprawnienia zapisywane są w wolumenie grafana_data
Źródło danych (Data source): Konfiguracja połączenia Grafany z bazą, na przykład adres Prometheusa; zapytania paneli odwołują się do niej po nazwie.
Zrzut ekranu: slajd 28
Zrzut: provisioning źródła i ekran logowania.
Wejście do Grafanyprovisioningdatasources/*.ymlurl: prometheusisDefault/api/health200 OKversiondatabase: okhttp://localhost:3000 login adminDashboard -> New -> Add visualizationźródło: Prometheus (domyślne)
Slajd 29/45
Panel systemowy Linux
Cel slajdu: Budowa wykresów obciążenia, pamięci i systemu plików zapytaniami PromQL.

Trzy zapytania dają pełny obraz hosta

Panel łączy średnie obciążenie, użycie pamięci oraz zajętość dysku. Zapytania czyta się od nazwy metryki, przez filtr w nawiasach, po funkcję agregującą. Te trzy zapytania wystarczą na codzienny podgląd zdrowia hosta.

  • Obciążenie: node_load1 oraz warianty 5 i 15 minutowe pokazujące trend, nie chwilowy pik
  • Pamięć: Stosunek dostępnej do całkowitej: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes
  • Dysk: node_filesystem_avail_bytes{mountpoint="/"} dla partycji systemowej hosta
  • Procesor: 100 * (1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))) jako procent zajętości
Panel (Dashboard panel): Pojedynczy wykres, miernik lub tabela w Grafanie zasilany jednym lub kilkoma zapytaniami do źródła danych.
Zrzut ekranu: slajd 29
Zrzut: wykresy obciążenia, pamięci i dysku.
Pomiary hosta na panelunode_load1, node_load5, node_load15MemAvailable / MemTotal -> udział wolnejnode_filesystem_avail_bytes{mountpoint="/"}100*(1-avg(rate(cpu_idle[5m]))) -> % CPUload1/5/15 mintrendRAMdostępnabuforowanadysk /wolnezajęte
Slajd 30/45
Panel SNMP routera
Cel slajdu: Budowa paneli ruchu interfejsów i stanu operacyjnego z danych routera.

Router na wykresie: ruch i stan portów

Zapytania filtrują po etykiecie instance z adresem routera oraz po ifDescr z nazwą interfejsu. Ruch liczy funkcja rate, a stan pokazuje proste zapytanie o ifOperStatus i ifAdminStatus. Te same dwa zapytania zasilają gotowe dashboardy z serwisu Grafana.

  • Ruch: rate(ifInOctets{instance="ADRES"}[5m]) * 8 daje bity na sekundę dla każdego interfejsu
  • Jednostki: Liczniki SNMP zliczają oktety, a operatorzy mówią o bitach, stąd mnożenie przez 8
  • Stany: ifOperStatus równe 1 oznacza port w górze, ifAdminStatus rozróżnia wyłączenie administracyjne od awarii
  • Błędy: Metryki ifInErrors i ifOutDiscards w osobnym panelu wyłapują wadliwe okablowanie i przeciążenie
Stan operacyjny (ifOperStatus): Wartość 1 oznacza interfejs pracujący w górze, 2 interfejs w dole; podstawa paneli dostępności łączy.
Zrzut ekranu: slajd 30
Zrzut: wykres ruchu i stanów portów routera.
Router na panelurate(ifInOctets{ifDescr="ether1"}[5m])*8 -> b/sifOperStatus{ifDescr="ether1"} = 1ifAdminStatus vs ifOperStatus -> admin czy awariaifInErrors, ifOutDiscards -> panel błędówPrzepustowośćna interfejsbity/sDostępnośćup/downadmin/oper
Slajd 31/45
Cztery wskaźniki RouterOS
Cel slajdu: Przedstawienie celu bloku: nazwa, czas pracy, obciążenie CPU i pamięć z dokładnymi OID.

Od nazwy urządzenia po procenty

Z routera MikroTik przez SNMP odczytasz cztery fundamenty: nazwę administracyjną, czas od restartu, obciążenie procesora i zajętość pamięci. Każdy ma inny typ danych i wymaga innego zapytania. Kolejne slajdy przechodzą przez każdy z nich osobno, od testu po gotowy panel.

  • sysName 1.3.6.1.2.1.1.5.0: Tekst, na przykład MT_BIURO; identyfikuje urządzenie na panelach i w alarmach
  • sysUpTime 1.3.6.1.2.1.1.3.0: Licznik setnych sekund od restartu; po przeliczeniu daje godziny i dni pracy
  • hrProcessorLoad 1.3.6.1.2.1.25.3.3.1.2: Średnie obciążenie CPU w procentach; tabela indeksowana numerem procesora
  • Pamięć: hrMemorySize 1.3.6.1.2.1.25.2.2.0 w kilobajtach plus tabela hrStorage z użyciem main memory
OID skalarny i tabelaryczny: Skalar kończy się .0 i ma jedną wartość; tabela wymaga dopisania indeksu, na przykład .1 dla pierwszego procesora.
Zrzut ekranu: slajd 31
Zrzut: tabela czterech wskaźników z OID.
Mapa wskaźnikówsysNametekst.1.5.0tożsamośćsysUpTimesetne s.1.3.0czas pracyhrProcessorLoadprocentytabela .1CPUhrMemorySizekilobajtyRAMhrStorageskalar .0, tabela z indeksem
Slajd 32/45
Krok 1: włączenie SNMP na RouterOS
Cel slajdu: Pokazanie włączenia usługi SNMP trzema drogami z zabezpieczeniem dostępu.

Usługa bywa domyślnie wyłączona

RouterOS nie odpowiada na SNMP, dopóki usługi się nie włączy i nie ustawi wspólnoty. Wystarczą dwa polecenia w terminalu, odpowiednik w WinBox oraz reguła zapory dla UDP 161. Po każdej zmianie powtarzasz test z następnego slajdu, aż router odpowie.

  • Podgląd: /snmp print pokazuje enabled: no na świeżym urządzeniu oraz wpis community public
  • Włączenie: /snmp set enabled=yes oraz /snmp community set [find default=yes] addresses=ADRES_MONITORINGU/32
  • WinBox: Okno SNMP: zaznaczenie Enabled, przycisk Communities oraz ograniczenie pola Addresses
  • Zapora: Reguła accept dla UDP 161 ze źródła monitoringu przed regułami drop; test z hosta monitorującego
Wspólnota z adresami: Hasło SNMP powiązane z listą dozwolonych adresów; zapytania spoza listy są odrzucane.
Zrzut ekranu: slajd 32
Zrzut: terminal RouterOS z komendami SNMP.
Włączenie usługi/snmp print # enabled: no?/snmp set enabled=yes/snmp community set addresses=MONITORING/32UDP 161 accept przed dropTerminal/snmp ...2 komendyWinBoxSNMP EnabledAddresses
Slajd 33/45
Krok 2: ręczny test czterech OID
Cel slajdu: Sprawdzenie każdego wskaźnika snmpget i nauka interpretacji odpowiedzi.

Czytaj odpowiedź, nie tylko błąd

Narzędzia snmpget i snmpwalk z pakietu snmp zwracają wartości z typami. Poprawna odpowiedź zawiera typ i liczbę, a typowe błędy mówią dokładnie, czego brakuje: usługi, wspólnoty albo indeksu. Naucz się czytać te trzy odpowiedzi, a diagnozowanie SNMP przestanie być zgadywaniem.

  • sysName i sysUpTime: snmpget -v2c -c public ADRES 1.3.6.1.2.1.1.5.0 1.3.6.1.2.1.1.3.0; odpowiedzi STRING oraz Timeticks z czasem
  • Pamięć: snmpget ... 1.3.6.1.2.1.25.2.2.0; odpowiedź w kilobajtach, na przykład 262144
  • Pułapka tabel: Zapytanie gołego OID tabeli bez indeksu zwraca No Such Object; procesor pyta się z indeksem .1
  • CPU i tablica: snmpwalk ... 1.3.6.1.2.1.25.3.3.1.2 listuje obciążenie każdego procesora z osobna
Timeticks: Licznik setnych części sekundy; dzielenie przez 100 daje sekundy, a wynik w panelu przelicza się na godziny.
Zrzut ekranu: slajd 33
Zrzut: wyniki snmpget dla czterech OID.
Test ręcznysnmpget ... 1.3.6.1.2.1.1.5.0 -> STRING: MT_BIUROsnmpget ... 1.3.6.1.2.1.1.3.0 -> Timeticks: 21:1:23:14snmpget ... .25.2.2.0 -> 262144 KBytessnmpwalk ... .25.3.3.1.2 -> procenty CPUtabela bez indeksu zgłasza No Such ObjectLekcja z praktykiOID tabeli zawsze z indeksem albo spacerem
Slajd 34/45
Który moduł ma te obiekty
Cel slajdu: Sprawdzenie wbudowanych modułów i decyzja o generowaniu własnego.

Inwentaryzacja przed generowaniem

Wbudowany plik snmp.yml zawiera moduły system i if_mib z nazwą i czasem pracy, lecz nic z gałęzi host-resources. Dlatego CPU i pamięć wymagają własnego modułu zbudowanego generatorem z dwóch plików MIB.

  • Gotowe: Moduł system niesie sysName i sysUpTime, moduł if_mib interfejsy; oba działają bez dotykania pliku
  • Brakuje: Obiektów hrProcessorLoad, hrMemorySize i hrStorage nie ma w żadnym wbudowanym module; sprawdza się to poleceniem grep po OID
  • Narzędzie: Obraz prom/snmp-generator buduje moduł routeros z plików SNMPv2-MIB i HOST-RESOURCES-MIB
  • Efekt: Siedem metryk: sysName, sysUpTime, hrMemorySize, hrProcessorLoad oraz trzy liczniki hrStorage z etykietą opisu
Generator snmp.yml: Program tłumaczący nazwy MIB na numery OID i reguły etykiet; jego wyniku nie edytuje się ręcznie.
Zrzut ekranu: slajd 34
Zrzut: wyszukiwanie modułu grepem w pliku.
Decyzja o moduleWbudowanesystemif_mib, mikrotikDo zbudowaniahrProcessorLoadhrMemorySizegrep hrProcessorLoad snmp.yml # tylko modul hpegenerator.yml: walk [sysName, hrProcessorLoad, ...]mibs: SNMPv2-MIB, HOST-RESOURCES-MIB, IF-MIB
Slajd 35/45
Budowa modułu generatorem
Cel slajdu: Uruchomienie generatora na plikach MIB i omówienie wyniku.

Z nazw MIB na numery OID

Generator czyta generator.yml oraz katalog z bazami MIB i wypisuje gotowy moduł. Plik generator.yml ma kilkanaście linii i trafia do paczki dla studentów.

  • Wejście mibs/: Pliki SNMPv2-SMI, SNMPv2-TC, SNMPv2-CONF, SNMPv2-MIB, HOST-RESOURCES-MIB, IF-MIB oraz IANAifType-MIB
  • Walk: Osiem nazw: sysName, sysUpTime, hrProcessorLoad, hrMemorySize oraz cztery obiekty hrStorage
  • Lookups: Indeks hrStorageIndex tłumaczony na czytelny opis hrStorageDescr, sam opis ignorowany jako metryka
  • Wynik: Komunikat Generated metrics 7 oraz plik z numerycznymi OID, typami, indeksami i regułami etykiet
Spojrzenie (Lookup): Reguła dopisująca czytelną etykietę z tabeli opisów do metryki indeksowanej numerem.
Zrzut ekranu: slajd 35
Zrzut: terminal z uruchomieniem generatora.
Praca generatoraplik: _grafana_stack/snmp_exporter/generator.ymldocker run --rm -v ./snmp_exporter:/gen generatorgenerate -g /gen/generator.yml -o /gen/snmp.ymlGenerated metrics ... metrics=7Config writtenZasadanazwy w generator.yml, numery w snmp.ymlwyniku nie edytować ręcznie
Slajd 36/45
Wpięcie modułu do stosu
Cel slajdu: Dopisanie modułu do pliku eksportera, restart i test bramki.

Moduł ląduje na końcu pliku

Wygenerowany blok routeros dokleja się na końcu snmp.yml używanego przez stos. Po restarcie kontenera bramka odpowiada na nowy moduł, co sprawdza się jednym zapytaniem testowym przed konfiguracją Prometheusa.

  • Scalenie: Blok od linii z routeros do końca pliku doklejony do snmp.yml stosu; sekcja auths pozostaje wspólna
  • Restart: docker restart snmp-exporter; log potwierdza start bez błędów parsowania
  • Test: Zapytanie z module routeros zwraca po jednej linii na wskaźnik, w tym hrProcessorLoad z indeksem procesora
  • Kontrola: Dopiero poprawna odpowiedź bramki uzasadnia dopisanie zadania do Prometheusa
Scalanie konfiguracji: Doklejenie wygenerowanego modułu do pliku roboczego z zachowaniem wcięć; parsowanie weryfikuje restart.
Zrzut ekranu: slajd 36
Zrzut: odpowiedź bramki z czterema wskaźnikami.
Moduł w stosiesnmp.yml (44111 linii) + blok routerosdocker restart snmp-exportercurl .../snmp?module=routeros&... -> 24 liniehrProcessorLoad{hrDeviceIndex="1"} 14Bramka OK24 linie4 wskaźnikiPotemzadaniereload
Slajd 37/45
Zadanie snmp-routeros
Cel slajdu: Pełny listing zadania Prometheusa dla modułu routeros.

Szósty cel na stronie Targets

Zadanie różni się od snmp tylko parametrem module; relabeling jest identyczny, bo bramka ta sama. Po przeładowaniu cel snmp-routeros ma stan up, a próbki trafiają do bazy co 60 sekund. Ten sam schemat dokłada kolejne urządzenia bez dotykania bramki.

  • module routeros: Jedyna zmiana względem zadania snmp; reszta parametrów i relabelingu bez zmian
  • Cel: Adres MikroTika z etykietą urzadzenie; ten sam router występuje też w zadaniach snmp i snmp-mikrotik
  • Interwał: 60 sekund z limitem 55 sekund, jak pozostałe zadania SNMP dla słabych procesorów
  • Kontrola: Żądanie POST do /-/reload, potem strona Targets i pierwsze zapytania w Explore
Współdzielenie bramki: Wiele zadań może pytać tego samego eksportera z różnymi modułami; każde jest osobnym celem.
Zrzut ekranu: slajd 37
Zrzut: zadanie snmp-routeros w pliku.
Listing zadaniadopisz na końcu scrape_configsjob_name: snmp-routerosparams module: [routeros]targets: [ADRES] + urzadzenierelabeling jak w snmpPOST /-/reload -> upEfekt6 cel: snmp-routeros uppróbki co 60 s
Slajd 38/45
Weryfikacja w Targets i Explore
Cel slajdu: Sprawdzenie stanu celu i pierwszych próbek czterech wskaźników.

Sześć wierszy up i cztery liczby

Po przeładowaniu strona Targets pokazuje sześć celów w stanie up. W Explore zapytania o każdą metrykę zwracają pierwsze próbki: nazwę tekstową, setne sekundy, procent CPU i kilobajty RAM. Wartości liczbowe u ciebie będą inne, ale kształty odpowiedzi są zawsze identyczne.

  • Targets: Wiersz snmp-routeros z adresem routera i stanem up; błąd mówiłby dokładnie, co nie odpowiada
  • sysName: Próbka o wartości 1 z etykietą sysName z nazwą urządzenia do panelu Stat
  • sysUpTime: Liczba rzędu stu milionów setnych sekund, rosnąca monotonicznie do restartu
  • CPU i RAM: hrProcessorLoad w procentach oraz hrMemorySize w kilobajtach gotowe do paneli
Eksploracja (Explore): Tryb Grafany do swobodnych zapytań bez budowy panelu; miejsce pierwszej weryfikacji metryki.
Zrzut ekranu: slajd 38
Zrzut: strona Targets 6/6 up i wyniki Explore.
Pierwsze próbkiTargets: 6/6 up (snmp-routeros up)sysName{sysName="MT_BIURO"} 1sysUpTime 1.8e+08hrProcessorLoad 9..14 %, hrMemorySize 262144 kBCel up6/6błąd mówi coPróbki4 wskaźnikiExplore
Slajd 39/45
PromQL dla czterech wskaźników
Cel slajdu: Gotowe wyrażenia z konwersjami jednostek do wklejenia w panele.

Jednostki przelicza zapytanie

Surowe metryki mają jednostki SNMP: setne sekundy, procenty i kilobajty. Dzielenia w zapytaniu zamieniają je na godziny, procenty i gigabajty czytelne na panelach. Jednostkę panelu dobierasz do wyniku, inaczej oś wprowadza w błąd.

  • Nazwa: sysName{job="snmp-routeros"} w panelu Stat z legendą z etykiety sysName
  • Czas pracy: sysUpTime / 100 / 3600 daje godziny; dzielenie przez 24 daje dni
  • CPU: hrProcessorLoad bez przeliczeń, wprost w procentach z etykietą procesora
  • RAM: Stosunek hrStorageUsed do hrStorageSize dla opisu main memory razy 100 daje procent zajętości
Legenda z etykiety: Wpis w polu legendy pobierający tekst z etykiety serii, na przykład nazwę urządzenia.
Zrzut ekranu: slajd 39
Zrzut: cztery wyrażenia PromQL z wynikami.
Wyrażenia do panelisysName -> Stat, legenda z sysNamesysUpTime/100/3600 -> godzinyhrProcessorLoad -> % CPUhrStorageUsed/hrStorageSize*100 -> % RAMBezpośrednionazwa, CPUZ dzieleniemczas, RAM
Slajd 40/45
Własny dashboard routera
Cel slajdu: Budowa czterech paneli krok po kroku: Stat, Stat, Gauge i Timeseries.

Cztery panele w dziesięć minut

Dashboard składa się z dwóch paneli tekstowych, miernika CPU i wykresu RAM. Każdy panel to jedno zapytanie z poprzedniego slajdu, typ wizualizacji i jednostka; źródło danych wybiera się raz. Taki sam układ powtarzasz dla każdego kolejnego routera.

  • Panel 1, Stat: Zapytanie sysName, legenda z etykiety sysName, tekstowa nazwa urządzenia na górze
  • Panel 2, Stat: Zapytanie sysUpTime / 100 / 3600 z jednostką godziny i progiem ostrzegawczym przy restarcie
  • Panel 3, Gauge: Zapytanie hrProcessorLoad z jednostką procentów i progami 70 oraz 90
  • Panel 4, Timeseries: Zapytanie procentu RAM z jednostką procentów; historia pokazuje wycieki pamięci
Panel tekstowy (Stat): Duża liczba lub tekst z ostatniej próbki; służy nazwom, czasom i stanom.
Zrzut ekranu: slajd 40
Zrzut: gotowy dashboard czterech paneli.
Skład dashboarduStat + Statnazwaczas pracyGauge + wykresCPU %RAM %Dashboard -> New -> Add visualizationźródło: Prometheus, zapytanie, typ, jednostkaSave dashboard: RouterOS SNMP
Slajd 41/45
Problemy i ich objawy
Cel slajdu: Zebranie typowych usterek bloku RouterOS z rozpoznaniem po objawach.

Czytaj błąd, nie zgaduj

Każda usterka ma charakterystyczny objaw: pusty cel, puste CPU albo zerujący się czas. Poniższa lista przyporządkowuje objaw do przyczyny i naprawy. Zaczynasz od góry listy i schodzisz w dół, aż objaw zniknie.

  • Cel down: Bramka nie odpowiada lub router milczy; wracasz do snmpwalk z kroku drugiego
  • Puste CPU: Starszy RouterOS bez gałęzi hrProcessorLoad; reszta działa, CPU czytasz z API urządzenia
  • Czas od zera: sysUpTime resetuje każdy restart; wykres czasu tnie się, a nie jest to awaria monitoringu
  • Nazwa liczbą: Panel sysName bez legendy z etykiety pokazuje jedynkę; legenda bierze tekst z sysName
Reset licznika: Naturalne zerowanie sysUpTime przy restarcie; funkcje increase korygują je automatycznie.
Zrzut ekranu: slajd 41
Zrzut: lista objawów z przyczynami.
Diagnostyka blokuCel downsnmpwalkusługa?Puste CPUstary ROSAPICzas od zerarestartnormalneNazwa = 1legendaetykietaobjaw prowadzi do przyczyny
Slajd 42/45
Gotowe dashboardy ze społeczności
Cel slajdu: Wskazanie sprawdzonych dashboardów dla Linuksa, MikroTika i Cisco oraz sposobu ich importu.

Nie rysuj od zera, zaimportuj i dostosuj

Serwis grafana.com/grafana/dashboards zawiera tysiące gotowych paneli. Import sprowadza się do wklejenia numeru ID w oknie Dashboards, New, Import oraz wskazania źródła Prometheus. Poniższe pozycje pasują do stosu z tego modułu.

  • Linux, ID 1860: Node Exporter Full, pełny obraz hosta; na górze wybiera się job i host z listy, część paneli wymaga kolektorów systemd i processes
  • SNMP if_mib, ID 11169: SNMP Stats dla modułu if_mib, działa od razu z naszym stosem dla MikroTika, Cisco i każdego switcha; alternatywa to ID 21962
  • MikroTik rozszerzony, ID 11589: Mikrotik monitoring, bogatszy, lecz wymaga modułu mikrotik wygenerowanego z MIB producenta
  • Cisco przez SNMP: Zweryfikowany szablon to ID 11169 (interfejsy Catalyst przez if_mib, procedura w tutorialu sbcode); na switchu wystarcza snmp-server community public RO, a CPU i pamięć wymagają modułu cisco z generatora (CISCO-PROCESS-MIB)
Import dashboardu: Mechanizm Grafany pobierający gotową definicję paneli po numerze ID z serwisu grafana.com i podpinający ją pod wskazane źródło danych.
Zrzut ekranu: slajd 42
Zrzut: okno importu dashboardu z polem ID.
Gotowe dashboardyID 1860Linuxjob/host z listysystemdID 11169if_mibMikroTik, Ciscood razuID 11589MikroTik+moduł mikrotikgeneratorCiscoIF przez 11169CPU: moduł ciscocommunity ROimport: Dashboards, New, Import, wklej ID
Slajd 43/45
Liczniki i wskaźniki
Cel slajdu: Wyjaśnienie typów Counter i Gauge oraz poprawnego stosowania funkcji rate i increase.

Nigdy nie rysuj surowego licznika

Licznik rośnie do restartu, więc jego wykres to wznosząca się linia bez informacji o tempie. Funkcje rate i increase liczą przyrost na sekundę i automatycznie korygują zerowanie licznika po restarcie. Pomyłka w tym miejscu to najczęstsza przyczyna bezsensownych wykresów u początkujących.

  • Counter: ifInOctets i node_cpu_seconds_total rosną monotonicznie; 32-bitowe zawijają się po 4 miliardach, 64-bitowe praktycznie nigdy
  • Gauge: node_load1, temperatura i ifOperStatus mają chwilową wartość; rysuje się je bezpośrednio funkcjami avg i max
  • rate: Średni przyrost na sekundę z zakresu, na przykład rate(ifInOctets[5m]) dla ruchu interfejsu
  • increase: Całkowity przyrost w zakresie, na przykład transfer w ciągu doby: increase(ifInOctets[24h])
Licznik (Counter): Metryka rosnąca monotonicznie do restartu lub zawinięcia; wskaźnik (Gauge) to chwilowa wartość mogąca rosnąć i maleć.
Zrzut ekranu: slajd 43
Zrzut: wykres licznika i wskaźnika obok siebie.
Typy metrykCounterrośnie, resetuje sięrate(), increase()Gaugechwilowa wartośćavg(), max()rate(ifInOctets[5m]) * 8 -> b/s interfejsuincrease(ifHCInOctets[24h]) -> transfer dobyavg(node_load1) -> średnie obciążenie
Slajd 44/45
Diagnostyka typowych błędów
Cel slajdu: Zebranie procedur rozwiązywania najczęstszych awarii stosu w kolejności działań.

Od objawu do komendy w trzech krokach

Większość awarii diagnozuje się w kolejności: Targets, log kontenera, ręczny test poleceniem curl. Poniższa sekwencja przyporządkowuje objaw do konkretnej komendy. Trzymaj się tej kolejności, a większość awarii znajdziesz w kilka minut.

  • Brak danych na wykresie: Strona Targets wskaże cel down; dalej docker logs prometheus i test curl adres/metrics
  • Restart snmp-exporter: Log z błędem formatu pliku snmp.yml; naprawa przez poprawny plik i restart kontenera
  • SNMP timeout: Najpierw snmpwalk z hosta; brak odpowiedzi oznacza wyłączoną usługę lub złą wspólnotę, nie awarię stosu
  • Pusty dashboard z importu: Wybierz źródło Prometheus, zmienną Job snmp, zakres co najmniej godziny oraz sprawdź metrykę w Explore
  • Grafana bez danych: Test źródła w konfiguracji oraz sprawdzenie czasu systemowego, bo rozjazd czasu rozjeżdża wykresy
Strona Targets: Wbudowana lista celów Prometheusa ze stanem, czasem ostatniego pobrania i treścią błędu; pierwszy punkt każdej diagnostyki.
Zrzut ekranu: slajd 44
Zrzut: procedura Targets, logi, curl.
Ścieżka diagnostyki1. Targetsup/downtreść błędu2. logsdocker logsformat?3. curlmetrics?snmpwalk?docker logs snmp-exporter --tail 20curl localhost:9100/metrics | headsnmpwalk -v2c -c public ADRES sysDescr
Slajd 45/45
Słownik, pytania i zadania
Cel slajdu: Podsumowanie terminologii, weryfikacja wiedzy oraz propozycje ćwiczeń.

Sprawdź się przed laboratorium

Uczestnik potrafi uruchomić stos, wyjaśnić przepływ metryk, zbudować panel w Grafanie oraz zdiagnozować brak danych. Poniższe pytania i zadania weryfikują te umiejętności. Kto przejdzie zadania, ten samodzielnie postawi monitoring w swojej sieci.

  • Pytania: 1. Wyjaśnij różnicę między modelem pobierania a wypychania. 2. Po co w zadaniu snmp trzy reguły relabeling. 3. Kiedy stosuje się rate, a kiedy increase.
  • Zadania laboratoryjne: 1. Uruchom stos i doprowadź siedem celów do stanu up. 2. Zbuduj panel ruchu wybranego interfejsu w bitach na sekundę. 3. Dopisz trzeci router i przeładuj konfigurację bez restartu.
  • Słownik: TSDB, PromQL, eksporter, cel, zadanie, relabeling, licznik, wskaźnik, wspólnota, moduł, spacer, provisioning
  • Źródła: Dokumentacja Prometheus i Grafana, repozytorium snmp_exporter, dokumentacja Dockera oraz standardy protokołu SNMP
Kompetencje modułu: Samodzielne wdrożenie czterokontenerowego stosu metryk, konfiguracja pobierania SNMP oraz budowa paneli z poprawnym użyciem liczników i wskaźników.
Zrzut ekranu: slajd 45
Zrzut: pytania, zadania i słownik pojęć.
Podsumowanie modułuPytaniapull kontra pushrelabelingrate, increaseZadania7 x uppanel ruchunowy celprometheus.io/docs, grafana.com/docsgithub.com/prometheus/snmp_exporterdocs.docker.com/engine/install/ubuntu