flowchart TB
    subgraph Icinga
        ic_checkresults[Subscribe to Event Stream]
    subgraph MeerkatBackend
        mb_started[Meerkat is started]
        mb_config[Load Config]
        mb_assetsandlogging[Create asset folders and log instance]
        mb_dashbaordsandcache[Initialize dashboard and object cache]
        mb_routesandevents[Create Routes and Subscribe to Icinga events]
        mb_loaded[Server is loaded]
        mb_receiveevent[Receive event]
        style mb_receiveevent fill:#ffd080
        style mb_loaded fill:#80ff80
        style mb_started fill:#ff8888
    subgraph Frontend
        fe_staticwww[Serve static frontend files]
    mb_started --> mb_config
    mb_config --> mb_assetsandlogging
    mb_assetsandlogging --> mb_dashbaordsandcache
    mb_dashbaordsandcache --> mb_routesandevents
    mb_routesandevents --> mb_loaded
    mb_routesandevents --> fe_staticwww
    mb_routesandevents --> ic_checkresults
    ic_checkresults --> mb_receiveevent

Meerkat Event Changes

flowchart TB
    subgraph Icinga
        ic_statechange[Object state changes]
        ic_getIcinga[Get Icinga object data]
        style ic_statechange fill:#ff8888
    subgraph Meerkat Backend
        mb_receiveevent[Receive event]
        mb_eventcache[Save event to cache]
        mb3{Is worst event?}
        mb_ignoreevent[Ignore event]
        mb_proxyapicall[Proxy API Call]
        style mb_receiveevent fill:#ffd080
    subgraph Frontend
        fe_worstevent[Receive worst event from backend]
        fe_dashbaord[Dashboard Loaded]
        fe_apicall[API call to get objects]
        style fe_dashbaord fill:#ff8888

    ic_statechange -->|event stream triggered| mb_receiveevent
    mb_receiveevent --> mb_eventcache
    mb_eventcache --> mb3
    mb3 -- Yes --> fe_worstevent
    mb3 -- No --> mb_ignoreevent
    mb_proxyapicall --> ic_getIcinga
    ic_getIcinga --> mb_eventcache
    fe_dashbaord --> fe_apicall
    fe_apicall --> mb_proxyapicall
    mb_eventcache --> fe_worstevent


dashboardCache is recreated on icinga reload for all dashboards dashboardCache is reloaded for single dashboard on actions such as edit/update.


cache contains list of dashboards, each dashboard contains list of elements, each element contains information such as element type (host/service/servicefilter/etc), name, last event values (this is the current element showing on the dashboard as it is the worst element according to the severity order), and list of object names that are associated with that element.

for the events to be updated on the dashboard the element needs to have the object being updated in its object list in cache.

Icinga to Cache

getObjectHandler in dashboard.go is the main function where it makes the requests for icinga objects and puts them in cache and returns them to the frontend this function is very important as it builds the element cache for events to successfully go through.

Cache to Dashboard

handleKey in events.go is the function that handles the StateChange and CheckResult events coming through to meerkat. In the function we go through all the elements and all the objects for each element checking if its in the element list and if it is checking if it is worse than the current worse (unless its the same object then force update) if it is we send an event to the frontends to update their dashboard.

Unit Tests

currently in cmd/meerkat/icinga_test.go unit tests on event handling could be done by creating an instance of the struct Dashboard and using random information next step would be to create an []ElementStore instance and fill it with elements to test status. next step would be to create Event instances with information you want and calling handleKey on the values. then you would check the elementStore to see if the elements last event was the correct event it should have displayed.

Debug Url’s

https://meerkat.hq.sol1.net:8585/api/cache (Shows all dashboards and their cache) https://meerkat.hq.sol1.net:8585/api/cache/[dashboard-slug] (Shows the cache for a single dashboard) https://meerkat.hq.sol1.net:8585/api/status (Shows overall status of meerkat such as open dashboards, previous requests, previous events and icinga information) https://meerkat.hq.sol1.net:8585/cache (A page that allows you to clear object and dashboard cache with a button click)