- Implemented RustFsArtifactObjectStore for managing artifacts in RustFS. - Added unit tests for RustFsArtifactObjectStore functionality. - Created a RustFS migrator tool to transfer objects from S3 to RustFS. - Introduced policy preview and report models for API integration. - Added fixtures and tests for policy preview and report functionality. - Included necessary metadata and scripts for cache_pkg package.
		
			
				
	
	
		
			49 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# Scanner Analyzer Benchmarks – Operations Guide
 | 
						||
 | 
						||
## Purpose
 | 
						||
Keep the language analyzer microbench under the < 5 s SBOM pledge. CI emits Prometheus metrics and JSON fixtures so trend dashboards and alerts stay in lockstep with the repository baseline.
 | 
						||
 | 
						||
> **Grafana note:** Import `docs/ops/scanner-analyzers-grafana-dashboard.json` into your Prometheus-backed Grafana stack to monitor `scanner_analyzer_bench_*` metrics and alert on regressions.
 | 
						||
 | 
						||
## Publishing workflow
 | 
						||
1. CI (or engineers running locally) execute:
 | 
						||
   ```bash
 | 
						||
   dotnet run \
 | 
						||
     --project bench/Scanner.Analyzers/StellaOps.Bench.ScannerAnalyzers/StellaOps.Bench.ScannerAnalyzers.csproj \
 | 
						||
     -- \
 | 
						||
     --repo-root . \
 | 
						||
     --out bench/Scanner.Analyzers/baseline.csv \
 | 
						||
     --json out/bench/scanner-analyzers/latest.json \
 | 
						||
     --prom out/bench/scanner-analyzers/latest.prom \
 | 
						||
     --commit "$(git rev-parse HEAD)" \
 | 
						||
     --environment "${CI_ENVIRONMENT_NAME:-local}"
 | 
						||
   ```
 | 
						||
2. Publish the artefacts (`baseline.csv`, `latest.json`, `latest.prom`) to `bench-artifacts/<date>/`.
 | 
						||
3. Promtail (or the CI job) pushes `latest.prom` into Prometheus; JSON lands in long-term storage for workbook snapshots.
 | 
						||
4. The harness exits non-zero if:
 | 
						||
   - `max_ms` for any scenario breaches its configured threshold; or
 | 
						||
   - `max_ms` regresses ≥ 20 % versus `baseline.csv`.
 | 
						||
 | 
						||
## Grafana dashboard
 | 
						||
- Import `docs/ops/scanner-analyzers-grafana-dashboard.json`.
 | 
						||
- Point the template variable `datasource` to the Prometheus instance ingesting `scanner_analyzer_bench_*` metrics.
 | 
						||
- Panels:
 | 
						||
  - **Max Duration (ms)** – compares live runs vs baseline.
 | 
						||
  - **Regression Ratio vs Limit** – plots `(max / baseline_max - 1) * 100`.
 | 
						||
  - **Breached Scenarios** – stat panel sourced from `scanner_analyzer_bench_regression_breached`.
 | 
						||
 | 
						||
## Alerting & on-call response
 | 
						||
- **Primary alert**: fire when `scanner_analyzer_bench_regression_ratio{scenario=~".+"} >= 1.20` for 2 consecutive samples (10 min default). Suggested PromQL:
 | 
						||
  ```
 | 
						||
  max_over_time(scanner_analyzer_bench_regression_ratio[10m]) >= 1.20
 | 
						||
  ```
 | 
						||
- Suppress duplicates using the `scenario` label.
 | 
						||
- Pager payload should include `scenario`, `max_ms`, `baseline_max_ms`, and `commit`.
 | 
						||
- Immediate triage steps:
 | 
						||
  1. Check `latest.json` artefact for the failing scenario – confirm commit and environment.
 | 
						||
  2. Re-run the harness with `--captured-at` and `--baseline` pointing at the last known good CSV to verify determinism.
 | 
						||
  3. If regression persists, open an incident ticket tagged `scanner-analyzer-perf` and page the owning language guild.
 | 
						||
  4. Roll back the offending change or update the baseline after sign-off from the guild lead and Perf captain.
 | 
						||
 | 
						||
Document the outcome in `docs/12_PERFORMANCE_WORKBOOK.md` (section 8) so trendlines reflect any accepted regressions.
 |