Program Listing for File network_sink_registerer.hpp

Return to documentation for file (rcppsw/metrics/network_sink_registerer.hpp)

#pragma once

/*******************************************************************************
 * Includes
 ******************************************************************************/
#include <memory>
#include <utility>
#include <string>

#include "rcppsw/metrics/config/network_sink_config.hpp"
#include "rcppsw/metrics/network_output_manager.hpp"
#include "rcppsw/utils/maskable_enum.hpp"
#include "rcppsw/metrics/creatable_collector_set.hpp"
#include "rcppsw/metrics/network_sink.hpp"

/*******************************************************************************
 * Namespaces/Decls
 ******************************************************************************/
namespace rcppsw::metrics {

/*******************************************************************************
 * Class Definitions
 ******************************************************************************/
class network_sink_registerer :public rer::client<network_sink_registerer> {
 public:
  network_sink_registerer(void)
      : ER_CLIENT_INIT() {}

  network_sink_registerer& operator=(const network_sink_registerer&) = default;
  network_sink_registerer(const network_sink_registerer&) = default;

  template <typename TIterator, typename TSink>
  void emit_diagnostic(const TIterator& it,
                       const collector_registration_spec<TSink>& spec) {
      ER_INFO("Metrics enabled: "
              "xml_name='%s',scoped_name='%s',dest='%s',output_interval=%lu,"
              "mode=%x",
              it->input_name.c_str(),
              it->scoped_name.c_str(),
              spec.sink->dest().c_str(),
              spec.sink->output_interval().v(),
              rcppsw::as_underlying(spec.sink->output_mode()));
  }

  template<typename TSink>
  collector_registration_spec<TSink>
  calc_registration_spec(network_output_manager* manager,
                         const rmconfig::network_sink_config* const config,
                         const std::string& xml_name,
                         const rmetrics::output_mode& allowed) const {
    auto stream_it = config->stream.enabled.find(xml_name);
    size_t sum =
        static_cast<size_t>(stream_it != config->stream.enabled.end());
    ER_ASSERT(sum <= 1,
              "Collector '%s' present in more than 1 network sink collector group in XML file",
              xml_name.c_str());

    collector_registration_spec<TSink> ret;
    if (stream_it != config->stream.enabled.end()) {
      ER_ASSERT(allowed & rmetrics::output_mode::ekSTREAM,
                "Output mode %d for collector '%s' does not contain ekSTREAM",
                rcppsw::as_underlying(allowed),
                xml_name.c_str());
      ret.is_enabled = true;
      ret.sink = std::make_unique<TSink>(manager->dest_prefix() + stream_it->second,
                                         rmetrics::output_mode::ekSTREAM,
                                         config->stream.output_interval);
    }
    return ret;
  }
};

} /* namespace rcppsw::metrics */