diff --git a/lib/icingadb/icingadb-objects.cpp b/lib/icingadb/icingadb-objects.cpp index e1c757869..e7b0706a4 100644 --- a/lib/icingadb/icingadb-objects.cpp +++ b/lib/icingadb/icingadb-objects.cpp @@ -1603,7 +1603,7 @@ void IcingaDB::SendStateChange(const ConfigObject::Ptr& object, const CheckResul void IcingaDB::SendSentNotification( const Notification::Ptr& notification, const Checkable::Ptr& checkable, const std::set& users, - NotificationType type, const CheckResult::Ptr& cr, const String& author, const String& text + NotificationType type, const CheckResult::Ptr& cr, const String& author, const String& text, double sendTime ) { if (!m_Rcon || !m_Rcon->IsConnected()) @@ -1620,10 +1620,15 @@ void IcingaDB::SendSentNotification( auto usersAmount (users.size()); auto notificationHistoryId = Utility::NewUniqueID(); + auto sendTs (TimestampToMilliseconds(sendTime)); + + Array::Ptr rawId = new Array(Prepend(GetEnvironment(), GetObjectIdentifiersWithoutEnv(notification))); + rawId->Add(GetNotificationTypeByEnum(type)); + rawId->Add(sendTs); std::vector xAdd ({ "XADD", "icinga:history:stream:notification", "*", - "id", notificationHistoryId, + "id", HashValue(rawId), "environment_id", m_EnvironmentId, "notification_id", GetObjectIdentifier(notification), "host_id", GetObjectIdentifier(host), @@ -1633,7 +1638,7 @@ void IcingaDB::SendSentNotification( "author", Utility::ValidateUTF8(author), "text", Utility::ValidateUTF8(finalText), "users_notified", Convert::ToString(usersAmount), - "send_time", Convert::ToString(TimestampToMilliseconds(Utility::GetTime())), + "send_time", Convert::ToString(sendTs), "event_id", Utility::NewUniqueID(), "event_type", "notification" }); @@ -2368,10 +2373,11 @@ void IcingaDB::NotificationSentToAllUsersHandler( ) { auto rws (ConfigType::GetObjectsByType()); + auto sendTime (notification->GetLastNotification()); if (!rws.empty()) { for (auto& rw : rws) { - rw->SendSentNotification(notification, checkable, users, type, cr, author, text); + rw->SendSentNotification(notification, checkable, users, type, cr, author, text, sendTime); } } } diff --git a/lib/icingadb/icingadb-utility.cpp b/lib/icingadb/icingadb-utility.cpp index 8ca9e298e..74203ab9b 100644 --- a/lib/icingadb/icingadb-utility.cpp +++ b/lib/icingadb/icingadb-utility.cpp @@ -149,6 +149,32 @@ Dictionary::Ptr IcingaDB::SerializeVars(const CustomVarObject::Ptr& object) return res; } +const char* IcingaDB::GetNotificationTypeByEnum(NotificationType type) +{ + switch (type) { + case NotificationDowntimeStart: + return "downtime_start"; + case NotificationDowntimeEnd: + return "downtime_end"; + case NotificationDowntimeRemoved: + return "downtime_removed"; + case NotificationCustom: + return "custom"; + case NotificationAcknowledgement: + return "acknowledgement"; + case NotificationProblem: + return "problem"; + case NotificationRecovery: + return "recovery"; + case NotificationFlappingStart: + return "flapping_start"; + case NotificationFlappingEnd: + return "flapping_end"; + } + + VERIFY(!"Invalid notification type."); +} + static const std::set propertiesBlacklistEmpty; String IcingaDB::HashValue(const Value& value) diff --git a/lib/icingadb/icingadb.hpp b/lib/icingadb/icingadb.hpp index df49fd17d..90c91a845 100644 --- a/lib/icingadb/icingadb.hpp +++ b/lib/icingadb/icingadb.hpp @@ -81,7 +81,7 @@ private: void SendSentNotification( const Notification::Ptr& notification, const Checkable::Ptr& checkable, const std::set& users, - NotificationType type, const CheckResult::Ptr& cr, const String& author, const String& text + NotificationType type, const CheckResult::Ptr& cr, const String& author, const String& text, double sendTime ); void SendStartedDowntime(const Downtime::Ptr& downtime); @@ -109,6 +109,7 @@ private: static String GetObjectIdentifier(const ConfigObject::Ptr& object); static String GetEnvironment(); static Dictionary::Ptr SerializeVars(const CustomVarObject::Ptr& object); + static const char* GetNotificationTypeByEnum(NotificationType type); static String HashValue(const Value& value); static String HashValue(const Value& value, const std::set& propertiesBlacklist, bool propertiesWhitelist = false);