Use ExecuteCommandProcessFinishedHandler for all lib/methods/*task.cpp

This commit is contained in:
Mattia Codato 2020-07-20 16:29:26 +02:00
parent acc986afd0
commit 8758e58b92
8 changed files with 256 additions and 91 deletions

View File

@ -29,46 +29,70 @@ void ClusterCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRe
return; return;
CheckCommand::Ptr command = checkable->GetCheckCommand(); CheckCommand::Ptr command = checkable->GetCheckCommand();
cr->SetCommand(command->GetName()); String commandName = command->GetName();
ApiListener::Ptr listener = ApiListener::GetInstance(); ApiListener::Ptr listener = ApiListener::GetInstance();
if (!listener) { if (!listener) {
cr->SetOutput("No API listener is configured for this instance."); String output = "No API listener is configured for this instance.";
if (Checkable::ExecuteCommandProcessFinishedHandler) {
double now = Utility::GetTime();
ProcessResult pr;
pr.PID = -1;
pr.ExecutionStart = now;
pr.ExecutionEnd = now;
pr.ExitStatus = 126;
pr.Output = output;
Checkable::ExecuteCommandProcessFinishedHandler(commandName, pr);
} else {
cr->SetOutput(output);
cr->SetState(ServiceUnknown); cr->SetState(ServiceUnknown);
checkable->ProcessCheckResult(cr); checkable->ProcessCheckResult(cr);
}
return; return;
} }
std::pair<Dictionary::Ptr, Dictionary::Ptr> stats = listener->GetStatus(); std::pair<Dictionary::Ptr, Dictionary::Ptr> stats = listener->GetStatus();
Dictionary::Ptr status = stats.first; Dictionary::Ptr status = stats.first;
/* use feature stats perfdata */
std::pair<Dictionary::Ptr, Array::Ptr> feature_stats = CIB::GetFeatureStats();
cr->SetPerformanceData(feature_stats.second);
int numConnEndpoints = status->Get("num_conn_endpoints"); int numConnEndpoints = status->Get("num_conn_endpoints");
int numNotConnEndpoints = status->Get("num_not_conn_endpoints"); int numNotConnEndpoints = status->Get("num_not_conn_endpoints");
ServiceState state;
String output = "Icinga 2 Cluster"; String output = "Icinga 2 Cluster";
if (numNotConnEndpoints > 0) { if (numNotConnEndpoints > 0) {
output += " Problem: " + Convert::ToString(numNotConnEndpoints) + " endpoints are not connected."; output += " Problem: " + Convert::ToString(numNotConnEndpoints) + " endpoints are not connected.";
output += "\n(" + FormatArray(status->Get("not_conn_endpoints")) + ")"; output += "\n(" + FormatArray(status->Get("not_conn_endpoints")) + ")";
cr->SetState(ServiceCritical); state = ServiceCritical;
} else { } else {
output += " OK: " + Convert::ToString(numConnEndpoints) + " endpoints are connected."; output += " OK: " + Convert::ToString(numConnEndpoints) + " endpoints are connected.";
output += "\n(" + FormatArray(status->Get("conn_endpoints")) + ")"; output += "\n(" + FormatArray(status->Get("conn_endpoints")) + ")";
cr->SetState(ServiceOK); state = ServiceOK;
} }
if (Checkable::ExecuteCommandProcessFinishedHandler) {
double now = Utility::GetTime();
ProcessResult pr;
pr.PID = -1;
pr.Output = output;
pr.ExecutionStart = now;
pr.ExecutionEnd = now;
pr.ExitStatus = state;
Checkable::ExecuteCommandProcessFinishedHandler(commandName, pr);
} else {
/* use feature stats perfdata */
std::pair<Dictionary::Ptr, Array::Ptr> feature_stats = CIB::GetFeatureStats();
cr->SetPerformanceData(feature_stats.second);
cr->SetCommand(commandName);
cr->SetState(state);
cr->SetOutput(output); cr->SetOutput(output);
checkable->ProcessCheckResult(cr); checkable->ProcessCheckResult(cr);
} }
}
String ClusterCheckTask::FormatArray(const Array::Ptr& arr) String ClusterCheckTask::FormatArray(const Array::Ptr& arr)
{ {

View File

@ -21,15 +21,32 @@ void ClusterZoneCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const Che
REQUIRE_NOT_NULL(cr); REQUIRE_NOT_NULL(cr);
ApiListener::Ptr listener = ApiListener::GetInstance(); ApiListener::Ptr listener = ApiListener::GetInstance();
CheckCommand::Ptr command = checkable->GetCheckCommand();
String commandName = command->GetName();
if (!listener) { if (!listener) {
cr->SetOutput("No API listener is configured for this instance."); String output = "No API listener is configured for this instance.";
cr->SetState(ServiceUnknown); ServiceState state = ServiceUnknown;
if (Checkable::ExecuteCommandProcessFinishedHandler) {
double now = Utility::GetTime();
ProcessResult pr;
pr.PID = -1;
pr.Output = output;
pr.ExecutionStart = now;
pr.ExecutionEnd = now;
pr.ExitStatus = state;
Checkable::ExecuteCommandProcessFinishedHandler(commandName, pr);
} else {
cr->SetCommand(commandName);
cr->SetOutput(output);
cr->SetState(state);
checkable->ProcessCheckResult(cr); checkable->ProcessCheckResult(cr);
}
return; return;
} }
CheckCommand::Ptr command = checkable->GetCheckCommand();
Value raw_command = command->GetCommandLine(); Value raw_command = command->GetCommandLine();
Host::Ptr host; Host::Ptr host;
@ -58,21 +75,51 @@ void ClusterZoneCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const Che
if (resolvedMacros && !useResolvedMacros) if (resolvedMacros && !useResolvedMacros)
return; return;
cr->SetCommand(command->GetName());
if (zoneName.IsEmpty()) { if (zoneName.IsEmpty()) {
cr->SetOutput("Macro 'cluster_zone' must be set."); String output = "Macro 'cluster_zone' must be set.";
cr->SetState(ServiceUnknown); ServiceState state = ServiceUnknown;
if (Checkable::ExecuteCommandProcessFinishedHandler) {
double now = Utility::GetTime();
ProcessResult pr;
pr.PID = -1;
pr.Output = output;
pr.ExecutionStart = now;
pr.ExecutionEnd = now;
pr.ExitStatus = state;
Checkable::ExecuteCommandProcessFinishedHandler(commandName, pr);
} else {
cr->SetCommand(commandName);
cr->SetOutput(output);
cr->SetState(state);
checkable->ProcessCheckResult(cr); checkable->ProcessCheckResult(cr);
}
return; return;
} }
Zone::Ptr zone = Zone::GetByName(zoneName); Zone::Ptr zone = Zone::GetByName(zoneName);
if (!zone) { if (!zone) {
cr->SetOutput("Zone '" + zoneName + "' does not exist."); String output = "Zone '" + zoneName + "' does not exist.";
cr->SetState(ServiceUnknown); ServiceState state = ServiceUnknown;
if (Checkable::ExecuteCommandProcessFinishedHandler) {
double now = Utility::GetTime();
ProcessResult pr;
pr.PID = -1;
pr.Output = output;
pr.ExecutionStart = now;
pr.ExecutionEnd = now;
pr.ExitStatus = state;
Checkable::ExecuteCommandProcessFinishedHandler(commandName, pr);
} else {
cr->SetCommand(commandName);
cr->SetOutput(output);
cr->SetState(state);
checkable->ProcessCheckResult(cr); checkable->ProcessCheckResult(cr);
}
return; return;
} }
@ -107,25 +154,41 @@ void ClusterZoneCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const Che
bytesReceivedPerSecond += endpoint->GetBytesReceivedPerSecond(); bytesReceivedPerSecond += endpoint->GetBytesReceivedPerSecond();
} }
ServiceState state;
String output;
if (connected) { if (connected) {
cr->SetState(ServiceOK); state = ServiceOK;
cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag)); output = "Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag);
/* Check whether the thresholds have been resolved and compare them */ /* Check whether the thresholds have been resolved and compare them */
if (missingLagCritical.IsEmpty() && zoneLag > lagCritical) { if (missingLagCritical.IsEmpty() && zoneLag > lagCritical) {
cr->SetState(ServiceCritical); state = ServiceCritical;
cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag) output = "Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag)
+ " greater than critical threshold: " + Utility::FormatDuration(lagCritical)); + " greater than critical threshold: " + Utility::FormatDuration(lagCritical);
} else if (missingLagWarning.IsEmpty() && zoneLag > lagWarning) { } else if (missingLagWarning.IsEmpty() && zoneLag > lagWarning) {
cr->SetState(ServiceWarning); state = ServiceWarning;
cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag) output = "Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag)
+ " greater than warning threshold: " + Utility::FormatDuration(lagWarning)); + " greater than warning threshold: " + Utility::FormatDuration(lagWarning);
} }
} else { } else {
cr->SetState(ServiceCritical); state = ServiceCritical;
cr->SetOutput("Zone '" + zoneName + "' is not connected. Log lag: " + Utility::FormatDuration(zoneLag)); output = "Zone '" + zoneName + "' is not connected. Log lag: " + Utility::FormatDuration(zoneLag);
} }
if (Checkable::ExecuteCommandProcessFinishedHandler) {
double now = Utility::GetTime();
ProcessResult pr;
pr.PID = -1;
pr.Output = output;
pr.ExecutionStart = now;
pr.ExecutionEnd = now;
pr.ExitStatus = state;
Checkable::ExecuteCommandProcessFinishedHandler(commandName, pr);
} else {
cr->SetCommand(commandName);
cr->SetState(state);
cr->SetOutput(output);
cr->SetPerformanceData(new Array({ cr->SetPerformanceData(new Array({
new PerfdataValue("slave_lag", zoneLag, false, "s", lagWarning, lagCritical), new PerfdataValue("slave_lag", zoneLag, false, "s", lagWarning, lagCritical),
new PerfdataValue("last_messages_sent", lastMessageSent), new PerfdataValue("last_messages_sent", lastMessageSent),
@ -138,3 +201,4 @@ void ClusterZoneCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const Che
checkable->ProcessCheckResult(cr); checkable->ProcessCheckResult(cr);
} }
}

View File

@ -48,14 +48,26 @@ void DummyCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResu
std::pair<String, String> co = PluginUtility::ParseCheckOutput(dummyText); std::pair<String, String> co = PluginUtility::ParseCheckOutput(dummyText);
double now = Utility::GetTime(); double now = Utility::GetTime();
String commandName = command->GetName();
if (Checkable::ExecuteCommandProcessFinishedHandler) {
ProcessResult pr;
pr.PID = -1;
pr.Output = co.first;
pr.ExecutionStart = now;
pr.ExecutionEnd = now;
pr.ExitStatus = dummyState;
Checkable::ExecuteCommandProcessFinishedHandler(commandName, pr);
} else {
cr->SetOutput(co.first); cr->SetOutput(co.first);
cr->SetPerformanceData(PluginUtility::SplitPerfdata(co.second)); cr->SetPerformanceData(PluginUtility::SplitPerfdata(co.second));
cr->SetState(PluginUtility::ExitStatusToState(dummyState)); cr->SetState(PluginUtility::ExitStatusToState(dummyState));
cr->SetExitStatus(dummyState); cr->SetExitStatus(dummyState);
cr->SetExecutionStart(now); cr->SetExecutionStart(now);
cr->SetExecutionEnd(now); cr->SetExecutionEnd(now);
cr->SetCommand(command->GetName()); cr->SetCommand(commandName);
checkable->ProcessCheckResult(cr); checkable->ProcessCheckResult(cr);
} }
}

View File

@ -23,5 +23,19 @@ void ExceptionCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const Check
if (resolvedMacros && !useResolvedMacros) if (resolvedMacros && !useResolvedMacros)
return; return;
ScriptError scriptError = ScriptError("Test") << boost::errinfo_api_function("Test");
if (Checkable::ExecuteCommandProcessFinishedHandler) {
double now = Utility::GetTime();
ProcessResult pr;
pr.PID = -1;
pr.Output = scriptError.what();
pr.ExecutionStart = now;
pr.ExecutionEnd = now;
pr.ExitStatus = 0;
Checkable::ExecuteCommandProcessFinishedHandler("", pr);
} else {
BOOST_THROW_EXCEPTION(ScriptError("Test") << boost::errinfo_api_function("Test")); BOOST_THROW_EXCEPTION(ScriptError("Test") << boost::errinfo_api_function("Test"));
} }
}

View File

@ -148,7 +148,7 @@ void IcingaCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes
perfdata->Add(new PerfdataValue("sum_bytes_received_per_second", bytesReceivedPerSecond)); perfdata->Add(new PerfdataValue("sum_bytes_received_per_second", bytesReceivedPerSecond));
cr->SetPerformanceData(perfdata); cr->SetPerformanceData(perfdata);
cr->SetState(ServiceOK); ServiceState state = ServiceOK;
String appVersion = Application::GetAppVersion(); String appVersion = Application::GetAppVersion();
@ -160,7 +160,7 @@ void IcingaCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes
if (lastReloadFailed > 0) { if (lastReloadFailed > 0) {
output += "; Last reload attempt failed at " + Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", lastReloadFailed); output += "; Last reload attempt failed at " + Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", lastReloadFailed);
cr->SetState(ServiceWarning); state =ServiceWarning;
} }
/* Indicate a warning when the last synced config caused a stage validation error. */ /* Indicate a warning when the last synced config caused a stage validation error. */
@ -173,7 +173,7 @@ void IcingaCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes
output += "; Last zone sync stage validation failed at " output += "; Last zone sync stage validation failed at "
+ Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", validationResult->Get("ts")); + Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", validationResult->Get("ts"));
cr->SetState(ServiceWarning); state = ServiceWarning;
} }
} }
@ -182,11 +182,25 @@ void IcingaCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes
/* Return an error if the version is less than specified (optional). */ /* Return an error if the version is less than specified (optional). */
if (missingIcingaMinVersion.IsEmpty() && !icingaMinVersion.IsEmpty() && Utility::CompareVersion(icingaMinVersion, parsedAppVersion) < 0) { if (missingIcingaMinVersion.IsEmpty() && !icingaMinVersion.IsEmpty() && Utility::CompareVersion(icingaMinVersion, parsedAppVersion) < 0) {
output += "; Minimum version " + icingaMinVersion + " is not installed."; output += "; Minimum version " + icingaMinVersion + " is not installed.";
cr->SetState(ServiceCritical); state = ServiceCritical;
} }
String commandName = command->GetName();
if (Checkable::ExecuteCommandProcessFinishedHandler) {
double now = Utility::GetTime();
ProcessResult pr;
pr.PID = -1;
pr.Output = output;
pr.ExecutionStart = now;
pr.ExecutionEnd = now;
pr.ExitStatus = state;
Checkable::ExecuteCommandProcessFinishedHandler(commandName, pr);
} else {
cr->SetState(state);
cr->SetOutput(output); cr->SetOutput(output);
cr->SetCommand(command->GetName()); cr->SetCommand(commandName);
checkable->ProcessCheckResult(cr); checkable->ProcessCheckResult(cr);
} }
}

View File

@ -26,12 +26,25 @@ void NullCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResul
String output = "Hello from "; String output = "Hello from ";
output += IcingaApplication::GetInstance()->GetNodeName(); output += IcingaApplication::GetInstance()->GetNodeName();
ServiceState state = ServiceOK;
if (Checkable::ExecuteCommandProcessFinishedHandler) {
double now = Utility::GetTime();
ProcessResult pr;
pr.PID = -1;
pr.Output = output;
pr.ExecutionStart = now;
pr.ExecutionEnd = now;
pr.ExitStatus = state;
Checkable::ExecuteCommandProcessFinishedHandler("", pr);
} else {
cr->SetOutput(output); cr->SetOutput(output);
cr->SetPerformanceData(new Array({ cr->SetPerformanceData(new Array({
new PerfdataValue("time", Convert::ToDouble(Utility::GetTime())) new PerfdataValue("time", Convert::ToDouble(Utility::GetTime()))
})); }));
cr->SetState(ServiceOK); cr->SetState(state);
checkable->ProcessCheckResult(cr); checkable->ProcessCheckResult(cr);
} }
}

View File

@ -31,10 +31,24 @@ void RandomCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes
+ ". Icinga 2 has been running for " + Utility::FormatDuration(uptime) + ". Icinga 2 has been running for " + Utility::FormatDuration(uptime)
+ ". Version: " + Application::GetAppVersion(); + ". Version: " + Application::GetAppVersion();
CheckCommand::Ptr command = checkable->GetCheckCommand();
String commandName = command->GetName();
ServiceState state = static_cast<ServiceState>(Utility::Random() % 4);
if (Checkable::ExecuteCommandProcessFinishedHandler) {
double now = Utility::GetTime();
ProcessResult pr;
pr.PID = -1;
pr.Output = output;
pr.ExecutionStart = now;
pr.ExecutionEnd = now;
pr.ExitStatus = state;
Checkable::ExecuteCommandProcessFinishedHandler(commandName, pr);
} else {
cr->SetOutput(output); cr->SetOutput(output);
double random = Utility::Random() % 1000; double random = Utility::Random() % 1000;
cr->SetPerformanceData(new Array({ cr->SetPerformanceData(new Array({
new PerfdataValue("time", now), new PerfdataValue("time", now),
new PerfdataValue("value", random), new PerfdataValue("value", random),
@ -43,10 +57,9 @@ void RandomCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes
new PerfdataValue("uptime", uptime), new PerfdataValue("uptime", uptime),
})); }));
cr->SetState(static_cast<ServiceState>(Utility::Random() % 4)); cr->SetState(state);
cr->SetCommand(commandName);
CheckCommand::Ptr command = checkable->GetCheckCommand();
cr->SetCommand(command->GetName());
checkable->ProcessCheckResult(cr); checkable->ProcessCheckResult(cr);
} }
}

View File

@ -42,13 +42,24 @@ void SleepCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResu
String output = "Slept for " + Convert::ToString(sleepTime) + " seconds."; String output = "Slept for " + Convert::ToString(sleepTime) + " seconds.";
double now = Utility::GetTime(); double now = Utility::GetTime();
CheckCommand::Ptr command = checkable->GetCheckCommand();
String commandName = command->GetName();
if (Checkable::ExecuteCommandProcessFinishedHandler) {
ProcessResult pr;
pr.PID = -1;
pr.Output = output;
pr.ExecutionStart = now;
pr.ExecutionEnd = now;
pr.ExitStatus = 0;
Checkable::ExecuteCommandProcessFinishedHandler("", pr);
} else {
cr->SetOutput(output); cr->SetOutput(output);
cr->SetExecutionStart(now); cr->SetExecutionStart(now);
cr->SetExecutionEnd(now); cr->SetExecutionEnd(now);
cr->SetCommand(commandName);
CheckCommand::Ptr command = checkable->GetCheckCommand();
cr->SetCommand(command->GetName());
checkable->ProcessCheckResult(cr); checkable->ProcessCheckResult(cr);
} }
}