Attualmente sto lavorando a un progetto per un impianto di produzione. Le macchine in produzione stanno salvando i cosiddetti "dati di telemetria", misurazioni come la pressione dell'acqua, il volume di plastica o la temperatura in un database. In questo caso stiamo usando un Cluster ElasticSearch. Il mio compito è sviluppare un'applicazione web che offra allo staff tecnico un'interfaccia per l'analisi nel caso in cui una macchina abbia un errore, che a volte può essere letta dai dati di telemetria. La visualizzazione più semplice che hanno richiesto è una linechart che mostra tutti i dati nel tempo. So che strumenti come Kibana sono disponibili ma il software ha bisogno di completare più attività che non possono essere realizzate con Kibana.
Il mio obiettivo sarebbe quello di costruire un dashboard flessibile per la parte di analisi usando JSF e Primefaces. La cosa su cui mi sto battendo nel processo di moddelling è il fatto che ci sono 3 tipi di macchine e i dati di telemetria che stanno salvando nel database sono tutti diversi. Ad esempio, una delle macchine sta semplicemente stampando parti di metallo e sta emettendo solo una misura di pressione, ma ce n'è anche una che viene utilizzata per lo stampaggio di plastica che registra il volume di plastica da e la temperatura corrente.
Quindi ho iniziato a implementarlo in questo modo:
Enum MachineType{
METALLSTANCE, PLASTICMOLDER;
}
class Machine{
private MachineType type;
}
class TelemetryDataPoint<T extends Enum<T>>{
}
E c'è una API disponibile localmente nella rete che mi consente di inviare richieste di ricerca a ElasticSearchCluster e restituisce l'intera stringa:
{
"took" : 63,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : null,
"hits" : [ {
"_index" : "telemetry",
"_type" : "_doc",
"_id" : "1",
"_score" : null,
"_source" : {<DATA>}
},
]
}
}
Costruisco una classe RESTRouter che consente di inviare le richieste GET e restituisce la risposta. RESTRouter è intern usato dal repository delle statistiche per recuperare i dati desiderati in un determinato periodo di tempo. I DataPoints vengono quindi utilizzati nel diagramma di linee. Ora la mia domanda è come eseguire l'analisi della risposta ElasticSearch in TelemetryDataPoint - Attualmente sto usando jackson per ciò che funziona bene, ma mi sento un po 'innaturale perché sto già usando l'API elasticsearch per costruire le query e mi sento come deve esserci un modo per quell'API per prendere il json e trasformarlo in oggetti.
La parte complicata è iniziata oggi in cui una delle persone responsabili del progetto è intervenuta su di me e mi ha chiesto di fornire alcuni dati aggregati alla dashboard, ad esempio "Che volume di plastica è stato utilizzato nelle ultime 4 ore" o quante volte la pressione è passata al di sopra di una soglia critica nelle ultime 4 ore?
E questo è il posto dove non riesco a capire come farlo. Non so come dovrei progettare l'oggetto contenente i dati aggregati poiché ci sono così tanti tipi di aggregati, ad es. Conteggi, somme o medie, potrebbero richiedere e potrebbero essere tutti provenienti da macchine diverse, il che significa che dovrei implementare
COUNT(MACHINE_TYPES) X COUNT(AGGREGATE_TYPES)
classi e i parser corrispondenti per la risposta usando jackson. È questo l'unico modo per fare questo o sono cieco?