Differences

This shows you the differences between two versions of the page.

Link to this comparison view

idp:laboratoare:07 [2022/04/19 12:33]
radu.ciobanu
idp:laboratoare:07 [2023/02/22 11:13] (current)
radu.ciobanu
Line 1: Line 1:
-===== Laboratorul 07 - Monitorizare,​ logare, cozi de mesaje =====+===== Laboratorul 07 - Monitorizare,​ logare, vizualizare, cozi de mesaje =====
  
-==== Introducere ==== 
  
-Pentru acest laborator, vom lucra cu fișierele care se găsesc în subgrupul [[https://​gitlab.com/​mobylab-idp/​laborator-7|Laborator 7]] din grupul oficial de GitLab al materiei. Directoarele **Testapp** și **Worker** conțin fișierele sursă și Dockerfile pentru cele două aplicații pe care le vom rula, directorul **Docker** conține fișierele Docker Compose cu care vom face deployment, iar directorul **Configs** conține configurările pentru diversele servicii pe care le vom adăuga în deployment. 
- 
-==== Monitorizare ==== 
- 
-=== Monitorizare din linia de comandă === 
- 
-În acest laborator, se abordează problema monitorizării. Într-o aplicație Docker, se pot monitoriza în primul rând metrici despre mașinile (fizice sau virtuale) pe care rulează serviciile noastre, apoi metrici care țin de containerele care rulează în swarm, și, nu în ultimul rând, metrici care țin de aplicația propriu-zisă și pe care le putem defini. 
- 
-Cea mai simplă metodă de a monitoriza unul sau mai multe containere este prin intermediul interfeței în linie de comandă din Docker, folosind comanda //docker container stats// în felul următor: 
- 
-<code bash> 
-$ docker container run --name myalpine -it -d alpine 
-</​code>​ 
- 
-<code bash> 
-$ docker container stats myalpine 
- 
-CONTAINER ID   ​NAME ​      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O    PIDS 
-5d002ad9bba1 ​  ​myalpine ​  ​0.00% ​    ​484KiB / 7.774GiB ​  ​0.01% ​    806B / 0B   135kB / 0B   1 
-</​code>​ 
- 
-În exemplul de mai sus, s-a pornit un container de Linux Alpine, care apoi se monitorizează continuu. Informațiile afișate includ ID-ul și numele containerului,​ consumul de CPU și memorie, cantitatea de date schimbate pe interfețele de rețea, activitatea pe disc, etc. Dacă se dorește monitorizarea mai multor containere simultan, se poate utiliza comanda //docker stats//: 
- 
-<code bash> 
-$ docker container run --name myalpine2 -it -d alpine 
-</​code>​ 
- 
-<code bash> 
-$ docker stats 
- 
-CONTAINER ID   ​NAME ​       CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O    PIDS 
-97ab4376c5b7 ​  ​myalpine2 ​  ​0.01% ​    ​352KiB / 7.774GiB ​  ​0.00% ​    586B / 0B     0B / 0B      1 
-5d002ad9bba1 ​  ​myalpine ​   0.02%     ​484KiB / 7.774GiB ​  ​0.01% ​    ​1.02kB / 0B   135kB / 0B   1 
-</​code>​ 
- 
-În exemplul de mai sus, s-a mai pornit un container adițional. Prin comanda //docker stats//, se afișează informații statistice despre toate containerele care rulează pe mașină. 
- 
-Comanda de mai sus poate fi customizată prin formatarea output-ului în funcție de câmpurile care se doresc a fi afișate, precum și modul în care acest lucru este făcut: 
- 
-<code bash> 
-$ docker stats --format "​{{.Container}}:​ {{.CPUPerc}}"​ 
- 
-97ab4376c5b7:​ 0.02% 
-5d002ad9bba1:​ 0.01% 
-</​code>​ 
- 
-<code bash> 
-$ docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"​ 
- 
-NAME        CPU %     MEM USAGE / LIMIT 
-myalpine2 ​  ​0.01% ​    ​352KiB / 7.774GiB 
-myalpine ​   0.03%     ​484KiB / 7.774GiB 
-</​code>​ 
- 
-Dacă se dorește doar afișarea primului rezultat de monitorizare (în loc de o afișare continuă), se poate folosi comanda //docker container stats --no-stream//​. 
- 
-=== Monitorizare prin Docker Remote API === 
- 
-Pe lângă comenzile din CLI, Docker oferă și un set de endpoint-uri HTTP remote sub forma unui API, prin care se pot trimite comenzi către daemon-ul de Docker. Printre endpoint-urile din API-ul de Docker, există și câteva care oferă informații mai detaliate de monitorizare:​ 
- 
-<code bash> 
-$ curl --unix-socket /​var/​run/​docker.sock http://​localhost/​containers/​97ab4376c5b7/​stats 
- 
-{ 
- "​read":​ "​2022-04-19T08:​52:​27.9008855Z",​ 
- "​preread":​ "​0001-01-01T00:​00:​00Z",​ 
- "​pids_stats":​ { 
- "​current":​ 1, 
- "​limit":​ 18446744073709551615 
- }, 
-[...] 
- "​cpu_stats":​ { 
- "​cpu_usage":​ { 
- "​total_usage":​ 51201000, 
- "​usage_in_kernelmode":​ 14821000, 
- "​usage_in_usermode":​ 36379000 
- }, 
- "​system_cpu_usage":​ 18947870000000,​ 
- "​online_cpus":​ 4, 
- "​throttling_data":​ { 
- "​periods":​ 0, 
- "​throttled_periods":​ 0, 
- "​throttled_time":​ 0 
- } 
- }, 
-[...] 
- "​memory_stats":​ { 
- "​usage":​ 360448, 
- "​stats":​ { 
-[...] 
- }, 
- "​limit":​ 8346984448 
- }, 
- "​name":​ "/​myalpine2",​ 
- "​id":​ "​97ab4376c5b7e0411abd33277d3ea6ec7e902bdc9af9826d3afe6ff8f9325249",​ 
- "​networks":​ { 
- "​eth0":​ { 
- "​rx_bytes":​ 936, 
- "​rx_packets":​ 12, 
-[...] 
- } 
- } 
-} 
-</​code>​ 
- 
-Datele sunt generate o dată la o secundă și sunt în format JSON, așa cum se poate observa mai sus (unde s-a formatat JSON-ul pentru a fi urmărit mai ușor, și s-au păstrat doar părți din output, pentru claritate). La rularea comenzii, este necesar ID-ul containerului care se dorește a fi monitorizat. 
- 
-=== Monitorizare de evenimente Docker === 
- 
-Dacă se dorește monitorizarea în timp real a unor evenimente Docker ce au loc pe mașina gazdă, se poate folosi comanda //docker system events//, așa cum se prezintă mai jos: 
- 
-<code bash> 
-$ docker system events 
- 
-# aceste evenimente se genereaza atunci cand oprim containerul myalpine2 
-2022-04-19T11:​57:​02.936639300+03:​00 container kill 97ab4376c5b7e0411abd33277d3ea6ec7e902bdc9af9826d3afe6ff8f9325249 (image=alpine,​ name=myalpine2,​ signal=15) 
-2022-04-19T11:​57:​12.977888700+03:​00 container kill 97ab4376c5b7e0411abd33277d3ea6ec7e902bdc9af9826d3afe6ff8f9325249 (image=alpine,​ name=myalpine2,​ signal=9) 
-2022-04-19T11:​57:​13.102094700+03:​00 container die 97ab4376c5b7e0411abd33277d3ea6ec7e902bdc9af9826d3afe6ff8f9325249 (exitCode=137,​ image=alpine,​ name=myalpine2) 
-2022-04-19T11:​57:​13.165242800+03:​00 network disconnect 56499229054c04a928960053276ea4bf37c12e575bcdafa522140c835372df62 (container=97ab4376c5b7e0411abd33277d3ea6ec7e902bdc9af9826d3afe6ff8f9325249,​ name=bridge,​ type=bridge) 
-2022-04-19T11:​57:​13.184247100+03:​00 container stop 97ab4376c5b7e0411abd33277d3ea6ec7e902bdc9af9826d3afe6ff8f9325249 (image=alpine,​ name=myalpine2) 
- 
-# acest eveniment se genereaza atunci cand stergem containerul myalpine2 
-2022-04-19T11:​57:​19.124295200+03:​00 container destroy 97ab4376c5b7e0411abd33277d3ea6ec7e902bdc9af9826d3afe6ff8f9325249 (image=alpine,​ name=myalpine2) 
- 
-# aceste evenimente se genereaza atunci cand pornim un container myalpine3 
-2022-04-19T11:​57:​40.002873200+03:​00 container create fc65cf12a86cf253127415d0b0dabf2399e9dbfa15315c106e3f3566a9b2aee3 (image=alpine,​ name=myalpine3) 
-2022-04-19T11:​57:​40.082728100+03:​00 network connect 56499229054c04a928960053276ea4bf37c12e575bcdafa522140c835372df62 (container=fc65cf12a86cf253127415d0b0dabf2399e9dbfa15315c106e3f3566a9b2aee3,​ name=bridge,​ type=bridge) 
-2022-04-19T11:​57:​40.449862600+03:​00 container start fc65cf12a86cf253127415d0b0dabf2399e9dbfa15315c106e3f3566a9b2aee3 (image=alpine,​ name=myalpine3) 
-</​code>​ 
- 
-În exemplul de mai sus, s-a pornit monitorizarea de evenimente într-un terminal, iar în celălalt terminal întâi s-a oprit containerul **myalpine2** creat anterior, apoi s-a șters, iar în final s-a creat un container **myalpine3**. 
- 
-Docker generează notificări pentru evenimente care au loc asupra containerelor,​ daemonului Docker, imaginilor, rețelelor virtuale, volumelor, etc. Este de asemenea posibilă filtrarea output-ului comenzii de mai sus în funcție de tipul de eveniment căutat, de un anumit container, etc.: 
- 
-<code bash> 
-$ docker system events -f event=die -f container=myalpine3 ​                           ​ 
- 
-2022-04-19T12:​01:​22.419370500+03:​00 container die fc65cf12a86cf253127415d0b0dabf2399e9dbfa15315c106e3f3566a9b2aee3 (exitCode=137,​ image=alpine,​ name=myalpine3) 
-</​code>​ 
- 
-=== Monitorizare folosind Prometheus === 
- 
-[[https://​prometheus.io|Prometheus]] este un toolkit open-source de monitorizare și alertare scris în Go, care colectează metrici prin citirea lor din endpoint-uri HTTP ale componentelor monitorizate (astfel de componente pot fi containere Docker, sau chiar Prometheus însuși). Oferă un model de date multi-dimensional,​ cu seriile de timp identificate prin-un nume de metrică și perechi cheie-valoare. Componentele monitorizate sunt descoperite prin servicii de descoperire (ca DNS, Consul, etc.) sau prin configurații statice. În plus, Prometheus oferă un limbaj de query funcțional numit PromQL, prin intermediul căruia se pot compune query-uri mai complexe. 
- 
-În mod implicit, Docker expune metrici pentru Prometheus pe portul 9323, ceea ce înseamnă că o instanță de Prometheus poate monitoriza runtime-ul de Docker de pe un nod. 
- 
-<note important>​Această opțiune este încă în stadiu experimental pentru MacOS, așa că este nevoie să se adauge linia //"​metrics-addr"​ : "​0.0.0.0:​9323"//​ în setările avansate de daemon Docker din Docker Desktop.</​note>​ 
- 
-În general, metricile unei componente care expune date pentru Prometheus se găsesc la un endpoint numit **metrics**,​ și așa este cazul și pentru Docker, care expune datele pentru Prometheus la adresa [[http://​localhost:​9323/​metrics]]. Acolo se pot observa toate metricile expuse de Docker, iar pașii pentru a vizualiza datele de monitorizare folosind Prometheus sunt descriși în continuare. 
- 
-Așa cum s-a specificat și mai sus, Prometheus se poate auto-monitoriza. Pentru acest lucru, sunt necesare două componente. În primul rând, este necesar un fișier YAML prin care se setează componentele care se doresc a fi monitorizate,​ precum și modul în care acestea sunt descoperite pe rețea. Pentru a monitoriza Docker și Prometheus, putem folosi următorul fișier de configurare (pe care îl puteți găsi în repository-ul [[https://​gitlab.com/​mobylab-idp/​laborator-7/​configs|Configs]] la calea **prometheus/​prometheus.yml**):​ 
- 
-<code yaml> 
-scrape_configs:​ 
-  - job_name: '​prometheus'​ 
-    scrape_interval:​ 5s 
-    static_configs:​ 
-      - targets: ['​prometheus:​9090'​] 
- 
-  - job_name: '​docker'​ 
-    scrape_interval:​ 5s 
-    static_configs:​ 
-      - targets: ['​host.docker.internal:​9323'​] 
-</​code>​ 
- 
-În fișierul de mai sus, se creează două job-uri de monitorizare:​ 
-  * unul denumit **prometheus**,​ care va colecta date din endpoint-ul HTTP la 5 secunde, de pe interfața serviciului de Prometheus care va fi pornit pe portul 9090 
-  * unul denumit **docker**, care va colecta date din endpoint-ul HTTP tot la 5 secunde, de pe interfața gazdei Docker pe care se rulează (**host.docker.internal** se rezolvă la adresa IP internă a gazdei). 
- 
-Vom rula Prometheus ca un serviciu Docker prin intermediul unui fișier Docker Compose (pe care îl puteți găsi în repository-ul [[https://​gitlab.com/​mobylab-idp/​laborator-7/​docker|Docker]] cu numele **prometheus-stack.yml**),​ care conține următorul serviciu: 
- 
-<code yaml> 
-prometheus: 
-    image: prom/​prometheus 
-    volumes: 
-        - ./​configs/​prometheus/​prometheus.yml:/​etc/​prometheus/​prometheus.yml 
-    ports: 
-        - 9090:9090 
-</​code>​ 
- 
-Odată ce facem deployment-ul pe baza acestui fișier de Compose (așa cum am studiat în [[https://​ocw.cs.pub.ro/​courses/​idp/​laboratoare/​03|laboratorul 3]]), la adresa [[http://<​IP>:​9090/​graph]] se va găsi dashboard-ul Prometheus (prezentat mai jos, unde se pot vedea datele monitorizate și se pot adăuga grafice noi), iar la [[http://<​IP>:​9090/​targets]] se vor găsi componentele monitorizate. De asemenea, ca la Docker, la [[http://<​IP>:​9090/​metrics]] se pot găsi toate metricile generate de Prometheus. 
- 
-<note important>​În URL-urile de mai sus, **<​IP>​** se referă la adresa externă a unui nod din cluster-ul Docker (sau **localhost**,​ dacă rulăm local).</​note>​ 
- 
-{{:​idp:​laboratoare:​prom_dashboard.png?​800|}} 
idp/laboratoare/07.1650360783.txt.gz · Last modified: 2022/04/19 12:33 by radu.ciobanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0