Ҷамъоварии гузоришҳо аз Loki

Ҷамъоварии гузоришҳо аз Loki

Мо дар Badoo пайваста технологияҳои навро назорат мекунем ва баҳо медиҳем, ки оё онҳо дар системаи мо истифода мешаванд ё не. Мо мехоҳем яке аз ин таҳқиқотро бо ҷомеа мубодила кунем. Он ба Loki, як системаи ҷамъкунии логҳо бахшида шудааст.

Loki як роҳи ҳалли нигоҳдорӣ ва дидани гузоришҳо мебошад ва ин стек инчунин системаи чандирро барои таҳлили онҳо ва фиристодани маълумот ба Prometheus таъмин мекунад. Дар моҳи май, навсозии дигар бароварда шуд, ки онро эҷодкорон фаъолона пешбарӣ мекунанд. Мо ба он таваҷҷӯҳ доштем, ки Loki чӣ кор карда метавонад, кадом хусусиятҳоро таъмин мекунад ва то чӣ андоза он метавонад ҳамчун алтернатива ба ELK, стеке, ки мо ҳоло истифода мебарем, амал кунад.

Локи чист

Grafana Loki маҷмӯи ҷузъҳо барои системаи мукаммали бақайдгирӣ мебошад. Баръакси дигар системаҳои шабеҳ, Loki ба идеяи индексатсияи танҳо метамаълумоти лог - тамғакоғазҳо (ба монанди Prometheus) ва фишурдани гузоришҳо паҳлӯ ба паҳлӯ ба қисмҳои алоҳида асос ёфтааст.

Саҳифаи асосӣ, GitHub

Пеш аз он ки ман ба он чизе ки шумо бо Loki кор карда метавонед, ман мехоҳам фаҳмонам, ки "ғояи индексатсияи танҳо метамаълумот" чӣ маъно дорад. Биёед равиши Loki ва равиши индексатсияро дар ҳалли анъанавӣ, ба монанди Elasticsearch, бо истифода аз мисоли сатр аз сабти nginx муқоиса кунем:

172.19.0.4 - - [01/Jun/2020:12:05:03 +0000] "GET /purchase?user_id=75146478&item_id=34234 HTTP/1.1" 500 8102 "-" "Stub_Bot/3.0" "0.001"

Системаҳои анъанавӣ тамоми сатрро, аз ҷумла майдонҳоро бо арзишҳои беназири user_id ва item_id таҳлил мекунанд ва ҳама чизро дар индексҳои калон нигоҳ медоранд. Бартарии ин равиш дар он аст, ки шумо метавонед дархостҳои мураккабро зуд иҷро кунед, зеро қариб ҳамаи маълумотҳо дар индекс ҷойгиранд. Аммо шумо бояд барои ин пардохт кунед, зеро индекс калон мешавад, ки ин ба талаботи хотира табдил меёбад. Дар натиҷа, индекси пурраи гузоришҳо аз рӯи андоза бо худи гузоришҳо муқоисашаванда аст. Барои зуд ҷустуҷӯ кардани он, индекс бояд ба хотира бор карда шавад. Ва ҳар қадаре, ки гузоришҳо зиёд бошанд, индекс ҳамон қадар тезтар меафзояд ва хотираи бештари он истеъмол мешавад.

Муносибати Loki талаб мекунад, ки аз сатр танҳо маълумоти зарурӣ гирифта шавад, ки шумораи арзишҳои онҳо хурд аст. Бо ин роҳ мо шохиси хурд ба даст меорем ва метавонем маълумотро тавассути филтр кардани он аз рӯи вақт ва майдонҳои индексатсияшуда ҷустуҷӯ кунем ва сипас боқимондаро бо ифодаҳои муқаррарӣ ё ҷустуҷӯҳои зерсатр скан кунем. Ин раванд зудтарин ба назар намерасад, аммо Локи дархостро ба чанд қисм тақсим мекунад ва онҳоро дар як вақт иҷро мекунад ва миқдори зиёди маълумотро дар муддати кӯтоҳ коркард мекунад. Шумораи пораҳо ва дархостҳои мувозӣ дар онҳо танзимшаванда аст; ҳамин тавр, ҳаҷми маълумоте, ки дар як воҳиди вақт коркард мешавад, ба таври хаттӣ аз ҳаҷми захираҳои додашуда вобаста аст.

Ин муомила байни шохиси бузурги зуд ва индекси хурди параллели қувваи бераҳмона ба Loki имкон медиҳад, ки арзиши системаро назорат кунад. Он метавонад мувофиқи ниёзҳои шумо чандир танзим ва васеъ карда шавад.

Стеки Loki аз се ҷузъ иборат аст: Promtail, Loki, Grafana. Promtail гузоришҳоро ҷамъ мекунад, коркард мекунад ва ба Loki мефиристад. Локи онҳоро нигоҳ медорад. Ва Grafana метавонад аз Loki маълумот талаб кунад ва онро нишон диҳад. Умуман, Loki метавонад на танҳо барои нигоҳ доштани гузоришҳо ва ҷустуҷӯ тавассути онҳо истифода шавад. Тамоми стек барои коркард ва таҳлили маълумоти воридотӣ бо роҳи Prometheus имкониятҳои бузург фароҳам меорад.
Тавсифи раванди насб кардан мумкин аст дар ин ҷо.

Ҷустуҷӯи сабт

Шумо метавонед гузоришҳоро дар интерфейси махсуси Grafana — Explorer ҷустуҷӯ кунед. Дархостҳо забони LogQL-ро истифода мебаранд, ки ба PromQL, ки Prometheus истифода мебарад, хеле монанд аст. Дар асл, онро метавон ҳамчун grep тақсимшуда баррасӣ кард.

Интерфейси ҷустуҷӯ чунин менамояд:

Ҷамъоварии гузоришҳо аз Loki

Худи дархост аз ду қисм иборат аст: селектор ва филтр. Селектор ҷустуҷӯ аз рӯи метамаълумотҳои (тамғаҳои) индексатсияшудаест, ки ба гузоришҳо таъин шудаанд ва филтр сатри ҷустуҷӯ ё regexp мебошад, ки сабтҳои муайянкардаи селекторро филтр мекунад. Дар мисоли боло: Дар қавсҳои ҷингила - селектор, ҳама чиз баъд аз - филтр.

{image_name="nginx.promtail.test"} |= "index"

Аз сабаби кори Loki, шумо наметавонед бидуни селектор дархост пешниҳод кунед, аммо тамғакоғазҳо метавонанд ба таври худсарона умумӣ карда шаванд.

Селектор арзиши калидӣ дар қавсҳои ҷингила мебошад. Шумо метавонед интихобкунандагонро якҷоя кунед ва бо истифода аз операторҳои =, != ё ифодаҳои муқаррарӣ шартҳои гуногуни ҷустуҷӯро муайян кунед:

{instance=~"kafka-[23]",name!="kafka-dev"} 
// Найдёт логи с лейблом instance, имеющие значение kafka-2, kafka-3, и исключит dev 

Филтр матн ё regexp мебошад, ки тамоми маълумоти аз ҷониби селектор гирифташударо филтр мекунад.

Дар асоси маълумоти гирифташуда дар реҷаи метрика графикҳои муваққатӣ гирифтан мумкин аст. Масалан, шумо метавонед басомади пайдоишро дар гузоришҳои nginx вурудоте, ки дорои сатри индекс аст, пайдо кунед:

Ҷамъоварии гузоришҳо аз Loki

Тавсифи пурраи хусусиятҳоро дар ҳуҷҷатҳо пайдо кардан мумкин аст LogQL.

Таҳлили сабт

Якчанд роҳҳо барои ҷамъоварии сабтҳо мавҷуданд:

  • Бо ёрии Promtail, як ҷузъи стандартии стек барои ҷамъоварии гузоришҳо.
  • Бевосита аз контейнери докер бо истифода аз Ронандаи Logging Loki Docker.
  • Fluentd ё Fluent Bit-ро истифода баред, ки метавонад ба Loki маълумот фиристад. Баръакси Promtail, онҳо барои қариб ҳама намуди журналҳо таҳлилгари тайёр доранд ва инчунин метавонанд гузоришҳои бисёрсатрро идора кунанд.

Одатан Promtail барои таҳлил истифода мешавад. Он се чизро иҷро мекунад:

  • Манбаъҳои маълумотро пайдо мекунад.
  • Ба онҳо тамғакоғазҳо часпонед.
  • Маълумотро ба Loki мефиристад.

Дар айни замон Promtail метавонад гузоришҳоро аз файлҳои маҳаллӣ ва аз маҷаллаи системавӣ хонад. Он бояд дар ҳар як мошине насб карда шавад, ки аз он гузоришҳо ҷамъ карда мешаванд.

Интегратсия бо Kubernetes мавҷуд аст: Promtail ба таври худкор ҳолати кластерро тавассути Kubernetes REST API муайян мекунад ва гузоришҳоро аз гиреҳ, хидмат ё подк ҷамъ мекунад ва фавран дар асоси метамаълумоти Kubernetes (номи паҳлӯ, номи файл ва ғ.) тамғакоғазҳоро ҷойгир мекунад.

Шумо инчунин метавонед тамғакоғазҳоро дар асоси маълумот аз гузориш бо истифода аз Pipeline овезон кунед. Pipeline Promtail метавонад аз чор намуди марҳила иборат бошад. Тафсилоти бештар - дар ҳуҷҷатҳои расмӣ, Дархол баъзе нозукихоро кайд мекунам.

  1. Марҳилаҳои таҳлил. Ин марҳилаи RegEx ва JSON аст. Дар ин марҳила, мо маълумотро аз гузоришҳо ба харитаи истихроҷшуда истихроҷ мекунем. Шумо метавонед аз JSON тавассути нусхабардории майдонҳое, ки ба мо лозим аст, ба харитаи истихроҷшуда ё тавассути ифодаҳои муқаррарӣ (RegEx), ки дар он гурӯҳҳои номбаршуда ба харитаи истихроҷшуда "харита карда мешаванд" истихроҷ кунед. Харитаи истихроҷшуда анбори арзишҳои калидӣ мебошад, ки дар он калид номи майдон аст ва арзиш арзиши он аз гузоришҳо мебошад.
  2. Марҳилаҳои табдилдиҳӣ. Ин марҳила ду интихоб дорад: табдил, ки дар он мо қоидаҳои трансформатсияро муқаррар мекунем ва манбаъ - манбаи маълумот барои табдил аз харитаи истихроҷшуда. Агар дар харитаи истихроҷшуда чунин майдон вуҷуд надошта бошад, пас он сохта мешавад. Ҳамин тариқ, метавон нишонаҳоеро эҷод кард, ки дар харитаи истихроҷшуда асос наёфтаанд. Дар ин марҳила, мо метавонем маълумотро дар харитаи истихроҷшуда бо истифода аз қувваи хеле пурқувват коркард кунем қолаби голанг. Илова бар ин, мо бояд дар хотир дошта бошем, ки харитаи истихроҷшуда ҳангоми таҳлил пурра бор карда мешавад, ки масалан, имкон медиҳад, ки арзиши он дар он тафтиш карда шавад: "{{if .tag}tag арзиши мавҷуд аст{end}}". Шаблон шартҳо, ҳалқаҳо ва баъзе функсияҳои сатрро, аз қабили Иваз ва Тримро дастгирӣ мекунад.
  3. Марҳилаҳои амал. Дар ин марҳила, шумо метавонед бо истихроҷшуда коре кунед:
    • Аз маълумоти истихроҷшуда нишона эҷод кунед, ки аз ҷониби Loki индексатсия карда мешавад.
    • Вақти ҳодисаро аз сабт тағир диҳед ё таъин кунед.
    • Тағир додани маълумот (матни сабт), ки ба Loki меравад.
    • Метрикҳо эҷод кунед.
  4. Марҳилаҳои филтр. Марҳилаи мувофиқат, ки дар он мо метавонем сабтҳоеро фиристем, ки ба мо лозим нест /dev/null ё онҳоро барои коркарди минбаъда фиристем.

Бо истифода аз мисоли коркарди гузоришҳои оддии nginx, ман нишон медиҳам, ки чӣ гуна шумо метавонед гузоришҳоро бо Promtail таҳлил кунед.

Барои санҷиш, биёед тасвири тағирёфтаи nginx jwilder/nginx-proxy:alpine ҳамчун nginx-proxy ва демони хурдеро гирем, ки метавонад тавассути HTTP худро пурсад. Демон якчанд нуқтаҳои ниҳоӣ дорад, ки ба онҳо метавонад посухҳои андозаҳои гуногун, бо статусҳои гуногуни HTTP ва бо таъхирҳои гуногун диҳад.

Мо гузоришҳоро аз контейнерҳои докер ҷамъ мекунем, ки онҳоро дар роҳи /var/lib/docker/containers/ ёфтан мумкин аст. / -json.log

Дар docker-compose.yml мо Promtail-ро насб карда, роҳро ба танзимот муайян мекунем:

promtail:
  image: grafana/promtail:1.4.1
 // ...
 volumes:
   - /var/lib/docker/containers:/var/lib/docker/containers:ro
   - promtail-data:/var/lib/promtail/positions
   - ${PWD}/promtail/docker.yml:/etc/promtail/promtail.yml
 command:
   - '-config.file=/etc/promtail/promtail.yml'
 // ...

Роҳро ба гузоришҳо ба promtail.yml илова кунед (дар конфигуратсия варианти "докер" мавҷуд аст, ки дар як сатр ҳамин корро мекунад, аммо он чандон аён нахоҳад буд):

scrape_configs:
 - job_name: containers

   static_configs:
       labels:
         job: containerlogs
         __path__: /var/lib/docker/containers/*/*log  # for linux only

Вақте ки ин конфигуратсия фаъол карда мешавад, Loki гузоришҳоро аз ҳама контейнерҳо қабул мекунад. Барои пешгирӣ кардани ин, мо танзимоти nginx-и санҷиширо дар docker-compose.yml тағир медиҳем - сабтро ба майдони барчасп илова кунед:

proxy:
 image: nginx.test.v3
//…
 logging:
   driver: "json-file"
   options:
     tag: "{{.ImageName}}|{{.Name}}"

Таҳрири promtail.yml ва насб кардани Pipeline. Сабтҳо чунинанд:

{"log":"u001b[0;33;1mnginx.1    | u001b[0mnginx.test 172.28.0.3 - - [13/Jun/2020:23:25:50 +0000] "GET /api/index HTTP/1.1" 200 0 "-" "Stub_Bot/0.1" "0.096"n","stream":"stdout","attrs":{"tag":"nginx.promtail.test|proxy.prober"},"time":"2020-06-13T23:25:50.66740443Z"}
{"log":"u001b[0;33;1mnginx.1    | u001b[0mnginx.test 172.28.0.3 - - [13/Jun/2020:23:25:50 +0000] "GET /200 HTTP/1.1" 200 0 "-" "Stub_Bot/0.1" "0.000"n","stream":"stdout","attrs":{"tag":"nginx.promtail.test|proxy.prober"},"time":"2020-06-13T23:25:50.702925272Z"}

марҳилаҳои қубур:

 - json:
     expressions:
       stream: stream
       attrs: attrs
       tag: attrs.tag

Мо майдонҳои ҷараён, attrs, attrs.tag (агар вуҷуд дошта бошанд) аз JSON воридшаванда хориҷ карда, онҳоро ба харитаи истихроҷшуда мегузорем.

 - regex:
     expression: ^(?P<image_name>([^|]+))|(?P<container_name>([^|]+))$
     source: "tag"

Агар имконпазир бошад, ки майдони барчасп дар харитаи истихроҷшуда ҷойгир карда шавад, пас бо истифода аз regexp мо номҳои тасвир ва контейнерро истихроҷ мекунем.

 - labels:
     image_name:
     container_name:

Мо нишонаҳо таъин мекунем. Агар калидҳои image_name ва container_name дар маълумоти истихроҷшуда пайдо шаванд, пас арзишҳои онҳо ба тамғакоғазҳои мувофиқ таъин карда мешаванд.

 - match:
     selector: '{job="docker",container_name="",image_name=""}'
     action: drop

Мо ҳама гузоришҳоро мепартоем, ки тамғакоғазҳои image_name ва container_name надоранд.

  - match:
     selector: '{image_name="nginx.promtail.test"}'
     stages:
       - json:
           expressions:
             row: log

Барои ҳамаи гузоришҳо, ки image_name онҳо ба nginx.promtail.test баробар аст, мо майдони гузоришро аз сабти манбаъ хориҷ мекунем ва онро бо калиди сатр дар харитаи истихроҷшуда мегузорем.

  - regex:
         # suppress forego colors
         expression: .+nginx.+|.+[0m(?P<virtual_host>[a-z_.-]+) +(?P<nginxlog>.+)
         source: logrow

Мо сатри вурудро бо ифодаҳои муқаррарӣ тоза мекунем ва мизбони виртуалии nginx ва хати сабти nginx-ро берун мекунем.

     - regex:
         source: nginxlog
         expression: ^(?P<ip>[w.]+) - (?P<user>[^ ]*) [(?P<timestamp>[^ ]+).*] "(?P<method>[^ ]*) (?P<request_url>[^ ]*) (?P<request_http_protocol>[^ ]*)" (?P<status>[d]+) (?P<bytes_out>[d]+) "(?P<http_referer>[^"]*)" "(?P<user_agent>[^"]*)"( "(?P<response_time>[d.]+)")?

Сабти nginx-ро бо ифодаҳои муқаррарӣ таҳлил кунед.

    - regex:
           source: request_url
           expression: ^.+.(?P<static_type>jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$
     - regex:
           source: request_url
           expression: ^/photo/(?P<photo>[^/?.]+).*$
       - regex:
           source: request_url
           expression: ^/api/(?P<api_request>[^/?.]+).*$

Таҳлили request_url. Бо ёрии regexp, мо ҳадафи дархостро муайян мекунем: ба статика, аксҳо, ба API ва калиди мувофиқро дар харитаи истихроҷшуда насб кунед.

       - template:
           source: request_type
           template: "{{if .photo}}photo{{else if .static_type}}static{{else if .api_request}}api{{else}}other{{end}}"

Бо истифода аз операторҳои шартӣ дар Шаблон, мо майдонҳои насбшударо дар харитаи истихроҷшуда тафтиш мекунем ва арзишҳои лозимиро барои майдони type_type муқаррар мекунем: фото, статикӣ, API. Дигарро таъин кунед, агар ноком бошад. Ҳоло type_type навъи дархостро дар бар мегирад.

       - labels:
           api_request:
           virtual_host:
           request_type:
           status:

Мо тамғакоғазҳои api_request, virtual_host, type_type ва status (status HTTP) -ро дар асоси он чизе ки мо тавонистем дар харитаи истихроҷшуда гузоштаем, муқаррар кардем.

       - output:
           source: nginx_log_row

Тағйир додани баромад. Ҳоло гузориши тозашудаи nginx аз харитаи истихроҷшуда ба Локи меравад.

Ҷамъоварии гузоришҳо аз Loki

Пас аз иҷро кардани конфигуратсияи дар боло зикршуда, шумо метавонед бубинед, ки ҳар як вуруд дар асоси маълумот аз сабт нишонгузорӣ шудааст.

Дар хотир доред, ки истихроҷи тамғакоғазҳо бо миқдори зиёди арзишҳо (кардиналӣ) метавонад Loki-ро ба таври назаррас суст кунад. Яъне, шумо набояд дар индекс, масалан, user_id ҷойгир кунед. Дар ин бора бештар дар мақола хонедЧӣ гуна тамғакоғазҳо дар Loki метавонанд дархостҳои сабтро тезтар ва осонтар кунанд". Аммо ин маънои онро надорад, ки шумо наметавонед аз рӯи user_id бидуни индекс ҷустуҷӯ кунед. Ҳангоми ҷустуҷӯ филтрҳоро истифода бурдан лозим аст ("мувофиқи маълумот" гирифтан) ва индекс дар ин ҷо ҳамчун идентификатори ҷараён амал мекунад.

Визуализатсияи сабт

Ҷамъоварии гузоришҳо аз Loki

Loki метавонад ҳамчун манбаи маълумот барои диаграммаҳои Grafana бо истифода аз LogQL амал кунад. Хусусиятҳои зерин дастгирӣ карда мешаванд:

  • суръат - шумораи сабтҳо дар як сония;
  • бо мурури замон ҳисоб кунед - шумораи сабтҳо дар диапазони додашуда.

Инчунин функсияҳои ҷамъкунии Sum, Avg ва ғайра мавҷуданд. Шумо метавонед графикҳои хеле мураккаб созед, масалан, графики шумораи хатогиҳои HTTP:

Ҷамъоварии гузоришҳо аз Loki

Сарчашмаи маълумоти пешфарзии Loki нисбат ба манбаи маълумоти Prometheus каме камтар функсионалӣ аст (масалан, шумо афсонаро тағир дода наметавонед), аммо Loki-ро метавон ҳамчун манбаи навъи Prometheus пайваст кард. Ман боварӣ надорам, ки оё ин рафтори ҳуҷҷатӣ аст, аммо аз рӯи посухи таҳиягарон баҳо дода мешавад "Чӣ тавр Loki-ро ҳамчун манбаи маълумоти Prometheus танзим кардан мумкин аст? · Нашри №1222 · графана/локи”, масалан, он комилан қонунист ва Loki бо PromQL комилан мувофиқ аст.

Loki-ро ҳамчун манбаи маълумот бо навъи Prometheus илова кунед ва URL /loki -ро илова кунед:

Ҷамъоварии гузоришҳо аз Loki

Ва шумо метавонед графикҳо созед, гӯё мо бо метрикаи Prometheus кор карда истодаем:

Ҷамъоварии гузоришҳо аз Loki

Ман фикр мекунам, ки номутобиқатӣ дар функсия муваққатӣ аст ва таҳиягарон онро дар оянда ислоҳ хоҳанд кард.

Ҷамъоварии гузоришҳо аз Loki

Метрикҳо

Loki имкон медиҳад, ки ченакҳои ададӣ аз гузоришҳо истихроҷ карда, ба Prometheus фиристанд. Масалан, сабти nginx шумораи байтҳоро барои як посух ва инчунин бо тағироти муайяни формати стандартии гузориш, вақтро бо сонияҳо барои посух додан дар бар мегирад. Ин маълумотро метавон истихроҷ кард ва ба Прометей фиристод.

Ба promtail.yml бахши дигар илова кунед:

- match:
   selector: '{request_type="api"}'
   stages:
     - metrics:
         http_nginx_response_time:
           type: Histogram
           description: "response time ms"
           source: response_time
           config:
             buckets: [0.010,0.050,0.100,0.200,0.500,1.0]
- match:
   selector: '{request_type=~"static|photo"}'
   stages:
     - metrics:
         http_nginx_response_bytes_sum:
           type: Counter
           description: "response bytes sum"
           source: bytes_out
           config:
             action: add
         http_nginx_response_bytes_count:
           type: Counter
           description: "response bytes count"
           source: bytes_out
           config:
             action: inc

Опсия ба шумо имкон медиҳад, ки метрикаро дар асоси маълумот аз харитаи истихроҷшуда муайян ва навсозӣ кунед. Ин нишондиҳандаҳо ба Loki фиристода намешаванд - онҳо дар нуқтаи ниҳоии Promtail /metrics пайдо мешаванд. Prometheus бояд барои гирифтани маълумот аз ин марҳила танзим карда шавад. Дар мисоли боло, барои request_type="api" мо метрикаи гистограмма ҷамъ мекунем. Бо ин намуди нишондиҳандаҳо ба даст овардани фоизҳо қулай аст. Барои статика ва аксҳо, мо ҷамъи байтҳо ва шумораи сатрҳоеро, ки дар он байтҳо гирифтаем, ҷамъоварӣ мекунем, то ҳисоби миёнаро ҳисоб кунем.

Муфассалтар дар бораи нишондиҳандаҳо хонед дар ин ҷо.

Дар Promtail портро кушоед:

promtail:
     image: grafana/promtail:1.4.1
     container_name: monitoring.promtail
     expose:
       - 9080
     ports:
       - "9080:9080"

Мо боварӣ ҳосил мекунем, ки ченакҳо бо префикси promtail_custom пайдо шудаанд:

Ҷамъоварии гузоришҳо аз Loki

Насб кардани Prometheus. Иловаи пешниҳоди кор:

- job_name: 'promtail'
 scrape_interval: 10s
 static_configs:
   - targets: ['promtail:9080']

Ва график кашед:

Ҷамъоварии гузоришҳо аз Loki

Бо ин роҳ шумо метавонед, масалан, чор дархости сусттаринро пайдо кунед. Шумо инчунин метавонед мониторингро барои ин ченакҳо танзим кунед.

Миқёскунӣ

Loki метавонад ҳам дар режими ягонаи бинарӣ ва ҳам пора (режими уфуқӣ-миқёспазир) бошад. Дар ҳолати дуюм, он метавонад маълумотро ба абр захира кунад ва қисмҳо ва индексҳо алоҳида нигоҳ дошта мешаванд. Дар версияи 1.5, қобилияти нигоҳдорӣ дар як ҷо амалӣ карда мешавад, аммо ҳанӯз дар истеҳсолот истифода бурдани он тавсия дода намешавад.

Ҷамъоварии гузоришҳо аз Loki

Қисмҳоро дар анбори мувофиқи S3 нигоҳ доштан мумкин аст, барои нигоҳ доштани индексҳо, пойгоҳи додаҳои ба таври уфуқӣ миқёспазирро истифода баред: Cassandra, BigTable ё DynamoDB. Қисмҳои дигари Loki - Дистрибюторҳо (барои навиштан) ва Querier (барои дархостҳо) - бидуни шаҳрвандӣ мебошанд ва инчунин ба таври уфуқӣ миқёс доранд.

Дар конфронси DevOpsDays Vancouver 2019, яке аз иштирокчиён Каллум Стян эълон кард, ки бо Локи лоиҳаи ӯ петабайтҳои гузоришҳоро бо индекси камтар аз 1% андозаи умумӣ дорад: "Чӣ тавр Loki ченакҳо ва гузоришҳоро мувофиқат мекунад ва пулро сарфа мекунад".

Муқоисаи Локи ва ELK

Андозаи индекс

Барои санҷидани андозаи индекси натиҷа, ман аз контейнери nginx гузоришҳоро гирифтам, ки қубури боло барои он танзим шуда буд. Дар файли журнал 406 сатр бо ҳаҷми умумии 624 МБ иборат буд. Гузоришҳо дар давоми як соат тавлид шуданд, тақрибан 109 сабт дар як сония.

Намунаи ду сатр аз гузориш:

Ҷамъоварии гузоришҳо аз Loki

Вақте ки аз ҷониби ELK индексатсия карда шуд, ин андозаи индекси 30,3 МБ дод:

Ҷамъоварии гузоришҳо аз Loki

Дар мавриди Loki, ин тақрибан 128 КБ индекс ва тақрибан 3,8 МБ маълумотро дар қисмҳо дод. Қобили зикр аст, ки гузориш ба таври сунъӣ тавлид шуда буд ва дорои навъҳои зиёди маълумот набуд. Gzip оддӣ дар сабти аслии Docker JSON бо маълумот фишурдани 95,4% дод ва бо назардошти он, ки танҳо сабти nginx тозашуда ба худи Loki фиристода шудааст, фишурдашавӣ ба 4 МБ фаҳмо аст. Шумораи умумии арзишҳои беназир барои тамғакоғазҳои Loki 35 буд, ки андозаи хурди индексро шарҳ медиҳад. Барои ELK, журнал низ тоза карда шуд. Ҳамин тариқ, Loki маълумоти аслиро 96% ва ELK 70% фишурдааст.

Истеъмоли хотира

Ҷамъоварии гузоришҳо аз Loki

Агар мо тамоми стеки Prometheus ва ELK-ро муқоиса кунем, пас Локи якчанд маротиба камтар "мехӯрад". Маълум аст, ки хидмати Go нисбат ба хидмати Java камтар истеъмол мекунад ва муқоисаи андозаи Heap Elasticsearch JVM ва хотираи ҷудошуда барои Loki нодуруст аст, аммо ба ҳар ҳол, бояд қайд кард, ки Loki хотираи камтарро истифода мебарад. Бартарии CPU он қадар равшан нест, аммо он низ мавҷуд аст.

Суръат

Локи сабтҳоро тезтар "хӯрад". Суръат аз бисёр омилҳо вобаста аст - чӣ гуна гузоришҳо, мо то чӣ андоза мураккаби онҳоро таҳлил мекунем, шабака, диск ва ғайра - аммо он бешубҳа аз ELK баландтар аст (дар санҷиши ман - тақрибан ду маротиба). Ин бо он шарҳ дода мешавад, ки Локи ба индекс камтар маълумот мегузорад ва мувофиқан барои индексатсия вақти камтар сарф мекунад. Дар ин ҳолат, вазъият бо суръати ҷустуҷӯ баръакс мешавад: Loki маълумоти калонтар аз чанд гигабайтро ба таври назаррас суст мекунад, дар ҳоле ки барои ELK суръати ҷустуҷӯ аз андозаи маълумот вобаста нест.

Ҷустуҷӯи сабт

Loki аз ҷиҳати қобилияти ҷустуҷӯи гузоришҳо аз ELK хеле пасттар аст. Grep бо ибораҳои муқаррарӣ як чизи қавӣ аст, аммо он аз пойгоҳи додаҳои калонсолон пасттар аст. Набудани дархостҳои диапазон, ҷамъкунӣ танҳо аз рӯи тамғакоғазҳо, имконнопазирии ҷустуҷӯ бидуни нишонаҳо - ҳамаи ин моро дар ҷустуҷӯи маълумоти ҷолиб дар Loki маҳдуд мекунад. Ин маънои онро надорад, ки бо истифода аз Loki чизе ёфтан мумкин нест, аммо он ҷараёни кор бо гузоришҳоро муайян мекунад, вақте ки шумо аввал дар диаграммаҳои Prometheus мушкилот пайдо мекунед ва сипас дар гузоришҳо бо истифода аз ин тамғакоғазҳо чӣ ҳодиса рух додааст, ҷустуҷӯ кунед.

интерфейси

Аввалан, он зебо аст (бахшед, муқобилат карда натавонистам). Grafana интерфейси зебо дорад, аммо Кибана хеле функсионалӣ аст.

Тарафҳои мусбат ва манфии Loki

Аз бартариятҳо метавон қайд кард, ки Loki бо Prometheus ҳамгиро мешавад, мутаносибан мо ченакҳо ва огоҳкуниро аз қуттӣ мегирем. Он барои ҷамъоварии гузоришҳо ва нигоҳ доштани онҳо бо Kubernetes Pods қулай аст, зеро он дорои кашфи хидмате, ки аз Prometheus мерос гирифтааст ва ба таври худкор тамғакоғазҳоро замима мекунад.

Аз камбудиҳо - ҳуҷҷатгузории бад. Баъзе чизҳо, ба монанди хусусиятҳо ва имкониятҳои Promtail, ман танҳо дар ҷараёни омӯзиши код, манфиати кушодаасосро кашф кардам. Камбудии дигар ин қобилияти таҳлили заиф мебошад. Масалан, Loki гузоришҳои чандсатиро таҳлил карда наметавонад. Инчунин, камбудиҳо аз он иборатанд, ки Loki технологияи нисбатан ҷавон аст (версияи 1.0 дар моҳи ноябри соли 2019 буд).

хулоса

Loki як технологияи 100% ҷолиб аст, ки барои лоиҳаҳои хурд ва миёна мувофиқ аст ва ба шумо имкон медиҳад, ки мушкилоти зиёди ҷамъкунии гузоришҳо, ҷустуҷӯи гузоришҳо, мониторинг ва таҳлили гузоришҳоро ҳал кунед.

Мо Loki-ро дар Badoo истифода намебарем, зеро мо як стеки ELK дорем, ки ба мо мувофиқ аст ва дар тӯли солҳо бо қарорҳои гуногуни фармоишӣ пур шудааст. Барои мо монеаи пешпо ҷустуҷӯ дар гузоришҳост. Бо қариб 100 ГБ гузоришҳо дар як рӯз, барои мо муҳим аст, ки ҳама чизро ва каме бештарро пайдо кунем ва онро зуд иҷро кунем. Барои диаграмма ва мониторинг, мо дигар қарорҳоро истифода мебарем, ки ба ниёзҳои мо мутобиқ карда шудаанд ва бо ҳамдигар муттаҳид шудаанд. Стеки Loki манфиатҳои назаррас дорад, аммо он ба мо аз он чизе, ки мо дорем, бештар намедиҳад ва фоидаи он аз хароҷоти муҳоҷират комилан зиёдтар нахоҳад буд.

Ва гарчанде ки пас аз таҳқиқот маълум шуд, ки мо Loki-ро истифода бурда наметавонем, мо умедворем, ки ин паём ба шумо дар интихоб кӯмак хоҳад кард.

Анбор бо рамзи дар мақола истифодашуда ҷойгир аст дар ин ҷо.

Манбаъ: will.com

Илова Эзоҳ