diff --git a/lib/redis/rediswriter.cpp b/lib/redis/rediswriter.cpp index 0674f9d62..70403068b 100644 --- a/lib/redis/rediswriter.cpp +++ b/lib/redis/rediswriter.cpp @@ -21,6 +21,7 @@ #include "redis/rediswriter.tcpp" #include "remote/eventqueue.hpp" #include "base/json.hpp" +#include "base/statsfunction.hpp" using namespace icinga; @@ -55,6 +56,11 @@ void RedisWriter::Start(bool runtimeCreated) m_SubscriptionTimer->OnTimerExpired.connect(boost::bind(&RedisWriter::UpdateSubscriptionsTimerHandler, this)); m_SubscriptionTimer->Start(); + m_StatsTimer = new Timer(); + m_StatsTimer->SetInterval(10); + m_StatsTimer->OnTimerExpired.connect(boost::bind(&RedisWriter::PublishStatsTimerHandler, this)); + m_StatsTimer->Start(); + boost::thread thread(boost::bind(&RedisWriter::HandleEvents, this)); thread.detach(); } @@ -202,6 +208,28 @@ void RedisWriter::UpdateSubscriptions(void) << "Current Redis event subscriptions: " << m_Subscriptions.size(); } +void RedisWriter::PublishStatsTimerHandler(void) +{ + m_WorkQueue.Enqueue(boost::bind(&RedisWriter::PublishStats, this)); +} + +void RedisWriter::PublishStats(void) +{ + AssertOnWorkQueue(); + + if (!m_Context) + return; + + //TODO: Figure out if more stats can be useful here. + StatsFunction::Ptr func = StatsFunctionRegistry::GetInstance()->GetItem("CIB"); + Dictionary::Ptr status = new Dictionary(); + Array::Ptr perfdata = new Array(); + func->Invoke(status, perfdata); + String jsonStats = JsonEncode(status); + + ExecuteQuery({ "PUBLISH", "icinga:stats", jsonStats }); +} + void RedisWriter::HandleEvents(void) { String queueName = Utility::NewUniqueID(); diff --git a/lib/redis/rediswriter.hpp b/lib/redis/rediswriter.hpp index 04af7c520..d9bcabc07 100644 --- a/lib/redis/rediswriter.hpp +++ b/lib/redis/rediswriter.hpp @@ -58,6 +58,8 @@ private: void UpdateSubscriptionsTimerHandler(void); void UpdateSubscriptions(void); + void PublishStatsTimerHandler(void); + void PublishStats(void); /* config & status dump */ void UpdateAllConfigObjects(void); @@ -86,6 +88,7 @@ private: boost::shared_ptr ExecuteQuery(const std::vector& query); + Timer::Ptr m_StatsTimer; Timer::Ptr m_ReconnectTimer; Timer::Ptr m_SubscriptionTimer; WorkQueue m_WorkQueue;