Loki je open source rámec pro agregaci protokolů s licencí Apache 2.0 navržený Grafana Labs a vytvořený s obrovskou podporou rostoucí komunity. Je to také projekt, na kterém pracuji každý den. V tomto článku, spíše než jen mluvit o tom, jak Loki funguje, poskytnu praktický úvod do řešení skutečných problémů s ním.
Problém:trvalá centralizovaná historie shellu
Miluji svou historii shellu a vždy jsem byl fanatický uživatel CTRL+R. Asi před rokem se můj terminálový život navždy změnil, když mě můj vrstevník Dieter Plaetinck seznámil s fuzzy vyhledávačem příkazového řádku fzf .
Najednou hledání v příkazech šlo z tohoto:
K tomu:
I když fzf výrazně zlepšil kvalitu mého života, v historii mého shellu stále chyběly některé kousky:
- Ztráta historie shellu, když se terminály náhle zavřou, počítače se zhroutí, počítače zemřou, šifrovací klíče celého disku jsou zapomenuty
- Přístup k mé historii shellu od všechny mé počítače zapnuty všechny mé počítače
Svou historii shellu považuji za dokumentaci:je to důležitý příběh, o který nechci přijít. Kombinace Lokiho s mou historií shellu pomáhá vyřešit tyto problémy a další.
O Loki
Prozkoumejte cloud s otevřeným zdrojovým kódem
- Porozumění mrakům
- Bezplatný online kurz:Vývoj cloudových nativních aplikací s architekturou mikroslužeb
- Co je hybridní cloud?
- Elektronická kniha:Budování hybridní cloudové strategie
- Co je Kubernetes?
- Porozumění edge computingu
- Nejnovější články pro IT architekty
Loki využívá intuitivní model štítků, který open source projekt Prometheus používá pro metriky, a rozšiřuje jej do světa agregace protokolů. To umožňuje vývojářům a operátorům plynule přecházet mezi jejich metrikami a protokoly pomocí stejné sady štítků. I když nepoužíváte Prometheus, stále existuje spousta důvodů, proč by se Loki mohl hodit pro vaše potřeby ukládání protokolů:
- Nízká režie: Loki neprovádí fulltextové indexování protokolů; vytváří pouze rejstřík štítků, které jste umístili na své protokoly. Udržování malého indexu podstatně snižuje provozní požadavky Loki. Spouštím svůj projekt loki-shell, který používá Loki k ukládání historie shellu, na Raspberry Pi s využitím jen něco málo přes 50 MB paměti.
- Nízká cena: Obsah protokolu je komprimován a uložen v úložištích objektů, jako je Amazon S3, Google Cloud Storage, Azure Blob, nebo dokonce přímo v souborovém systému. Cílem je používat úložiště, které je levné a odolné.
- Flexibilita: Loki je k dispozici v jediném binárním souboru, který lze stáhnout a spustit přímo nebo jako obrázek Docker pro spuštění v libovolném prostředí kontejneru. Pro rychlé zahájení v Kubernetes je k dispozici graf Helm. Pokud od svých protokolovacích nástrojů vyžadujete hodně, podívejte se na produkční nastavení běžící v Grafana Labs. Využívá open source Jsonnet a Tanka k nasazení stejného obrazu Loki jako diskrétních stavebních bloků, aby umožnilo masivní horizontální škálování, vysokou dostupnost, replikaci, samostatné škálování cest pro čtení a zápis, vysoce paralelizovatelné dotazování a další.
Stručně řečeno, Lokiho přístup je udržovat malý rejstřík metadat o vašich protokolech (štítcích) a ukládat neindexovaný a komprimovaný obsah protokolů v levných objektových úložištích, aby byl provoz jednodušší a levnější. Aplikace je vytvořena tak, aby běžela jako jediný proces a snadno se rozvinula ve vysoce dostupný distribuovaný systém. Pomocí paralelizace a shardingu dotazů můžete dosáhnout vysokého výkonu dotazů při větší zátěži protokolování – něco jako MapReduce pro vaše protokoly.
Kromě toho je tato funkce dostupná pro každého, kdo ji může používat zdarma. Stejně jako u své platformy pro otevřenou pozorovatelnost Grafana je i Grafana Labs odhodlána vytvořit z Loki plně funkční a plně otevřený software pro agregaci protokolů, který může používat kdokoli.
Začínáme
Spouštím Lokiho na Raspberry Pi ve své domácí síti a ukládám svou historii shellu mimo pracoviště v kbelíku S3.
Když stisknu CTRL+R, Lokiho rozhraní příkazového řádku LogCLI provede několik dávkových požadavků, které jsou streamovány do fzf. Zde je příklad – horní část zobrazuje protokoly serveru Loki na Pi.
Jste připraveni to zkusit? Následující průvodce vám pomůže nastavit a spustit Loki, aby byl integrován s vaší historií shellu. Vzhledem k tomu, že cílem tohoto návodu je zjednodušit, toto nastavení spustí Loki lokálně na vašem počítači a uloží všechny soubory do souborového systému.
To vše, plus informace o tom, jak nastavit propracovanější instalaci, najdete v loki-shell úložišti GitHub.
Upozorňujeme, že tento tutoriál nezmění žádné stávající chování týkající se vaší historie, takže váš stávající příkaz historie shellu a nastavení historie zůstanou nedotčeny. Místo toho se historie příkazů zkopíruje do Lokiho pomocí $PROMPT_COMMAND
v Bash a precmd
v Zsh. Na straně CTRL+R to přetěžuje funkci, kterou fzf používá pro přístup k příkazu CTRL+R. Vyzkoušení je bezpečné a pokud se rozhodnete, že se vám to nelíbí, postupujte podle kroků odinstalace v úložišti GitHub a odstraňte všechny stopy. Vaše historie shellu zůstane nedotčena.
Krok 1:Instalace fzf
Existuje několik způsobů, jak nainstalovat fzf, ale já preferuji metodu Git:
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
Řekněte ano na všechny výzvy k otázkám.
Pokud již máte fzf nainstalovaný, ujistěte se, že máte povoleny klávesové zkratky (tj. ujistěte se, že když zadáte CTRL+R, objeví se fzf). V případě potřeby můžete znovu spustit instalaci fzf a povolit vazby kláves.
Krok 2:Instalace loki-shell
Stejně jako fzf má loki-shell také Git repo a instalační skript:
git clone --depth 1 https://github.com/slim-bean/loki-shell.git ~/.loki-shell
~/.loki-shell/install
Nejprve skript vytvoří ~/.loki-shell
adresář, kde budou uchovávány všechny soubory (včetně dat Loki). Dále stáhne binární soubory pro Promtail, LogCLI a Loki.
Poté se zeptá:
Do you want to install Loki? ([y]/n)
Pokud již máte centralizovaného Loki spuštěného pro loki-shell, můžete odpovědět n
; v tomto kurzu však odpovězte y
nebo stiskněte Enter.
Existují dvě možnosti, jak Loki spustit lokálně:jako obrázek Dockeru nebo jako jeden binární soubor (s podporou přidání služby systemd). Doporučuji používat Docker, pokud je k dispozici, protože si myslím, že trochu zjednodušuje operace, ale obojí funguje dobře.
Spuštění s Dockerem
Chcete-li spustit Loki jako obrázek Docker:
[y] to run Loki in Docker, [n] to run Loki as a binary ([y]/n) y
Error: No such object: loki-shell
Error response from daemon: No such container: loki-shell
Error: No such container: loki-shell
54843ff3392f198f5cac51a6a5071036f67842bbc23452de8c3efa392c0c2e1e
Pokud instalaci spouštíte poprvé, můžete chybové zprávy ignorovat. Tento skript zastaví a nahradí spuštěný kontejner Loki, pokud se verze neshoduje, což vám umožní znovu spustit tento skript a upgradovat Loki.
A je to! Loki nyní běží jako kontejner Docker.
Data z Loki budou uložena v ~/.loki-shell/data
.
Obrázek běží s --restart=unless-stopped
, takže se restartuje při restartu, ale zůstane zastaven, pokud spustíte docker stop loki-shell
.
(Pokud používáte Docker, můžete přeskočit dolů k integraci Shell.)
Běží jako binární
Existuje mnoho způsobů, jak spustit binární soubor v systému Linux. Tento skript může nainstalovat službu systemd. Pokud nemáte systemd, stále můžete použít binární instalaci:
[y] to run Loki in Docker, [n] to run Loki as a binary ([y]/n) n
Run Loki with systemd? ([y]/n) n
This is as far as this script can take you
You will need to setup an auto-start for Loki
It can be run with this command: /home/username/.loki-shell/bin/loki -config.file=/home/username/.loki-shell/config/loki-binary-config.yaml
Skript vyplivne příkaz, který potřebujete ke spuštění Lokiho, a vy budete sami nastavit init skript nebo jinou metodu automatického spouštění.
Pokud chcete, můžete příkaz spustit přímo a spustit Lokiho ze svého aktuálního prostředí.
Pokud uděláte máte systemd, máte možnost nechat skript nainstalovat službu systemd nebo vám ukázat příkazy, jak ji spustit sami:
Run Loki with systemd? ([y]/n) y
Installing the systemd service requires root permissions.
[y] to run these commands with sudo [n] to print out the commands and you can run them yourself. ([y]/n) n
sudo cp /home/ed/.loki-shell/config/loki-shell.service /etc/systemd/system/loki-shell.service
sudo systemctl daemon-reload
sudo systemctl enable loki-shell
sudo systemctl start loki-shell
Copy these commands and run them when the script finishes. (press enter to continue)
Integrace prostředí Shell
Bez ohledu na to, jak jste Loki nainstalovali, měli byste nyní vidět výzvu:
Enter the URL for your Loki server or press enter for default (http://localhost:4100)
Pokud byste nastavili centralizovaného Lokiho, zadali byste toto URL zde. Tato ukázka však používá pouze výchozí nastavení, takže můžete stisknout Enter.
Spousta textu vysvětlí všechny položky přidané do vašeho ~.bashrc
nebo ~.zshrc
(nebo obojí).
To je ono!
Finished. Restart your shell or reload config file.
source ~/.bashrc # bash
source ~/.zshrc # zsh
Krok 3:Vyzkoušejte to!
Začněte používat svůj shell a pomocí CTRL+R zobrazte své příkazy.
Otevřete více oken terminálu, zadejte příkaz do jednoho a CTRL+R do druhého a uvidíte, že vaše příkazy jsou okamžitě k dispozici.
Všimněte si také, že když přepínáte mezi terminály a zadáváte příkazy, jsou okamžitě dostupné pomocí CTRL+R, ale činnost šipky nahoru mezi terminály není ovlivněna. (Toto nemusí být pravda, pokud máte nainstalovaný Oh My Zsh, protože automaticky připojuje všechny příkazy k historii.)
K přepínání mezi řazením podle času a podle relevance použijte několikrát CTRL+R.
Všimněte si, že tato konfigurace zobrazí pouze historii dotazů aktuálních hostitelů, i když do Loki posíláte data shellu z více hostitelů. Myslím, že to standardně dává největší smysl. Je toho hodně, co můžete vyladit, pokud chcete, aby se toto chování změnilo; více se dozvíte v repozitáři loki-shell.
Nainstaloval také alias nazvaný hist
:
alias hist="$HOME/.loki-shell/bin/logcli --addr=$LOKI_URL"
LogCLI lze použít k dotazování a prohledávání vaší historie přímo v Loki, včetně toho, že vám umožní prohledávat jiné hostitele. Další informace o dotazování naleznete v příručce Začínáme pro LogCLI.
Lokiho log query language (LogQL) poskytuje metrické dotazy, které vám umožňují dělat některé zajímavé věci; například vidím, kolikrát jsem vydal kc
příkaz (můj alias pro kubectl) za posledních 30 dní:
Kredit navíc
Nainstalujte si Grafana a pohrajte si s historií shellu:
docker run -d -p 3000:3000 --name=grafana grafana/grafana
Otevřete webový prohlížeč na adrese http://localhost:3000
a přihlaste se pomocí výchozího admin/admin uživatelské jméno a heslo.
Vlevo přejděte na Konfigurace -> Zdroje dat , klikněte na Přidat zdroj dat a vyberte Loki .
Pro adresu URL byste měli být schopni použít http://localhost:4100
(na svém počítači WSL2 jsem však musel použít skutečnou IP adresu počítače).
Klikněte na Uložit a otestovat . Měli byste vidět Zdroj dat připojen a štítky nalezeny .
Klikněte na Prozkoumat ikonu nalevo, ujistěte se, že Loki je vybrán zdroj dat a vyzkoušejte dotaz:
{job="shell"}
Pokud máte více hostitelů, kteří odesílají příkazy shellu, můžete omezit výsledky na určitého hostitele pomocí hostname
štítek:
{job="shell", hostname="myhost"}.
Můžete také hledat konkrétní příkazy pomocí výrazů filtru:
{job="shell"} |= "docker"
Nebo můžete začít prozkoumávat svět metrik z protokolů a zjistit, jak často svůj shell používáte:
rate({job="shell"}[1m])
Chcete rekonstruovat časovou osu z incidentu? Můžete filtrovat podle konkrétního příkazu a zjistit, kdy se spustil.
Chcete-li vidět, co dalšího můžete dělat, a dozvědět se více o Lokiho dotazovacím jazyce, podívejte se na průvodce LogQL.
Poslední myšlenky
Další nápady, řešení problémů a aktualizace najdete v repozitáři GitHubu. Na tom se stále pracuje, takže případné problémy nahlaste zde.
Chcete-li se o Loki dozvědět více, prohlédněte si dokumentaci, blogové příspěvky a úložiště GitHub nebo to vyzkoušejte v Grafana Cloud.
Zvláštní poděkování patří mému kolegovi Jacku Baldrymu za zasazení semínka pro tento nápad. Měl jsem Lokiho znalosti, abych to mohl uskutečnit, ale nebýt jeho návrhu, nemyslím si, že bych se sem někdy dostal.