diff --git a/src/broker/Manager.cc b/src/broker/Manager.cc index 0ce23d9508..41f2282ab7 100644 --- a/src/broker/Manager.cc +++ b/src/broker/Manager.cc @@ -10,6 +10,7 @@ #include "zeek/Func.h" #include "zeek/broker/Data.h" #include "zeek/broker/Store.h" +#include "zeek/telemetry/Manager.h" #include "zeek/util.h" #include "zeek/Var.h" #include "zeek/Desc.h" @@ -1806,4 +1807,31 @@ void Manager::PrepareForwarding(const std::string &name) DBG_LOG(DBG_BROKER, "Resolved table forward for data store %s", name.c_str()); } +std::unique_ptr Manager::NewTelemetryManager() + { + // The telemetry Manager actually only has a dependency on the actor system, + // not to the Broker Manager. By having the telemetry Manager hold on to a + // shared_ptr to our Broker state, we make sure the Broker endpoint, which + // owns the CAF actor system, lives for as long as necessary. This also + // makes sure that the Broker Manager may even get destroyed before the + // telemetry Manager. + struct TM : public telemetry::Manager + { + static auto getPimpl(BrokerState& st) + { + auto registry = std::addressof(st.endpoint.system().metrics()); + return reinterpret_cast(registry); + } + + explicit TM(const std::shared_ptr& bsptr) + : telemetry::Manager(getPimpl(*bsptr)), ptr(bsptr) + { + } + + std::shared_ptr ptr; + }; + + return std::make_unique(bstate); + } + } // namespace zeek::Broker diff --git a/src/broker/Manager.h b/src/broker/Manager.h index af09855c6b..670a9bcd79 100644 --- a/src/broker/Manager.h +++ b/src/broker/Manager.h @@ -30,6 +30,8 @@ class TableVal; using VectorTypePtr = IntrusivePtr; using TableValPtr = IntrusivePtr; +namespace telemetry { class Manager; } + namespace detail { class Frame; } namespace Broker { @@ -357,6 +359,11 @@ public: ~ScriptScopeGuard() { --script_scope; } }; + /** + * Allocates a new manager for telemetry data. + */ + std::unique_ptr NewTelemetryManager(); + private: void DispatchMessage(const broker::topic& topic, broker::data msg); diff --git a/src/zeek-setup.cc b/src/zeek-setup.cc index 51e3162c2b..f01294b00f 100644 --- a/src/zeek-setup.cc +++ b/src/zeek-setup.cc @@ -69,6 +69,7 @@ extern "C" { #include "zeek/zeekygen/Manager.h" #include "zeek/iosource/Manager.h" #include "zeek/broker/Manager.h" +#include "zeek/telemetry/Manager.h" #include "zeek/binpac_zeek.h" #include "zeek/module_util.h" @@ -107,6 +108,7 @@ zeek::file_analysis::Manager* zeek::file_mgr = nullptr; zeek::zeekygen::detail::Manager* zeek::detail::zeekygen_mgr = nullptr; zeek::iosource::Manager* zeek::iosource_mgr = nullptr; zeek::Broker::Manager* zeek::broker_mgr = nullptr; +zeek::telemetry::Manager* zeek::telemetry_mgr = nullptr; zeek::Supervisor* zeek::supervisor_mgr = nullptr; zeek::detail::trigger::Manager* zeek::detail::trigger_mgr = nullptr; @@ -327,6 +329,7 @@ static void terminate_bro() delete plugin_mgr; delete val_mgr; delete fragment_mgr; + delete telemetry_mgr; // free the global scope pop_scope(); @@ -576,6 +579,7 @@ SetupResult setup(int argc, char** argv, Options* zopts) file_mgr = new file_analysis::Manager(); auto broker_real_time = ! options.pcap_file && ! options.deterministic_mode; broker_mgr = new Broker::Manager(broker_real_time); + telemetry_mgr = broker_mgr->NewTelemetryManager().release(); trigger_mgr = new trigger::Manager(); plugin_mgr->InitPreScript();