Sa Badoo, kanunay namong gimonitor ang mga bag-ong teknolohiya ug gisusi kung angayan ba kini gamiton sa among sistema. Gusto namon nga ipaambit ang usa niini nga mga pagtuon sa komunidad. Gipahinungod kini sa Loki, usa ka sistema sa paghugpong sa log.
Ang Loki usa ka solusyon alang sa pagtipig ug pagtan-aw sa mga troso, ug kini nga stack naghatag usab usa ka flexible nga sistema alang sa pag-analisar niini ug pagpadala data sa Prometheus. Niadtong Mayo, laing update ang gipagawas, nga aktibong gipasiugdahan sa mga tiglalang. Interesado kami kung unsa ang mahimo ni Loki, unsa nga mga kapabilidad nga gihatag niini, ug kung unsa ang gidak-on nga mahimo kini nga alternatibo sa ELK, ang stack nga among gigamit karon.
Unsa ni Loki
Ang Grafana Loki usa ka hugpong sa mga sangkap alang sa usa ka kompleto nga sistema alang sa pagtrabaho sa mga troso. Dili sama sa ubang susama nga mga sistema, ang Loki gibase sa ideya sa pag-index lamang sa log metadata - mga label (sama sa Prometheus), ug pag-compress sa mga troso sa ilang kaugalingon ngadto sa lain nga mga tipak.
Sa wala pa kami moadto kung unsa ang mahimo nimo sa Loki, gusto nako nga ipatin-aw kung unsa ang among gipasabut sa "ideya sa pag-index lamang sa metadata." Atong itandi ang Loki nga pamaagi ug ang pamaagi sa pag-index sa tradisyonal nga mga solusyon sama sa Elasticsearch, gamit ang panig-ingnan sa usa ka linya gikan sa nginx log:
Gi-parse sa tradisyonal nga mga sistema ang tibuok row, lakip ang mga field nga adunay daghang talagsaon nga user_id ug item_id values, ug tipigan ang tanan sa dagkong mga index. Ang bentaha sa kini nga pamaagi mao nga dali ka makadagan sa komplikado nga mga pangutana, tungod kay hapit tanan nga datos naa sa indeks. Apan kini moabut sa usa ka gasto tungod kay ang indeks mahimong dako, nga gihubad ngadto sa mga kinahanglanon sa memorya. Ingon nga resulta, ang full-text log index ikatandi sa gidak-on sa mga log mismo. Aron dali nga makapangita niini, ang indeks kinahanglan i-load sa memorya. Ug ang daghang mga troso, mas paspas nga motubo ang index ug mas daghang memorya ang gigamit niini.
Ang pamaagi sa Loki nanginahanglan nga ang kinahanglan nga datos lamang ang makuha gikan sa usa ka hilo, ang gidaghanon sa mga kantidad nga gamay. Niining paagiha makakuha kami usa ka gamay nga indeks ug makapangita sa datos pinaagi sa pagsala niini sa oras ug pinaagi sa gi-index nga mga natad, ug dayon gi-scan ang nahabilin nga adunay regular nga mga ekspresyon o pagpangita sa substring. Ang proseso dili ingon sa labing paspas, apan gibahin ni Loki ang hangyo sa daghang mga bahin ug gipatuman kini nga managsama, pagproseso sa daghang mga datos sa mubo nga panahon. Ang gidaghanon sa mga shards ug parallel nga mga hangyo niini ma-configure; sa ingon, ang gidaghanon sa datos nga mahimong maproseso kada yunit sa panahon nagdepende sa linearly sa gidaghanon sa mga kapanguhaan nga gihatag.
Kini nga trade-off tali sa usa ka dako, paspas nga indeks ug usa ka gamay, parallel brute-force index nagtugot sa Loki sa pagkontrolar sa gasto sa sistema. Mahimo kini nga flexible nga ma-configure ug mapalapad sumala sa mga panginahanglanon.
Ang stack sa Loki naglangkob sa tulo ka mga sangkap: Promtail, Loki, Grafana. Gikolekta sa Promtail ang mga troso, giproseso kini ug gipadala kini sa Loki. Gibantayan sila ni Loki. Ug si Grafana makahangyo ug datos gikan kang Loki ug ipakita kini. Sa kinatibuk-an, ang Loki mahimong magamit dili lamang sa pagtipig sa mga troso ug pagpangita pinaagi niini. Ang tibuuk nga stack naghatag daghang mga oportunidad alang sa pagproseso ug pag-analisar sa umaabot nga datos gamit ang Prometheus nga paagi.
Makita ang usa ka paghulagway sa proseso sa pag-instalar dinhi.
Pangitaa pinaagi sa mga troso
Mahimo nimong pangitaon ang mga troso sa usa ka espesyal nga interface sa Grafana - Explorer. Ang mga pangutana naggamit sa LogQL nga pinulongan, nga susama kaayo sa PromQL nga gigamit sa Prometheus. Sa prinsipyo, kini mahimong isipon nga usa ka gipang-apod-apod nga grep.
Ang interface sa pagpangita ingon niini:
Ang hangyo mismo naglangkob sa duha ka bahin: selector ug filter. Ang Selector usa ka pagpangita gamit ang gi-index nga metadata (mga label) nga gi-assign sa mga log, ug ang filter usa ka search string o regexp nga nagsala sa mga rekord nga gihubit sa nagpili. Sa gihatag nga pananglitan: Sa mga kulot nga braces adunay usa ka tigpili, ang tanan pagkahuman usa ka filter.
{image_name="nginx.promtail.test"} |= "index"
Tungod sa paagi sa pagtrabaho ni Loki, dili ka makahimo og mga pangutana nga walay tigpili, apan ang mga label mahimong himoon nga kinatibuk-an sama sa imong gusto.
Ang usa ka tigpili usa ka hinungdanon nga kantidad nga kantidad sa mga kulot nga braces. Mahimo nimong isagol ang mga tigpili ug ipiho ang lainlaing mga kondisyon sa pagpangita gamit ang mga operator =, != o mga regular nga ekspresyon:
Ang usa ka filter mao ang teksto o regexp nga magsala sa tanang datos nga nadawat sa tigpili.
Posible nga makakuha og ad-hoc graphs base sa nadawat nga datos sa metrics mode. Pananglitan, mahibal-an nimo kung unsa ka sagad ang usa ka entry nga adunay sulud nga indeks sa string nga makita sa nginx logs:
Ang bug-os nga paghulagway sa mga kapabilidad makita sa dokumentasyon LogQL.
Pag-parse sa log
Adunay daghang mga paagi sa pagkolekta sa mga troso:
Gigamit ang Promtail, usa ka sukaranan nga sangkap sa stack alang sa pagkolekta sa mga troso.
Gamita ang Fluentd o Fluent Bit, nga makapadala ug datos sa Loki. Dili sama sa Promtail, aduna silay andam nga mga parser para sa halos bisan unsang matang sa log ug mahimo usab nga magdumala sa multiline logs.
Kasagaran ang Promtail gigamit alang sa pag-parse. Naghimo kini og tulo ka butang:
Pangitag mga tinubdan sa datos.
Nagbutang og mga label ngadto kanila.
Nagpadala ug data ngadto kang Loki.
Sa pagkakaron ang Promtail makabasa sa mga log gikan sa lokal nga mga file ug gikan sa systemd journal. Kini kinahanglan nga i-install sa matag makina diin ang mga troso gikolekta.
Adunay integrasyon sa Kubernetes: Awtomatiko nga Promtail, pinaagi sa Kubernetes REST API, makaila sa kahimtang sa cluster ug mangolekta og mga log gikan sa usa ka node, serbisyo o pod, mag-post dayon og mga label base sa metadata gikan sa Kubernetes (pod name, file name, etc.) .
Mahimo usab nimo ibitay ang mga label base sa datos gikan sa log gamit ang Pipeline. Ang Pipeline Promtail mahimong naglangkob sa upat ka matang sa mga yugto. Dugang detalye sa opisyal nga dokumentasyon, Mamatikdan dayon nako ang pipila ka mga nuances.
Mga yugto sa pag-parse. Kini ang yugto sa RegEx ug JSON. Niini nga yugto, among gikuha ang datos gikan sa mga troso ngadto sa gitawag nga kinuha nga mapa. Makuha nato gikan sa JSON pinaagi sa pagkopya lang sa mga field nga atong gikinahanglan ngadto sa gikuha nga mapa, o pinaagi sa regular nga mga ekspresyon (RegEx), diin ang ginganlan nga mga grupo "mapa" ngadto sa gikuha nga mapa. Ang Extracted map kay key-value store, diin ang key mao ang ngalan sa field, ug ang value mao ang value niini gikan sa logs.
Pag-usab sa mga yugto. Kini nga yugto adunay duha ka kapilian: pagbag-o, diin among gibutang ang mga lagda sa pagbag-o, ug gigikanan - ang gigikanan sa datos alang sa pagbag-o gikan sa gikuha nga mapa. Kung walay ingon nga field sa gikuha nga mapa, kini pagabuhaton. Niining paagiha posible ang paghimo og mga label nga wala gibase sa nakuha nga mapa. Niini nga yugto mahimo natong manipulahon ang datos sa gikuha nga mapa gamit ang medyo gamhanan Golang Template. Dugang pa, kinahanglan natong hinumdoman nga ang gikuha nga mapa bug-os nga gikarga sa panahon sa pag-parse, nga nagpaposible, pananglitan, sa pagsusi sa bili niini: "{{if .tag}tag value anaa{end}}". Gisuportahan sa template ang mga kondisyon, mga loop, ug pipila ka mga function sa string sama sa Replace ug Trim.
Mga yugto sa aksyon. Niini nga punto mahimo nimo ang usa ka butang sa nakuha nga sulud:
Paghimo usa ka label gikan sa nakuha nga datos, nga ma-indeks ni Loki.
Usba o itakda ang oras sa panghitabo gikan sa log.
Usba ang data (log text) nga moadto sa Loki.
Paghimo ug metrics.
Mga yugto sa pagsala. Ang yugto sa duwa, diin mahimo natong ipadala ang mga entries nga dili na nato kinahanglan /dev/null o ipasa kini para sa dugang pagproseso.
Gamit ang usa ka pananglitan sa pagproseso sa mga regular nga nginx log, akong ipakita kung giunsa nimo ma-parse ang mga troso gamit ang Promtail.
Alang sa pagsulay, atong kuhaon isip nginx-proxy ang usa ka giusab nga nginx image jwilder/nginx-proxy:alpine ug usa ka gamay nga daemon nga makapangutana sa kaugalingon pinaagi sa HTTP. Ang daemon adunay daghang mga endpoint, diin makahatag kini og mga tubag sa lain-laing mga gidak-on, uban sa lain-laing mga HTTP status ug uban sa lain-laing mga paglangan.
Mangolekta kami og mga troso gikan sa mga sudlanan sa docker, nga makita sa dalan /var/lib/docker/containers/ / -json.log
Sa docker-compose.yml among gi-configure ang Promtail ug gitino ang dalan sa config:
Idugang ang agianan sa mga log sa promtail.yml (adunay kapilian nga "docker" sa config, nga parehas nga butang sa usa ka linya, apan dili kini klaro):
scrape_configs:
- job_name: containers
static_configs:
labels:
job: containerlogs
__path__: /var/lib/docker/containers/*/*log # for linux only
Kung kini nga pag-configure mahimo, ang mga troso gikan sa tanan nga mga sudlanan ipadala sa Loki. Aron malikayan kini, usbon namo ang mga setting sa test nginx sa docker-compose.yml - pagdugang og logging tag field:
Kung nakahimo kami sa pagbutang sa tag field sa nakuha nga mapa, unya gamit ang regexp among gikuha ang mga ngalan sa imahe ug sudlanan.
- labels:
image_name:
container_name:
Naghatag kami og mga label. Kung ang mga yawe sa image_name ug container_name makit-an sa nakuha nga datos, nan ang ilang mga kantidad itudlo sa katugbang nga mga label.
- match:
selector: '{job="docker",container_name="",image_name=""}'
action: drop
Among gilabay ang tanang mga troso nga walay gibutang nga label nga image_name ug container_name.
Para sa tanang log kansang image_name mao ang nginx.promtail.test, kuhaa ang log field gikan sa source log ug ibutang kini sa gikuha nga mapa gamit ang row key.
Atong i-parse ang request_url. Gamit ang regexp atong mahibal-an ang katuyoan sa hangyo: sa static nga datos, sa mga litrato, sa API ug gibutang ang katugbang nga yawe sa nakuha nga mapa.
- template:
source: request_type
template: "{{if .photo}}photo{{else if .static_type}}static{{else if .api_request}}api{{else}}other{{end}}"
Gamit ang mga conditional operators sa Template, gisusi namo ang mga na-install nga field sa gikuha nga mapa ug gitakda ang gikinahanglang values ββpara sa request_type field: photo, static, API. I-assign ang uban kung kini mapakyas. request_type karon naglangkob sa hangyo matang.
Gibutang namo ang mga label nga api_request, virtual_host, request_type ug status (HTTP status) base sa among nahimo nga gibutang sa gikuha nga mapa.
- output:
source: nginx_log_row
Usba ang output. Karon ang nalimpyo nga nginx log gikan sa nakuha nga mapa moadto sa Loki.
Human sa pagpadagan sa config sa ibabaw, imong makita nga ang matag entry gi-assign nga mga label base sa datos gikan sa log.
Usa ka butang nga hinumdoman mao nga ang pagkuha sa mga label nga adunay daghang mga kantidad (cardinality) mahimoβg makapahinay sa Loki. Kana mao, dili nimo ibutang, pananglitan, user_id sa index. Basaha ang dugang bahin niini sa artikulo nga "Giunsa sa mga label sa Loki ang paghimo sa mga pangutana sa log nga mas paspas ug dali" Apan wala kini magpasabot nga dili ka makapangita pinaagi sa user_id nga walay mga indeks. Kinahanglan nga mogamit ka og mga filter kung mangita ("grab" ang data), ug ang indeks dinhi naglihok isip usa ka stream identifier.
Pagtan-aw sa mga log
Ang Loki mahimong molihok isip tinubdan sa datos alang sa mga grapiko sa Grafana gamit ang LogQL. Ang mosunod nga mga bahin gisuportahan:
rate β gidaghanon sa mga rekord matag segundo;
ihap sa paglabay sa panahon β ang gidaghanon sa mga rekord sa gitakda nga range.
Adunay usab aggregation function Sum, Avg ug uban pa. Makahimo ka og medyo komplikado nga mga graph, pananglitan usa ka graph sa gidaghanon sa mga sayup sa HTTP:
Ang standard nga tinubdan sa datos nga si Loki medyo gipakunhod sa pagpaandar kumpara sa Prometheus data source (pananglitan, dili nimo mabag-o ang leyenda), apan ang Loki mahimong konektado isip tinubdan sa Prometheus type. Dili ko sigurado kung kini usa ka dokumentado nga pamatasan, apan sa paghukom sa tubag sa mga developer "Giunsa i-configure ang Loki ingon Prometheus datasource? Β· Isyu #1222 Β· grafana/lokiβ, pananglitan, hingpit nga ligal, ug ang Loki hingpit nga nahiuyon sa PromQL.
Idugang ang Loki isip tinubdan sa datos nga adunay tipo nga Prometheus ug idugang ang URL /loki:
Ug makahimo kami og mga graph, ingon nga nagtrabaho kami sa mga sukatan gikan sa Prometheus:
Sa akong hunahuna nga ang kalainan sa pag-andar temporaryo ug ang mga developer magtul-id niini sa umaabot.
Mga sukatan
Naghatag si Loki og abilidad sa pagkuha sa mga numerical metrics gikan sa mga troso ug ipadala kini sa Prometheus. Pananglitan, ang nginx log naglangkob sa gidaghanon sa mga byte matag tubag, ingon man, uban sa usa ka piho nga pagbag-o sa standard nga format sa log, ang oras sa mga segundo nga gikinahanglan sa pagtubag. Kini nga datos mahimong makuha ug ipadala sa Prometheus.
Gitugotan ka sa kapilian nga ipasabut ug i-update ang mga sukatan base sa datos gikan sa gikuha nga mapa. Kini nga mga sukatan wala ipadala sa Loki - kini makita sa Promtail /metrics endpoint. Ang Prometheus kinahanglan nga ma-configure aron makadawat sa datos nga nadawat sa kini nga yugto. Sa pananglitan sa ibabaw, para sa request_type=βapiβ nangolekta mi ug histogram metric. Uban niini nga matang sa metrics sayon ββββang pagkuha sa mga porsyento. Alang sa static ug litrato, among gikolekta ang sumada sa mga byte ug ang gidaghanon sa mga laray diin among nadawat ang mga byte aron makalkulo ang kasagaran.
Niining paagiha mahibal-an nimo, pananglitan, ang upat nga labing hinay nga mga pangutana. Mahimo ka usab nga mag-set up sa pagmonitor alang niini nga mga sukatan.
Pag-scale
Ang Loki mahimong anaa sa single binary mode o sa sharded mode (horizontally-scalable mode). Sa ikaduha nga kaso, kini makatipig sa datos sa panganod, ug ang mga tipak ug indeks gitipigan nga gilain. Ang Bersyon 1.5 nagpaila sa abilidad sa pagtipig sa usa ka lugar, apan wala pa girekomenda nga gamiton kini sa produksiyon.
Ang mga tipik mahimong tipigan sa S3-compatible storage, ug horizontally scalable databases mahimong gamiton sa pagtipig sa mga index: Cassandra, BigTable o DynamoDB. Ang ubang mga bahin sa Loki - Mga Distributor (para sa pagsulat) ug Querier (para sa mga pangutana) - walay estado ug usab pinahigda ang sukod.
Sa komperensya sa DevOpsDays Vancouver 2019, usa sa mga partisipante nga si Callum Styan nagpahibalo nga kauban si Loki ang iyang proyekto adunay mga petabytes sa mga troso nga adunay indeks nga dili mubu sa 1% sa kinatibuk-ang gidak-on: "Giunsa Pag-ayo ni Loki ang Mga Sukatan ug Mga Log - Ug Makatipig Ka sa Kuwarta".
Pagtandi sa Loki ug ELK
Gidak-on sa indeks
Aron sulayan ang resulta nga gidak-on sa indeks, gikuha nako ang mga troso gikan sa nginx nga sudlanan diin ang Pipeline sa ibabaw gi-configure. Ang log file adunay 406 ka linya nga adunay total volume nga 624 MB. Ang mga log nahimo sulod sa usa ka oras, gibana-bana nga 109 ka mga entry kada segundo.
Pananglitan sa duha ka linya gikan sa log:
Kung gi-index sa ELK, naghatag kini usa ka gidak-on sa indeks nga 30,3 MB:
Sa kaso ni Loki, miresulta kini sa gibana-bana nga 128 KB nga indeks ug gibana-bana nga 3,8 MB nga datos sa mga tipak. Angay nga hinumdoman nga ang log gihimo sa artipisyal nga paagi ug walaβy daghang lainlain nga datos. Ang usa ka yano nga gzip sa orihinal nga Docker JSON log nga adunay data naghatag usa ka compression nga 95,4%, ug gikonsiderar ang kamatuoran nga ang nalimpyo nga nginx log lamang ang gipadala sa Loki mismo, ang compression hangtod sa 4 MB masabtan. Ang kinatibuk-ang gidaghanon sa talagsaon nga mga kantidad alang sa mga label sa Loki mao ang 35, nga nagpatin-aw sa gamay nga gidak-on sa indeks. Alang sa ELK ang log gi-clear usab. Sa ingon, gi-compress ni Loki ang orihinal nga datos sa 96%, ug ELK sa 70%.
Pagkonsumo sa memorya
Kung atong itandi ang tibuok Prometheus ug ELK stack, nan si Loki "mokaon" sa daghang mga higayon nga dili kaayo. Klaro nga ang usa ka serbisyo sa Go mokonsumo og gamay kaysa usa ka serbisyo sa Java, ug ang pagtandi sa gidak-on sa JVM Heap Elasticsearch ug ang gigahin nga panumduman alang sa Loki dili husto, apan bisan pa niana angay nga hinumdoman nga ang Loki naggamit labi ka gamay nga memorya. Ang bentaha sa CPU niini dili kaayo dayag, apan anaa usab kini.
Dali
Si Loki "naglamoy" sa mga troso nga mas paspas. Ang katulin nagdepende sa daghang mga hinungdan - kung unsa nga klase sa mga troso, kung unsa kita ka sopistikado sa pag-parse kanila, network, disk, ug uban pa - apan siguradong mas taas kini kaysa ELK (sa akong pagsulay - mga doble nga mas daghan). Gipatin-aw kini sa kamatuoran nga si Loki nagbutang ug mas gamay nga datos sa indeks ug, sumala niana, naggugol ug gamay nga panahon sa pag-indeks. Sa katulin sa pagpangita, sukwahi ang kahimtang: Ang Loki mamatikdan nga nagpahinay sa datos nga mas dako kaysa daghang gigabytes, samtang ang katulin sa pagpangita sa ELK wala magdepende sa kadako sa datos.
Pangitaa pinaagi sa mga troso
Ang Loki labi ka ubos sa ELK sa mga termino sa mga kapabilidad sa pagpangita sa log. Ang Grep nga adunay regular nga mga ekspresyon gamhanan, apan kini mas ubos sa usa ka hamtong nga database. Ang kakulang sa mga pangutana sa hanay, pagtipon lamang pinaagi sa mga label, ang kawalay katakus sa pagpangita nga walay mga label - kining tanan naglimite kanamo sa pagpangita sa impormasyon nga interesado sa Loki. Wala kini magpasabot nga walay bisan unsa nga makit-an gamit ang Loki, apan kini naghubit sa dagan sa pagtrabaho uban sa mga troso sa diha nga ikaw una nga makakita og problema sa Prometheus nga mga tsart, ug dayon gamita kini nga mga label sa pagpangita kon unsay nahitabo sa mga troso.
interface
Una sa tanan, kini matahum (sorry, dili makasukol). Ang Grafana adunay nindot tan-awon nga interface, apan ang Kibana mas daghan nga bahin nga adunahan.
Mga bentaha ug disbentaha sa Loki
Usa sa mga bentaha mao nga ang Loki nag-uban sa Prometheus, mao nga nakakuha kami mga sukatan ug nagpaalerto sa gawas sa kahon. Kombenyente alang sa pagkolekta sa mga troso ug pagtipig niini gikan sa Kubernetes Pods, tungod kay kini adunay pagdiskobre sa serbisyo nga napanunod gikan sa Prometheus ug awtomatiko nga nag-attach sa mga label.
Ang downside mao ang huyang nga dokumentasyon. Ang pipila ka mga butang, pananglitan, ang mga bahin ug mga kapabilidad sa Promtail, akong nadiskobrehan lamang sa proseso sa pagtuon sa code, maayo na lang kay open-source kini. Ang laing disbentaha mao ang huyang nga mga kapabilidad sa pag-parse. Pananglitan, si Loki dili maka-parse sa multiline logs. Ang laing disbentaha mao nga ang Loki usa ka medyo batan-on nga teknolohiya (pagpagawas sa 1.0 kaniadtong Nobyembre 2019).
konklusyon
Ang Loki usa ka 100% nga makapaikag nga teknolohiya nga angay alang sa gagmay ug medium nga kadako nga mga proyekto, nga gitugotan ka nga masulbad ang daghang mga problema sa paghugpong sa log, pagpangita sa log, pag-monitor ug pagtuki sa log.
Wala kami mogamit sa Loki sa Badoo tungod kay kami adunay usa ka ELK stack nga angay kanamo ug nga napuno sa lainlaing mga naandan nga solusyon sa daghang mga tuig. Alang kanamo, ang babag mao ang pagpangita pinaagi sa mga troso. Uban sa hapit 100 GB nga mga troso matag adlaw, hinungdanon nga makit-an namon ang tanan ug gamay pa ug buhaton kini dayon. Para sa pag-chart ug pag-monitor, naggamit kami og ubang mga solusyon nga gipahaum sa among mga panginahanglan ug gihiusa sa usag usa. Ang stack sa Loki adunay mahikap nga mga benepisyo, apan dili kini maghatag labi pa sa naa na naton, ug ang mga benepisyo niini siguradong dili molapas sa gasto sa paglalin.
Ug bisan kung pagkahuman sa panukiduki nahimo nga klaro nga dili namon magamit ang Loki, nanghinaut kami nga kini nga post makatabang kanimo sa imong pagpili.
Ang repository nga adunay code nga gigamit sa artikulo nahimutang dinhi.