ELK stek

Share

Uvod u ELK stek

Ukoliko se vaš proizvod ili servis oslanja, na primer, na više web servera i/ili više database servera i nemate centralizovani alat za analizu i skladištenje logova, identifikovanje različitih tipova događaja i njihova korelacija sa drugim tipovima događaja skoro je nemoguća misija.

Jedan „izuzetak“ (engleski: exception) negde u utrobi sistema doveo je do toga da vaš korisnik dobija praznu stranicu baš onda kada bi trebalo da plati vašu uslugu ili je veliki packet-loss unutar vaše mreže doveo do toga da se taj map-reduce posao koji ste pokrenuli završi za 10 sati umesto za 10 minuta…Posle ovakvih događaja, normalno je da želite da znate šta se tačno dogodilo, kako biste sprečili da se ponovo desi, ali to znači da morate da svlačite logove sa pojedinačnih mašina, da ih agregirate, da vodite računa o clock skew-u, da ih join-ujete preko neke vrste transaction id-a, da vodite računa o tome u kom trenutku je log rotiran i kada to završite da tek tada konačno krećete da postavljate pitanja.  To je sve pod uslovom da logovi koje bi trebalo da pregledate staju u radnu memoriju računara ili kada (z)cat + grep + xargs nije dovoljan za analizu… ELK stek je upravo stvoren za ovakve situacije.

Šta je ELK stek?

ELK stek se sastoji od: [ElasticSearch](https://www.elastic.co/products/elasticsearch), [Logstash](https://www.elastic.co/products/logstash) i [Kibana](https://www.elastic.co/products/kibana).

ElasticSearch je distribuirana schema-free baza podataka koja je bazirana na Lucene-u (Lucene vodi računa o skladištenju podataka na disku, indeksiranju, i pretrazi dokumenata, dok sam ElasticSearch vodi računa o ažuriranju dokumenata, API-ju i distribuciji dokumenata između ElasticSearch instanci u istom klasteru), Logstash je u osnovi ETL (Extract, Transfer, Load) alat kojim se logovi transformišu i pohranjuju unutar ElasticSearch-a, a Kibana je web based alat kroz koji se upitima u ElasticSearch bazu vizualizuju i analiziraju prethodno pohranjeni podaci. Ova tri alata su nezamenjiva za analizu i vizualizaciju događaja u sistemu.

Logiranje događaja

Svaki relevantan događaj unutar vašeg sistema bi trebalo da bude logiran. Bolje je i preterati sa logiranjem nego nemati podatake o potencijalno problematičnom događaju. Dobra „meta“ za logiranje na aplikativnom nivou je sve što je vezano za bilo kakvu interakciju korisnika sa sistemom (autorizacija korisnika na sistem, zahtev korisnika ka nekom url-u, email koji je poslat korisniku, itd.). Obzirom da logirate raznorazne informacije, taj log uopšte nije struktuiran, ali bi trebalo da ima neke osnovne podatke, kako biste lakše rezonovali o informaciji. Najbolji savet koji se tiče logovanja u distribuiranim sistemima je da se svaki relevantni događaj koji na neki način propagira kroz distribuirani sistem (kao na primer zahtev za web stranicom), bez obzira da li dotiče više delova distribuiranog sistema ili ne, da se „pečatira“ (engleski: stamp) događaj na samom izvoru (u slučaju zahteva za web stranicom, „pečat“ bi stavio load balancer ili web server) i da se taj“pečat“ prenosi dalje sve do samog kraja životnog veka tog događaja („pečat“ je često UUID ili slično). Na taj način osiguravate da se ne gubi linearnost događaja i da možete da grupišete i da vezujete događaje (na primer taj zahtev za stranicom možete kasnije da povežete sa upitom ka bazi koji je neophodan da se stranica prikaže).

Logstash

Kada je događaj upisan u log file, tu nastupa Logstash. Logstash će se pobrinuti da vaši unosi budu transformisani u jedan od podržanih target formata koji će se kasnije predati ElasticSearch serveru.

Logstash procesiranje se odvija u tri etape: „ulaz“, „transformacija i filtriranje“ i „izlaz“. Ulaz Logstash-a, pored fajla, može da bude i syslog, Redis ili lumberjack (sada logstash-forwarder). Redis se često koristi kao pub/sub „broker“ u centralizovanoj Logstash infrastrukturi, gde Logstash producer-i šalju svoje poruke, a jedna instanca ih dalje procesira. Transformacija i filtriranje se odvija prema setu prethodno definisanih pravila, gde se pored npr. transformacije formata datuma, može i augmentovati npr. podatak o ip adresi, uključujući grad i državu ip adrese prema nekoj lookup tabeli (koristi se [MaxMind (http://dev.maxmind.com/geoip/geoip2/geolite2/) besplatna baza). Izlaz može preko pluginova da se transformiše u skoro bilo koji [format](https://www.elastic.co/guide/en/logstash/current/output plugins.html), a u našem slučaju to će biti ElasticSearch.

Primer za aplikativni log:

{
        "action": "log in",
        "user": "someuser",
        "time": 123456789,
        "ip": "192.168.0.1",
        "transaction-id": "c2a91914-6241-4352-b18e-4abd494a0785"
    }
Primer logstash.conf:


#logstash.conf

    input {
        # ...
    }

    filter {
            # Parsiramo `time` podatak kao Unix timestamp i pohranjujemo ga u @timestamp podatak.
        # Taj podatak će kasnije koristiti Kibana.
        date {
            match => [ "time", "UNIX" ]
        }

        # Dodaje podatke o geolokaciji na osnovu IP adrese.
        geoip {
            source => "ip"
        }
    }

    output {
        elasticsearch {
            # ...
        }
        stdout { codec => rubydebug }
    }

Isprobajte ELK stek

Kako bismo mogli da isprobamo ELK stek i probamo neke komande o kojima ćemo govoriti, potrebno nekako instalirati ELK lokalno.. Za ovaj demo biće nam neophodan Docker odnosno boot2docker. Nećemo se zadržavati na [Docker](http://www.docker.com/) i [boot2docker](http://boot2docker.io/) projektu, zvanični resursi su više nego odlični i vrlo je jednostavno podesiti ovu kombinaciju. Za potrebe ovog testa, koristićemo [elk docker image](https://registry.hub.docker.com/u/sebp/elk/).

$ docker pull sebp/elk
    $ docker run -p 5601:5601 -p 9200:9200 -p 5000:5000 -it --name elk sebp/elk
    $ docker exec -it elk /bin/bash
    $ /opt/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { host => localhost } }'
    # Sada otkucajte poruku npr.
    Ovo je test poruka.
    CTRL-C
    $

Sa host mašine:

 $ curl -s -XGET 'http://192.168.59.103:9200/_search?pretty&q=poruka'

Dobijate:

{
        "took" : 3,
        "timed_out" : false,
        "_shards" : {
            "total" : 6,
            "successful" : 6,
            "failed" : 0
        },
        "hits" : {
            "total" : 1,
            "max_score" : 0.4790727,
            "hits" : [ {
            "_index" : "logstash-2015.05.18",
            "_type" : "logs",
            "_id" : "Rg8kNtFjQFWinjAN6pUKqA",
            "_score" : 0.4790727,
            "_source":{"message":"Ovo je test poruka.","@version":"1","@timestamp":"2015-05-18T09:41:17.634Z","host":"4429b647e117"}
            } ]
        }
    }

Kada odete nazad na Kibana-u, biće vam predložen indeks, i posle tog inicijalnog podešavanja, moći ćete da vršite upite na indeksom.

ElasticSearch

Onog trenutka kada Logstash završi svoj posao i prosledi logove ElasticSearch-u, tada već možete da uradite nešto sa tim podacima. Jednostavnom `curl` komandom `curl -XGET ‘http://192.168.59.103:9200/_search’` možete videti „dokumente“ u bazi. `192.168.59.103` je u ovom slučaju adresa boot2docker vm-a, a 9200 je izloženi port. Obzirom da je rezultat u JSON formatu, vaši rezultati su spremni za dalju obradu. `curl -XGET ‘http://192.168.59.103:9200/_search?pretty’` vraća čitljiviju verziju dokumenta za brzu inspekciju.

Kibana

Kibana je u osnovi samo statični (html+css+js) klijent za ElasticSearch. Osim što kroz Kibana-u možete lako da vršite upite nad ElasticSearch indeksima, osnovna prednost jeste što te upite, ma koliko komplikovani oni bili možete da „složite“ u vrlo pregledan „dashboard“ i taj „dashboard“ da sačuvate i podelite sa drugima. Kibana dolazi sa vrlo moćnim setom alata za vizualizaciju i tako npr. možete da vidite koliko često se sličan događaj ponavlja tokom vremena, možete da agregirate događaje po raznim kriterijumima (npr. koliko je zahteva došlo sa pojedine IP adrese u poslednjih sat vremena, da li je porastao broj grešaka po određenom serveru ili čak da uočite porast u broju zahteva za određenom stranicom). Takođe, ovo je odličan alat za detekciju anomalija koje su uzrokovane promenama unutar vašeg sistema. Kibana se neretko koristi za vizuelnu korelaciju broja i kategorije izuzetaka unutar aplikacije posle deployment-a novog koda, kao i za vizuelno testiranje regresija nakon izmena unutar sistema.

ElasticSearch i gubitak podataka pri mrežnim particijama

Kao što to obično i biva, i ELK stek dolazi sa svojim setom problema. Tokom prethodne i ove godine, napisani su brojni članci o tome kako ElasticSearch gubi podatke usled mrežne particije, čak i ako uslovi mrežne particije traju svega nekoliko sekundi. [Ovde](https://aphyr.com/posts/323-call-me-maybe-elasticsearch-1-5-0) možete pronaći više informacija kako se ElasticSearch ponaša u toku tranzitivne, ne-tranzitivne mrežne particije, kao i pri particiji singularnong noda. Ono što je zanimljivo jeste da čak i mikro-particije mogu da izazovu lag od 90 sekundi u okviru kog se radi elekcija novog vođe unutar klastera (preko ZenDisco algoritma za elekciju vođe koji je razvio ElasticSearch tim) i pritom sve što je insertovano u toku tog intervala može potencijalno da bude odbačeno, tako da je dobra ideja da logove zadržite i u originalnom formatu i da se ne oslanjate 100% na ElasticSearch, makar za „mission-critical“ logove.

Zaključak

Ovim smo samo zagrebali površinu i prezentovali jako mali set mogućnosti ELK steka. Ključni problemi koje se dobrim delom rešavaju ovim stekom su brza i jednostavna analiza logova i vizualizacija događaja u sistemu, kako singularnih tako i klastera događaja, sve kroz monolitni interfejs koji može da posluži kao osnova za dalju instrumentaciju. Srećno logovanje!

 

Share

Prijavi se da prvi dobijaš nove blogove i vesti.

Ostavite odgovor

Development Team Performance Technologies

mm

Tim programera Performance Technologies-a je sastavljen od mladih i entuziasticnih licnosti. Kao dobar tim oni se susrecu sa razlicitim izazovima na polju kompleksnih Web aplikacija. Njihov interes za programiranje moze da nadmasi samo njihova strast za cevapima i tortom!

Prijavi se da prvi dobijaš nove blogove i vesti.

Kategorije