Closed dawidkomorowski closed 8 years ago
Pozwole sobie się wtrącić ;)
"znalezienie sensora w oparciu o ExternalSystemId" mamy to w aktualnym REST API? możliwe że przeoczyłem
wstępnie zastanawiając się nad implementacją tej procedury, z perspektywy sensora, widziałem to tak że sensor odpytuje o metryki i zasoby (używając metod GET które pobierają całe listy) w monitorze i w razie potrzeby dodaje nowe i sam się rejestruje ale nie będę miał nic przeciwko jeśli zaimplementujecie dwie ostatnie kropki z tej listy.
Co do tych dwóch ostatnich kropek to unikalność metryki z perspektywy sensora będzie zachowana, ewentualnym problemem może być unikalność zasobu.
@paweljozwik, trzech ostatnich kropek nie ma w dokumentacji aktualnego REST API, ale nie traktowałbym go nazbyt wiążąco.
Warto tu rozpatrzyć możliwe przypadki użycia tego procesu rejestracji sensora. Poniżej trzy warianty brzegowe:
Na podstawie tych trzech scenariuszy widać potrzebę możliwości odnalezienia odpowiednich danych. Oczywiście można ten obowiązek zostawić po stronie sensora, z tym że, jeśli zwrócone kolekcje metryk, zasobów, sensorów będą zawierać linki do faktycznych zasobów, to mamy klasyczne N+1 jeśli chodzi o ilość zapytań do monitora, aby obsłużyć przypadek 1 (gdzie nic nie zostanie odnalezione i wszystko należy utworzyć).
Jeżeli znowu kolekcje zwracałyby faktyczne zasoby, to zapytań będzie niewiele, ale i tak będą niosły one sporo danych. Optymalnym zatem wydaje się utworzyć takie serwisy, które będą potrafić zrealizować podstawowe filtrowanie. Można zatem do tych endpointów reprezentujących odpowiednie kolekcje (/sensors, /metrics, /resources) dodać parametry query, zawężające zwracaną listę (/metrics?name=CPU) i dalej już sensor obsłuży otrzymane wyniki.
Jeżeli przyjąć nazwy zasobów i metryk jako unikalne (co wydaje się dość logiczne) to zwrócone zostaną jednoelementowe listy. Pytanie jak z sensorami, czy sensor o danym ExternalSystemId może mieć więcej niż jedną konfigurację? Jeśli nie, to można to też zrobić unikalne i wszystko jest proste. Jeżeli pozwalamy na kilka konfiguracji to sprawa się lekko komplikuje, zależnie od dalszych wymagań.
Aktualny projekt tej komunikacji opierałem na tym co w tym momencie jest w REST API stąd pomysł robienia filtrowania w sensorze.
Wydaje mi się że lepsze byłoby jednak filtrowanie tego po stronie monitora, choćby z tego względu że będzie mógł z tego skorzystać zarówno web-client jak i klient automatyczny.
Ja bym się skłaniał za architekturą: jedna metryka + jeden zasób -> jeden sensor tzn. aplikacja sensora która ma monitorować użycie pamięci ("RAM") i cpu ("CPU") na danym komputerze ("pawel-pc") faktycznie w monitorze stworzy (albo użyje jeśli już będą) dwa sensory: "RAM" + "pawel-pc" -> sensor/1 "CPU" + "pawel-pc" -> sensor/2
I potem do tych endpointów aplikacja będzie pchała odpowiednie pomiary. Co prawda nie jest to najprostsze możliwe podejście ale daje pewną skalowalność przy dodawaniu nowych metryk.
ExternalSystemId w zasadzie nie wiem po co to jest, możliwe że jakaś zaszłość z dyskusji na spotkaniach. Wydaje mi się że jest to pewna redundancja z zasobem. Nazwa hosta jako nazwa zasobu powinna wystarczyć jako identyfikator tego skąd pochodzi pomiar.
Co do ExternalSystemId, to ono miało być tym unikalnym identyfikatorem sensora, po którym ten mógłby się odnaleźć. Oczywiście można do tego wykorzystać nazwę zasobu jak sugerujesz, chociaż w takim wypadku tracimy możliwość używania kilku sensorów dla jednego zasobu (zasób nie może już przykładowo reprezentować sali laboratoryjnej, w której jest 15 komputerów i na każdym sensor monitorujący zasoby).
Co do filtrowania, to tak jak wspomniałeś lepszym wydaje się zrobić to po stronie monitora, zatem API zostanie rozszerzone o filtrowanie kolekcji.
Update: Temat wart jeszcze poruszenia, to kwestia reprezentacji referencji zasobów w JSON. Może jakiś spec od REST mógłby się wypowiedzieć jak powinno być to zrobione poprawnie. Obecna wersja REST API, którą tworzyłem w owym czasie, referencje do innych obiektów zawsze podaje jako URL (tam dany jako względny, ale chyba powinien być bezwzględny). Pytanie czy reprezentacja używana do POST-owania nowych zasobów powinna wyglądać tak samo, czy może używać np. Id wprost?
Pewne sugestie na temat REST, na których się oparłem wtedy mówią, że reprezentacja zasobu przy GET i POST powinna być taka sama, chociaż w sposób oczywisty komplikuje się obsługa POST-ów zawierających URL jako referencję.
@invader92 Czy udało się zrobić już jakieś postępy?
Podstawowy przypadek użycia REST API monitora to proces rejestracji nowego sensora (lub określenie istniejącej konfiguracji sensora).
Należy zaimplementować klasy serwisowe i ich metody pozwalające na:
Dodatkowo należy odpowiednio zaktualizować dokumentację REST API.
Link: #16