Metrics Dashboard
Overview
Section titled “Overview”Track project health, downloads, performance, and usage metrics.
Available Metrics
Section titled “Available Metrics”1. GitHub Insights
Section titled “1. GitHub Insights”Built-in GitHub metrics:
- Stars/Forks/Watchers - Popularity indicators
- Issues/PRs - Activity metrics
- Contributors - Community growth
- Traffic - Views and clones
- Releases - Download counts
Access: Repository → Insights tab
2. crates.io Statistics
Section titled “2. crates.io Statistics”Package metrics:
- Downloads - Total and recent downloads
- Versions - Release history
- Dependencies - Reverse dependency count
API Access:
# Get crate infocurl https://crates.io/api/v1/crates/rust-template
# Get download statscurl https://crates.io/api/v1/crates/rust-template/downloadsResponse:
{ "crate": { "id": "rust-template", "name": "rust-template", "downloads": 12345, "recent_downloads": 1234 }, "versions": [ { "num": "0.1.0", "downloads": 5678 } ]}3. Docker Hub Statistics
Section titled “3. Docker Hub Statistics”Container metrics:
- Pulls - Image download count
- Stars - Repository stars
API Access:
curl https://hub.docker.com/v2/repositories/username/rust-template/
# Pull statisticscurl https://hub.docker.com/v2/repositories/username/rust-template/stats/4. GitHub Packages
Section titled “4. GitHub Packages”Package registry metrics:
gh api /users/USERNAME/packages/container/rust-template5. CI/CD Metrics
Section titled “5. CI/CD Metrics”Workflow metrics:
- Build times - Performance tracking
- Success rate - Reliability metric
- Cache hit rate - Efficiency metric
Query via GitHub API:
gh api repos/USER/REPO/actions/workflows/ci.yml/runs \ --jq '.workflow_runs[] | {created_at, conclusion, run_duration_ms}'Dashboard Options (how-to)
Section titled “Dashboard Options (how-to)”“Available Metrics” above is the reference catalog of metric sources; the options below are task-oriented setup recipes for surfacing them.
Option 1: shields.io Badges
Section titled “Option 1: shields.io Badges”Add to README.md:

[](https://codecov.io/gh/USER/REPO)
[](https://crates.io/crates/rust-template)[](https://crates.io/crates/rust-template)
[](https://hub.docker.com/r/username/rust-template)
[](https://deps.rs/repo/github/USER/REPO)
[](https://github.com/USER/REPO/actions?query=workflow%3A%22Security+Audit%22)Option 2: GitHub Metrics Action
Section titled “Option 2: GitHub Metrics Action”.github/workflows/metrics.yml:
name: Metricson: schedule: - cron: "0 0 * * 0" # Weekly workflow_dispatch:
jobs: metrics: runs-on: ubuntu-latest permissions: contents: write steps: - uses: lowlighter/metrics@latest with: token: ${{ secrets.METRICS_TOKEN }} user: username template: classic config_timezone: America/New_York plugin_lines: yes plugin_languages: yes plugin_languages_details: percentage plugin_traffic: yes plugin_stargazers: yes plugin_stargazers_charts_type: chartistGenerates: SVG metrics dashboard
Option 3: Custom Dashboard
Section titled “Option 3: Custom Dashboard”Grafana + Prometheus:
version: '3'services: prometheus: image: prom/prometheus volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml ports: - 9090:9090
grafana: image: grafana/grafana ports: - 3000:3000 environment: - GF_SECURITY_ADMIN_PASSWORD=adminprometheus.yml:
scrape_configs: - job_name: 'github' static_configs: - targets: ['api.github.com'] metrics_path: '/repos/USER/REPO'Option 4: Plausible Analytics
Section titled “Option 4: Plausible Analytics”For documentation site traffic:
<script defer data-domain="yourdomain.com" src="https://plausible.io/js/script.js"></script>Features:
- Privacy-friendly
- No cookies
- GDPR compliant
- Real-time dashboard
Performance Benchmarks
Section titled “Performance Benchmarks”Criterion Integration
Section titled “Criterion Integration”View Benchmark Reports:
- Run benchmarks locally:
cargo bench - Open
target/criterion/report/index.html - Compare with baseline
CI Reports:
- Saved to Actions artifacts
- Compare across PRs
- Track performance trends
Continuous Benchmarking
Section titled “Continuous Benchmarking”Track performance over time:
# Generate benchmark historycargo bench --bench my_benchmark -- --save-baseline current
# Compare with previouscargo bench --bench my_benchmark -- --baseline previousStore results:
- name: Upload benchmark results uses: actions/upload-artifact@v4 with: name: benchmarks-${{ github.sha }} path: target/criterion/ retention-days: 90Download Tracking
Section titled “Download Tracking”crates.io Downloads
Section titled “crates.io Downloads”Script to track:
import requestsimport jsonfrom datetime import datetime
def get_crate_stats(crate_name): url = f"https://crates.io/api/v1/crates/{crate_name}" response = requests.get(url) data = response.json()
return { "date": datetime.now().isoformat(), "total_downloads": data["crate"]["downloads"], "recent_downloads": data["crate"]["recent_downloads"], "versions": len(data["versions"]) }
# Store in time-series database or CSVstats = get_crate_stats("rust-template")with open("downloads.json", "a") as f: json.dump(stats, f) f.write("\n")Automate with GitHub Actions:
name: Track Downloadson: schedule: - cron: '0 0 * * *' # Daily
jobs: track: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Fetch stats run: python scripts/track_downloads.py - name: Commit stats run: | git add downloads.json git commit -m "Update download stats [skip ci]" git pushVisualization
Section titled “Visualization”Generate charts:
import matplotlib.pyplot as pltimport json
# Load datawith open("downloads.json") as f: data = [json.loads(line) for line in f]
dates = [d["date"] for d in data]downloads = [d["total_downloads"] for d in data]
# Plotplt.plot(dates, downloads)plt.title("Download Growth")plt.xlabel("Date")plt.ylabel("Total Downloads")plt.xticks(rotation=45)plt.tight_layout()plt.savefig("downloads.png")Health Checks
Section titled “Health Checks”Repository Health Score
Section titled “Repository Health Score”GitHub Community Standards:
- ✅ README
- ✅ LICENSE
- ✅ CODE_OF_CONDUCT.md
- ✅ CONTRIBUTING.md
- ✅ SECURITY.md
- ✅ Issue templates
- ✅ PR templates
Check: Repository → Insights → Community
Dependency Health
Section titled “Dependency Health”deps.rs Dashboard:
Shows:
- Outdated dependencies
- Security vulnerabilities
- License compatibility
Code Quality Metrics
Section titled “Code Quality Metrics”From workflows:
- Test coverage (≥80%)
- Mutation score (≥80%)
- Clippy warnings (0)
- Documentation coverage
Alerting
Section titled “Alerting”GitHub Notifications
Section titled “GitHub Notifications”Configure alerts:
- Repository → Settings → Notifications
- Enable:
- Dependabot alerts
- Secret scanning
- Code scanning
Custom Alerts
Section titled “Custom Alerts”Workflow failures:
- name: Notify on failure if: failure() uses: 8398a7/action-slack@v3 with: status: ${{ job.status }} text: 'Build failed!' webhook_url: ${{ secrets.SLACK_WEBHOOK }}Performance regression:
- name: Check regression run: | if [ "$PERF_CHANGE" -gt "10" ]; then echo "Performance regression detected!" gh issue create --title "Performance Regression" --body "..." fiReporting
Section titled “Reporting”Weekly Summary
Section titled “Weekly Summary”Automated report:
name: Weekly Reporton: schedule: - cron: '0 9 * * 1' # Monday 9 AM
jobs: report: runs-on: ubuntu-latest steps: - name: Generate report run: | cat > report.md << 'EOF' # Weekly Report
## Downloads $(curl -s https://crates.io/api/v1/crates/rust-template | jq -r '.crate | "Total: \(.downloads), Recent: \(.recent_downloads)"')
## Issues Open: $(gh issue list --state open --json id | jq '. | length') Closed this week: $(gh issue list --state closed --search "closed:>=$(date -d '7 days ago' +%Y-%m-%d)" --json id | jq '. | length')
## PRs Merged this week: $(gh pr list --state merged --search "merged:>=$(date -d '7 days ago' +%Y-%m-%d)" --json id | jq '. | length') EOF
- name: Post to discussions run: gh discussion create --title "Weekly Report $(date +%Y-%m-%d)" --body-file report.md