Tigna ex Loki colligendis

Tigna ex Loki colligendis

At Badoo, novas technologias monentes constanter ac perpendamus num valeant in nostro systemate uti. Unum horum studiorum cum communitate communicare velimus. Dedicatum est Loki, ratio aggregationis log.

Loki solutio est materias recondendas et spectandas, et hic acervus etiam praebet systema flexibile ad eas solvendas et ad Prometheum datas mittendas. Mense Maio alia renovatio dimissa est, quae ab creatoribus active promovit. Nos quaerebamus quid Loki facere possit, quid facultates praebet, et quatenus jocus agere possit ad ELK, acervum quo nunc utimur.

Quod Loki

Grafana Loki copia partium est pro ratio completa operandi cum lignis. Dissimiles aliae similes systemata, Lokius innititur notione indexing metadatae-tabularum tantum (eadem ac in Prometheo), et comprimendo trabes in chunkos separatos.

homepage, GitHub

Priusquam ingrediamur quid cum Lokio facere possis, elucidare cupimus quid per "ideam metadatae solum indicendi" significamus. Aditus Loki comparemus et accessus ad solutiones traditionales indices quales Elasticae investigationes conferamus, exemplo lineae e nginx stipes adhibito:

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"

Traditional systemata totum ordinem parse, including agros cum magno numero valorum singularium usorum et item_idorum, et omnia in magnis indicibus recondunt. Commodum accessus huius est ut quaestiones implicatas celeriter currere possis, cum omnia fere notitiae in indice sint. Sed hoc gratuitum fit quod index fit magnus, qui in memoriam requisita vertit. Quam ob rem index plenus-textus cum ipsis lignis magnitudine comparandus est. Ut celeriter perscrutemur, index in memoriam oneratur. Quantoque plura sunt, eo celerius index crescit et eo magis memoria consumit.

Lokius accessus postulat ut solum necessariae notitiae e filo extrahantur, quarum numerus parvus est. Hoc modo parvum indicem accipimus et notitias eliquare per tempus et agros recensuimus explorare possumus, ac deinde ceteras regulares expressiones quaerere vel substringi explorare. Processus velocissimus non videtur, sed Lokius petitionem in plures partes scindit easque in parallelis exequitur, magnam copiam notitiarum brevi tempore expediens. Numerus shards et petitiones parallelae in eis configurabilis est; proinde summa notitiarum quae per unitatem temporis discursum esse possunt, linearly dependet a copia facultatum provisorum.

Commercium hoc inter magnum, ieiunium indicem et parvum, indicem parallelum violentae violentae permittit Lokius sumptus systematis regere. Configurari potest mollius et dilatari secundum necessitates.

BIBLIOTHECA Lokii tribus constat partibus: Promtail, Loki, Grafana. Promtail ligna colligit, eas processit et ad Lokium mittit. Loki eos servat. Et Grafana data a Loki petere potest et eam exhibere. In genere, Loki non solum ad tigna accommodanda et per eas perscrutandas adhiberi potest. Totus acervus magnas opportunitates praebet ad expediendas et solvendas notitias advenientis utendi modo Promethei.
Descriptio processus institutionis inveniri potest hic.

Iniuriarum quaerere

Tigna in speciali interface Grafana - explorare potes. Queries lingua LogQL utuntur, quae simillima est PromQL in Prometheo. Principio, grep distributo cogitari potest.

Quaestio interface hoc simile est:

Tigna ex Loki colligendis

Rogatio ipsa duabus partibus constat: selecta et sparguntur. Elector est quaesitio utens metadata (schedula) designata quae lignis assignata est, et colum est chorda vel regexp quae filters e monumentis a selectore definitos habet. In exemplo dato: In capreolis crispis electrix est, omnia post filtrum.

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

Propter viam Loki opera, interrogationes sine selectore facere non potes, sed pittacia generalia fieri possunt ut tibi placet.

Elector valorem clavem pretii in capreolis crispis est. Selectores coniungere potes et varias condiciones quaerendi utentes operatores =, != vel expressionibus regularibus specificare:

{instance=~"kafka-[23]",name!="kafka-dev"} 
// Найдёт Π»ΠΎΠ³ΠΈ с Π»Π΅ΠΉΠ±Π»ΠΎΠΌ instance, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ kafka-2, kafka-3, ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ dev 

Colamentum est textus vel regexp qui omnia notitia a selectore recepta sparget.

Fieri potest ut ad-hoc graphs innixus e notitia recepta in metri modo. Exempli causa, invenire potes quoties viscus continens indicem chordarum in ngingis lignis apparet;

Tigna ex Loki colligendis

Plena descriptio facultatum in documentis inveniri potest LogQL.

Log parsing

Plures modi sunt ligna colligendi:

  • Promtail utens, vexillum elementum acervi ad ligna colligenda.
  • Protinus a docker vas usura Loki Docker Logging Coegi.
  • Utere Fluentd vel Fluent Bit, qui notitias Loki mittere potest. Dissimilis Promtail, parsers paratae habent ad quodlibet fere genus stipes et etiam tigna multilinea tractare possunt.

Solet Promtail ponitur pro parsing. Circa primum tria facit;

  • Data invenit fontes.
  • Adnectit eis pittacia.
  • Data Loki mittit.

In statu Promtail potes legere acta e lima locali et e ephemeride systemd. In qualibet machina debet institui ex qua tigna colliguntur.

Cum Kubernetes integratio est: Promtail automatice, per Kubernetes REST API, statum botri cognoscit et tigna ex nodo, servitio vel vasculo colligit, statim pittacia in metadata Kubernetes posita (pod nomen, nomen fasciculi, etc.). .

Etiam pittacia suspendere potes innixa in notitia e ligno utendo Pipeline. Pipeline Promtail quattuor genera graduum consistere potest. More details in officialis documentaStatim notabo aliquas nugas.

  1. Parsing gradus. Hic est RegEx et JSON scaena. In hoc scaena notitias ex lignis elicimus in tabula sic dicta extracta. Ex JSON excerpere possumus, solum describendo agros, quibus opus est in tabula extrahenda, vel per expressiones regulares (RegEx), ubi catervae nominatae sunt in tabula extracta. Extracta tabula est clavis pretii promptuarium, ubi clavis nomen est agri, et valor ex lignis.
  2. Mutare gradus. Hic scaena duas optiones habet: transformare, ubi regulas transformationis ponimus, et principium - fons notitiae transformationis ex tabula extracta. Si non est talis ager in tabula extracta, creabitur. Hoc modo pittacia creare potest qui in tabula extracta non nituntur. In hac scaena manipulare possumus notitias in tabula extracta utendo satis valido Golang Template. Praeterea meminisse debemus tabulam extractam totam in parsing oneratam esse, quae sinit, exempli gratia, valorem in ea reprimere: "{{si .tag}tag valorem existit{end}}". Formulae condiciones, ansulas et chordas aliquas functiones sustinet ut vnde et Trim.
  3. Actio gradus. Hic aliquid facere potes cum argumento extracto;
    • Pittacium ex data extracta creare, qui per Lokium index erit.
    • Mutatio vel eventu tempus a stipes constituunt.
    • Mutare notitias (textus iniuriarum) qui Lokium ibit.
    • Metricam crea.
  4. Gradus eliquare. Par scaena, ubi viscus vel mittere possumus quae /dev/nulli non indigemus vel ad ulteriora processui eas transmittere possumus.

Exempli causa utens ngings regulares dispensandi, ostendam quomodo potes ligna parse utens Promtail.

Ad experimentum, sumamus ut nginx-procuratorem mutatum nginx imaginis jwilder/nginx-procuratoris: Alpini et daemonis parvum, qui se per HTTP petere potest. Daemon plures terminos habet, quibus responsa variarum magnitudinum, cum diversis HTTP status et moras varias praebere potest.

Tigna e vasis phialam colligemus, quae per semitam /var/lib/docker/tabularum/inveniri possunt. / -json.log

In docker-compose.yml configuramus Promtail et iter ad config denotamus:

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'
 // ...

Adde viam lignis ad promtail.yml (est optio "docker" in config, quod idem facit in una linea, sed non ita perspicuum est);

scrape_configs:
 - job_name: containers

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

Cum hac configuratione datur, ligna ex omnibus vasis Loki mittentur. Ad hoc evitare nos occasus test nginx in docker-compose.yml mutamus - logging tag campum adde:

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

Emendo promtail.yml et erectio Pipeline. Input omnia huius generis includit:

{"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"}

Pipeline scaena:

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

Agros rivum, attrs, attrs.tag (si existunt) ab advenientibus JSON elicimus et in tabula extracta collocamus.

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

Si agrum tag in tabula extracta ponere potuimus, tum regexp nomina imaginis et vasis excerpimus.

 - labels:
     image_name:
     container_name:

Titulos assignamus. Si imago_name et continens_name claves in notitia extracta invenientur, valores eorum in pittaciis respondentibus assignabuntur.

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

Omnes trabes abiicias quae pittacia non habent image_name et continens_name.

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

Pro omnibus lignis, quorum nomen est nginx.promtail.test, agrum ex fonte stipes extrahunt et eum in tabula extracta cum clavis actuariis pone.

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

Patemus input lineam cum expressionibus regularibus et nginx virtualis exercitus et nginx lineam evellere.

     - 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.]+)")?

Parse nginx log utens expressionibus regularibus.

    - 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>[^/?.]+).*$

Parse request_url situs. Usura regexp propositum rogationis decernimus: ad static notitias, ad imagines, ad API et ad debitam clavem in tabula extracta constituimus.

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

Operatores conditionales in Template utentes, designatos agros in tabula extracta compescimus et valores requisitos posuimus pro agro petitionis_type: photo, static, API. Aliam si defecerit assigno. request_type nunc genus petitionis continet.

       - labels:
           api_request:
           virtual_host:
           request_type:
           status:

pittacia api_request, virtual_hostia, request_type et status (HTTP status) constituimus secundum ea quae in tabula extracta collocavimus.

       - output:
           source: nginx_log_row

Mutare output. Nunc nginx stipes purgatae ex tabula extracta ad Lokium accedit.

Tigna ex Loki colligendis

Post config supra currentes, videre potes singulas introitus labellis innixas ex notitia e indice assignatos esse.

Unum memorabile est quod pittacia restituendi cum magno numero valorum (cardinalitatis) signanter Loki retardare possunt. Hoc est, non debes poni, verbi gratia, user_id in indice. Plura de hoc lege in articulo "Quomodo pittacia in Loki facere possunt citius ac facilius log queries" Sed hoc non significat te sine indicibus quaerere ab usore_id. Filtra debes uti cum notitias quaerendo ("capto", et index hic tamquam rivus identifier agit.

Visualization lignorum

Tigna ex Loki colligendis

Loki agere potest ut fons notitiae pro Grafana graphs LogQL utentes. Sequentia lineamenta sustentantur:

  • rate - number of records per second;
  • computat super tempus - numerus records in determinatis range.

Sunt etiam functiones aggregationis Sum, Avg, et aliae. Potes graphes admodum implicatos aedificare, exempli gratia grapha errorum numeri HTTP;

Tigna ex Loki colligendis

Commodus notae fons Loki aliquantum redactus est in functione data ad Promethei fontem (exempli gratia, legendam mutare non potes), sed Loki coniungi potest ut fons cum typo Promethei. Pro certo non sum si hoc documentum comprobatur, sed responsionem electronicarum diiudicamus.Quomodo Lokium ut Prometheum datasource configurare? Β· Constitutio #1222 Β· grafana/loki", exempli gratia, est omnino legale, et Loki plene compatitur cum PromQL.

Adde Lokium ut fons notitiae apud Prometheum typum et adde URL /loki:

Tigna ex Loki colligendis

Et possumus graphes facere, quasi cum Prometheo metri causa laboraremus:

Tigna ex Loki colligendis

Discrepantiam functionis temporalis esse puto ac tincidunt emendare in futurum.

Tigna ex Loki colligendis

Metrics

Facultatem praebet Lokius e lignis metri numerales eliciendi et ad Prometheum mitte. Exempli gratia, nginx stipes continet numerum bytes per responsionem, tum cum quadam modificatione formarum logarum, tempus in secundis quod respondere cepit. Haec notitia extrahi potest et ad Prometheum mitti.

Adde aliam sectionem ad 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

Optionem tibi permittit ut metricas metri rationes ex tabula extracta definias et renovas. Hae metricae non mittuntur ad Lokium - apparent in termino Promtail / metrico. Conformandus est Prometheus ut notitias in hac scena receptas recipiat. In superiore exemplo, pro request_type="api" metricum histogramma colligimus. Cum hoc genere metri commodius est percentiles obtinere. Pro stata et photographica summam bytes et numerum ordinum in quibus bytes accepimus ad medium computandum colligimus.

Read more about metrics hic.

Aperi portum in Promtail:

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

Fac ut metrice cum praepositione promtail_custom appareant:

Tigna ex Loki colligendis

Proficiscitur Prometheus. Addere officium promtail:

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

Aliquam lacinia purus et venimus:

Tigna ex Loki colligendis

Hoc modo invenire potes, verbi gratia, quattuor tardissimas queries. Haec metrica vigilantia etiam constituere potes.

Scaling

Loki esse potest vel in uno modo binario vel in modo syllabis (modus scalae horizontalis-). In secundo casu, nubes notitias servare potest, et resina et index seorsim reponuntur. Versionem 1.5 facultatem in uno loco reponendam inducit, sed nondum ea in productione uti commendatur.

Tigna ex Loki colligendis

Chunks in repositione S3-compatible reponi possunt, et transversae databases scalabiles ad indices reponunt: Cassandra, BigTable vel DynamoDB. Aliae partes Loki - Distributores (pro scripto) et Querier (pro queries) - state sine aere sunt et etiam horizontaliter scandunt.

In colloquio DevOpsdays Vancouver 2019 unus e participibus Callum Styan nuntiavit se cum Loki suo incepto habere petabytas lignorum cum indice minoris quam 1% totius magnitudinis: "Quam Loki Correlates Metrics et Acta publica omnia - et vos salvet pecuniam".

Comparatio Lokii et ELK

Index size

Ad magnitudinem indicis consequentis probandam, ligna cepi ab nginx receptaculo ad quod Pipeline supra configurabatur. Fasciculus index contentus 406 lineas cum toto volumine 624 MB. Tigna intra horam generata sunt, circiter 109 viscus per alterum.

Exemplum duarum linearum ex sextario:

Tigna ex Loki colligendis

Cum index ab ELK, haec indicem dederunt 30,3 MB:

Tigna ex Loki colligendis

In casu Loki, hoc factum est in proxime 128 KB indicis et circiter 3,8 MB notitiarum in chunkis. Notatu dignum est stipes artificiose generari et non magnam datarum varietatem habere. Simplex gzip in originali Docker JSON log cum notitia compressionem 95,4% dedit, et ratione habita quod solum nginx truncum purgatum ad ipsum Lokium missum est, compressio usque ad 4 MB intellegi potest. Numerus valorum singularium in Lokio pittacia 35 erat, qui parvitatem indicis explicat. Nam ELK etiam vacuefactae sunt stipes. Ita Lokius primas notitias per 96% compressit, et ELK per 70%.

Memoria consummatio

Tigna ex Loki colligendis

Si totum Prometheum et ELK acervum comparemus, Lokius pluries minus "comedit". Patet servitium a Go minus quam ministerium Javae consumere et magnitudinem JVM Acervi Elasticaetionis comparare et memoriam in Loki collocari falsam esse, sed tamen memorabile est quod Loki multo minus memoria utitur. CPU utilitas eius non tam manifesta est, sed etiam praesens est.

celeritas

Loki "devorat" omnia citius. Celeritas ex multis factoribus pendet - qualia sunt tigna, quam urbani sumus in parsingis, retis, disci, etc. Hoc explicatur per quod Lokius multo minus notitias in indicem ponit ac proinde minus temporis in indicendo ponit. Celeritate quaesita condicio contraria est: Loki notabiliter in notitia plurium gigabytarum tardat, dum celeritas inquisitionis ELK a magnitudine notitiarum non pendet.

Iniuriarum quaerere

Loki signanter inferior ELK secundum facultates inquisitionis iniuriarum est. Grep cum expressionibus regularibus potens est, sed inferior datorum maturarum est. Defectus inquisitionum, aggregatio solum per pittacia, non posse quaerendi sine pittaciis - omnes hos limites nos quaerendo informationes usurarum in Loki. Hoc non significat nihil quod Loki usus inveniri possit, sed cursus tigna operandi definit cum primum problema in chartis Promethei invenis, deinde his pittaciis uteris ad quaerendum quid in lignis factum sit.

interface

Primum pulchrum est (miserere, resistere non potuit). Grafana pulchre vultus interfacies habet, sed Kibana multo pluma dives est.

Pros et cons Loki

Commodorum unum est quod Lokius cum Prometheo integrat, sic metricos et vigilantes e cista accipimus. Commodum est ligna colligere et eas ex Pods Kubernetes condere, sicut habet servitium inventionis hereditatis a Prometheo et sponte adnectit labella.

Downside documentum infirma est. Quaedam, exempli gratia, lineamenta et facultates Promtail, solum in processu studendi codicem inveni, feliciter fons apertus est. Aliud incommodum est facultatibus parsing infirma. Exempli gratia, Loki parse multilinea non potest. Aliud incommodum est quod Lokius iuvenum technologiarum relative dicitur (dimissum 1.0 mense Novembri 2019).

conclusio,

Loki est technologiae C% interesting quae apta est parvis et mediocribus inceptis, permittens ut multa problemata de logis aggregationis, inquisitionis logae, vigilantiae et analysi logatae.

Loki in Badoo non utimur quod ELK acervum habemus quod nobis convenit et quae variis consuetudinum solutionibus per annos obsita est. Pro nobis scandalum per ligna quaerit. Cum fere 100 GB lignorum per diem, interest nos omnia posse reperire et paulo plus et celeriter facere. Ad charting et vigilantia, aliis solutionibus utimur quae ad necessitates nostras formandas et inter se integrantur. Loki acervus tangibiles utilitates habet, sed non plus nobis dabit quam iam habemus, eiusque beneficia certe pretium migrationis non praeponderant.

Et quamvis post investigationes innotuit nos Loki uti non posse, speramus nos hanc stationem in electione vestra adiuvare.

Reconditorium cum codice usus est in articulo sita est hic.

Source: www.habr.com