]> granicus.if.org Git - icinga2/blobdiff - lib/methods/icingachecktask.cpp
Correct current_concurrent_checks to actually running checks
[icinga2] / lib / methods / icingachecktask.cpp
index b288b6be2ee698b01410f9304ed279de0f4a7dfb..59dfbdf78787829e7d9bc0c5f53ef47713d11ba3 100644 (file)
@@ -1,26 +1,14 @@
-/******************************************************************************
- * Icinga 2                                                                   *
- * Copyright (C) 2012-2017 Icinga Development Team (https://www.icinga.com/)  *
- *                                                                            *
- * This program is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU General Public License                *
- * as published by the Free Software Foundation; either version 2             *
- * of the License, or (at your option) any later version.                     *
- *                                                                            *
- * This program is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
- * GNU General Public License for more details.                               *
- *                                                                            *
- * You should have received a copy of the GNU General Public License          *
- * along with this program; if not, write to the Free Software Foundation     *
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
- ******************************************************************************/
+/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
 
 #include "methods/icingachecktask.hpp"
 #include "icinga/cib.hpp"
 #include "icinga/service.hpp"
+#include "icinga/checkcommand.hpp"
+#include "icinga/macroprocessor.hpp"
 #include "icinga/icingaapplication.hpp"
+#include "icinga/clusterevents.hpp"
+#include "icinga/checkable.hpp"
+#include "remote/apilistener.hpp"
 #include "base/application.hpp"
 #include "base/objectlock.hpp"
 #include "base/utility.hpp"
 
 using namespace icinga;
 
-REGISTER_SCRIPTFUNCTION_NS(Internal, IcingaCheck, &IcingaCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros");
+REGISTER_FUNCTION_NONCONST(Internal, IcingaCheck, &IcingaCheckTask::ScriptFunc, "checkable:cr:resolvedMacros:useResolvedMacros");
 
 void IcingaCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResult::Ptr& cr,
-    const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros)
+       const Dictionary::Ptr& resolvedMacros, bool useResolvedMacros)
 {
        REQUIRE_NOT_NULL(checkable);
        REQUIRE_NOT_NULL(cr);
 
+       CheckCommand::Ptr command = checkable->GetCheckCommand();
+
+       Host::Ptr host;
+       Service::Ptr service;
+       tie(host, service) = GetHostService(checkable);
+
+       MacroProcessor::ResolverList resolvers;
+       if (service)
+               resolvers.emplace_back("service", service);
+       resolvers.emplace_back("host", host);
+       resolvers.emplace_back("command", command);
+       resolvers.emplace_back("icinga", IcingaApplication::GetInstance());
+
+       String missingIcingaMinVersion;
+
+       String icingaMinVersion = MacroProcessor::ResolveMacros("$icinga_min_version$", resolvers, checkable->GetLastCheckResult(),
+               &missingIcingaMinVersion, MacroProcessor::EscapeCallback(), resolvedMacros, useResolvedMacros);
+
        if (resolvedMacros && !useResolvedMacros)
                return;
 
@@ -69,6 +75,10 @@ void IcingaCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes
        perfdata->Add(new PerfdataValue("active_service_checks_15min", CIB::GetActiveServiceChecksStatistics(60 * 15)));
        perfdata->Add(new PerfdataValue("passive_service_checks_15min", CIB::GetPassiveServiceChecksStatistics(60 * 15)));
 
+       perfdata->Add(new PerfdataValue("current_pending_callbacks", Application::GetTP().GetPending()));
+       perfdata->Add(new PerfdataValue("current_concurrent_checks", Checkable::CurrentConcurrentChecks.load()));
+       perfdata->Add(new PerfdataValue("remote_check_queue", ClusterEvents::GetCheckRequestQueueSize()));
+
        CheckableCheckStatistics scs = CIB::CalculateServiceCheckStats();
 
        perfdata->Add(new PerfdataValue("min_latency", scs.min_latency));
@@ -103,17 +113,76 @@ void IcingaCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes
        perfdata->Add(new PerfdataValue("num_hosts_in_downtime", hs.hosts_in_downtime));
        perfdata->Add(new PerfdataValue("num_hosts_acknowledged", hs.hosts_acknowledged));
 
-       cr->SetOutput("Icinga 2 has been running for " + Utility::FormatDuration(uptime) +
-           ". Version: " + Application::GetAppVersion());
+       std::vector<Endpoint::Ptr> endpoints = ConfigType::GetObjectsByType<Endpoint>();
+
+       double lastMessageSent = 0;
+       double lastMessageReceived = 0;
+       double messagesSentPerSecond = 0;
+       double messagesReceivedPerSecond = 0;
+       double bytesSentPerSecond = 0;
+       double bytesReceivedPerSecond = 0;
+
+       for (const Endpoint::Ptr& endpoint : endpoints)
+       {
+               if (endpoint->GetLastMessageSent() > lastMessageSent)
+                       lastMessageSent = endpoint->GetLastMessageSent();
+
+               if (endpoint->GetLastMessageReceived() > lastMessageReceived)
+                       lastMessageReceived = endpoint->GetLastMessageReceived();
+
+               messagesSentPerSecond += endpoint->GetMessagesSentPerSecond();
+               messagesReceivedPerSecond += endpoint->GetMessagesReceivedPerSecond();
+               bytesSentPerSecond += endpoint->GetBytesSentPerSecond();
+               bytesReceivedPerSecond += endpoint->GetBytesReceivedPerSecond();
+       }
+
+       perfdata->Add(new PerfdataValue("last_messages_sent", lastMessageSent));
+       perfdata->Add(new PerfdataValue("last_messages_received", lastMessageReceived));
+       perfdata->Add(new PerfdataValue("sum_messages_sent_per_second", messagesSentPerSecond));
+       perfdata->Add(new PerfdataValue("sum_messages_received_per_second", messagesReceivedPerSecond));
+       perfdata->Add(new PerfdataValue("sum_bytes_sent_per_second", bytesSentPerSecond));
+       perfdata->Add(new PerfdataValue("sum_bytes_received_per_second", bytesReceivedPerSecond));
+
        cr->SetPerformanceData(perfdata);
+       cr->SetState(ServiceOK);
+
+       String appVersion = Application::GetAppVersion();
+
+       String output = "Icinga 2 has been running for " + Utility::FormatDuration(uptime) +
+               ". Version: " + appVersion;
 
+       /* Indicate a warning if the last reload failed. */
        double lastReloadFailed = Application::GetLastReloadFailed();
 
        if (lastReloadFailed > 0) {
-               cr->SetOutput(cr->GetOutput() + "; 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);
-       } else
-               cr->SetState(ServiceOK);
+       }
+
+       /* Indicate a warning when the last synced config caused a stage validation error. */
+       ApiListener::Ptr listener = ApiListener::GetInstance();
+
+       if (listener) {
+               Dictionary::Ptr validationResult = listener->GetLastFailedZonesStageValidation();
+
+               if (validationResult) {
+                       output += "; Last zone sync stage validation failed at "
+                               + Utility::FormatDateTime("%Y-%m-%d %H:%M:%S %z", validationResult->Get("ts"));
+
+                       cr->SetState(ServiceWarning);
+               }
+       }
+
+       String parsedAppVersion = Utility::ParseVersion(appVersion);
+
+       /* Return an error if the version is less than specified (optional). */
+       if (missingIcingaMinVersion.IsEmpty() && !icingaMinVersion.IsEmpty() && Utility::CompareVersion(icingaMinVersion, parsedAppVersion) < 0) {
+               output += "; Minimum version " + icingaMinVersion + " is not installed.";
+               cr->SetState(ServiceCritical);
+       }
+
+       cr->SetOutput(output);
+       cr->SetCommand(command->GetName());
 
        checkable->ProcessCheckResult(cr);
 }