diff --git a/include/ipfixprobe/outputPlugin.hpp b/include/ipfixprobe/outputPlugin.hpp index 37f073c33..416f237d4 100644 --- a/include/ipfixprobe/outputPlugin.hpp +++ b/include/ipfixprobe/outputPlugin.hpp @@ -17,12 +17,15 @@ #include "flowifc.hpp" #include "plugin.hpp" #include "processPlugin.hpp" +#include "telemetry-utils.hpp" #include #include #include #include +#include + namespace ipxp { #define DEFAULT_EXPORTER_ID 1 @@ -30,7 +33,9 @@ namespace ipxp { /** * \brief Base class for flow exporters. */ -class IPXP_API OutputPlugin : public Plugin { +class IPXP_API OutputPlugin + : public TelemetryUtils + , public Plugin { public: using ProcessPlugins = std::vector>>; uint64_t m_flows_seen; /**< Number of flows received to export. */ @@ -53,6 +58,12 @@ class IPXP_API OutputPlugin : public Plugin { */ virtual int export_flow(const Flow& flow) = 0; + /** + * \brief Set the telemetry directory for this plugin. + * \param [in] output_dir The telemetry directory for this plugin. + */ + void set_telemetry_dirs(std::shared_ptr output_dir); + /** * \brief Force exporter to flush flows to collector. */ diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index ac7f47632..633b965c5 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -11,6 +11,7 @@ add_library(ipfixprobe-core STATIC workers.cpp workers.hpp inputPlugin.cpp + outputPlugin.cpp pluginManager.cpp pluginManager.hpp ) diff --git a/src/core/ipfixprobe.cpp b/src/core/ipfixprobe.cpp index b7dceecea..331b6cb37 100644 --- a/src/core/ipfixprobe.cpp +++ b/src/core/ipfixprobe.cpp @@ -338,6 +338,7 @@ bool process_plugin_args(ipxp_conf_t& conf, IpfixprobeOptParser& parser) if (outputPlugin == nullptr) { throw IPXPError("invalid output plugin " + output_name); } + outputPlugin->set_telemetry_dirs(output_dir); conf.outputPlugin = outputPlugin; } catch (PluginError& e) { throw IPXPError(output_name + std::string(": ") + e.what()); diff --git a/src/core/outputPlugin.cpp b/src/core/outputPlugin.cpp new file mode 100644 index 000000000..2ed8bc08b --- /dev/null +++ b/src/core/outputPlugin.cpp @@ -0,0 +1,35 @@ +/** + * @file + * @brief Implementation of OutputPlugin telemetry integration + * @author Pavel Siska + * @date 2026 + * + * This file contains the implementation of telemetry-related functions for + * the OutputPlugin class. It provides functionality to register parser statistics + * in the telemetry system and manage telemetry directories. + * + * Copyright (c) 2025 CESNET + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include + +namespace ipxp { + +static telemetry::Content get_output_stats(const OutputPlugin* plugin) +{ + telemetry::Dict dict; + dict["processed"] = plugin->m_flows_seen; + dict["dropped"] = plugin->m_flows_dropped; + return dict; +} + +void OutputPlugin::set_telemetry_dirs(std::shared_ptr output_dir) +{ + telemetry::FileOps statsOps = {[this]() { return get_output_stats(this); }, nullptr}; + + register_file(output_dir, "stats", statsOps); +} + +} // namespace ipxp diff --git a/src/plugins/output/ipfix/CMakeLists.txt b/src/plugins/output/ipfix/CMakeLists.txt index 41ad2d80d..2b57c0722 100644 --- a/src/plugins/output/ipfix/CMakeLists.txt +++ b/src/plugins/output/ipfix/CMakeLists.txt @@ -13,6 +13,7 @@ set_target_properties(ipfixprobe-output-ipfix PROPERTIES target_include_directories(ipfixprobe-output-ipfix PRIVATE ${CMAKE_SOURCE_DIR}/include/ + ${telemetry_SOURCE_DIR}/include ) target_link_libraries(ipfixprobe-output-ipfix PRIVATE diff --git a/src/plugins/output/text/CMakeLists.txt b/src/plugins/output/text/CMakeLists.txt index 1371593f0..75f7167c0 100644 --- a/src/plugins/output/text/CMakeLists.txt +++ b/src/plugins/output/text/CMakeLists.txt @@ -10,7 +10,10 @@ set_target_properties(ipfixprobe-output-text PROPERTIES VISIBILITY_INLINES_HIDDEN YES ) -target_include_directories(ipfixprobe-output-text PRIVATE ${CMAKE_SOURCE_DIR}/include/) +target_include_directories(ipfixprobe-output-text PRIVATE + ${CMAKE_SOURCE_DIR}/include/ + ${telemetry_SOURCE_DIR}/include +) install( TARGETS ipfixprobe-output-text diff --git a/src/plugins/output/unirec/CMakeLists.txt b/src/plugins/output/unirec/CMakeLists.txt index 0f7e1ad2a..d8cac12f4 100644 --- a/src/plugins/output/unirec/CMakeLists.txt +++ b/src/plugins/output/unirec/CMakeLists.txt @@ -12,6 +12,7 @@ set_target_properties(ipfixprobe-output-unirec PROPERTIES target_include_directories(ipfixprobe-output-unirec PRIVATE ${CMAKE_SOURCE_DIR}/include/ + ${telemetry_SOURCE_DIR}/include ) target_link_libraries(ipfixprobe-output-unirec PRIVATE