8.1 KiB
Dashboard Activity & Tasks su Elasticsearch
Autore: Matteo Benedetto
Email: matteo.benedetto@e-geos.it
Data: 03/12/2025
1. Struttura dei dati in Elasticsearch
1.1 Indice
Tutti i dati sono indicizzati in Elasticsearch nell'indice:
- Nome indice:
geodata
L'indice viene creato automaticamente dal servizio data_loader (contenitore Docker) oppure tramite lo script di inizializzazione usato nella fase di sviluppo.
1.2 Mapping principale
Il mapping dell’indice geodata è stato definito in modo esplicito per evitare problemi con i tipi dinamici e per supportare aggregazioni e visualizzazioni in Grafana.
Campi principali:
location(geo_point)- Coordinate geografiche del punto (latitudine/longitudine).
timestamp(date)- Data/ora dell’evento.
status(keyword)- Stato del ticket/attività. Valori possibili:
OPEN,CLOSED,IN_PROGRESS,ON_HOLD.
- Stato del ticket/attività. Valori possibili:
timing_status(keyword)- Stato di puntualità, definito solo quando
status = CLOSED. - Valori possibili:
CLOSED_ON_TIME,CLOSED_LATE.
- Stato di puntualità, definito solo quando
lead_time(integer)- Tempo di lavorazione (in minuti) per le attività chiuse, usato per le medie nella dashboard.
operator(keyword)- Operatore responsabile (es.
Operator A,Operator B, …).
- Operatore responsabile (es.
duration(integer)- Durata generica dell’evento (valore grezzo usato solo come informativo).
task_type(keyword)- Tipo di task, usato nella dashboard Tasks. Valori esemplificativi:
Create ActivityClose ActivityCreate WFClose WFSelect DTOReport GenerationReport QC
- Tipo di task, usato nella dashboard Tasks. Valori esemplificativi:
min_duration(integer)- Durata minima simulata per il tipo di task (in secondi).
max_duration(integer)- Durata massima simulata per il tipo di task (in secondi).
avg_duration(integer)- Durata media simulata per il tipo di task (in secondi).
task_duration(integer)- Durata effettiva del singolo evento (in secondi).
id(integer)- Identificativo numerico univoco del record nella generazione mock.
1.3 Generazione e caricamento dati
- Generazione dati: file
generate_mock_data.py- Genera un file GeoJSON
data/sample.geojsoncon 1000 feature. - Popola per ogni feature:
- coordinate casuali in Europa,
- campi di stato (
status,timing_status,lead_time), - informazioni di task (
task_type, durate, operatore, timestamp).
- Genera un file GeoJSON
- Caricamento in Elasticsearch: file
loader/load_data.py- Attende che Elasticsearch sia disponibile.
- Crea l’indice
geodatacon il mapping descritto sopra. - Legge
sample.geojsone per ogni feature crea un documento con:location.lat/location.lon- tutti i campi in
properties(timestamp, status, operator, ecc.).
2. Dashboard "Activity"
La prima dashboard si chiama "Activity" ed è salvata in grafana/dashboards/dashboard.json.
2.1 Pannelli principali
-
Activity Status (table)
- Datasource:
Elasticsearch - Query: aggregazione
termssul campostatus+ metricacount. - Trasformazioni:
organizeper rinominare i campi inStatus,Count,Avg Lead Time.calculateFieldper calcolare il totale e la colonnaProportion(percentuale sul totale).
- Colori: override sul campo
Statuscon testo colorato (OPEN giallo, CLOSED blu, IN_PROGRESS azzurro, ON_HOLD viola). - Uso: fornisce il riepilogo delle attività per stato con la proporzione e il tempo medio di lavorazione.
- Datasource:
-
Activity Distribution (geomap heatmap)
- Datasource:
Elasticsearch - Query: metrica
raw_dataconquery: "*"etimeField: "timestamp". - Layer: tipo
heatmapcon:location.mode = "coords"latitude = "location.lat",longitude = "location.lon"
- Uso: visualizza la distribuzione geografica degli eventi come heatmap sull’Europa.
- Datasource:
-
Timing Status (table)
- Datasource:
Elasticsearch - Query: aggregazione
termssutiming_status+ metricacount. - Colori:
CLOSED_ON_TIMEcon background verde.CLOSED_LATEcon background arancione.
- Uso: mostra il numero di attività chiuse in tempo vs in ritardo.
- Datasource:
-
On-Time vs Late (pie chart)
- Datasource:
Elasticsearch - Query: identica a
Timing Status(terms sutiming_status). - Trasformazioni:
- trasformazione per convertire i risultati dell’aggregazione in valori per il pie chart.
- Uso: rappresentazione grafica (torta) della ripartizione CLOSED_ON_TIME vs CLOSED_LATE.
- Datasource:
-
Activity Over Time (time series)
- Datasource:
Elasticsearch - Query:
date_histogramsutimestamp+ metricacount. - Uso: andamento temporale del numero di eventi.
- Datasource:
3. Dashboard "Tasks"
La seconda dashboard si chiama "Tasks" ed è salvata in grafana/dashboards/tasks_dashboard.json.
3.1 Tasks (tabella in alto a sinistra)
- Datasource:
Elasticsearch - Query:
termssutask_type(raggruppamento per tipo di task).- Metriche:
count(Total)minsutask_duration(Min Duration)maxsutask_duration(Max Duration)
- Trasformazioni:
organizeper rinominare i campi:task_type → TaskCount → TotalMin task_duration → Min DurationMax task_duration → Max Duration
- Colori: testo del campo
Taskcolorato in azzurro. - Uso: riepilogo per tipo di task con numero totale e range di durata.
3.2 Tasks by Operator (grafico a barre orizzontali)
- Datasource:
Elasticsearch - Query:
- Primo livello:
termssuoperator(asse Y del grafico). - Secondo livello:
termssutask_type(serie colorate). - Metrica:
count.
- Primo livello:
- Trasformazioni:
groupingToMatrix(o equivalente) per trasformare l’output dell’aggregazione in una matrice con:rowField = operatorcolumnField = task_typevalueField = Count
- Opzioni grafiche:
orientation = horizontal.stacking = normalper avere barre impilate per operatore.- Legenda a destra con un colore per ogni tipo di task (
Create Activity,Close Activity,Create WF,Close WF,Select DTO,Report Generation,Report QC).
- Uso: mostra per ogni operatore il numero di task, suddivisi per tipologia come barre orizzontali impilate.
3.3 Tasks (tabella in basso)
- Datasource:
Elasticsearch - Query:
termssutask_typeeoperator(raggruppamento per Task + Operator).- Metriche:
count(Total)min/max/avgsutask_duration.
- Trasformazioni:
organizeper ordinare le colonne e rinominare i campi in:Task,Operator,Total,Min,Max,Average.
- Unità di misura:
- Durate espresse in secondi, visualizzate in Grafana come secondi/minuti (in base al formato scelto nella colonna).
- Uso: tabella dettagliata per tipo di task e operatore, con statistiche di durata.
4. Note operative
-
Provisioning Grafana
- I file delle dashboard sono montati nel container Grafana tramite Docker Compose.
- Ogni modifica ai file JSON (
dashboard.json,tasks_dashboard.json) richiede un riavvio del container Grafana (docker compose restart grafana).
-
Datasource Elasticsearch
- È definito tramite provisioning (file
datasource.yml) usando:jsonData.index = "geodata"jsonData.timeField = "timestamp"
- Non viene usata la
uiddel datasource nelle dashboard: i pannelli si riferiscono al datasource tramite"datasource": "Elasticsearch"per evitare problemi di provisioning.
- È definito tramite provisioning (file
-
Rigenerazione dati
- Per rigenerare i dati mock:
- Eseguire
python3 generate_mock_data.pynella root del progetto. - Cancellare l’indice
geodatain Elasticsearch. - Riavviare il container
data_loaderin modo che ricrei l’indice con il mapping corretto e ricarichisample.geojson.
- Eseguire
- Per rigenerare i dati mock:
Questo documento descrive lo stato corrente della soluzione (stack Docker Elasticsearch + Grafana + loader Python) usata per visualizzare dati geospaziali e metriche di attività/task nelle dashboard Activity e Tasks.