A production-inspired Windows monitoring stack built using Prometheus, Grafana, Alertmanager, Docker, and windows_exporter.
This project demonstrates how to build a reusable observability system for Windows environments, designed to scale from local development to homelab and Kubernetes deployments.
- Monitor Windows systems using open-source tooling
- Build reusable, version-controlled dashboards
- Implement dynamic service discovery
- Implement alerting and routing
- Simulate real-world DevOps monitoring practices
- Prometheus scraping Windows hosts via windows_exporter
- File-based service discovery (file_sd_configs)
- Alerting with Prometheus rule files
- Alert routing via Alertmanager
- Pre-provisioned Grafana dashboards (JSON)
- Fully containerized with Docker Compose
- Config-driven (no manual UI setup required)
- Designed for future Kubernetes migration
- Prometheus
- Grafana
- Alertmanager
- windows_exporter
- Docker Compose
Ensure the exporter is running and accessible:
http://<host>:9182/metricsEdit:
prometheus/targets/windows.jsonExample:
[
{
"targets": ["10.0.100.110:9182"],
"labels": {
"env": "homelab"
}
}
]docker compose up -d| Service | URL |
|---|---|
| Prometheus | http://localhost:9090 |
| Grafana | http://localhost:3000 |
| Alertmanager | http://localhost:9093 |
Grafana credentials:
| User | Password |
|---|---|
| admin | admin |
- Build custom dashboards
- Add alerts
- Add multiple Windows hosts
- Export/import dashboards for homelab use
This project uses inline values for local testing only.
Do not commit real credentials.
In production, use Docker secrets or a secret manager and the smtp_auth_password_file configuration.
TODO
Alerts are defined using rule files:
prometheus/rules/These are loaded via:
rule_files:
- "/etc/prometheus/rules/*.yaml"Example alert:
groups:
- name: test
rules:
- alert: AlwaysFiring
expr: vector(1)
for: 1m
labels:
severity: warning
annotations:
summary: "Test alert"
Prometheus sends alerts to Alertmanager:
alerting:
alertmanagers:
- static_configs:
- targets:
- "alertmanager-wm:9093"Alertmanager is responsible for:
- Grouping alerts
- Deduplicating alerts
- Routing alerts (email, Slack, etc.)
Prometheus
http://localhost:9090/alertsAlertmanager
http://localhost:9093Alertmanager status in Prometheus
Status → AlertmanagersThe default dashboard provides:
- Exporter health (UP/DOWN)
- CPU usage
- Memory usage
- System uptime
- Process count
- Network throughput
- Disk I/O
- Disk usage per volume
.
├── docker-compose.yaml
├── prometheus/
│ ├── prometheus.yaml
│ └── targets/
│ └── windows.json
└── grafana/
├── dashboards/
│ └── windows-overview.json
└── provisioning/
├── datasources/
│ └── prometheus.yaml
└── dashboards/
└── dashboards.yaml-
prometheus/prometheus.yml- Main Prometheus configuration
- Defines scrape jobs and service discovery
- Docs: https://prometheus.io/docs/prometheus/latest/configuration/configuration/
-
prometheus/targets/windows.json- File-based service discovery for Windows hosts
- Allows dynamic updates without restarting Prometheus
- Docs: https://prometheus.io/docs/guides/file-sd/
-
alertmanager/alertmanager.yaml- Alertmanager configuration
- Docs: https://prometheus.io/docs/alerting/latest/configuration/
-
prometheus/rules/*.yaml- Prometheus rules
- Docs: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/
-
grafana/provisioning/datasources/prometheus.yml- Automatically provisions Prometheus as a Grafana datasource
- Docs: https://grafana.com/docs/grafana/latest/administration/provisioning/#datasources
-
grafana/provisioning/dashboards/dashboards.yml- Configures Grafana to load dashboards from files
- Docs: https://grafana.com/docs/grafana/latest/administration/provisioning/#dashboards
-
grafana/dashboards/windows-overview.json- Dashboard definition (panels, queries, layout)
- Docs: https://grafana.com/docs/grafana/latest/dashboards/json-model/