Dashboard web per il monitoraggio dei ticket Redmine con calcolo SLA, alimentata da MongoDB.
Redmine API
│
▼
redmine_fetcher.py ──► MongoDB (tickets)
│
▼
web_server.py ──► dashboard.html (browser)
| File | Ruolo |
|---|---|
redmine_fetcher.py |
Recupera i ticket da Redmine, calcola i tempi SLA e salva su MongoDB |
web_server.py |
Server HTTP che espone la dashboard e le API JSON |
dashboard.html |
Frontend della dashboard |
config.json |
Configurazione centralizzata (connessioni, SLA, filtri, orari) |
- Python 3.12+
- MongoDB (locale o remoto)
- Accesso all'istanza Redmine con API key
python -m venv venv
source venv/bin/activate # Linux/macOS
# oppure: venv\Scripts\activate # Windows
pip install -r requirements.txtCopia il template e compila i valori:
cp config.example.json config.jsonModifica config.json con i tuoi dati:
{
"redmine": {
"url": "https://tua-istanza.redmine.it",
"api_key": "<la-tua-api-key>"
},
"mongodb": {
"uri": "mongodb://localhost:27017",
"database": "ams_dashboard",
"collection": "tickets"
}
}| Sezione | Descrizione |
|---|---|
redmine |
URL e API key dell'istanza Redmine |
mongodb |
URI, database e collection MongoDB |
filtri_ticket |
Filtri per stato, tracker e custom field dei progetti |
sla |
Target ore per presa in carico e risoluzione per priorità |
mappa_priorita |
Normalizzazione dei nomi priorità Redmine → chiavi SLA |
stati_* |
Nomi degli stati Redmine per nuovo/risolto/chiuso/attese |
orario_lavorativo |
Fasce orarie lavorative per il calcolo ore SLA |
stima_pic |
Parametri della stima statistica del tempo di presa in carico |
server |
Porta, auto-refresh e apertura automatica del browser |
| Priorità | Presa in carico | Risoluzione |
|---|---|---|
| Urgente | 2 ore | 8 ore |
| Alta | 4 ore | 12 ore |
| Media | 12 ore | 24 ore |
| Bassa | 24 ore | — |
I tempi sono calcolati in ore lavorative (lunedì–venerdì, 9–13 e 14–18).
python redmine_fetcher.pypython redmine_fetcher.py --daemonIl daemon esegue un ciclo ogni schedule.intervallo_minuti minuti (default 30).
python web_server.pyLa dashboard si apre automaticamente su http://localhost:8765 (modificabile in config.json).
| Endpoint | Descrizione |
|---|---|
GET / |
Serve la dashboard HTML |
GET /api/issues?start_date=YYYY-MM-DD |
Restituisce i ticket in formato JSON |
GET /api/config |
Configurazione runtime (SLA, auto-refresh, ultimo fetch) |
Per ogni ticket vengono calcolati:
- ore_presa_in_carico — ore lavorative dalla creazione al primo cambio di stato
- ore_risoluzione — ore lavorative dalla creazione alla risoluzione/chiusura
- ore_attesa_cliente — ore lavorative totali nello stato "In attesa cliente"
- ore_attesa_interna — ore lavorative totali nello stato "In attesa interna"
Lo stato SLA può essere: ok (< 80% target), warning (80–100%), breach (> 100%), n/a (nessun target definito).
Per i ticket ancora nello stato "Nuovo", il fetcher calcola una stima dell'orario atteso di presa in carico basata sul percentile 75 storico per combinazione priorità+tracker. La finestra temporale è configurabile (stima_pic.giorni_primari, con fallback a giorni_fallback se i campioni sono insufficienti).
{
"_id": 1234,
"subject": "Titolo del ticket",
"project": "Nome progetto",
"tracker": "Bug",
"priority": "Alta",
"priority_key": "Alta",
"categoria": "AMS contratto standard",
"status": "In corso",
"assigned_to": "Mario Rossi",
"created_on": "2026-01-15T10:30:00Z",
"ore_presa_in_carico": 3.5,
"ore_risoluzione": null,
"ore_attesa_cliente": 1.0,
"ore_attesa_interna": null,
"ore_trascorse": 12.0,
"status_pic": "ok",
"status_res": "warning",
"pic_scadenza_sla": "2026-01-15T14:30:00+00:00",
"pic_stima_statistica": "2026-01-15T13:15:00+00:00",
"aggiornato_il": "2026-01-15T11:00:00"
}