-
Notifications
You must be signed in to change notification settings - Fork 0
Implementacja Sensora
DSM-Sensor jest modułem projektu DSM dokonującym cyklicznych pomiarów wybranych metryk dla określonych zasobów i wysyłającym te pomiary do Monitora. Zasobem i metryką może tu być na przykład: Host / CPU Utilization (aktualne użycie CPU dla hosta).
Sensor napisany został w Javie z użyciem bibioteki SIGAR która pozwala na łatwe i "bezbolesne" pobieranie informacji o zasobach systemowych z poziomu Javy.
Ponieważ wszystkie klasy i pakiety znajdują się w pakiecie pl.edu.agh.dsm.sensor w dalszej części opisu będę pomijał tą część nazwy i pisał np Sensor zamiast pl.edu.agh.dsm.sensor.Sensor lub udp.UdpValueUpdate zamiast pl.edu.agh.dsm.sensor.udp.UdpValueUpdate
Główną klasą programu jest Sensor która w metodzie main(String[]) sprawdza poprawność przekazanych parametrów, tworzy obiekt klasy udp.SensorSocket odpowiedzialnej za komunikację a następnie dla każdej pary argumentów tworzy wątek monitorujący daną metrykę.
Obiekty monitorujące metryki tworzone są przez klasę monitored.MonitoredFactory. Obiekty te są instancjami klas rozszerzających monitored.MonitoredObject posiadającej 2 metody abstrakcyjne które muszą być zaimplementowane w klasach pochodnych: double checkValue() zwracającą zmierzoną wartość i String getUnit() zwracającą jednostkę. Przykładem implementacji tych 2 metod może być klasa monitored.impl.MonitoredCpu zwracająca procentowe obciążenie procesora (0.0% - 100.0%):
public class MonitoredCpu extends MonitoredResource {
public static final String METRIC_NAME = "cpu";
public MonitoredCpu() {
super(METRIC_NAME);
}
@Override
public double checkValue() throws MonitoringException {
try {
return 100 * new Sigar().getCpuPerc().getCombined();
} catch (SigarException ex) {
throw new MonitoringException("SigarException caught while performing resource check: ",ex);
}
}
@Override
public String getUnit() {
return "%";
}
}
Obiekty monitorujące (opisane w poprzednim punkcie) "owijane" są w instancję klasy SensorThread (która, jak sama nazwa wskazuje, reprezentuje wątek) a następnie przekazywane do ScheduledExecutorService który periodycznie, co określony interwał, wykonuje metodę run danego obiektu. W metodzie tej zawarte jest wykonanie pomiaru oraz przesłanie wyniku do Monitora.
Komunikacja z monitorem zawarta jest w klasie SensorThread (wywołanie) oraz udp.SensorSocket (logika) i jest oparta o standardowe narzędzia dostępne w Javie - DatagramSocket oraz o bibliotekę Jackson służącą do mapowania obiektów DTO Javy do JSONa.
W klasie SensorThread w metodzie run (wywoływanej periodycznie przez ScheduledExecutorService) wykonywany jest pomiar. Następnie, ze zmierzonej wartości (razem z jednostką, typem metryki, id metryki, id zasobu oraz timestamp'em) tworzony jest obiekt klasy DTO udp.UdpValueUpdate przekazywany do udp.SensorSocket. W klasie tej obiekt mapowany jest do JSONa a następnie z JSONa budowany jest DatagramPacket i wysyłany do Monitora.
-
SIGAR - System Information Gatherer And Reporter. API dostarczające przenośną metodę pobierania informacji o stanie zasobów systemowych.
-
Jackson - mapowanie obiektów do JSON
-
Maven - konfiguracja build'ów + zarządzanie zależnościami i wersjami. W tym:
- maven-compiler-plugin - kompilacja
- appassembler-maven-plugin - generowanie skryptów uruchomieniowych, generowanie wynikowej struktury katalogów
- maven-antrun-plugin - generowanie archiwum z gotowym do dystrybucji sensorem.
- maven-surefire-plugin - testy
Po wykonaniu Maven'owego builda (mvn clean install) w katalogu target projektu utworzone zostaną (między innymi) 2 pliki:
- DSM-sensor-[wersja].jar - wykonywalny jar zawierający TYLKO klasy DSM-Sensor, bez żadnych zewnętrznych zależności (thin-jar). Do uruchomienia potrzebne jest środowisko w którym zewnętrzne zależności (takie jak SIGAR, slf4j, logback czy Jackson) już się znajdują.
- DSM-sensor-[wersja].zip - archiwum zawierające powyższy plik + skonfigurowane zależności (fat-client). W celu uruchomienia wystarczy wypakować archiwum i wykonać odpowiedni skrypt.
+---bin
| sensor.bat // skrypt uruchomieniowy dla systemu Windows
| sensor.sh // skrypt uruchomieniowy dla systemów UNIXowych
|
+---conf // katalog konfiguracyjne
| README
|
\---lib // katalog z zależnościami i bibliotekami natywnymi SIGAR
DSM-sensor-1.0-SNAPSHOT.jar // thin-client
...
...
...