Què és Prometeu i per què el necessites?
Prometheus és un potent sistema de monitorització que recopila i processa dades numèriques (mètriques) d'aplicacions. T'ajuda a fer un seguiment d'indicadors clau com ara:
- El nombre de peticions gestionades pel vostre servei.
- El temps de resposta per a cada sol·licitud.
- Ús de memòria i CPU.
- El nombre d'errors que es produeixen al sistema.
Mitjançant l'ús de Prometheus, podeu respondre preguntes crítiques com:
"El meu servei funciona de manera eficient?"
"Quins són els colls d'ampolla del rendiment?"
"Hem d'augmentar la nostra infraestructura?"
I com recull Prometheus mètriques?
Hi ha dues maneres principals en què Prometheus recopila dades:
- Model d'extracció : Prometheus consulta activament els serveis per les seves mètriques.
- Model Push (Pushgateway) : els serveis transmeten les seves mètriques a un intermediari, que Prometheus recull.
Anem a trencar-los.
Model de tirada
En el model d'extracció , Prometheus obté mètriques de manera activa de la vostra aplicació mitjançant HTTP (p. ex., http://your-service:8080/metrics
).
Aquest és el mètode predeterminat i el més utilitzat.
Configuració de Prometheus amb Golang (model pull)
Instal·leu les biblioteques necessàries:
go get github.com/prometheus/client_golang/prometheus go get github.com/prometheus/client_golang/prometheus/promhttp
Definiu les vostres mètriques (p. ex., comptant les sol·licituds HTTP):
import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" ) var httpRequestsTotal = promauto.NewCounter(prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests", })
Exposa un punt final
/metrics
:import ( "net/http" "github.com/prometheus/client_golang/prometheus/promhttp" ) func main() { http.Handle("/metrics", promhttp.Handler()) }
Configureu Prometheus per esborrar mètriques del vostre servei a
prometheus.yml
:scrape_configs: - job_name: "example_service" static_configs: - targets: ["localhost:8080"]
Ara, Prometheus consultarà automàticament http://localhost:8080/metrics
cada pocs segons per recollir dades.
Per què es prefereix el model Pull?
- Simplicitat : Prometheus controla el programa i la freqüència de raspat.
- Menys punts d'error : no cal un servei addicional per rebre mètriques.
- Neteja automàtica : si un servei deixa de respondre, Prometheus simplement deixa de rebre dades, evitant mètriques obsoletes.
Model Push (Enfocament Pushgateway)
En el model push , un servei envia les seves mètriques a un servei intermediari anomenat Pushgateway , que les emmagatzema fins que Prometheus les recupera.
Com funciona (model push)
La vostra aplicació envia mètriques a Pushgateway:
import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/push" ) func main() { registry := prometheus.NewRegistry() jobCounter := prometheus.NewCounter(prometheus.CounterOpts{ Name: "job_execution_count", Help: "Number of executed jobs", }) registry.MustRegister(jobCounter) jobCounter.Inc() err := push.New("http://localhost:9090", "my_service_or_job"). Collector(jobCounter). Grouping("instance", "worker_1"). Push() if err != nil { panic(err) } }
Configura Prometheus per recopilar dades de Pushgateway:
scrape_configs: - job_name: "pushgateway" static_configs: - targets: ["localhost:9091"]
Quan és realment útil el model Push?
- Feines de curta durada (tasques per lots, tasques de cron) que es completen abans que Prometheus pugui rascar-les.
- Restriccions de xarxa on Prometheus no pot accedir directament al servei.
- Fonts de dades externes (dispositius IoT, API externes) que no es poden eliminar directament.
Quin model hauríeu d'utilitzar?
Mètode | El millor per... | Pros | Contres |
---|---|---|---|
Tirar (recomanat) | Serveis web, API, aplicacions de llarga durada | Configuració senzilla, menys dependències, neteja automàtica | No apte per a tasques de molt curta durada |
Push (Pushgateway) | Treballs per lots, tasques sense accés estable a la xarxa | Permet enviar dades de feines de curta durada | Dades obsoletes, complexitat addicional, risc de colls d'ampolla |
Per què el model Push no és ideal?
Tot i que Pushgateway resol alguns problemes (per exemple, processos de curta durada que finalitzen abans que Prometheus els raspegi), introdueix diversos problemes nous :
- Difícil de gestionar les dades obsoletes
Si un servei mor, les seves mètriques antigues romanen a Pushgateway.
Prometheus no té manera de saber si el servei encara funciona.
Heu de suprimir manualment mètriques obsoletes mitjançant
push.Delete(...)
o configurar polítiques de caducitat.
- Complexitat addicional
En lloc d'un enllaç directe Servei → Prometheus , ara teniu Servei → Pushgateway → Prometheus .
Pushgateway és una dependència addicional que augmenta la sobrecàrrega de manteniment.
- Potencials colls d'ampolla
Si molts serveis impulsen mètriques amb freqüència, Pushgateway es pot desbordar.
A diferència dels raspats directes de Prometheus (que distribueixen la càrrega), totes les sol·licituds arriben a una única instància Pushgateway.
- Problemes de coherència de les dades
- Si diversos serveis transmeten mètriques amb el mateix nom però amb valors diferents, les dades es poden sobreescriure i es poden produir resultats incorrectes.
Conclusió
Prometheus és una eina potent i fiable per al seguiment dels serveis. Per a la majoria d'aplicacions, el model d'extracció és la millor opció: és senzill, eficient i garanteix dades noves sense complexitat addicional. Tanmateix, si treballeu amb processos de curta durada, com ara funcions Lambda o treballs per lots, el model push mitjançant Pushgateway pot ser útil per capturar mètriques abans que el procés surti.
L'elecció de l'enfocament adequat garanteix una millor observabilitat i manteniment del vostre sistema.
Cuida't!