"""Six assigned canary windows; deterministic example policy, not statistical inference.""" import csv,json from pathlib import Path from fractions import Fraction def pct(errors,requests):return Fraction(errors*100,requests) def decide(c,s,segment=None): cr,ce=c;sr,se=s if min(cr,sr)<200:return 'PAUSE','insufficient version-level requests' if pct(se,sr)>2:return 'PAUSE','control is unhealthy; investigate the incident' if segment: (nr,ne),(br,be)=segment if min(nr,br)<50:return 'PAUSE','insufficient critical-segment requests' if pct(be,br)>2:return 'PAUSE','critical-segment control is unhealthy' if pct(ne,nr)>2 and pct(ne,nr)-pct(be,br)>1:return 'ROLLBACK','critical-segment regression' if pct(ne,nr)>2:return 'PAUSE','critical-segment result is inconclusive' if pct(ce,cr)>2 and pct(ce,cr)-pct(se,sr)>1:return 'ROLLBACK','candidate regression' if pct(ce,cr)>2:return 'PAUSE','candidate result is inconclusive' return 'PROMOTE','all assigned example gates pass' def run(): fixtures=[('Healthy',(500,2),(9500,38),None),('Low traffic',(40,0),(960,4),None),('Candidate regression',(500,30),(9500,38),None),('Aggregate hides failure',(200,20),(19800,79),None),('Critical segment',(1000,10),(9000,36),((50,8),(450,2))),('Shared incident',(500,30),(9500,570),None)] rows=[] for name,c,s,segment in fixtures: decision,reason=decide(c,s,segment);cr,ce=c;sr,se=s rows.append(dict(case=name,candidateRequests=cr,candidateErrors=ce,controlRequests=sr,controlErrors=se,candidatePct=float(pct(ce,cr)),controlPct=float(pct(se,sr)),overallPct=float(pct(ce+se,cr+sr)),criticalCandidatePct=float(pct(segment[0][1],segment[0][0])) if segment else None,criticalCounts=segment,decision=decision,reason=reason)) assert [r['decision'] for r in rows]==['PROMOTE','PAUSE','ROLLBACK','ROLLBACK','ROLLBACK','PAUSE'] assert rows[3]['overallPct']==.495 and rows[3]['candidatePct']==10 assert rows[4]['candidatePct']==1 and rows[4]['criticalCandidatePct']==16 return dict(scope='Assigned counts in contemporaneous example windows; thresholds are an invented review policy, not an SLO recommendation or confidence test.',policy=dict(minVersionRequests=200,minCriticalSegmentRequests=50,maxErrorPct=2,minRegressionPercentagePoints=1),rows=rows) if __name__=='__main__': result=run();assert result==run();p=Path(__file__).resolve().parent;(p/'results.json').write_text(json.dumps(result,indent=2)+'\n') with (p/'results.csv').open('w',newline='') as f: w=csv.DictWriter(f,fieldnames=[k for k in result['rows'][0] if k!='criticalCounts']);w.writeheader();w.writerows({k:v for k,v in r.items() if k!='criticalCounts'} for r in result['rows']) print(json.dumps(result,indent=2))