Improve type logging for notifications

This commit is contained in:
Michael Friedrich 2019-07-02 16:33:11 +02:00
parent e1314ca80e
commit 8098f4d54d
9 changed files with 68 additions and 59 deletions

View File

@ -237,7 +237,7 @@ void CompatLogger::NotificationSentHandler(const Notification::Ptr& notification
Service::Ptr service;
tie(host, service) = GetHostService(checkable);
String notification_type_str = Notification::NotificationTypeToString(notification_type);
String notification_type_str = Notification::NotificationTypeToStringCompat(notification_type);
/* override problem notifications with their current state string */
if (notification_type == NotificationProblem) {

View File

@ -1071,7 +1071,7 @@ void DbEvents::AddNotificationSentLogHistory(const Notification::Ptr& notificati
if (commandObj)
checkCommandName = commandObj->GetName();
String notificationTypeStr = Notification::NotificationTypeToString(notification_type);
String notificationTypeStr = Notification::NotificationTypeToStringCompat(notification_type); //TODO: Change that to our own types.
String author_comment = "";
if (notification_type == NotificationCustom || notification_type == NotificationAcknowledgement) {

View File

@ -132,7 +132,7 @@ void ApiEvents::NotificationSentToAllUsersHandler(const Notification::Ptr& notif
}
result->Set("users", new Array(std::move(userNames)));
result->Set("notification_type", Notification::NotificationTypeToString(type));
result->Set("notification_type", Notification::NotificationTypeToStringCompat(type)); //TODO: Change this to our own types.
result->Set("author", author);
result->Set("text", text);
result->Set("check_result", Serialize(cr));

View File

@ -49,13 +49,21 @@ void Checkable::SendNotifications(NotificationType type, const CheckResult::Ptr&
std::set<Notification::Ptr> notifications = GetNotifications();
Log(LogInformation, "Checkable")
<< "Checkable '" << checkableName << "' has " << notifications.size() << " notification(s). Proceeding with filters, successful sends will be logged.";
String notificationTypeName = Notification::NotificationTypeToString(type);
if (notifications.empty())
// Bail early if there are no notifications.
if (notifications.empty()) {
Log(LogNotice, "Checkable")
<< "Skipping checkable '" << checkableName << "' which doesn't have any notification objects configured.";
return;
}
Log(LogInformation, "Checkable")
<< "Checkable '" << checkableName << "' has " << notifications.size()
<< " notification(s). Checking filters for type '" << notificationTypeName << "', sends will be logged.";
for (const Notification::Ptr& notification : notifications) {
// Re-send stashed notifications from cold startup.
if (ApiListener::UpdatedObjectAuthority()) {
try {
if (!notification->IsPaused()) {
@ -86,6 +94,7 @@ void Checkable::SendNotifications(NotificationType type, const CheckResult::Ptr&
<< GetName() << "': " << DiagnosticInformation(ex, false);
}
} else {
// Cold startup phase. Stash notification for later.
Log(LogNotice, "Notification")
<< "Notification '" << notification->GetName() << "': object authority hasn't been updated, yet. Stashing notification.";

View File

@ -12,6 +12,7 @@
#include "base/exception.hpp"
#include "base/initialize.hpp"
#include "base/scriptglobal.hpp"
#include <algorithm>
using namespace icinga;
@ -215,39 +216,15 @@ void Notification::ResetNotificationNumber()
SetNotificationNumber(0);
}
/* the upper case string used in all interfaces */
String Notification::NotificationTypeToString(NotificationType type)
{
switch (type) {
case NotificationDowntimeStart:
return "DOWNTIMESTART";
case NotificationDowntimeEnd:
return "DOWNTIMEEND";
case NotificationDowntimeRemoved:
return "DOWNTIMECANCELLED";
case NotificationCustom:
return "CUSTOM";
case NotificationAcknowledgement:
return "ACKNOWLEDGEMENT";
case NotificationProblem:
return "PROBLEM";
case NotificationRecovery:
return "RECOVERY";
case NotificationFlappingStart:
return "FLAPPINGSTART";
case NotificationFlappingEnd:
return "FLAPPINGEND";
default:
return "UNKNOWN_NOTIFICATION";
}
}
void Notification::BeginExecuteNotification(NotificationType type, const CheckResult::Ptr& cr, bool force, bool reminder, const String& author, const String& text)
{
String notificationName = GetName();
String notificationTypeName = NotificationTypeToString(type);
Log(LogNotice, "Notification")
<< "Attempting to send " << (reminder ? "reminder " : "") << "notifications for notification object '" << notificationName << "'.";
<< "Attempting to send " << (reminder ? "reminder " : "")
<< "notifications of type '" << notificationTypeName
<< "' for notification object '" << notificationName << "'.";
Checkable::Ptr checkable = GetCheckable();
@ -292,7 +269,7 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe
unsigned long ftype = type;
Log(LogDebug, "Notification")
<< "Type '" << NotificationTypeToStringInternal(type)
<< "Type '" << NotificationTypeToString(type)
<< "', TypeFilter: " << NotificationFilterToString(GetTypeFilter(), GetTypeFilterMap())
<< " (FType=" << ftype << ", TypeFilter=" << GetTypeFilter() << ")";
@ -300,7 +277,7 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe
Log(LogNotice, "Notification")
<< "Not sending " << (reminder ? "reminder " : "") << "notifications for notification object '"
<< notificationName << "': type '"
<< NotificationTypeToStringInternal(type) << "' does not match type filter: "
<< NotificationTypeToString(type) << "' does not match type filter: "
<< NotificationFilterToString(GetTypeFilter(), GetTypeFilterMap()) << ".";
/* Ensure to reset no_more_notifications on Recovery notifications,
@ -419,7 +396,7 @@ void Notification::BeginExecuteNotification(NotificationType type, const CheckRe
}
Log(LogInformation, "Notification")
<< "Sending " << (reminder ? "reminder " : "") << "'" << NotificationTypeToStringInternal(type) << "' notification '"
<< "Sending " << (reminder ? "reminder " : "") << "'" << NotificationTypeToString(type) << "' notification '"
<< notificationName << "' for user '" << userName << "'";
Utility::QueueAsyncCallback(std::bind(&Notification::ExecuteNotificationHelper, this, type, user, cr, force, author, text));
@ -460,7 +437,7 @@ bool Notification::CheckNotificationUserFilters(NotificationType type, const Use
Log(LogDebug, "Notification")
<< "User '" << userName << "' notification '" << notificationName
<< "', Type '" << NotificationTypeToStringInternal(type)
<< "', Type '" << NotificationTypeToString(type)
<< "', TypeFilter: " << NotificationFilterToString(user->GetTypeFilter(), GetTypeFilterMap())
<< " (FType=" << ftype << ", TypeFilter=" << GetTypeFilter() << ")";
@ -469,7 +446,7 @@ bool Notification::CheckNotificationUserFilters(NotificationType type, const Use
Log(LogNotice, "Notification")
<< "Not sending " << (reminder ? "reminder " : "") << "notifications for notification object '"
<< notificationName << " and user '" << userName << "': type '"
<< NotificationTypeToStringInternal(type) << "' does not match type filter: "
<< NotificationTypeToString(type) << "' does not match type filter: "
<< NotificationFilterToString(user->GetTypeFilter(), GetTypeFilterMap()) << ".";
return false;
}
@ -542,7 +519,7 @@ void Notification::ExecuteNotificationHelper(NotificationType type, const User::
Checkable::OnNotificationSentToUser(this, GetCheckable(), user, type, cr, nr, author, text, command->GetName(), nullptr);
Log(LogInformation, "Notification")
<< "Completed sending '" << NotificationTypeToStringInternal(type)
<< "Completed sending '" << NotificationTypeToString(type)
<< "' notification '" << notificationName
<< "' for checkable '" << checkableName
<< "' and user '" << userName << "' using command '" << commandName << "'.";
@ -626,30 +603,51 @@ String Notification::NotificationFilterToString(int filter, const std::map<Strin
return Utility::NaturalJoin(sFilters);
}
/* internal for logging */
String Notification::NotificationTypeToStringInternal(NotificationType type)
/*
* Main interface to translate NotificationType values into strings.
*/
String Notification::NotificationTypeToString(NotificationType type)
{
auto typeMap = Notification::m_TypeFilterMap;
auto it = std::find_if(typeMap.begin(), typeMap.end(),
[&type](const std::pair<String, int>& p) {
return p.second == type;
});
if (it == typeMap.end())
return Empty;
return it->first;
}
/*
* Compat interface used in external features.
*/
String Notification::NotificationTypeToStringCompat(NotificationType type)
{
switch (type) {
case NotificationDowntimeStart:
return "DowntimeStart";
return "DOWNTIMESTART";
case NotificationDowntimeEnd:
return "DowntimeEnd";
return "DOWNTIMEEND";
case NotificationDowntimeRemoved:
return "DowntimeRemoved";
return "DOWNTIMECANCELLED";
case NotificationCustom:
return "Custom";
return "CUSTOM";
case NotificationAcknowledgement:
return "Acknowledgement";
return "ACKNOWLEDGEMENT";
case NotificationProblem:
return "Problem";
return "PROBLEM";
case NotificationRecovery:
return "Recovery";
return "RECOVERY";
case NotificationFlappingStart:
return "FlappingStart";
return "FLAPPINGSTART";
case NotificationFlappingEnd:
return "FlappingEnd";
return "FLAPPINGEND";
default:
return Empty;
return "UNKNOWN_NOTIFICATION";
}
}

View File

@ -85,9 +85,15 @@ public:
void ProcessNotificationResult(const NotificationResult::Ptr& nr, const MessageOrigin::Ptr& origin = nullptr);
// Logging, etc.
static String NotificationTypeToString(NotificationType type);
// Compat, used for notifications, etc.
static String NotificationTypeToStringCompat(NotificationType type);
static String NotificationFilterToString(int filter, const std::map<String, int>& filterMap);
static String NotificationServiceStateToString(ServiceState state);
static String NotificationHostStateToString(HostState state);
static boost::signals2::signal<void (const Notification::Ptr&, const MessageOrigin::Ptr&)> OnNextNotificationChanged;
static boost::signals2::signal<void (const Notification::Ptr&, const NotificationResult::Ptr&, const MessageOrigin::Ptr&)> OnNewNotificationResult;
@ -119,10 +125,6 @@ private:
static bool EvaluateApplyRuleInstance(const intrusive_ptr<Checkable>& checkable, const String& name, ScriptFrame& frame, const ApplyRule& rule);
static bool EvaluateApplyRule(const intrusive_ptr<Checkable>& checkable, const ApplyRule& rule);
static String NotificationTypeToStringInternal(NotificationType type);
static String NotificationServiceStateToString(ServiceState state);
static String NotificationHostStateToString(HostState state);
static std::map<String, int> m_StateFilterMap;
static std::map<String, int> m_TypeFilterMap;
};

View File

@ -32,7 +32,7 @@ void PluginNotificationTask::ScriptFunc(const Notification::Ptr& notification,
Checkable::Ptr checkable = notification->GetCheckable();
Dictionary::Ptr notificationExtra = new Dictionary({
{ "type", Notification::NotificationTypeToString(type) },
{ "type", Notification::NotificationTypeToStringCompat(type) }, //TODO: Change that to our types.
{ "author", author },
{ "comment", comment }
});

View File

@ -318,7 +318,7 @@ void ElasticsearchWriter::NotificationSentToAllUsersHandlerInternal(const Notifi
Service::Ptr service;
tie(host, service) = GetHostService(checkable);
String notificationTypeString = Notification::NotificationTypeToString(type);
String notificationTypeString = Notification::NotificationTypeToStringCompat(type); //TODO: Change that to our own types.
Dictionary::Ptr fields = new Dictionary();

View File

@ -371,7 +371,7 @@ void GelfWriter::NotificationToUserHandlerInternal(const Notification::Ptr& noti
Service::Ptr service;
tie(host, service) = GetHostService(checkable);
String notificationTypeString = Notification::NotificationTypeToString(notificationType);
String notificationTypeString = Notification::NotificationTypeToStringCompat(notificationType); //TODO: Change that to our own types.
String authorComment = "";