Free lesson · GenAI Solutions & Delivery

ADR governance dashboard ಮತ್ತು compliance audit ರಚಿಸಿ

ನೀವು ಒಂದು ADRGovernanceDashboard ನಿರ್ಮಿಸುವಿರಿ, ಇದು architecture decision ಆರೋಗ್ಯ, coverage ಅಂತರಗಳು ಮತ್ತು compliance ಸ್ಥಿತಿಯ ಬಗ್ಗೆ ಸಂಸ್ಥೆ-ವ್ಯಾಪಿ ಗೋಚರತೆಯನ್ನು ಒದಗಿಸುತ್ತದೆ. compute_coverage() ಹೊಂದಿರುವ CoverageAnalyzer ಅನ್ನು ಅನುಷ್ಠಾನಗೊಳಿಸಿ, ಇದು service_id VARCHAR(64) PRIMARY KEY, service_name VARCHAR(128), team VARCHAR(64), deployed_at TIMESTAMPTZ, technology_stack JSONB, has_llm_integration BOOLEAN ಕಾಲಮ್‌ಗಳನ್ನು ಹೊಂದಿರುವ deployed_services PostgreSQL ಟೇಬಲ್‌ನಿಂದ ಸಿಸ್ಟಮ್‌ನ deployed services ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿ, ಯಾವುದೇ ಸಂಬಂಧಿತ ADR ಇಲ್ಲದ services ಅನ್ನು ಗುರುತಿಸಲು architecture_decisions ಜೊತೆ cross-reference ಮಾಡುತ್ತದೆ, ಮತ್ತು total_services: int, covered_services: int, coverage_pct: float, uncovered_services: list[UncoveredService] ಹೊಂದಿರುವ ADRCoverageReport Pydantic model ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ; ಇಲ್ಲಿ ಪ್ರತಿಯೊಂದೂ service_name: str, team: str, risk_level: str ಹೊಂದಿರುತ್ತದೆ, ಇದು service ಗೆ ದಾಖಲಿತ decisions ಇಲ್ಲದೆ LLM integration ಇದೆಯೇ ಎಂಬುದರ ಆಧಾರದ ಮೇಲೆ ನಿರ್ಧರಿಸಲಾಗುತ್ತದೆ. Coverage ಶೇಕಡಾವಾರನ್ನು 60% (yellow) ಮತ್ತು 80% (green) thresholds ಹೊಂದಿರುವ gauge ಆಗಿ ತೋರಿಸುವ Grafana panel ಅನ್ನು ನಿರ್ಮಿಸಿ, ಜೊತೆಗೆ risk ಪ್ರಕಾರ ವಿಂಗಡಿಸಲಾದ uncovered services ಪಟ್ಟಿಯ ಟೇಬಲ್ ಅನ್ನು ಸೇರಿಸಿ. submit_for_review() ಹೊಂದಿರುವ ReviewWorkflowEngine ಅನ್ನು ಅನುಷ್ಠಾನಗೊಳಿಸಿ, ಇದು ADR ಅನ್ನು PROPOSED ನಿಂದ PENDING_REVIEW ಗೆ ಪರಿವರ್ತಿಸುತ್ತದೆ ಮತ್ತು review_id VARCHAR(64) PRIMARY KEY, adr_id VARCHAR(64), reviewer VARCHAR(64), due_date TIMESTAMPTZ, status VARCHAR(16) (PENDING, APPROVED, REJECTED, EXPIRED), review_comment TEXT, reviewed_at TIMESTAMPTZ ಕಾಲಮ್‌ಗಳನ್ನು ಹೊಂದಿರುವ adr_reviews ಟೇಬಲ್‌ನಲ್ಲಿ ಒಂದು entry ರಚಿಸುತ್ತದೆ. asyncio background task ಮೂಲಕ ದೈನಂದಿನ scheduled task ಆಗಿ ಚಲಿಸುವ check_expiry() ಅನ್ನು ನಿರ್ಮಿಸಿ, ಇದು due_date ದಾಟಿದ ನಂತರವೂ review ಚಟುವಟಿಕೆ ಇಲ್ಲದ ADR ಗಳನ್ನು EXPIRED ಎಂದು ಗುರುತಿಸಿ adr_reviews_expired_total Prometheus counter ಅನ್ನು ಹೊರಸೂಸುತ್ತದೆ. reviewer: str, review_comment: str ಹೊಂದಿರುವ ApprovalRequest ಅನ್ನು ಸ್ವೀಕರಿಸುವ POST /api/v1/adrs/{adr_id}/approve ಮತ್ತು reviewer: str, review_comment: str, required_changes: list[str] ಹೊಂದಿರುವ RejectionRequest ಅನ್ನು ಸ್ವೀಕರಿಸುವ POST /api/v1/adrs/{adr_id}/reject ಅನ್ನು ಅನುಷ್ಠಾನಗೊಳಿಸಿ. generate_report() ಹೊಂದಿರುವ ComplianceReportGenerator ಅನ್ನು ನಿರ್ಮಿಸಿ, ಇದು ಈ ಕೆಳಗಿನವುಗಳನ್ನು ಒಟ್ಟುಗೂಡಿಸುತ್ತದೆ: SELECT status, COUNT(*) FROM architecture_decisions GROUP BY status ಬಳಸಿ status ಪ್ರಕಾರ ಒಟ್ಟು ADR ಗಳು, AVG(accepted_at - created_at) ಬಳಸಿ PROPOSED ನಿಂದ ACCEPTED ವರೆಗಿನ ಸರಾಸರಿ ಸಮಯ, coverage ಶೇಕಡಾವಾರು, stale ADR ಎಣಿಕೆ, dependency graph ನಿಂದ open conflicts ಎಣಿಕೆ; ಮತ್ತು report_id: str, generated_at: datetime, total_adrs: int, adrs_by_status: dict[str, int], avg_review_time_days: float, coverage_pct: float, stale_count: int, conflict_count: int, governance_score: float ಹೊಂದಿರುವ GovernanceComplianceReport Pydantic model ಅನ್ನು ಔಟ್‌ಪುಟ್ ಮಾಡುತ್ತದೆ. ಈ report ಅನ್ನು ಹಿಂತಿರುಗಿಸುವ GET /api/v1/governance/report endpoint ಅನ್ನು ಬಹಿರಂಗಪಡಿಸಿ. ಈ panels ಹೊಂದಿರುವ ಸಮಗ್ರ Grafana dashboard ಅನ್ನು ರಚಿಸಿ: ADR status ವಿತರಣೆಯ pie chart, coverage gauge, 90 ದಿನಗಳ staleness trend line, review pipeline funnel (PROPOSED -> PENDING -> APPROVED), ಮತ್ತು conflict ಎಣಿಕೆಯ time series. Coverage (40%), freshness (30%) ಮತ್ತು conflict-free ಅನುಪಾತ (30%) ಗಳ weighted average ಆಗಿ ಲೆಕ್ಕಹಾಕಲಾದ adr_governance_score Prometheus gauge ಅನ್ನು ಹೊರಸೂಸಿ.

Course: GenAI Architecture & Design Patterns · Chapter 1 · GenAI ADR Engine

Free to read — no subscription required.

ಪರಿಚಯ

ನೀವು ADR ಯಂತ್ರಾಂಗವನ್ನು ಎರಡು ವಿಭಿನ್ನ ಓದುಗರ ಮೂಲಕ ಪ್ರಸ್ತುತಪಡಿಸದೆ ನಿರ್ಮಿಸಿದರೆ — ಲೈವ್ ಸ್ಥಿತಿ ಬೇಕಾದ ಆಪರೇಟರ್ ಮತ್ತು ಬದಲಾಯಿಸಲಾಗದ ಸ್ನ್ಯಾಪ್‌ಶಾಟ್ ಬೇಕಾದ ಆಡಿಟರ್ — ಆಡಳಿತ ಕಾರ್ಯಕ್ರಮವು ಮೂರು ತಿಂಗಳ ನಂತರ ಯಾರೂ ಉಲ್ಲೇಖಿಸಲಾಗದ ಒಂದೇ ಲೈವ್ ಪುಟವಾಗಿ ಕುಸಿಯುತ್ತದೆ, ಮತ್ತು SOC 2 ಸಾಕ್ಷ್ಯ ಸಂಗ್ರಹಣೆಯು ಪುರಾತತ್ವ ಯೋಜನೆಯಾಗುತ್ತದೆ. ಲೈವ್ ಡ್ಯಾಶ್‌ಬೋರ್ಡ್ ಅನ್ನು ಅನುಸರಣೆ ಕಲಾಕೃತಿಯೊಂದಿಗೆ ಬೆರೆಸುವ ತಂಡಗಳು, ಇಬ್ಬರು ಓದುಗರು ಒಂದು ವಾರದ ಅಂತರದಲ್ಲಿ ಟಿಪ್ಪಣಿಗಳನ್ನು ಹೋಲಿಸಿ ಬೇರೆ ಬೇರೆ ಸಂಖ್ಯೆಗಳನ್ನು ನೋಡಿದ ಮೊದಲ ಬಾರಿಗೇ ವಿಶ್ವಾಸವನ್ನು ಕಳೆದುಕೊಳ್ಳುತ್ತವೆ. ಈ ಪಾಠದ ಅಂತ್ಯದ ವೇಳೆಗೆ ನೀವು ಒಂದೇ ಅನುಸರಣೆ ಮೌಲ್ಯಮಾಪಕವನ್ನು ಆಪರೇಟರ್‌ಗಳಿಗಾಗಿ Prometheus ಸ್ಕ್ರೇಪ್ ಮಾರ್ಗ ಮತ್ತು ಆಡಿಟರ್‌ಗಳಿಗಾಗಿ ಹ್ಯಾಶ್ ಮಾಡಿದ JSON-ಜೊತೆ-markdown ಕಲಾಕೃತಿಯಾಗಿ ವಿಭಜಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ, ಮತ್ತು ಆ ಎರಡು ಮೇಲ್ಮೈಗಳು ಏಕೆ ಎಂದಿಗೂ ಒಂದೇ ಕೋಡ್ ಮಾರ್ಗವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಾರದು ಎಂಬುದರ ಕುರಿತು ತರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ.

ಪ್ರಮುಖ ಪರಿಭಾಷೆ

  • ComplianceReport: findings, ಬಹು-ಅಕ್ಷ fleet_counts, ಮತ್ತು snapshot_hash ಅನ್ನು ಹೊಂದಿರುವ ಸೀರಿಯಲೈಸ್ ಮಾಡಬಹುದಾದ ಆಡಿಟ್ ಕಲಾಕೃತಿ; ಇದು CI ಆರ್ಕೈವ್‌ಗಳಿಗಾಗಿ ಕ್ಯಾನೊನಿಕಲ್ JSON ಆಗಿ ಮತ್ತು ನಾಯಕತ್ವ ಇಮೇಲ್‌ಗಾಗಿ markdown ಆಗಿ ರೆಂಡರ್ ಆಗುತ್ತದೆ.
  • snapshot_hash: ಸಾರ್ಟ್-ಕೀ ಮಾಡಿದ ವರದಿ ದೇಹದ ಮೇಲೆ ಲೆಕ್ಕಹಾಕಲಾದ SHA-256 ಡೈಜೆಸ್ಟ್, ಇದರಿಂದ ಯಾವುದೇ ಓದುಗರು ಆರ್ಕೈವ್ ಮಾಡಿದ ಕಲಾಕೃತಿಯು ನಾಯಕತ್ವ ನೋಡಿದ್ದಕ್ಕೆ ಹೊಂದುತ್ತದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಬಹುದು.
  • ಕಾರ್ಯಾಚರಣೆ/ಆಡಿಟ್ ಗಡಿ: ಲೈವ್ Prometheus ಎಕ್ಸ್‌ಪೋರ್ಟರ್ (ಆಪರೇಟರ್‌ಗೆ ಸತ್ಯದ ಮೂಲ) ಮತ್ತು ಹ್ಯಾಶ್ ಮಾಡಿದ JSON-ಜೊತೆ-markdown ಕಲಾಕೃತಿ (ಆಡಿಟರ್‌ಗೆ ಸತ್ಯದ ಮೂಲ) ನಡುವಿನ ಕಠಿಣ ಪ್ರತ್ಯೇಕತೆ — ಈ ಎರಡು ಮೇಲ್ಮೈಗಳು ಎಂದಿಗೂ ಒಂದೇ ಕೋಡ್ ಮಾರ್ಗವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಾರದು.

ಪರಿಕಲ್ಪನೆಗಳು

ಆಡಿಟ್ ಆವರ್ತನ ಮತ್ತು ಕಾರ್ಯಾಚರಣೆ/ಆಡಿಟ್ ಗಡಿ

ಪೂರ್ಣ ComplianceAuditor.audit ಎರಡು ಸಂದರ್ಭಗಳಲ್ಲಿ ಚಲಿಸುತ್ತದೆ. ಮೊದಲನೆಯದಾಗಿ, ADR ರಿಜಿಸ್ಟ್ರಿ ಡೈರೆಕ್ಟರಿಯನ್ನು ಸ್ಪರ್ಶಿಸುವ main ಗೆ ಪ್ರತಿ ಮರ್ಜ್‌ನಲ್ಲಿ CI ಹಂತವಾಗಿ—ಫಲಿತಾಂಶದ JSON ಅನ್ನು ಬಿಲ್ಡ್ ಕಲಾಕೃತಿಯಾಗಿ ಅಪ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ ಮತ್ತು markdown ಅನ್ನು PR ಕಾಮೆಂಟ್ ಆಗಿ ಪೋಸ್ಟ್ ಮಾಡಲಾಗುತ್ತದೆ, ಇದರಿಂದ ಪರಿಶೀಲಕರು ಮರ್ಜ್ ಮಾಡುವ ಮೊದಲು ಅನುಸರಣೆ ಪರಿಣಾಮವನ್ನು ನೋಡಬಹುದು. ಎರಡನೆಯದಾಗಿ, ಪ್ರತಿ ರಾತ್ರಿ 02:00 UTC ಗೆ ಚಲಿಸುವ Kubernetes CronJob ಆಗಿ, ಇದು ಹ್ಯಾಶ್ ಮಾಡಿದ JSON ಅನ್ನು ಆಡಿಟ್ ಆರ್ಕೈವ್ ಬಕೆಟ್‌ಗೆ ಬರೆಯುತ್ತದೆ, ಮತ್ತು ಪ್ರತಿ ತಿಂಗಳ ಮೊದಲ ದಿನ ಹೆಚ್ಚುವರಿಯಾಗಿ markdown ಅನ್ನು ತಂಡ ಮತ್ತು ಮಾಲೀಕರ ಪ್ರಕಾರ ಕ್ರೋಢೀಕರಿಸಿದ ನಾಯಕತ್ವ ಇಮೇಲ್ ಆಗಿ ರೆಂಡರ್ ಮಾಡುತ್ತದೆ. CronJob ಆಡಿಟರ್‌ಗೆ ಸತ್ಯದ ಮೂಲ; ಲೈವ್ ಎಕ್ಸ್‌ಪೋರ್ಟರ್ ಆಪರೇಟರ್‌ಗೆ ಸತ್ಯದ ಮೂಲ.

ನಾಯಕತ್ವ ಇಮೇಲ್ ಸಂಪೂರ್ಣವಾಗಿ ಆಡಿಟ್ ವರದಿಯಿಂದ ಬರುತ್ತದೆ—ಲೈವ್ ಎಕ್ಸ್‌ಪೋರ್ಟರ್‌ನಿಂದ ಅಲ್ಲ—ಆದ್ದರಿಂದ CEO ಅವರ ಇನ್‌ಬಾಕ್ಸ್‌ನಲ್ಲಿರುವ ಸಂಖ್ಯೆಗಳು ಬಕೆಟ್‌ನಲ್ಲಿ ಆರ್ಕೈವ್ ಮಾಡಿದ JSON ಮತ್ತು ಇಮೇಲ್‌ನ ಕೆಳಭಾಗದಲ್ಲಿ ಮುದ್ರಿಸಿದ ಹ್ಯಾಶ್‌ಗೆ ಹೊಂದುತ್ತವೆ. ಮಾಲೀಕರ-ಪ್ರಕಾರ-ಕ್ರೋಢೀಕರಣ ಟೇಬಲ್ fleet_counts["reviewer"] ಅನ್ನು ಇಳಿಕೆ ಕ್ರಮದಲ್ಲಿ ಸಾರ್ಟ್ ಮಾಡಿದ್ದರಿಂದ ಬರುತ್ತದೆ, ಪ್ರತಿ ಸಾಲನ್ನು ಆ ಪರಿಶೀಲಕರ ಎಷ್ಟು ADR ಗಳು SLA-ಉಲ್ಲಂಘನೆಯಾಗಿವೆ ಎಂಬುದರೊಂದಿಗೆ ಟಿಪ್ಪಣಿ ಮಾಡಲಾಗುತ್ತದೆ. ಈ ಒಂದೇ ಟೇಬಲ್ ಆಡಳಿತ ಕಾರ್ಯಕ್ರಮದ ಅರ್ಧ ಭಾಗವನ್ನು ಮೌನವಾಗಿ ತಡೆಹಿಡಿದಿರುವ ಅಡಚಣೆ ಎಂಜಿನಿಯರ್ ಅನ್ನು ಬಹಿರಂಗಪಡಿಸುತ್ತದೆ.

ಕಾರ್ಯಾಚರಣೆ ಶಿಸ್ತು

  • ComplianceReport.snapshot_hash ಅನ್ನು ಭಾರ-ಹೊರುವ ಅಂಶವೆಂದು ಪರಿಗಣಿಸಿ. ಪರಿಶೀಲಿಸಬಹುದಾದ ಹ್ಯಾಶ್ ಇಲ್ಲದೆ ಆರ್ಕೈವ್ ಬಕೆಟ್‌ಗೆ ಬರುವ ಯಾವುದೇ ಕಲಾಕೃತಿ ಭ್ರಷ್ಟವಾಗಿದೆ; ಮಾಸಿಕ ಇಮೇಲ್ ಹ್ಯಾಶ್ ಅನ್ನು ಮುದ್ರಿಸಬೇಕು, ಇದರಿಂದ ಯಾವುದೇ ಓದುಗರು ಆರ್ಕೈವ್‌ನಿಂದ ಎಳೆದ JSON ನಾಯಕತ್ವ ನೋಡಿದ್ದಕ್ಕೆ ಹೊಂದುತ್ತದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಬಹುದು.
  • ಆಡಿಟರ್ ಮೇಲ್ಮೈಯನ್ನು ಎಂದಿಗೂ ಲೈವ್ ಎಕ್ಸ್‌ಪೋರ್ಟರ್ ಎಂಡ್‌ಪಾಯಿಂಟ್‌ನಿಂದ ಸರ್ವ್ ಮಾಡಬೇಡಿ. ನಿಯಂತ್ರಕರು ಕಳೆದ ಮಾರ್ಚ್‌ನ ಅನುಸರಣೆ ಸ್ಥಿತಿಯನ್ನು ಕೇಳಿದರೆ, ಆರ್ಕೈವ್ ಮಾಡಿದ ಹ್ಯಾಶ್ JSON ಅನ್ನು ತೋರಿಸಿ, Grafana ಸಮಯ-ಶ್ರೇಣಿ ಪ್ರಶ್ನೆಯನ್ನು ಅಲ್ಲ—ನೀವು ಡೌನ್‌ಸ್ಯಾಂಪ್ಲಿಂಗ್ ಗಡಿಯನ್ನು ದಾಟಿದ ನಂತರ Grafana ಧಾರಣ ಕಿಟಕಿಗಳು ಐತಿಹಾಸಿಕ ನಿಖರತೆಯ ಬಗ್ಗೆ ಸುಳ್ಳು ಹೇಳುತ್ತವೆ.
  • ಮೂರು ಪ್ರಮುಖ ಅನುಸರಣೆ ಪರಿಶೀಲನೆಗಳನ್ನು (C-001, C-002, C-003) ಬಿಡುಗಡೆಗಳಾದ್ಯಂತ ಬದಲಾಯಿಸಲಾಗದಂತೆ ಇರಿಸಿ. ಹೊಸ ಪರಿಶೀಲನೆಗಳನ್ನು (C-004 ಮುಂದಕ್ಕೆ) ಮುಕ್ತವಾಗಿ ಸೇರಿಸಿ, ಆದರೆ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಪರಿಶೀಲನೆಯನ್ನು ಮರುಹೆಸರಿಸುವುದು ಅಥವಾ ಮರುಸಂಖ್ಯೆ ಮಾಡುವುದು ಪ್ರತಿ ಐತಿಹಾಸಿಕ ವರದಿ ಹೋಲಿಕೆಯನ್ನು ಮತ್ತು check_id ಮೂಲಕ ಫಿಲ್ಟರ್ ಮಾಡುವ ಪ್ರತಿ ಆಡಿಟ್-ಟ್ರೇಲ್ ಪ್ರಶ್ನೆಯನ್ನು ಮುರಿಯುತ್ತದೆ.
  • ನಾಯಕತ್ವ ಇಮೇಲ್ ಮಾಸಿಕವಾಗಿದ್ದರೂ ಪೂರ್ಣ ಆಡಿಟ್ ಅನ್ನು ಪ್ರತಿ ರಾತ್ರಿ ಚಲಾಯಿಸಿ. ರಾತ್ರಿಯ ಆವರ್ತನವು ಇಪ್ಪತ್ನಾಲ್ಕು ಗಂಟೆಗಳೊಳಗೆ ಹಿಂಜರಿತಗಳನ್ನು ಹಿಡಿಯುತ್ತದೆ; ಮಾಸಿಕ ಆವರ್ತನವು ಕೇವಲ ವರದಿ ಮಾಡುವ ಲಯ. ಈ ಎರಡು ಆವರ್ತನಗಳು ಸ್ವತಂತ್ರವಾಗಿವೆ ಮತ್ತು ಸ್ವತಂತ್ರವಾಗಿಯೇ ಉಳಿಯಬೇಕು.
  • adr_review_sla_breach_total > 0 ಮೇಲೆ ಎಚ್ಚರಿಕೆಗೆ ಒಂದು-ವಾರ, ಪೇಜ್‌ಗೆ ಇಪ್ಪತ್ನಾಲ್ಕು-ಗಂಟೆ ತೀವ್ರತೆ ಏಣಿಯೊಂದಿಗೆ ಅಲರ್ಟ್ ಮಾಡಿ. ಒಂದೇ SLA ಉಲ್ಲಂಘನೆಗಾಗಿ ಆನ್-ಕಾಲ್ ಅನ್ನು ಪೇಜ್ ಮಾಡುವುದು ಗದ್ದಲ; ಉಲ್ಲಂಘನೆಗಳು ತಂಡದ ಪರಿಶೀಲನಾ ಸಾಮರ್ಥ್ಯವನ್ನು ಮೀರಿ ಸಂಗ್ರಹವಾದಾಗ ಪೇಜ್ ಮಾಡುವುದು ಸಂಕೇತ.
  • ಎಕ್ಸ್‌ಪೋರ್ಟರ್ ಸ್ಕ್ರೇಪ್ ಮಾರ್ಗವನ್ನು 500 ms ನಲ್ಲಿ ಟೈಮ್‌ಔಟ್ ಆಗುವಂತೆ ವೈರ್ ಮಾಡಿ. ಅಗ್ರಿಗೇಟರ್ ಇನ್-ಮೆಮೊರಿ ರಿಜಿಸ್ಟ್ರಿಯ ಮೇಲಿನ ಶುದ್ಧ ಫಂಕ್ಷನ್, ಆದ್ದರಿಂದ ಅದಕ್ಕಿಂತ ನಿಧಾನವಾದದ್ದು ರಿಜಿಸ್ಟ್ರಿಯು ಮೆಮೊರಿಯಲ್ಲಿ ಹೊಂದುವುದನ್ನು ಮೀರಿ ಬೆಳೆದಿದೆ ಮತ್ತು ಪೇಜಿನೇಟೆಡ್ ಕ್ಯಾಶ್ ಪದರ ಬೇಕಾಗಿದೆ ಎಂದು ಸೂಚಿಸುತ್ತದೆ—ನಿಧಾನ ಸ್ಕ್ರೇಪ್ ಮೌನವಾಗಿ ಟೈಮ್ ಸೀರೀಸ್‌ನಿಂದ ಮೆಟ್ರಿಕ್‌ಗಳನ್ನು ಕೈಬಿಡಲು ಬಿಡಬೇಡಿ.
  • ಆಡಿಟ್ ಆರ್ಕೈವ್ ಬಕೆಟ್ ಅನ್ನು ಆಬ್ಜೆಕ್ಟ್-ಲಾಕ್ ಸಕ್ರಿಯಗೊಳಿಸಿ ಮತ್ತು ಕನಿಷ್ಠ ಏಳು ವರ್ಷಗಳ ಧಾರಣ ನೀತಿಯೊಂದಿಗೆ ಸಂಗ್ರಹಿಸಿ. ಅನುಸರಣೆ ವರದಿ ಸಾಕ್ಷ್ಯ; ಸಾಕ್ಷ್ಯವು ಅದನ್ನು ಉತ್ಪಾದಿಸಿದ ಎಂಜಿನಿಯರ್‌ಗಳನ್ನು ಮೀರಿ ಬದುಕಬೇಕು, ಮತ್ತು ಬಕೆಟ್ ನೀತಿಯೇ ಆ ಭರವಸೆಯನ್ನು ಆಕಾಂಕ್ಷೆಯ ಬದಲು ಜಾರಿಗೊಳಿಸಬಹುದಾದಂತೆ ಮಾಡುತ್ತದೆ.
Loading diagram...

ಕೋಡ್ ವಾಕ್‌ಥ್ರೂ

ಕಾರ್ಯಾಚರಣೆ/ಆಡಿಟ್ ಗಡಿಯನ್ನು ಈಗ ತಾನೇ ಎಳೆದ ನಂತರ, ನೀವು ಈಗ ಎರಡೂ ಮೇಲ್ಮೈಗಳನ್ನು ಪೋಷಿಸುವ ಒಂದೇ ಮೌಲ್ಯಮಾಪಕವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುತ್ತೀರಿ. ComplianceAuditor ಯಂತ್ರ-ಪರಿಶೀಲಿಸಬಹುದಾದ ಪ್ರಶ್ನೆಗಳಿಗೆ ಉತ್ತರಿಸುತ್ತದೆ — ಇಲ್ಲಿ, ತ್ರೈಮಾಸಿಕ ಪರಿಶೀಲನಾ SLA ಗಳನ್ನು ಗೌರವಿಸಲಾಗುತ್ತಿದೆಯೇ? — ಮತ್ತು CI ಕಲಾಕೃತಿಗಳಿಗಾಗಿ JSON ಆಗಿ ಮತ್ತು ನಾಯಕತ್ವ ಇಮೇಲ್‌ಗಾಗಿ markdown ಆಗಿ ನಿರ್ಣಾಯಕವಾಗಿ ಸೀರಿಯಲೈಸ್ ಆಗುವ ComplianceReport ಅನ್ನು ಹೊರಸೂಸುತ್ತದೆ. ಎರಡು ವಿನ್ಯಾಸ ಅಂಶಗಳು ಭಾರ-ಹೊರುವವು: ಬಹು-ಅಕ್ಷ fleet_counts (ಸ್ಥಿತಿ, ವರ್ಗ, ಪರಿಶೀಲಕ, SLA ಉಲ್ಲಂಘನೆಗಳು) ಮತ್ತು ಆರ್ಕೈವ್ ಮಾಡಿದ ಕಲಾಕೃತಿಯನ್ನು ತಿರುಚಲಾಗಿಲ್ಲ ಎಂದು ಸಾಬೀತುಪಡಿಸುವ snapshot_hash.

Code snippetpython
1from dataclasses import dataclass, field, asdict 2from datetime import datetime, timedelta 3from hashlib import sha256 4import json 5 6@dataclass 7class ComplianceFinding: 8 check_id: str 9 description: str 10 passed: bool 11 failing_items: list[str] = field(default_factory=list) 12 severity: str = "info" 13 14@dataclass 15class ComplianceReport: 16 generated_at: datetime 17 findings: list[ComplianceFinding] 18 fleet_counts: dict[str, dict[str, int]] 19 snapshot_hash: str = "" 20 21 def to_json(self) -> str: 22 body = asdict(self) 23 body["generated_at"] = self.generated_at.isoformat() 24 return json.dumps(body, sort_keys=True, indent=2) 25 26class ComplianceAuditor: 27 def __init__(self, sla_days: int = 90): 28 self.sla_days = sla_days 29 30 def audit(self, adrs: list[dict]) -> ComplianceReport: 31 now = datetime.utcnow() 32 breached = { 33 a["reviewer"] for a in adrs 34 if (now - datetime.fromisoformat(a["last_reviewed_at"])) 35 > timedelta(days=self.sla_days) 36 } 37 by_reviewer: dict[str, int] = {} 38 for a in adrs: 39 by_reviewer[a["reviewer"]] = by_reviewer.get(a["reviewer"], 0) + 1 40 findings = [ 41 ComplianceFinding( 42 "C-002", 43 f"Every accepted ADR reviewed within {self.sla_days} days", 44 not breached, sorted(breached), "high", 45 ), 46 ] 47 report = ComplianceReport( 48 generated_at=now, 49 findings=findings, 50 fleet_counts={"reviewer": by_reviewer}, 51 ) 52 report.snapshot_hash = sha256(report.to_json().encode()).hexdigest() 53 return report

ಮಾಸಿಕ ನಾಯಕತ್ವ ಇಮೇಲ್ ಮುದ್ರಿಸುವ ಮಾಲೀಕರ-ಪ್ರಕಾರ-ಕ್ರೋಢೀಕರಣ ಟೇಬಲ್ ನಿಖರವಾಗಿ ಇಳಿಕೆ ಕ್ರಮದಲ್ಲಿ ಸಾರ್ಟ್ ಮಾಡಿದ fleet_counts["reviewer"] ಆಗಿದೆ, ಪ್ರತಿ ಸಾಲನ್ನು ಆ ಪರಿಶೀಲಕರ ಎಷ್ಟು ADR ಗಳು breached ಸೆಟ್‌ನಲ್ಲಿ ಬರುತ್ತವೆ ಎಂಬುದರೊಂದಿಗೆ ಟಿಪ್ಪಣಿ ಮಾಡಲಾಗುತ್ತದೆ — ಇದೇ ಆಡಳಿತ ಕಾರ್ಯಕ್ರಮದ ಅರ್ಧ ಭಾಗವನ್ನು ಮೌನವಾಗಿ ತಡೆಹಿಡಿದಿರುವ ಅಡಚಣೆ ಎಂಜಿನಿಯರ್ ಅನ್ನು ಬಹಿರಂಗಪಡಿಸುತ್ತದೆ. snapshot_hash ಅನ್ನು ಕ್ಯಾನೊನಿಕಲ್, ಸಾರ್ಟ್-ಕೀ ಮಾಡಿದ JSON ಮೇಲೆ ಲೆಕ್ಕಹಾಕಿರುವುದರಿಂದ, ಇಮೇಲ್ ಆ ಡೈಜೆಸ್ಟ್ ಅನ್ನು ಮುದ್ರಿಸಬಹುದು, ಇದರಿಂದ ಯಾವುದೇ ಓದುಗರು ಆರ್ಕೈವ್ ಬಕೆಟ್‌ನಿಂದ ಎಳೆದ JSON ನಾಯಕತ್ವ ನೋಡಿದ ನಿಖರ ವರದಿಗೆ ಹೊಂದುತ್ತದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಬಹುದು. ಹ್ಯಾಶ್ generated_at ಸೇರಿದಂತೆ ಸಂಪೂರ್ಣ ದೇಹವನ್ನು ಆವರಿಸುತ್ತದೆ ಎಂಬುದನ್ನು ಗಮನಿಸಿ, ಆದ್ದರಿಂದ ಇದು ಒಂದೇ ವರದಿಗಾಗಿ ತಿರುಚುವಿಕೆ-ಸಾಕ್ಷ್ಯ ಮುದ್ರೆ, ಕ್ರಾಸ್-ರನ್ ಇಡೆಂಪೊಟೆನ್ಸಿ ಭರವಸೆಯಲ್ಲ: ಬದಲಾಗದ ರಿಜಿಸ್ಟ್ರಿಯ ಮೇಲೆ ಎರಡು audit ಕರೆಗಳು ಇನ್ನೂ ತಮ್ಮ generated_at ಟೈಮ್‌ಸ್ಟ್ಯಾಂಪ್‌ನಲ್ಲಿ ಭಿನ್ನವಾಗಿರುತ್ತವೆ ಮತ್ತು ಆದ್ದರಿಂದ ವಿಭಿನ್ನ ಡೈಜೆಸ್ಟ್‌ಗಳನ್ನು ಉತ್ಪಾದಿಸುತ್ತವೆ. ವಿಷಯ ಡ್ರಿಫ್ಟ್‌ಗಾಗಿ ಎರಡು ರನ್‌ಗಳನ್ನು ಹೋಲಿಸಲು, ಕಚ್ಚಾ snapshot_hash ಮೌಲ್ಯಗಳನ್ನು ಹೋಲಿಸುವ ಬದಲು ಹ್ಯಾಶ್ ಮಾಡಿದ ದೇಹದಿಂದ generated_at ಅನ್ನು ಹೊರಗಿಡಿ (ಅಥವಾ findings ಮತ್ತು fleet_counts ಅನ್ನು ನೇರವಾಗಿ diff ಮಾಡಿ).

ಶಿಸ್ತು ಅನ್ವಯ

ಮಾಡಬೇಕಾದವು ಮತ್ತು ಮಾಡಬಾರದವು

ಮಾಡಬೇಕಾದವು

  1. Prometheus ಸ್ಕ್ರೇಪ್ ಮಾರ್ಗ ಮತ್ತು ಹ್ಯಾಶ್ ಮಾಡಿದ JSON ಕಲಾಕೃತಿಯನ್ನು ಪ್ರತ್ಯೇಕ ಕೋಡ್ ಮಾರ್ಗಗಳಲ್ಲಿ ಇರಿಸಿ — ComplianceReport.to_json() ವಿಧಾನವು ಆರ್ಕೈವ್ ಆಗುವ ಮತ್ತು ಆಡಿಟರ್‌ಗಳು ಉಲ್ಲೇಖಿಸುವ ಕ್ಯಾನೊನಿಕಲ್ ಸ್ನ್ಯಾಪ್‌ಶಾಟ್ ಅನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ; ಲೈವ್ ಆಪರೇಟರ್ ಮೇಲ್ಮೈ ಅದೇ ಕೋಡ್ ಮಾರ್ಗವನ್ನು ಹಂಚಿಕೊಂಡರೆ, "ಬದಲಾಯಿಸಲಾಗದ" ಕಲಾಕೃತಿ ಇನ್ನು ಮುಂದೆ ಬದಲಾಯಿಸಲಾಗದಂತೆ ಇರುವುದಿಲ್ಲ ಮತ್ತು ಇಬ್ಬರು ಓದುಗರು ಒಂದು ವಾರದ ಅಂತರದಲ್ಲಿ ಹ್ಯಾಶ್‌ಗಳನ್ನು ಹೋಲಿಸಿದ ಮೊದಲ ಬಾರಿಗೇ SOC 2 ಸಾಕ್ಷ್ಯ ಸಂಗ್ರಹಣೆ ಕುಸಿಯುತ್ತದೆ.
  2. snapshot_hash ಅನ್ನು ಸಾರ್ಟ್-ಕೀ ಮಾಡಿದ JSON ದೇಹದ ಮೇಲೆ sha256 ನೊಂದಿಗೆ ಲೆಕ್ಕಹಾಕಿ — to_json() ಒಳಗೆ json.dumps ಗೆ sort_keys=True ಅನ್ನು ಪಾಸ್ ಮಾಡುವುದು ಕೊಟ್ಟ ದೇಹಕ್ಕೆ ಸೀರಿಯಲೈಸೇಶನ್ ಅನ್ನು ನಿರ್ಣಾಯಕವಾಗಿಸುತ್ತದೆ, ಆದ್ದರಿಂದ ಡೈಜೆಸ್ಟ್ ವಿಶ್ವಾಸಾರ್ಹ ತಿರುಚುವಿಕೆ-ಸಾಕ್ಷ್ಯ ಮುದ್ರೆ: ಆರ್ಕೈವ್ ಮಾಡಿದ JSON ಮೇಲೆ ಹ್ಯಾಶ್ ಅನ್ನು ಮರು-ಲೆಕ್ಕಹಾಕುವ ಯಾವುದೇ ಓದುಗರು ಇಮೇಲ್ ಮುದ್ರಿಸಿದ ಅದೇ ಮೌಲ್ಯವನ್ನು ಪಡೆಯುತ್ತಾರೆ. ದೇಹವು generated_at ಅನ್ನು ಒಳಗೊಂಡಿರುವುದರಿಂದ, ಡೈಜೆಸ್ಟ್ ವಿನ್ಯಾಸದ ಪ್ರಕಾರ ಪ್ರತಿ ರನ್‌ನಲ್ಲಿ ಬದಲಾಗುತ್ತದೆ; ಎರಡು ರನ್‌ಗಳ ನಡುವೆ ವಿಷಯ ಡ್ರಿಫ್ಟ್ ಅನ್ನು ಪತ್ತೆಹಚ್ಚಲು, ಕಚ್ಚಾ ಡೈಜೆಸ್ಟ್‌ಗಳನ್ನು ಹೋಲಿಸುವ ಬದಲು generated_at ಅನ್ನು ಹೊರಗಿಟ್ಟ ದೇಹವನ್ನು ಹ್ಯಾಶ್ ಮಾಡಿ.
  3. fleet_counts ಅನ್ನು ಪರಿಶೀಲಕ-ಕೀ ಮಾಡಿದ ಕ್ರೋಢೀಕರಣದೊಂದಿಗೆ ತುಂಬಿಸಿ ಮತ್ತು ಪ್ರತಿ ಸಾಲನ್ನು ಅದರ SLA-ಉಲ್ಲಂಘನೆ ಎಣಿಕೆಯೊಂದಿಗೆ ಟಿಪ್ಪಣಿ ಮಾಡಿ — ComplianceAuditor.audit ಲೂಪ್‌ನಿಂದ ಬರುವ breached ಸೆಟ್ ಆಡಳಿತ ಕಾರ್ಯಕ್ರಮದ ಅರ್ಧ ಭಾಗವನ್ನು ಮೌನವಾಗಿ ತಡೆಯುತ್ತಿರುವ ಪರಿಶೀಲನಾ ಬ್ಯಾಕ್‌ಲಾಗ್ ಹೊಂದಿರುವ ಒಬ್ಬ ಎಂಜಿನಿಯರ್ ಅನ್ನು ಬಹಿರಂಗಪಡಿಸುತ್ತದೆ; ಕೇವಲ-ಸ್ಥಿತಿ ಎಣಿಕೆ ಆ ಅಡಚಣೆಯನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ಮರೆಮಾಡುತ್ತದೆ.

ಮಾಡಬಾರದವು

  1. ಆಪರೇಟರ್ ಡ್ಯಾಶ್‌ಬೋರ್ಡ್ ಮತ್ತು ಆಡಿಟರ್ ಕಲಾಕೃತಿಯ ನಡುವೆ ಒಂದೇ ಲೈವ್ ಸ್ಟೇಟ್ ಆಬ್ಜೆಕ್ಟ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಬೇಡಿ — ಕಾಂಕ್ರೀಟ್ ವೈಫಲ್ಯ ವಿಧಾನವೆಂದರೆ ಇಬ್ಬರು ಓದುಗರು ಒಂದು ವಾರದ ಅಂತರದಲ್ಲಿ ವರದಿಯನ್ನು ಎಳೆಯುತ್ತಾರೆ, ಲೈವ್ ರಿಜಿಸ್ಟ್ರಿ ಬದಲಾಗಿರುವುದರಿಂದ ವಿಭಿನ್ನ fleet_counts ಸಂಖ್ಯೆಗಳನ್ನು ನೋಡುತ್ತಾರೆ, ಮತ್ತು ಆಡಿಟ್ ಸಮಯದಲ್ಲಿ ಏನು ಸತ್ಯವಾಗಿತ್ತು ಎಂಬುದರ ಬಗ್ಗೆ ಇನ್ನು ಮುಂದೆ ಒಪ್ಪಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ, ಇದು ಅನುಸರಣೆ ದಾಖಲೆಯ ವಿಶ್ವಾಸಾರ್ಹತೆಯನ್ನು ನಾಶಪಡಿಸುತ್ತದೆ.
  2. ಹ್ಯಾಶ್ ಮಾಡುವ ಮೊದಲು ComplianceReport ಅನ್ನು ಸೀರಿಯಲೈಸ್ ಮಾಡುವಾಗ sort_keys=True ಅನ್ನು ಬಿಟ್ಟುಬಿಡಬೇಡಿ — Python ನ ಡೀಫಾಲ್ಟ್ dict ಕ್ರಮವು ಸೇರಿಸಿದ-ಕ್ರಮವಾಗಿದೆ, ಆದ್ದರಿಂದ sort_keys=True ಇಲ್ಲದೆ ಅದೇ ತಾರ್ಕಿಕ ದೇಹವು Python ಆವೃತ್ತಿಗಳು ಅಥವಾ dict-ಮರುನಿರ್ಮಾಣ ಮಾರ್ಗಗಳಾದ್ಯಂತ ವಿಭಿನ್ನ JSON ಸ್ಟ್ರಿಂಗ್ ಆಗಿ ಸೀರಿಯಲೈಸ್ ಆಗಬಹುದು, ಮತ್ತು ಆರ್ಕೈವ್ ಮಾಡಿದ JSON ಮೇಲೆ ಡೈಜೆಸ್ಟ್ ಅನ್ನು ಮರು-ಲೆಕ್ಕಹಾಕುವ ಓದುಗರು ಹೊಂದಿಸಲು ವಿಫಲರಾಗುತ್ತಾರೆ — ತಿರುಚುವಿಕೆ-ಸಾಕ್ಷ್ಯ ಭರವಸೆಯನ್ನು ಮೌನವಾಗಿ ಮುರಿಯುತ್ತದೆ. (ಎರಡು ರನ್‌ಗಳು ಈಗಾಗಲೇ generated_at ಮೂಲಕ ಭಿನ್ನವಾಗಿವೆ; sort_keys ಸ್ಥಿರ ದೇಹಕ್ಕೆ ಪುನರುತ್ಪಾದನೆಯ ಬಗ್ಗೆ, ಕ್ರಾಸ್-ರನ್ ಸಮಾನತೆಯ ಬಗ್ಗೆ ಅಲ್ಲ.)
  3. ವರದಿ ದೇಹವು ಸಂಪೂರ್ಣವಾಗಿ ತುಂಬುವ ಮೊದಲು snapshot_hash ಅನ್ನು ಲೆಕ್ಕಹಾಕಬೇಡಿ — ComplianceAuditor.audit ನಲ್ಲಿರುವ ಕೋಡ್ ಮೊದಲು ComplianceReport ಅನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ ಮತ್ತು ನಂತರ report.snapshot_hash = sha256(report.to_json().encode()).hexdigest() ಅನ್ನು ಹೊಂದಿಸುತ್ತದೆ; fleet_counts ಅಥವಾ findings ಲಗತ್ತಿಸುವ ಮೊದಲು ಹ್ಯಾಶ್ ಮಾಡುವುದು ಆರ್ಕೈವ್ ಬಕೆಟ್ ಸಂಗ್ರಹಿಸುವ ಸಂಪೂರ್ಣ ಕಲಾಕೃತಿಗೆ ಹೊಂದದ ಡೈಜೆಸ್ಟ್ ಅನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ, ಮತ್ತು ಪ್ರತಿ ಪುಲ್‌ನಲ್ಲಿ CI ಪರಿಶೀಲನೆ ವಿಫಲವಾಗುತ್ತದೆ.

3 hands-on labs come with this lesson — real code, in a cloud IDE. Create a free account to run them. No card.

Free account · no card · straight to the labs

Or get the full path — from

Listen to this lesson

Audio overviews of this lesson's labs and its chapter, from GenBodha Bytes.

More free lessons in GenAI Architecture & Design Patterns

All free lessons in GenAI Solutions & Delivery →