rsyslog/CHANGES_OVERVIEW.md
dvirlabs db28c9da82
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
Migrate from pushgateway to infinity
2026-04-21 12:41:09 +03:00

14 KiB
Raw Permalink Blame History

Change Summary: Pushgateway → gitops-status-server

Files Modified: 2 | Files Created: 2

Files Changed

MODIFIED  .woodpecker.yml
          ├─ Replaced Pushgateway URL with gitops-status-server URL
          ├─ Removed metric push commands
          ├─ Changed to call update-gitops-status.sh script
          ├─ Both update-gitops-status and gitops_sync_check steps updated
          └─ Enhanced comments explaining new flow

MODIFIED  ansible/playbooks/drift-check.yml
          ├─ Added file collection logic (drifted_files fact)
          ├─ Added debug output markers (DRIFTED_FILES=...)
          ├─ Added status markers (SYNC_STATUS=...)
          ├─ Original drift detection logic unchanged
          └─ Fully backward compatible

Files Created

NEW       update-gitops-status.sh
          ├─ Step 1: Run drift-check.yml
          ├─ Step 2: Parse output for changed files
          ├─ Step 3: Build JSON payload
          ├─ Step 4: POST to gitops-status-server/api/status
          ├─ 4-step flow with clear logging
          └─ Environment-configurable (GITOPS_STATUS_SERVER_URL, REPO_NAME, SERVER_NAME)

NEW       Documentation files (4 total)
          ├─ GITOPS_STATUS_SERVER_INTEGRATION.md (comprehensive guide)
          ├─ QUICK_REFERENCE.md (quick start & troubleshooting)
          ├─ REFACTOR_SUMMARY.md (before/after details)
          └─ README_GITOPS_STATUS.md (this overview)

Architecture Change

BEFORE: Pushgateway-based

Drift Check → Exit Code (0/1) → Pushgateway → Prometheus → Grafana
    ↓                              ↓                ↓          ↓
Binary                       Lost file info    Scraping   Only 0/1 shown

AFTER: gitops-status-server

Drift Check → JSON Generation → gitops-status-server → Grafana
    ↓              ↓                    ↓                  ↓
Ansible       Structured           REST API           Rich metadata
Output        Parsing              (POST)              File names
              ↓                                        + timestamps
              DRIFTED_FILES=...                       + counts

Step-by-Step Flow

┌─── CRON or POST-DEPLOY TRIGGER ────────────────────────────────────┐
│                                                                     │
│  Woodpecker Step Executes:                                         │
│  1. chmod +x update-gitops-status.sh                              │
│  2. ./update-gitops-status.sh                                     │
│                                                                     │
│  ↓                                                                  │
│  
│  STEP 1: Run Drift Detection                                       │
│  ─────────────────────────────────                                │
│  ansible-playbook drift-check.yml                                 │
│                                                                     │
│  Tasks:                                                            │
│  ├─ Copy rsyslog.conf (check mode)                               │
│  ├─ Copy rsyslog.d/* (check mode)                                │
│  ├─ Find missing files                                           │
│  └─ Output: DRIFTED_FILES=file1,file2,file3                      │
│            SYNC_STATUS=OUT_OF_SYNC                               │
│                                                                     │
│  Exit Code: 0 (SYNCED) or non-zero (OUT_OF_SYNC)                 │
│                                                                     │
│  ↓                                                                  │
│  
│  STEP 2: Parse Output                                             │
│  ──────────────────────                                           │
│  Extract from Ansible debug output:                              │
│  ├─ DRIFTED_FILES=/etc/rsyslog.conf,/etc/rsyslog.d/30-lab.conf  │
│  ├─ Split on commas: ['/etc/rsyslog.conf', '/etc/rsyslog.d/...'] │
│  ├─ Convert paths: [rsyslog.conf, rsyslog.d/30-lab.conf]        │
│  └─ Count: 2 changed files                                        │
│                                                                     │
│  ↓                                                                  │
│  
│  STEP 3: Generate JSON                                            │
│  ──────────────────────                                           │
│  {                                                                 │
│    "repo": "rsyslog",                                            │
│    "server": "rsyslog-lab",                                      │
│    "sync_status": "OUT_OF_SYNC",                                 │
│    "drift_count": 2,                                             │
│    "files": [                                                      │
│      { "name": "rsyslog.conf" },                                │
│      { "name": "rsyslog.d/30-lab.conf" }                         │
│    ],                                                             │
│    "last_check": "2026-04-21T10:30:00Z"                         │
│  }                                                                 │
│                                                                     │
│  ↓                                                                  │
│  
│  STEP 4: POST to gitops-status-server                             │
│  ─────────────────────────────────────                            │
│  curl -X POST                                                     │
│    -H "Content-Type: application/json"                           │
│    -d "$JSON"                                                     │
│    http://gitops-status-server.observability-stack.svc...:80/api/status
│                                                                     │
│  Response: HTTP 200 OK ✓                                          │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

┌─── GITOPS-STATUS-SERVER ───────────────────────────────────────────┐
│                                                                    │
│  Receives POST /api/status                                       │
│  Updates internal state                                          │
│  Serves /status.json                                             │
│  (Available to Grafana)                                          │
│                                                                    │
└────────────────────────────────────────────────────────────────────┘

┌─── GRAFANA ────────────────────────────────────────────────────────┐
│                                                                    │
│  Infinity Datasource                                             │
│  ├─ Polls /status.json (configurable interval)                 │
│  ├─ Parses JSON response                                         │
│  └─ Updates dashboard panels:                                    │
│     ├─ Sync Status: 🔴 OUT_OF_SYNC                             │
│     ├─ Drift Count: 2                                           │
│     ├─ Files:                                                    │
│     │  - rsyslog.conf                                           │
│     │  - rsyslog.d/30-lab.conf                                  │
│     └─ Last Check: 2026-04-21 10:30 UTC                        │
│                                                                    │
└────────────────────────────────────────────────────────────────────┘

Integration Points

Pull Request Event

push: branches: PR
  ├─ syntax-check
  ├─ validate
  └─ (NO gitops-status update, correct by design)

Master Push Event

push: branch: master
  ├─ syntax-check
  ├─ validate
  ├─ deploy
  └─ update-gitops-status ← NEW: calls update-gitops-status.sh

Scheduled Cron Event

cron: */2 * * * *
  └─ gitops_sync_check ← calls update-gitops-status.sh
     (every 2 minutes)

JSON Payload Examples

Case 1: Everything Synced

{
  "repo": "rsyslog",
  "server": "rsyslog-lab",
  "sync_status": "SYNCED",
  "drift_count": 0,
  "files": [],
  "last_check": "2026-04-21T10:30:00Z"
}

Case 2: Manual Edit Detected

{
  "repo": "rsyslog",
  "server": "rsyslog-lab",
  "sync_status": "OUT_OF_SYNC",
  "drift_count": 1,
  "files": [
    { "name": "rsyslog.conf" }
  ],
  "last_check": "2026-04-21T10:32:00Z"
}

Case 3: Multiple Files Changed

{
  "repo": "rsyslog",
  "server": "rsyslog-lab",
  "sync_status": "OUT_OF_SYNC",
  "drift_count": 3,
  "files": [
    { "name": "rsyslog.conf" },
    { "name": "rsyslog.d/30-lab.conf" },
    { "name": "rsyslog.d/31-remote.conf" }
  ],
  "last_check": "2026-04-21T10:34:00Z"
}

Deployment Checklist

  • Review changes: git diff origin/master
  • Commit: git add . && git commit -m "refactor: gitops-status-server integration"
  • Push: git push
  • Verify pipeline runs (check update-gitops-status step)
  • Create Woodpecker cron job: gitops_sync_check at */2 * * * *
  • Test cron execution (wait 2 minutes)
  • Verify gitops-status-server receives JSON
  • Check Grafana dashboard displays status
  • Test manual file edit (detect within 2 minutes)
  • Monitor for 24 hours

Key Improvements

Aspect Before (Pushgateway) After (gitops-status-server)
Data Format Single metric (0/1) Rich JSON with metadata
File Details None List of changed files
Infrastructure Prometheus + Pushgateway Single service call
Query Language PromQL Simple JSON API
Grafana Plugin Prometheus DS Infinity DS (native)
Audit Trail Basic Structured snapshots
Setup Complexity High Low
Multi-repo Support Difficult Built-in

Testing Scenarios

Scenario 1: Server is synced

Cron triggers → drift-check runs → No changes found
→ SYNC_STATUS=SYNCED → JSON sent → Grafana shows ✓ SYNCED (0 drift)

Scenario 2: Manual file edit

Someone edits /etc/rsyslog.conf directly on server
→ Cron triggers (≤2 min) → drift-check detects change
→ DRIFTED_FILES=/etc/rsyslog.conf → JSON sent
→ Grafana shows ✗ OUT_OF_SYNC (1 drift: rsyslog.conf)

Scenario 3: Deploy succeeds

Push to master → Pipeline runs → deploy completes
→ update-gitops-status runs → drift-check shows no drift
→ JSON sent: SYNC_STATUS=SYNCED → Grafana updated

Scenario 4: Manual drift recovery

Admin runs ansible apply to fix drift
→ Next cron (≤2 min) → drift-check shows SYNCED
→ JSON sent: SYNC_STATUS=SYNCED
→ Grafana updates to show ✓ SYNCED (0 drift)

Code Quality

  • Comments explain flow
  • Error handling included
  • Exit codes meaningful
  • No hardcoded paths (environment vars)
  • Ansible playbook backward compatible
  • JSON properly escaped
  • ISO 8601 timestamps

Security

  • SSH credentials in Woodpecker secrets
  • JSON exposes only metadata (no config contents)
  • No sensitive data in logs
  • gitops-status-server internal only (ClusterIP)
  • Network-isolated (Kubernetes)

Performance

  • Frequency: Every 2 minutes (cron) + immediate post-deploy
  • Duration: ~30 seconds per run (drift-check + JSON POST)
  • Data size: ~500 bytes per JSON update
  • Network: Internal only (ClusterIP service)
  • Load: Minimal (one HTTP POST per cycle)

Success Criteria

Cron job runs every 2 minutes
JSON posted to gitops-status-server with HTTP 200
gitops-status-server receives and stores JSON
Grafana dashboard displays sync status
Changed files listed in Grafana
Manual edits detected within 2 minutes
Post-deploy status updates immediately
No errors in pipeline logs


Rollback (if needed)

# Revert to previous version
git revert HEAD --no-edit
git push

# Remove cron job from Woodpecker UI

Documentation Generated

  1. GITOPS_STATUS_SERVER_INTEGRATION.md 400+ lines, comprehensive guide
  2. QUICK_REFERENCE.md Quick start, testing, troubleshooting
  3. REFACTOR_SUMMARY.md Before/after code comparison
  4. README_GITOPS_STATUS.md Overview and quick start
  5. This file Visual summary of changes

Next Actions

  1. Review all changes
  2. Test locally with ./update-gitops-status.sh
  3. Commit and push to Git
  4. Monitor Woodpecker pipeline run
  5. Configure Woodpecker cron job
  6. Verify gitops-status-server receives JSON
  7. Check Grafana dashboard works
  8. Monitor for 24 hours

Summary

Changed: Pushgateway-based metrics → gitops-status-server JSON API
Result: Richer metadata, simpler architecture, better audit trail
Impact: No breaking changes, backward compatible
Time to deploy: ~30 minutes (including testing)
Monitoring: Every 2 minutes + post-deploy

Ready for production deployment