diff --git a/lib/remote/endpoint.cpp b/lib/remote/endpoint.cpp index e534fc178..48621432c 100644 --- a/lib/remote/endpoint.cpp +++ b/lib/remote/endpoint.cpp @@ -2,6 +2,7 @@ #include "remote/endpoint.hpp" #include "remote/endpoint-ti.cpp" +#include "remote/apifunction.hpp" #include "remote/apilistener.hpp" #include "remote/jsonrpcconnection.hpp" #include "remote/zone.hpp" @@ -35,6 +36,13 @@ void Endpoint::SetCachedZone(const Zone::Ptr& zone) m_Zone = zone; } +Endpoint::Endpoint() +{ + for (auto& [name, afunc] : ApiFunctionRegistry::GetInstance()->GetItems()) { + m_MessageCounters.emplace(afunc, 0); + } +} + void Endpoint::AddClient(const JsonRpcConnection::Ptr& client) { bool was_master = ApiListener::GetInstance()->IsMaster(); @@ -117,6 +125,11 @@ void Endpoint::AddMessageReceived(int bytes) SetLastMessageReceived(time); } +void Endpoint::AddMessageReceived(const intrusive_ptr& method) +{ + m_MessageCounters.at(method).fetch_add(1, std::memory_order_relaxed); +} + double Endpoint::GetMessagesSentPerSecond() const { return m_MessagesSent.CalculateRate(Utility::GetTime(), 60); diff --git a/lib/remote/endpoint.hpp b/lib/remote/endpoint.hpp index d641c2c6b..2ccfc053f 100644 --- a/lib/remote/endpoint.hpp +++ b/lib/remote/endpoint.hpp @@ -5,12 +5,16 @@ #include "remote/i2-remote.hpp" #include "remote/endpoint-ti.hpp" +#include "base/atomic.hpp" #include "base/ringbuffer.hpp" +#include #include +#include namespace icinga { +class ApiFunction; class JsonRpcConnection; class Zone; @@ -28,6 +32,8 @@ public: static boost::signals2::signal&)> OnConnected; static boost::signals2::signal&)> OnDisconnected; + Endpoint(); + void AddClient(const intrusive_ptr& client); void RemoveClient(const intrusive_ptr& client); std::set > GetClients() const; @@ -42,6 +48,7 @@ public: void AddMessageSent(int bytes); void AddMessageReceived(int bytes); + void AddMessageReceived(const intrusive_ptr& method); double GetMessagesSentPerSecond() const override; double GetMessagesReceivedPerSecond() const override; @@ -56,6 +63,7 @@ private: mutable std::mutex m_ClientsLock; std::set > m_Clients; intrusive_ptr m_Zone; + std::unordered_map, Atomic> m_MessageCounters; mutable RingBuffer m_MessagesSent{60}; mutable RingBuffer m_MessagesReceived{60}; diff --git a/lib/remote/jsonrpcconnection.cpp b/lib/remote/jsonrpcconnection.cpp index 889d4452c..e7dbb99e2 100644 --- a/lib/remote/jsonrpcconnection.cpp +++ b/lib/remote/jsonrpcconnection.cpp @@ -351,6 +351,10 @@ void JsonRpcConnection::MessageHandler(const Dictionary::Ptr& message) Log(LogNotice, "JsonRpcConnection") << "Call to non-existent function '" << method << "' from endpoint '" << m_Identity << "'."; } else { + if (m_Endpoint) { + m_Endpoint->AddMessageReceived(afunc); + } + Dictionary::Ptr params = message->Get("params"); if (params) resultMessage->Set("result", afunc->Invoke(origin, params));