Skip to content

Implementacja Sensora

kw4s edited this page May 4, 2014 · 3 revisions

Wstęp

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.

Szczegóły implementacyjne

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

Ogólny opis działania

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

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 "%";
	}

}

Periodyczne uruchamianie obiektów monitorujących

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

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.

Użyte technologie

Produkty

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.

Struktura DSM-sensor-[wersja].zip

+---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
        ...
        ...
        ...

Uruchomienie:

Uruchamianie Projektu: uruchamianie sensora

Clone this wiki locally