ЁЯРд рдзрдбрд╛ 05 тАФ Release engineering: canary рдЪрд╛ рдирд┐рд░реНрдгрдп рдЖрдХрдбреНрдпрд╛рдВрд╡рд░реВрди рдШреНрдпрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 05 ┬╖ рдорд╛рдЧреЗ: lesson-04-on-call ┬╖ рдкреБрдвреЗ: lesson-06-progressive-delivery
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рднрд╛рдЧ 2 рд╕реБрд░реВ рд╣реЛрддреЛ: рд╕реБрд░рдХреНрд╖рд┐рддрдкрдгреЗ рдмрджрд▓ рдХрд░рдгреЗ. рдмрд╣реБрддреЗрдХ outages рдПрдЦрд╛рджреНрдпрд╛ рдмрджрд▓рд╛рдкрд╛рд╕реВрди рд╕реБрд░реВ рд╣реЛрддрд╛рдд тАФ рдирд╡рд╛ code, рдирд╡рд╛
config, рдирд╡рд╛ flag. рд╣рд╛ рдзрдбрд╛ рдПрдЦрд╛рджрд╛ рдмрджрд▓ рдЖрдзреА traffic рдЪреНрдпрд╛ рдЫреЛрдЯреНрдпрд╛ рднрд╛рдЧрд╛рдХрдбреЗ рдкрд╛рдард╡рддреЛ (canary)
рдЖрдгрд┐ рддреНрдпрд╛рдЪреА baseline рд╢реА рддреБрд▓рдирд╛ рдХрд░рддреЛ, dashboard рдХрдбреЗ рдбреЛрд│реНрдпрд╛рдВрдиреА рдмрдШрдгреНрдпрд╛рдРрд╡рдЬреА рдЖрдХрдбреНрдпрд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди:
promote, rollback, рдХреА рдЖрдгрдЦреА рдерд╛рдВрдмрд╛рдпрдЪреЗ. sre/crew.py рдордзреАрд▓ canary_judge
рдЖрдгрд┐ sre/demo.py рдордзреАрд▓ canary().
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдкрдердХрд╛рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧрд╛рдд рдирд╡рд╛ heating boiler рдмрд╕рд╡рд╛рдпрдЪрд╛ рдЖрд╣реЗ. ЁЯФе рдкрдг рдирд╡рд╛ boiler рдЦрд░рд╛рдм рдирд┐рдШрд╛рд▓рд╛ рддрд░?
рдореНрд╣рдгреВрди рддреЗ рддреЛ рдЖрдзреА рдПрдХрд╛рдЪ рд╡рд░реНрдЧрд╛рдд рдмрд╕рд╡рддрд╛рдд. рдЖрдгрд┐ тАФ рд╣реА рд╣реБрд╢рд╛рд░реАрдЪреА рдЧреЛрд╖реНрдЯ рдЖрд╣реЗ тАФ рддреЗ рд╢реЗрдЬрд╛рд░рдЪреНрдпрд╛ рд╡рд░реНрдЧрд╛рдд рдПрдХ рддрд╛рдЬрд╛ рдЬреБрдирд╛ boiler рд╕реБрджреНрдзрд╛ рдмрд╕рд╡рддрд╛рдд, рддреЗрд╡рдвреНрдпрд╛рдЪ рдЖрдХрд╛рд░рд╛рдЪрд╛, рддреЗрд╡рдвреНрдпрд╛рдЪ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреАрдВрд╕рд╛рдареА. рдЖрддрд╛ рддреЗ boiler рд╕реЛрдбреВрди рдмрд╛рдХреА рд╕рдЧрд│реНрдпрд╛ рдмрд╛рдмрддреАрдд рд╕рд╛рд░рдЦреНрдпрд╛ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рджреЛрди рд╡рд░реНрдЧрд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░реВ рд╢рдХрддрд╛рдд.
рдПрдХрд╛ рджрд┐рд╡рд╕рд╛рдирдВрддрд░ рдРрд╢реНрд╡рд░реНрдпрд╛ рддрдХреНрд░рд╛рд░реА рдореЛрдЬрддреЗ. рдЬреБрдирд╛ boiler: 11 рддрдХреНрд░рд╛рд░реА. рдирд╡рд╛ boiler: 42. рд╣реЗ рджреБрд░реНрджреИрд╡ рдирд╛рд╣реА; рд╣рд╛ рдЦрд░рд╛рдм boiler рдЖрд╣реЗ. рддреЛ рдХрд╛рдвреВрди рдЯрд╛рдХрд╛.
рджреБрд╕рд▒реНрдпрд╛ рд╡реЗрд│реА: рдЬреБрдирд╛ 11, рдирд╡рд╛ 13. рд╣рд╛ рдЫреЛрдЯрд╛ рдлрд░рдХ рд░реЛрдЬрдЪрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЪрдврдЙрддрд╛рд░ рдЖрд╣реЗ. рдирд╡рд╛ boiler рд╕рдЧрд│реАрдХрдбреЗ рдмрд╕рд╡рд╛.
рдЖрдгрд┐ рдЖрдЬ рддреНрдпрд╛ рд╡рд░реНрдЧрд╛рдд рдлрдХреНрдд рдХрд╛рд╣реАрдЪ рд╡рд┐рджреНрдпрд╛рд░реНрдерд┐рдиреА рдЖрд▓реНрдпрд╛ рдЕрд╕рддреАрд▓ рддрд░? "рд╕рд╛рдВрдЧрд╛рдпрд▓рд╛ рдЕрдЬреВрди рд▓рд╡рдХрд░ рдЖрд╣реЗ. рдЖрдгрдЦреА рдерд╛рдВрдмрд╛."
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
t["ЁЯЪж traffic"] --> b["baseline<br/>old version, fresh copy<br/>11 errors / 10,000 ┬╖ p99 180 ms"]
t --> c["canary<br/>new version, same size"]
b & c --> j{"тЪЦя╕П judge<br/>z-test on errors<br/>p99 ratio"}
j -->|"A: 13 errors ┬╖ z 0.41"| p["тЬЕ PROMOTE"]
j -->|"B: 42 errors ┬╖ z 4.26"| r["тЖйя╕П ROLLBACK"]
j -->|"C: p99 260 ms ┬╖ ├Ч1.44"| r
j -->|"D: only 400 requests"| e["тП│ EXTEND"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/sre/lesson-diagrams.html#l05
тЭУ рдХрд╛рдп
- Canary release тАФ рдирд╡реА version рдЖрдзреА рдЦрд▒реНрдпрд╛ traffic рдЪреНрдпрд╛ рдЫреЛрдЯреНрдпрд╛ рд╡рд╛рдЯреНрдпрд╛рдХрдбреЗ рдкрд╛рдард╡рд╛, рддрд┐рдЪреНрдпрд╛рд╡рд░ рд▓рдХреНрд╖ рдареЗрд╡рд╛, рдордЧ рдирд┐рд░реНрдгрдп рдШреНрдпрд╛. (рдкреВрд░реНрд╡реА рдХреЛрд│рд╢рд╛рдЪреНрдпрд╛ рдЦрд╛рдгреАрдВрдордзреНрдпреЗ рдзреЛрдХреНрдпрд╛рдЪреА рдЖрдЧрд╛рдК рд╕реВрдЪрдирд╛ рдореНрд╣рдгреВрди рдиреЗрд▓реНрдпрд╛ рдЬрд╛рдгрд╛рд▒реНрдпрд╛ canary рдкрдХреНрд╖реНрдпрд╛рдВрд╡рд░реВрди рд╣реЗ рдирд╛рд╡ рдкрдбрд▓реЗ.)
- Baseline тАФ рдЬреБрдиреА version, рддрд╛рдЬреА deploy рдХреЗрд▓реЗрд▓реА, canary рдЗрддрдХреНрдпрд╛рдЪ рдЖрдХрд╛рд░рд╛рдЪреА рдЖрдгрд┐ рддреЗрд╡рдвреНрдпрд╛рдЪ traffic рд╡рд╛рдЯреНрдпрд╛рдЪреА. рдЦреВрдк рдХрд╛рд│ рдЪрд╛рд▓рдгрд╛рд▒реНрдпрд╛ рд╕рдВрдкреВрд░реНрдг рдЬреБрдиреНрдпрд╛ fleet рд╢реА рддреБрд▓рдирд╛ рдХрд░рдгреЗ рдЕрдиреНрдпрд╛рдпрдХрд╛рд░рдХ рдЖрд╣реЗ: рдЬреБрдиреНрдпрд╛ machines рд╡рд░ warm caches, рд╣рд│реВ рд╣реЛрдгрд╛рд▒реНрдпрд╛ leaks рдЖрдгрд┐ рд╡реЗрдЧрд│реЗ hosts рдЕрд╕рддрд╛рдд. Netflix рдЖрдгрд┐ Google рдЪреЗ Kayenta canary tool рдиреЗрдордХреА рд╣реАрдЪ baseline-рд╡рд┐рд░реБрджреНрдз-canary рд░рдЪрдирд╛ рд╕реБрдЪрд╡рддреЗ.
- Canary analysis тАФ canary рдЪреНрдпрд╛ metrics рдЪреА baseline рдЪреНрдпрд╛ metrics рд╢реА рддреБрд▓рдирд╛: error rate, latency, CPU, memory, business metrics. Kayenta рдкреНрд░рддреНрдпреЗрдХ metric рд▓рд╛ Mann-Whitney U test рдиреЗ рдЧреБрдг рджреЗрддреЗ рдЖрдгрд┐ pass рд╡ marginal thresholds рд╕рд╣ рддреНрдпрд╛рдВрдЪреА рдмреЗрд░реАрдЬ 0тАУ100 score рдордзреНрдпреЗ рдХрд░рддреЗ.
- Two-proportion z-test тАФ рд╣рд╛ lab error rate рд╕рд╛рдареА рд╡рд╛рдкрд░рддреЛ рддреЛ check: рджреЛрди error rates рдПрдХрдореЗрдХрд╛рдВрдкрд╛рд╕реВрди
рдХрд┐рддреА standard errors рджреВрд░ рдЖрд╣реЗрдд?
z = (p_canary тИТ p_baseline) ├╖ SE, рдЗрдереЗ SE pooled rate рд╡рд░реВрди рдпреЗрддреЛ. рдореЛрдард╛ z рдореНрд╣рдгрдЬреЗ "рдпреЛрдЧрд╛рдпреЛрдЧ рдЕрд╕рдгреНрдпрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рдХрдореА". Lab z = 3.0 рдЪреНрдпрд╛ рд╡рд░ rollback рдХрд░рддреЛ. - Ratio check тАФ latency рд╕рд╛рдареА, canary рдЪрд╛ p99 baseline рдЪреНрдпрд╛ 1.2 ├Ч рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛ lab rollback рдХрд░рддреЛ. (рд╣рд╛ lab рд╢рд┐рдХрд╡рдгреНрдпрд╛рд╕рд╛рдареАрдЪреЗ model рдЖрд╣реЗ: errors рд╕рд╛рдареА рдПрдХ test, latency рд╕рд╛рдареА рдПрдХ ratio. рдЦрд░реЗ tools рдЕрдиреЗрдХ metrics рддрдкрд╛рд╕рддрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛рдВрдирд╛ рд╣реЗ рд╣рд╛рддрд╛рд│рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ рдХреА рдЕрдиреЗрдХ metrics рддрдкрд╛рд╕рд▓реНрдпрд╛рдиреЗ рдЦреЛрдЯреНрдпрд╛ рдзреЛрдХреНрдпрд╛рдЪреНрдпрд╛ рдЗрд╢рд╛рд▒реНрдпрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рд╡рд╛рдврддреЗ.)
- рдХрд┐рдорд╛рди sample тАФ рдЦреВрдк рдХрдореА requests рдЕрд╕рддреАрд▓ рддрд░ рдХреЛрдгрддреАрд╣реА test рдЦрд░рд╛ рдлрд░рдХ рдЖрдгрд┐ рдпреЛрдЧрд╛рдпреЛрдЧ рдпрд╛рдВрдд рдлрд░рдХ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА. рдХреЛрдгрддреНрдпрд╛рд╣реА рдмрд╛рдЬреВрд▓рд╛ 1,000 рдкреЗрдХреНрд╖рд╛ рдХрдореА requests рдЕрд╕рддреАрд▓ рддрд░ lab EXTEND рдореНрд╣рдгрддреЛ.
- Promote / rollback / extend тАФ рддреАрди рдирд┐рдХрд╛рд▓. рддреНрдпрд╛рдВрдирд╛ automate рдХрд░рд╛: рд╢реБрдХреНрд░рд╡рд╛рд░реА 17:55 рд▓рд╛ graphs рдХрдбреЗ рдЯрдХ рд▓рд╛рд╡реВрди рдмрдШрдгрд╛рд░реА рд╡реНрдпрдХреНрддреА рдЬрд╡рд│рдкрд╛рд╕ рдХрд╛рд╣реАрд╣реА promote рдХрд░рддреЗ.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдмрджрд▓ рд╣реЗ outages рдЪреЗ рд╕рд░реНрд╡рд╛рдд рдореЛрдареЗ рдХрд╛рд░рдг рдЖрд╣реЗ, рдЖрдгрд┐ canary рд╡рд╛рдИрдЯ рдмрджрд▓ рдХрд┐рддреА users рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрддреЛ рддреЗ рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рддреЗ (рдзрдбрд╛ 06 рддреЗ рдореЛрдЬрддреЛ). рдкрдг canary рддрд┐рдЪреНрдпрд╛ judge рдЗрддрдХреАрдЪ рдЪрд╛рдВрдЧрд▓реА рдЕрд╕рддреЗ. Dashboard рд╡рд░рдЪреНрдпрд╛ рджреЛрди рд░реЗрд╖рд╛рдВрдХрдбреЗ рдбреЛрд│реНрдпрд╛рдВрдиреА рдмрдШрд┐рддрд▓реНрдпрд╛рд╕, рджреЛрдиреНрд╣реА рдЕрдЧрджреА рд▓рд╣рд╛рди рдЕрд╕рддрд╛рдирд╛ 3├Ч error rate рд╕реБрдЯрддреЛ, рдЖрдгрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЧреЛрдВрдЧрд╛рдЯрд╛рдиреЗ рдШрдмрд░рд╛рдЯ рд╣реЛрддреЗ. рд▓рд┐рдЦрд┐рдд, automatic рдирд┐рдпрдо рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рд╕рд╛рд░рдЦрд╛рдЪ рдирд┐рд░реНрдгрдп рдШреЗрддреЛ, рдЖрдгрд┐ рддреЛ рдорд┐рдирд┐рдЯрд╛рдВрдд рдХреГрддреА рдХрд░реВ рд╢рдХрддреЛ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
sre/crew.py рдордзреАрд▓ canary_judge(base, canary, min_requests=1000, z_limit=3.0, p99_ratio=1.2)
рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЬреВрд╕рд╛рдареА (errors, requests, p99_ms) рдШреЗрддреЗ рдЖрдгрд┐ (verdict, z, p99 ratio) рдкрд░рдд рджреЗрддреЗ.
рддреЗ рдЖрдзреА sample рдЪрд╛ рдЖрдХрд╛рд░ рддрдкрд╛рд╕рддреЗ, рдордЧ error rate рд╡рд░ z-test, рдордЧ p99 ratio. sre/demo.py
рдордзреАрд▓ canary() рдПрдХрд╛ baseline рд╡рд┐рд░реБрджреНрдз рдЪрд╛рд░ canaries рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 sre/demo.py canary
python3 - <<'EOF'
import sys; sys.path.insert(0, "sre"); from crew import canary_judge
base = (11, 10000, 180)
for errors in (11, 20, 25, 30, 42):
v, z, r = canary_judge(base, (errors, 10000, 180))
print(f"canary {errors:>2} errors / 10,000 тЖТ z {z:5.2f} тЖТ {v}")
for n in (500, 5000, 50000):
v, z, r = canary_judge((n * 11 // 10000, n, 180), (n * 22 // 10000, n, 180))
print(f"double the error rate, {n:>6,} requests each тЖТ {v}" + ("" if z is None else f" (z {z:.2f})"))
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
canary рд╣реЗ print рдХрд░рддреЗ:
canary A: 13 errors / 10,000 ┬╖ p99 185 ms тЖТ z 0.41 ┬╖ p99 ├Ч1.03 тЖТ PROMOTE
canary B: 42 errors / 10,000 ┬╖ p99 182 ms тЖТ z 4.26 ┬╖ p99 ├Ч1.01 тЖТ ROLLBACK
canary C: 12 errors / 10,000 ┬╖ p99 260 ms тЖТ z 0.21 ┬╖ p99 ├Ч1.44 тЖТ ROLLBACK
canary D: 3 errors / 400 ┬╖ p99 179 ms тЖТ z n/a ┬╖ p99 ├Ч0.99 тЖТ EXTEND (first minutes: baseline 1 / 400)
рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:
canary 11 errors / 10,000 тЖТ z 0.00 тЖТ PROMOTE
canary 20 errors / 10,000 тЖТ z 1.62 тЖТ PROMOTE
canary 25 errors / 10,000 тЖТ z 2.34 тЖТ PROMOTE
canary 30 errors / 10,000 тЖТ z 2.97 тЖТ PROMOTE
canary 42 errors / 10,000 тЖТ z 4.26 тЖТ ROLLBACK
double the error rate, 500 requests each тЖТ EXTEND
double the error rate, 5,000 requests each тЖТ PROMOTE (z 1.50)
double the error rate, 50,000 requests each тЖТ ROLLBACK (z 4.29)
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
11 рдРрд╡рдЬреА 30 errors рдЕрд╕рд▓реЗрд▓реА canary тАФ рдЬрд╡рд│рдкрд╛рд╕ 3├Ч рд╡рд╛рдИрдЯ тАФ promote рдЭрд╛рд▓реА, рдХрд╛рд░рдг рдЗрддрдХреНрдпрд╛ рд▓рд╣рд╛рди error rates рд╕рд╛рдареА 10,000 requests рд╣рд╛ z = 3.0 рд╡рд░ рдкреБрд░реЗрд╕рд╛ рдкреБрд░рд╛рд╡рд╛ рдирд╛рд╣реА. рддреЛрдЪ рджреБрдкреНрдкрдЯ error rate 5,000 requests рд╡рд░ pass рдЭрд╛рд▓рд╛ рдЖрдгрд┐ 50,000 рд╡рд░ fail рдЭрд╛рд▓рд╛. рдореНрд╣рдгрдЬреЗ canary рдЪрд╛ рдЖрдХрд╛рд░ рдЖрдгрд┐ рдерд╛рдВрдмрдгреНрдпрд╛рдЪрд╛ рдХрд╛рд▓рд╛рд╡рдзреА рд╣реЗ рдард░рд╡рддрд╛рдд рдХреА judge рд▓рд╛ рдХрд╛рдп рджрд┐рд╕реВ рд╢рдХрддреЗ: рд▓рд╣рд╛рди error rates рд╕рд╛рдареА рднрд░рдкреВрд░ traffic рд▓рд╛рдЧрддреЗ. Canary C рджреБрд╕рд░рд╛ рдзрдбрд╛ рджрд╛рдЦрд╡рддреЗ тАФ error rate рдареАрдХ рд╣реЛрддрд╛ рдкрдг latency 44% рд╡рд╛рдИрдЯ рд╣реЛрддреА, рдореНрд╣рдгреВрди рдПрдХ metric рдкреБрд░реЗрд╕рд╛ рдирд╛рд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рддрд╛рдЬреНрдпрд╛ baseline рдРрд╡рдЬреА рд╕рдВрдкреВрд░реНрдг рдЬреБрдиреНрдпрд╛ fleet рд╢реА canary рдЪреА рддреБрд▓рдирд╛ рдХрд░рдгреЗ
- рдбреЛрд│реНрдпрд╛рдВрдиреА рдмрдШреВрди рдирд┐рд░реНрдгрдп рдШреЗрдгреЗ, рдХрд┐рдВрд╡рд╛ judge рд╢рд┐рд╡рд╛рдп рдлрдХреНрдд timer рд╡рд░ promote рдХрд░рдгреЗ
- рддреБрдореНрд╣рд╛рд▓рд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ errors рджрд┐рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдЦреВрдк рд▓рд╣рд╛рди рдХрд┐рдВрд╡рд╛ рдЦреВрдк рдХрдореА рдХрд╛рд│рд╛рдЪреА canary
- рдлрдХреНрдд рдПрдХрдЪ metric (errors) тАФ рд╣рд│реВ рдЕрд╕рдгреЗ рд╣реЗрд╣реА рдмрд┐рдШрдбрд▓реЗрд▓реЗрдЪ рдЖрд╣реЗ
- рдЕрдиреЗрдХ metrics рд╡рд░ рдХрдбрдХ threshold, рдореНрд╣рдгрдЬреЗ рдкреНрд░рддреНрдпреЗрдХ canary fail рд╣реЛрддреЗ рдЖрдгрд┐ рд▓реЛрдХ рддреЛ override рдХрд░рд╛рдпрд▓рд╛ рд╢рд┐рдХрддрд╛рдд
- рдлрдХреНрдд рдЕрдВрддрд░реНрдЧрдд рдХрд┐рдВрд╡рд╛ test traffic рдорд┐рд│рдгрд╛рд▒реНрдпрд╛ canaries, рдЬреЗ users рдХрд░рддрд╛рдд рддрд╕реЗ рдирд╕рддреЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
Argo Rollouts рдПрдХрд╛ AnalysisTemplate рдордзреВрди analysis рдЪрд╛рд▓рд╡рддреЗ: рдПрдХ query, рддреА рдХрд┐рддреА рд╡реЗрд│рд╛ рдЪрд╛рд▓рд╡рд╛рдпрдЪреА рдЖрдгрд┐
рдпрд╢ рдХрд╢рд╛рд▓рд╛ рдореНрд╣рдгрд╛рдпрдЪреЗ. рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ Prometheus рд╡рд┐рд░реБрджреНрдз error-rate check:
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata: {name: error-rate}
spec:
args: [{name: service-name}]
metrics:
- name: error-rate
interval: 5m
failureLimit: 1
successCondition: result[0] < 0.005
provider:
prometheus:
address: http://prometheus.monitoring:9090
query: |
sum(rate(http_requests_total{service="{{args.service-name}}",code=~"5.."}[5m]))
/ sum(rate(http_requests_total{service="{{args.service-name}}"}[5m]))
рд╣реЗ template рдард░рд╛рд╡рд┐рдХ threshold рддрдкрд╛рд╕рддреЗ, рддреБрд▓рдирд╛ рдирд╛рд╣реА. рдЦрд▒реНрдпрд╛ baseline-рд╡рд┐рд░реБрджреНрдз-canary рддреБрд▓рдиреЗрд╕рд╛рдареА Argo Rollouts baseline рдЖрдгрд┐ canary experiments рд╢реЗрдЬрд╛рд░реА рд╢реЗрдЬрд╛рд░реА рд╕реБрд░реВ рдХрд░реВ рд╢рдХрддреЗ, рдЖрдгрд┐ Kayenta рд╕рд╣ Spinnaker рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА statistical рддреБрд▓рдирд╛ рдЖрдгрд┐ score рдХрд░рддреЗ. Flagger Istio, Linkerd, NGINX рдЖрдгрд┐ рдЗрддрд░ routers рд╕рд╛рдареА threshold-рдЖрдзрд╛рд░рд┐рдд analysis рдХрд░рддреЗ.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ: рддреБрдордЪреНрдпрд╛ рдкреБрдврдЪреНрдпрд╛ release рд╕рд╛рдареА рдЖрдзреАрдЪ рд▓рд┐рд╣реВрди рдареЗрд╡рд╛: рдХреЛрдгрддреЗ metrics, canary рдХрд┐рддреА рдореЛрдареА, рдХрд┐рддреА рдХрд╛рд│, рдЖрдгрд┐ рдХреЛрдгрддреЗ рдЖрдХрдбреЗ рдореНрд╣рдгрдЬреЗ rollback. рд╣реЗ рдХрд░рддрд╛ рдЖрд▓реЗ рдирд╛рд╣реА, рддрд░ рддреБрдордЪреА canary рд╣реА test рдирд╕реВрди рдлрдХреНрдд рдПрдХ рдЖрд╢рд╛ рдЖрд╣реЗ.
тПня╕П рдкреБрдвреЗ
Judge рдореНрд╣рдгрддреЛ "rollback рдХрд░рд╛". рддреБрдореНрд╣реА рддреЗ рдХрд┐рддреА рд╡реЗрдЧрд╛рдиреЗ рдХрд░реВ рд╢рдХрддрд╛? рдЖрдгрд┐ рддреБрдореНрд╣реА рддреЗ рдХрд░рдгреНрдпрд╛рдЖрдзреА рдХрд┐рддреА users рдирд╛ рддреНрд░рд╛рд╕ рдЭрд╛рд▓рд╛? рдкреБрдврдЪрд╛ рдзрдбрд╛ рддреЗ рдореЛрдЬрддреЛ.
git checkout lesson-06-progressive-delivery