ЁЯУИ рдзрдбрд╛ 07 тАФ Prometheus рдЖрдгрд┐ Grafana: scrape рдХрд░рд╛, рд╕рд╛рдард╡рд╛, рд╡рд┐рдЪрд╛рд░рд╛, рдХрд╛рдврд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 07 ┬╖ рдорд╛рдЧреЗ: lesson-06-opentelemetry ┬╖ рдкреБрдвреЗ: lesson-08-alerting
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ06, рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдд рдкреНрд░рдЪрд▓рд┐рдд open-source metrics stack: Prometheus (scrape рдХрд░рдгреЗ рдЖрдгрд┐
рд╕рд╛рдард╡рдгреЗ, PromQL рдиреЗ рд╡рд┐рдЪрд╛рд░рдгреЗ) рдЖрдгрд┐ Grafana (рдЪрд┐рддреНрд░ рдХрд╛рдврдгреЗ). рддреБрдореНрд╣реА pull model,
scrape interval, rate() рд╣реЗ рддреБрдореНрд╣реА type рдХрд░рддрд╛ рддреЗ рдкрд╣рд┐рд▓реЗ function рдХрд╛ рдЕрд╕рддреЗ, recording rules,
рдЖрдгрд┐ Alertmanager рдЪреА рдкрд╣рд┐рд▓реА рдУрд│рдЦ рд╢рд┐рдХрддрд╛. obs/signals.py рдордзреАрд▓ rate()
counter reset Prometheus рдкреНрд░рдорд╛рдгреЗрдЪ рд╣рд╛рддрд╛рд│рддреЗ; obs/demo.py рдордзреАрд▓
prometheus() рддреЗ рдЖрдгрд┐ рд░реЛрдЬрдЪреНрдпрд╛ рддреАрди queries рджрд╛рдЦрд╡рддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдХрддрд░рд┐рдирд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧрд╛рдд рдмрд╕реВ рд╢рдХрдд рдирд╛рд╣реА. рдореНрд╣рдгреВрди рджрд░ 15 рд╕реЗрдХрдВрджрд╛рдВрдиреА рддрд┐рдЪреА рдорджрддрдиреАрд╕ clipboard ЁЯУЛ рдШреЗрдКрди рд╡реНрд╣рд░рд╛рдВрдбреНрдпрд╛рддреВрди рдлрд┐рд░рддреЗ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧрд╛рдЪреНрдпрд╛ рджрд╛рд░рд╛рд╡рд░рдЪрд╛ рдореЛрдЬрдгреА рдХрд╛рдЧрдж рд╡рд╛рдЪрддреЗ. рддреА рдЖрдХрдбрд╛ рдЖрдгрд┐ рд╡реЗрд│ рд▓рд┐рд╣реВрди рдШреЗрддреЗ. рд╣реЗ рдореНрд╣рдгрдЬреЗ pulling: рдорджрддрдиреАрд╕ рдЦреЛрд▓реНрдпрд╛рдВрдХрдбреЗ рдЬрд╛рддреЗ; рдЦреЛрд▓реНрдпрд╛рдВрдирд╛ рдХрд╛рд╣реАрд╣реА рдкрд╛рдард╡рд╛рд╡реЗ рд▓рд╛рдЧрдд рдирд╛рд╣реА. рдПрдЦрд╛рджреНрдпрд╛ рджрд╛рд░рд╛рд╡рд░ рдХрд╛рдЧрджрдЪ рдирд╕реЗрд▓, рдХрд┐рдВрд╡рд╛ рдЦреЛрд▓реАрд▓рд╛ рдХреБрд▓реВрдк рдЕрд╕реЗрд▓, рддрд░ рдорджрддрдиреАрд╕ рддреЗрд╣реА рдиреЛрдВрджрд╡рддреЗ тАФ рд╣рд░рд╡рд▓реЗрд▓реА рдЦреЛрд▓реА рд╣реА рд╕реБрджреНрдзрд╛ рдмрд╛рддрдореА рдЕрд╕рддреЗ.
рдПрдХрд╛ рд╕рдХрд╛рд│реА 3A рдЪрд╛ рдореЛрдЬрдгреА рдХрд╛рдЧрдж 2,200 рд╡рд░реВрди 150 рд╡рд░ рдЬрд╛рддреЛ. 2,050 рд╡рд┐рджреНрдпрд╛рд░реНрдереА рдирд┐рдШреВрди рдЧреЗрд▓реЗ рдХрд╛? рдирд╛рд╣реА тАФ рдХрд╛рдЧрдж рдЦрд╛рд▓реА рдкрдбрд▓рд╛ рдЖрдгрд┐ рдирд╡рд╛ рдХрд╛рдЧрдж рд╢реВрдиреНрдпрд╛рдкрд╛рд╕реВрди рд╕реБрд░реВ рдЭрд╛рд▓рд╛. рд╣реБрд╢рд╛рд░ рдорджрддрдиреАрд╕рд▓рд╛ рдорд╛рд╣реАрдд рдЕрд╕рддреЗ рдХреА рдореЛрдЬрдгреА рдХрдзреАрдЪ рдХрдореА рд╣реЛрдд рдирд╛рд╣реА, рдореНрд╣рдгреВрди рддреА рддреНрдпрд╛ 150 рдЦреБрдгрд╛ рдирд╡реНрдпрд╛ рдореНрд╣рдгреВрди рдореЛрдЬрддреЗ.
рдордЧ рджреАрдкрд┐рдХрд╛ рдПрдХрд╛ рдЫреЛрдЯреНрдпрд╛, рдиреЗрдордХреНрдпрд╛ рднрд╛рд╖реЗрдд рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рддреЗ: "рдЧреЗрд▓реНрдпрд╛ 5 рдорд┐рдирд┐рдЯрд╛рдВрдд, рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧрд╛рд╕рд╛рдареА, рджрд░ рд╕реЗрдХрдВрджрд╛рд▓рд╛ рдХрд┐рддреА рдЦреБрдгрд╛?" рдЖрдгрд┐ рдЙрддреНрддрд░реЗ рд╢рд┐рдХреНрд╖рдХ рдХрдХреНрд╖рд╛рддрд▓реНрдпрд╛ рдПрдХрд╛ рдореЛрдареНрдпрд╛ рдлрд▓рдХрд╛рд╡рд░ рд░реЗрд╖рд╛ рдореНрд╣рдгреВрди рдХрд╛рдврд▓реА рдЬрд╛рддрд╛рдд тАФ рддреЛ рдлрд▓рдХ рдореНрд╣рдгрдЬреЗ Grafana.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
subgraph targets["ЁЯОп targets (each serves /metrics)"]
a1["results-api pod 1"]
a2["results-api pod 2"]
end
p["ЁЯФе Prometheus<br/>scrape every 15 s (pull)<br/>TSDB ┬╖ rules"]
p -->|"GET /metrics"| a1
p -->|"GET /metrics"| a2
g["ЁЯУК Grafana<br/>dashboards"] -->|"PromQL"| p
p -->|"firing alerts"| am["ЁЯЪи Alertmanager<br/>group ┬╖ route ┬╖ silence"]
r["counter: 1000, 1600, 2200, 150 (restart), 750<br/>rate() = 8.1/s тАФ not negative"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/observability/lesson-diagrams.html#l07
тЭУ рдХрд╛рдп
- Prometheus тАФ рдПрдХ open-source metrics system (рдПрдХ CNCF project): рддреЗ targets scrape рдХрд░рддреЗ, samples рд╕реНрд╡рддрдГрдЪреНрдпрд╛ time-series database (TSDB) рдордзреНрдпреЗ рд╕рд╛рдард╡рддреЗ, rules evaluate рдХрд░рддреЗ, рдЖрдгрд┐ PromQL queries рдЪреА рдЙрддреНрддрд░реЗ рджреЗрддреЗ.
- Pull model тАФ Prometheus рдард░рд▓реЗрд▓реНрдпрд╛ рд╡реЗрд│рд╛рдкрддреНрд░рдХрд╛рдиреБрд╕рд╛рд░ рдкреНрд░рддреНрдпреЗрдХ target рдХрдбреВрди
GET /metricsрдЖрдгрддреЗ. Targets static lists рдХрд┐рдВрд╡рд╛ service discovery (Kubernetes, EC2, ConsulтАж) рдордзреВрди рдпреЗрддрд╛рдд. рдкреНрд░рддреНрдпреЗрдХ target рд╕рд╛рдареА Prometheusupрд╕реБрджреНрдзрд╛ рдиреЛрдВрджрд╡рддреЗ (1 = scrape рдЪрд╛рд▓рд▓рд╛, 0 = рдЕрдпрд╢рд╕реНрд╡реА), рдореНрд╣рдгреВрди рдмрдВрдж рдкрдбрд▓реЗрд▓рд╛ target рд╣рд╛рдЪ рдПрдХ signal рдЕрд╕рддреЛ. рджреЛрди scrapes рджрд░рдореНрдпрд╛рди рд╕рдВрдкрдгрд╛рд░реЗ рдЫреЛрдЯреЗ batch jobs рддреНрдпрд╛рдРрд╡рдЬреА Pushgateway рдХрдбреЗ push рдХрд░рддрд╛рдд. - Scrape interval тАФ рдкреНрд░рддреНрдпреЗрдХ target рдХрд┐рддреА рд╡реЗрд│рд╛ рд╡рд╛рдЪрд▓рд╛ рдЬрд╛рддреЛ; рд╕рд╣рд╕рд╛ 15тАУ60 s (built-in default 1 рдорд┐рдирд┐рдЯ рдЖрд╣реЗ). рджреЛрди scrapes рджрд░рдореНрдпрд╛рди рдШрдбреВрди рд╕рдВрдкрдгрд╛рд░реА рдХреЛрдгрддреАрд╣реА рдЧреЛрд╖реНрдЯ gauge рд▓рд╛ рджрд┐рд╕рдд рдирд╛рд╣реА; counter рдорд╛рддреНрд░ рддреА рдореЛрдЬрддреЛрдЪ.
- Instant vector рд╡рд┐рд░реБрджреНрдз range vector тАФ
http_requests_totalрдореНрд╣рдгрдЬреЗ рдкреНрд░рддреНрдпреЗрдХ series рдЪреА рд╕рд░реНрд╡рд╛рдд рдирд╡реА рдХрд┐рдВрдордд;http_requests_total[5m]рдореНрд╣рдгрдЬреЗ рдЧреЗрд▓реНрдпрд╛ 5 рдорд┐рдирд┐рдЯрд╛рдВрдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ sample. rate(counter[5m])тАФ range рдордзрд▓реА рджрд░ рд╕реЗрдХрдВрджрд╛рдЪреА рд╕рд░рд╛рд╕рд░реА рд╡рд╛рдв. рддреЗ counter resets рд╣рд╛рддрд╛рд│рддреЗ: рдХрд┐рдВрдордд рдХрдореА рдЭрд╛рд▓реА, рддрд░ Prometheus рдорд╛рдирддреЛ рдХреА process restart рдЭрд╛рд▓реА рдЖрдгрд┐ рдирд╡реА рдХрд┐рдВрдордд рд╢реВрдиреНрдпрд╛рдкрд╛рд╕реВрдирдЪреА рд╡рд╛рдв рдореНрд╣рдгреВрди рдореЛрдЬрддреЛ. рддреЗ range рдЪреНрдпрд╛ рдХрдбрд╛рдВрдкрд░реНрдпрдВрдд extrapolate рд╕реБрджреНрдзрд╛ рдХрд░рддреЗ. Scrape interval рдЪреНрдпрд╛ рдХрд┐рдорд╛рди 4├Ч range рд╡рд╛рдкрд░рд╛.increase()рд╣реЗрдЪ range рдордзрд▓реНрдпрд╛ рдПрдХреВрдг рд╡рд╛рдвреАрдЪреНрдпрд╛ рд░реВрдкрд╛рдд рджреЗрддреЗ;irate()рдлрдХреНрдд рд╢реЗрд╡рдЯрдЪреЗ рджреЛрди samples рд╡рд╛рдкрд░рддреЗ (рдЙрдбреНрдпрд╛ рдорд╛рд░рдгрд╛рд░реЗ тАФ zoom рдХреЗрд▓реЗрд▓реНрдпрд╛ graphs рд╕рд╛рдареА, alerts рд╕рд╛рдареА рдирд╛рд╣реА).- рдЖрдзреА rate, рдордЧ sum тАФ
sum(rate(x[5m])), рдХрдзреАрдЪrate(sum(x)[5m])рдирд╛рд╣реА: рдЖрдзреА рдмреЗрд░реАрдЬ рдХреЗрд▓реА рддрд░ рдПрдХрд╛ pod рдЪрд╛ reset рдЗрддрд░рд╛рдВрдЪреНрдпрд╛ рдПрдХреВрдг рдЖрдХрдбреНрдпрд╛рдд рд▓рдкреВрди рдЬрд╛рддреЛ. - рджрд░ рдЖрдард╡рдбреНрдпрд╛рд▓рд╛ рддреБрдореНрд╣реА type рдХрд░рд╛рд▓ рддреЗ PromQL:
sum by (status) (rate(http_requests_total[5m]))тАФ status рдиреБрд╕рд╛рд░ рджрд░ рд╕реЗрдХрдВрджрд╛рдЪреНрдпрд╛ requests;sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))тАФ error ratio;histogram_quantile(0.99, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))тАФ p99, pods рдордзреВрди рдПрдХрддреНрд░ рдХрд░реВрди (рдзрдбрд╛ 04).
- Recording rules тАФ Prometheus рдард░рд▓реЗрд▓реНрдпрд╛ рд╡реЗрд│рд╛рдкрддреНрд░рдХрд╛рдиреБрд╕рд╛рд░ рдЪрд╛рд▓рд╡реВрди рдирд╡реНрдпрд╛ series рдореНрд╣рдгреВрди рд╕рд╛рдард╡рддреЛ рдЕрд╢рд╛ queries,
рдЬрд╕реЗ
job:http_errors:ratio_rate5m. рдордЧ dashboards рдЖрдгрд┐ alerts рдорд╣рд╛рдЧрдбреА query рдкреБрдиреНрд╣рд╛ рдореЛрдЬрдгреНрдпрд╛рдРрд╡рдЬреА рдПрдХ рд╕реНрд╡рд╕реНрдд series рд╡рд╛рдЪрддрд╛рдд. рдирд╛рд╡рд╛рдЪреА рдкрджреНрдзрдд:level:metric:operations. - Alerting rules рдЖрдгрд┐ Alertmanager тАФ Prometheus alert rules evaluate рдХрд░рддреЛ; рд╡рд╛рдЬрдгрд╛рд░реЗ alerts Alertmanager рдХрдбреЗ рдЬрд╛рддрд╛рдд, рдЬреЛ рддреНрдпрд╛рдВрдирд╛ group рдХрд░рддреЛ, route рдХрд░рддреЛ (page, chat, ticket), рдореЛрдард╛ alert рд╡рд╛рдЬрдд рдЕрд╕рддрд╛рдирд╛ рд▓рд╣рд╛рди alerts inhibit рдХрд░рддреЛ, рдЖрдгрд┐ рдард░рд╡рд▓реЗрд▓реНрдпрд╛ рдХрд╛рдорд╛рджрд░рдореНрдпрд╛рди silences рдареЗрд╡рддреЛ (рдзрдбрд╛ 08).
- Grafana тАФ dashboard tool. рддреЗ data sources (Prometheus, Loki, Tempo, CloudWatch, DatadogтАж) рд╡рд╛рдЪрддреЗ рдЖрдгрд┐ panels рдХрд╛рдврддреЗ. Variables (services рдЪрд╛ drop-down) рдЖрдгрд┐ annotations (рдкреНрд░рддреНрдпреЗрдХ deploy рд╡реЗрд│реА рдкреНрд░рддреНрдпреЗрдХ graph рд╡рд░ рдПрдХ рд░реЗрд╖рд╛ тАФ рдзрдбрд╛ 11) рдпрд╛рдВрдореБрд│реЗ рдПрдХрдЪ dashboard рдЕрдиреЗрдХ services рд╕рд╛рдареА рдЪрд╛рд▓рддреЛ.
- Long-term storage тАФ рдПрдХ Prometheus local disk рд╡рд░ рдХрд╛рд╣реА рдЖрдард╡рдбреЗ рдареЗрд╡рддреЛ. рдЬрд╛рд╕реНрдд рдХрд╛рд│рд╛рд╕рд╛рдареА, Thanos, Grafana Mimir, рдХрд┐рдВрд╡рд╛ Amazon Managed Service for Prometheus рд╕рд╛рд░рдЦреНрдпрд╛ managed services рдХрдбреЗ remote write рд╡рд╛рдкрд░рд╛.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг counter рдЪреА рдХрдЪреНрдЪреА рдХрд┐рдВрдордд graph рд╡рд░ рдирд┐рд░реБрдкрдпреЛрдЧреА рдЕрд╕рддреЗ тАФ рддреА рдлрдХреНрдд рдЪрдврдд рдЬрд╛рддреЗ тАФ рдЖрдгрд┐ рд╕рд╛рдзреЗ
"рд╢реЗрд╡рдЯрдЪреЗ рд╡рдЬрд╛ рдкрд╣рд┐рд▓реЗ" рдкреНрд░рддреНрдпреЗрдХ restart рд▓рд╛ рдореЛрдбрддреЗ (deploy рдкреНрд░рддреНрдпреЗрдХ pod restart рдХрд░рддреЛ). rate()
counter рдЪреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рд╣рд╡реНрдпрд╛ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЖрдХрдбреНрдпрд╛рдд рд░реВрдкрд╛рдВрддрд░ рдХрд░рддреЗ, "рджрд░ рд╕реЗрдХрдВрджрд╛рд▓рд╛, рдЖрддреНрддрд╛", рдЖрдгрд┐ restarts рдордзреВрди рдЯрд┐рдХрддреЗ. Pull model рдореБрд│реЗ
рдХреЛрдгрддреЗ targets рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗрдд рд╣реЗ monitoring system рд▓рд╛ рдорд╛рд╣реАрдд рдЕрд╕рддреЗ, рдореНрд╣рдгреВрди рд╢рд╛рдВрддрддреЗрдорд╛рдЧреЗ
рдмрдВрдж рдкрдбрд▓реЗрд▓реА service рд▓рдкреВ рд╢рдХрдд рдирд╛рд╣реА.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
obs/signals.py рдордзреАрд▓ rate(samples) [(time, value), тАж] рдШреЗрддреЗ, рд╢реЗрдЬрд╛рд░рдЪреНрдпрд╛
samples рдордзрд▓реА рд╡рд╛рдв рдмреЗрд░реАрдЬ рдХрд░рддреЗ тАФ рдЖрдгрд┐ рдПрдЦрд╛рджреА рдХрд┐рдВрдордд рдХрдореА рдЭрд╛рд▓реА, рддрд░ рдЛрдг рдЖрдХрдбреНрдпрд╛рдРрд╡рдЬреА рдирд╡реА рдХрд┐рдВрдордд
(restart рдирдВрддрд░рдЪреА рдореЛрдЬрдгреА) рдЬреЛрдбрддреЗ тАФ рдордЧ рддреА рдЭрд╛рдХрд▓реЗрд▓реНрдпрд╛ рд╡реЗрд│реЗрдиреЗ рднрд╛рдЧрддреЗ. (рдЦрд░рд╛ Prometheus range рдЪреНрдпрд╛
рдХрдбрд╛рдВрдкрд░реНрдпрдВрдд extrapolate рд╕реБрджреНрдзрд╛ рдХрд░рддреЛ, рдореНрд╣рдгреВрди рддреНрдпрд╛рдЪреЗ рдЖрдХрдбреЗ рдереЛрдбреЗ рдЬрд╛рд╕реНрдд рдЕрд╕реВ рд╢рдХрддрд╛рдд.) prometheus() рддреНрдпрд╛рд▓рд╛
рджрд░ 60 s рд▓рд╛ scrape рдХреЗрд▓реЗрд▓рд╛ рдЖрдгрд┐ 180 s рд▓рд╛ restart рдЭрд╛рд▓реЗрд▓рд╛ counter рджреЗрддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
рд╢реВрдиреНрдп, рдПрдХ рдЖрдгрд┐ рджреЛрди restarts рдордзреВрди rate() рдЪреА рд╕рд╛рдзреНрдпрд╛ "(last тИТ first) / time" рд╢реА рддреБрд▓рдирд╛ рдХрд░рд╛:
python3 obs/demo.py prometheus
python3 - <<'EOF'
import sys; sys.path.insert(0, "obs"); from signals import rate
calm = [(0, 1000), (60, 1600), (120, 2200), (180, 2800), (240, 3400)]
restart = [(0, 1000), (60, 1600), (120, 2200), (180, 150), (240, 750)]
two = [(0, 1000), (60, 1600), (120, 100), (180, 700), (240, 50)]
for name, s in (("no restart", calm), ("one restart", restart), ("two restarts", two)):
naive = (s[-1][1] - s[0][1]) / (s[-1][0] - s[0][0])
print(f"{name:<13} rate() {rate(s):5.1f}/s ┬╖ naive (last - first) / time {naive:6.1f}/s")
EOF
python3 obs/test_obs.py
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
prometheus рд╣реЗ print рдХрд░рддреЗ:
тФАтФА a counter scraped every 60 s: [(0, 1000), (60, 1600), (120, 2200), (180, 150), (240, 750)] тАФ the app restarted at 180 s
rate over 4 min = 8.1 requests/s (the reset is handled, not a negative spike)
тФАтФА PromQL you will type every week:
sum by (status) (rate(http_requests_total[5m]))
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
histogram_quantile(0.99, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
Prometheus PULLS /metrics every 15тАУ60 s and stores series ┬╖ Grafana draws them ┬╖ recording rules pre-compute
рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:
no restart rate() 10.0/s ┬╖ naive (last - first) / time 10.0/s
one restart rate() 8.1/s ┬╖ naive (last - first) / time -1.0/s
two restarts rate() 5.6/s ┬╖ naive (last - first) / time -4.0/s
Tests рдордзреНрдпреЗ тЬЕ L07 rate() survives a counter reset рдЕрд╕рддреЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
Restart рдирд╕рддрд╛рдирд╛ рджреЛрдиреНрд╣реА рдкрджреНрдзрддреА рдЬреБрд│рддрд╛рдд (рджрд░ рд╕реЗрдХрдВрджрд╛рд▓рд╛ 10 requests). рдПрдХрд╛ restart рд╕рд╣ рд╕рд╛рдзреА
рдкрджреНрдзрдд рджрд░ рд╕реЗрдХрдВрджрд╛рд▓рд╛ тИТ1 рд╕рд╛рдВрдЧрддреЗ тАФ counter рд╕рд╛рдареА рдЕрд╢рдХреНрдп тАФ рддрд░ rate() 8.1 рд╕рд╛рдВрдЧрддреЗ:
240 s рдордзреНрдпреЗ 600 + 600 + 150 + 600 = 1,950 requests. Reset рдирдВрддрд░рдЪреЗ 150 рдирд╡реНрдпрд╛
requests рдореНрд╣рдгреВрди рдореЛрдЬрд▓реЗ рдЧреЗрд▓реЗ. рджреЛрди restarts: рд╕рд╛рдзреА рдкрджреНрдзрдд тИТ4.0, rate() 5.6. рдкреНрд░рддреНрдпреЗрдХ deploy рдореНрд╣рдгрдЬреЗ restart, рдореНрд╣рдгреВрди рд╣реЗ
рджрд░ рдЖрдард╡рдбреНрдпрд╛рд▓рд╛ рдШрдбрддреЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
rate()рд╢рд┐рд╡рд╛рдпhttp_requests_totalgraph рдХрд░рдгреЗ- 15 s scrape рд╕рд╣
rate(x[30s])тАФ рдЦреВрдк рдХрдореА samples; interval рдЪреНрдпрд╛ рдХрд┐рдорд╛рди 4├Ч рд╡рд╛рдкрд░рд╛ sum(rate(...))рдРрд╡рдЬреАrate(sum(...))- summed buckets рд╡рд░рдЪреНрдпрд╛
histogram_quantileрдРрд╡рдЬреА panel рдордзреНрдпреЗ p99s рдЪреА рд╕рд░рд╛рд╕рд░реА рдХрд╛рдврдгреЗ - 60 panels рдЕрд╕рд▓реЗрд▓рд╛ рдЖрдгрд┐ рдПрдХрд╣реА рдкреНрд░рд╢реНрди рдирд╕рд▓реЗрд▓рд╛ dashboard тАФ рдкреНрд░рддреНрдпреЗрдХ service рд╕рд╛рдареА RED (rate, errors, duration) рдиреЗ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рд╛
- рдкреБрдврдЪреНрдпрд╛ scrape рдЖрдзреАрдЪ рд╕рдВрдкрдгрд╛рд░реЗ рдЕрд▓реНрдкрд╛рдпреБрд╖реА jobs scrape рдХрд░рдгреЗ (Pushgateway рдХрд┐рдВрд╡рд╛ OTLP push рд╡рд╛рдкрд░рд╛)
- рдорд╣рддреНрддреНрд╡рд╛рдЪреНрдпрд╛ targets рд╕рд╛рдареА, рдХрд┐рдВрд╡рд╛ Prometheus рд╕рд╛рдареАрдЪ,
up == 0рд╡рд░ alert рдирд╛рд╣реА
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
On a real account тАФ static target, Kubernetes pod discovery,
rule files рдЖрдгрд┐ Alertmanager рд╕рд╣ prometheus.yml:
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files: ["rules/*.yml"]
alerting:
alertmanagers:
- static_configs:
- targets: ["alertmanager:9093"]
scrape_configs:
- job_name: results-api
static_configs:
- targets: ["results-api:8000"]
- job_name: kubernetes-pods
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: "true"
Recording rules (rules/results-api.yml) тАФ error ratio рдЖрдгрд┐ p99 рдПрдХрджрд╛рдЪ рдЖрдзреА рдореЛрдЬреВрди рдареЗрд╡рд╛:
groups:
- name: results-api-recording
rules:
- record: job:http_requests:rate5m
expr: sum by (job) (rate(http_requests_total[5m]))
- record: job:http_errors:ratio_rate5m
expr: |
sum by (job) (rate(http_requests_total{status=~"5.."}[5m]))
/
sum by (job) (rate(http_requests_total[5m]))
- record: job:http_request_duration_seconds:p99_5m
expr: histogram_quantile(0.99, sum by (job, le) (rate(http_request_duration_seconds_bucket[5m])))
Files load рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рддрдкрд╛рд╕рд╛, рдЖрдгрд┐ рдереЗрдЯ HTTP API рд▓рд╛ рд╡рд┐рдЪрд╛рд░рд╛:
promtool check config prometheus.yml
promtool check rules rules/results-api.yml
curl -s 'http://prometheus:9090/api/v1/query' --data-urlencode 'query=job:http_errors:ratio_rate5m'
Grafana тАФ provisioning file рдиреЗ Prometheus data source рдореНрд╣рдгреВрди рдЬреЛрдбрд╛
(provisioning/datasources/prometheus.yml), рдордЧ $job variable (label_values(up, job)) рдЖрдгрд┐
рддреАрди recorded series рд╡рд░рдЪреНрдпрд╛ panels рд╕рд╣ рдПрдХ RED dashboard рдмрдирд╡рд╛:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
ЁЯПн Production рдордзреНрдпреЗ рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдХреЛрдгреАрд╣реА custom dashboard design рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА, рдкреНрд░рддреНрдпреЗрдХ service рд▓рд╛ рддреЛрдЪ рдкрд╣рд┐рд▓рд╛ dashboard рджреНрдпрд╛ тАФ рджрд░ рд╕реЗрдХрдВрджрд╛рдЪреНрдпрд╛ requests, error ratio, p99, recording rules рдордзреВрди. Incident рджрд░рдореНрдпрд╛рди, рдУрд│рдЦреАрдЪрд╛ dashboard рд╣рд╛рдЪ рдЬрд▓рдж рдЕрд╕рддреЛ.
тПня╕П рдкреБрдвреЗ
Graphs рдХрд╛рдврд▓реЗ рдЖрд╣реЗрдд. рдкрд╣рд╛рдЯреЗ 3 рд╡рд╛рдЬрддрд╛ рдХреЛрдгреАрд╣реА graphs рдкрд╛рд╣рдд рдирд╛рд╣реА. Alarm рдиреЗ рдХрдзреА рдХреЛрдгрд╛рд▓рд╛ рдЙрдард╡рд╛рд╡реЗ тАФ рдЖрдгрд┐ рдХрдзреА рд╢рд╛рдВрдд рд░рд╛рд╣рд┐рд▓реЗрдЪ рдкрд╛рд╣рд┐рдЬреЗ?
git checkout lesson-08-alerting