Merge pull request #8083 from Icinga/feature/Implement-new-API-events-7974

Implement new API event streams response
This commit is contained in:
Alexander Aleksandrovič Klimov 2021-01-12 12:26:05 +01:00 committed by GitHub
commit a6af5406f7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 64 additions and 3 deletions

View File

@ -1682,6 +1682,9 @@ The following event stream types are available:
DowntimeRemoved | Downtime removed for hosts and services.
DowntimeStarted | Downtime started for hosts and services.
DowntimeTriggered | Downtime triggered for hosts and services.
ObjectCreated | Object created for all Icinga 2 objects.
ObjectDeleted | Object deleted for all Icinga 2 objects.
ObjectModified | Object modified for all Icinga 2 objects.
Note: Each type requires [API permissions](12-icinga2-api.md#icinga2-api-permissions)
being set.
@ -1694,6 +1697,14 @@ Example for all downtime events:
-d '{ "types": ["DowntimeAdded", "DowntimeRemoved", "DowntimeTriggered"] }'
```
Example for all object events:
```
&types=ObjectCreated&types=ObjectDeleted&types=ObjectModified
-d '{ "types": ["ObjectCreated", "ObjectDeleted", "ObjectModified"] }'
```
#### <a id="icinga2-api-event-streams-type-checkresult"></a> Event Stream Type: CheckResult
Name | Type | Description

View File

@ -3,7 +3,6 @@
#include "icinga/apievents.hpp"
#include "icinga/service.hpp"
#include "icinga/notificationcommand.hpp"
#include "remote/eventqueue.hpp"
#include "base/initialize.hpp"
#include "base/serializer.hpp"
#include "base/logger.hpp"
@ -30,6 +29,9 @@ void ApiEvents::StaticInitialize()
Downtime::OnDowntimeRemoved.connect(&ApiEvents::DowntimeRemovedHandler);
Downtime::OnDowntimeStarted.connect(&ApiEvents::DowntimeStartedHandler);
Downtime::OnDowntimeTriggered.connect(&ApiEvents::DowntimeTriggeredHandler);
ConfigObject::OnActiveChanged.connect(&ApiEvents::OnActiveChangedHandler);
ConfigObject::OnVersionChanged.connect(&ApiEvents::OnVersionChangedHandler);
}
void ApiEvents::CheckResultHandler(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr, const MessageOrigin::Ptr& origin)
@ -397,3 +399,40 @@ void ApiEvents::DowntimeTriggeredHandler(const Downtime::Ptr& downtime)
inboxes.Push(std::move(result));
}
void ApiEvents::OnActiveChangedHandler(const ConfigObject::Ptr& object, const Value&)
{
if (object->IsActive()) {
ApiEvents::SendObjectChangeEvent(object, EventType::ObjectCreated, "ObjectCreated");
} else if (!object->IsActive() && !object->GetExtension("ConfigObjectDeleted").IsEmpty()) {
ApiEvents::SendObjectChangeEvent(object, EventType::ObjectDeleted, "ObjectDeleted");
}
}
void ApiEvents::OnVersionChangedHandler(const ConfigObject::Ptr& object, const Value&)
{
ApiEvents::SendObjectChangeEvent(object, EventType::ObjectModified, "ObjectModified");
}
void ApiEvents::SendObjectChangeEvent(const ConfigObject::Ptr& object, const EventType& eventType, const String& eventQueue) {
std::vector<EventQueue::Ptr> queues = EventQueue::GetQueuesForType(eventQueue);
auto inboxes (EventsRouter::GetInstance().GetInboxes(eventType));
if (queues.empty() && !inboxes)
return;
Log(LogDebug, "ApiEvents") << "Processing event type '" + eventQueue + "'.";
Dictionary::Ptr result = new Dictionary ({
{"type", eventQueue},
{"timestamp", Utility::GetTime()},
{"object_type", object->GetReflectionType()->GetName()},
{"object_name", object->GetName()},
});
for (const EventQueue::Ptr& queue : queues) {
queue->ProcessEvent(result);
}
inboxes.Push(std::move(result));
}

View File

@ -3,6 +3,7 @@
#ifndef APIEVENTS_H
#define APIEVENTS_H
#include "remote/eventqueue.hpp"
#include "icinga/checkable.hpp"
#include "icinga/host.hpp"
@ -39,6 +40,10 @@ public:
static void DowntimeRemovedHandler(const Downtime::Ptr& downtime);
static void DowntimeStartedHandler(const Downtime::Ptr& downtime);
static void DowntimeTriggeredHandler(const Downtime::Ptr& downtime);
static void OnActiveChangedHandler(const ConfigObject::Ptr& object, const Value&);
static void OnVersionChangedHandler(const ConfigObject::Ptr& object, const Value&);
static void SendObjectChangeEvent(const ConfigObject::Ptr& object, const EventType& eventType, const String& eventQueue);
};
}

View File

@ -81,7 +81,10 @@ enum class EventType : uint_fast8_t
DowntimeTriggered,
Flapping,
Notification,
StateChange
StateChange,
ObjectCreated,
ObjectDeleted,
ObjectModified
};
class EventsInbox : public Object

View File

@ -31,7 +31,10 @@ const std::map<String, EventType> l_EventTypes ({
{"DowntimeTriggered", EventType::DowntimeTriggered},
{"Flapping", EventType::Flapping},
{"Notification", EventType::Notification},
{"StateChange", EventType::StateChange}
{"StateChange", EventType::StateChange},
{"ObjectCreated", EventType::ObjectCreated},
{"ObjectDeleted", EventType::ObjectDeleted},
{"ObjectModified", EventType::ObjectModified}
});
const String l_ApiQuery ("<API query>");