12#ifndef RTCTK_COMPONENTFRAMEWORK_EVENTRECORDINGUNIT_HPP
13#define RTCTK_COMPONENTFRAMEWORK_EVENTRECORDINGUNIT_HPP
25#include <fmt/format.h>
26#include <numapp/numapolicies.hpp>
27#include <numapp/thread.hpp>
28#include <taiclock/taiClock.hpp>
47 using sv = std::string_view;
57 {
sv(
"source_timestamp"),
sv(
"")},
58 {
sv(
"origin"),
sv(
"")},
60 {
sv(
"state"),
sv(
"")}}};
63 auto ts = taiclock::TaiClock::now().time_since_epoch().count();
77 using sv = std::string_view;
87 {
sv(
"source_timestamp"),
sv(
"")},
88 {
sv(
"origin"),
sv(
"")},
90 {
sv(
"result"),
sv(
"")}}};
93 auto ts = taiclock::TaiClock::now().time_since_epoch().count();
107 using sv = std::string_view;
114 {
sv(
"source_timestamp"),
sv(
"")},
115 {
sv(
"origin"),
sv(
"")},
116 {
sv(
"item"),
sv(
"")}}};
119 auto ts = taiclock::TaiClock::now().time_since_epoch().count();
133 using sv = std::string_view;
143 {
sv(
"source_timestamp"),
sv(
"")},
144 {
sv(
"origin"),
sv(
"")},
145 {
sv(
"items"),
sv(
"")},
146 {
sv(
"state"),
sv(
"")}}};
149 auto ts = taiclock::TaiClock::now().time_since_epoch().count();
151 bool is_first =
true;
152 for (
const auto& item : data.
items) {
153 if (is_first ==
false) {
172 using sv = std::string_view;
182 {
sv(
"source_timestamp"),
sv(
"")},
183 {
sv(
"origin"),
sv(
"")},
184 {
sv(
"items"),
sv(
"")},
185 {
sv(
"state"),
sv(
"")}}};
188 auto ts = taiclock::TaiClock::now().time_since_epoch().count();
190 bool is_first =
true;
191 for (
const auto& item : data.
items) {
192 if (is_first ==
false) {
211 using sv = std::string_view;
221 {
sv(
"source_timestamp"),
sv(
"")},
222 {
sv(
"origin"),
sv(
"")},
223 {
sv(
"items"),
sv(
"")},
224 {
sv(
"state"),
sv(
"")}}};
227 auto ts = taiclock::TaiClock::now().time_since_epoch().count();
229 bool is_first =
true;
230 for (
const auto& item : data.
items) {
231 if (is_first ==
false) {
250 using sv = std::string_view;
263 {
sv(
"source_timestamp"),
sv(
"")},
264 {
sv(
"origin"),
sv(
"")},
265 {
sv(
"items"),
sv(
"")},
266 {
sv(
"state"),
sv(
"")},
267 {
sv(
"hrtc_origin"),
sv(
"")},
268 {
sv(
"hrtc_timestamp"),
sv(
"")},
269 {
sv(
"hrtc_sample_id"),
sv(
"")}}};
272 auto ts = taiclock::TaiClock::now().time_since_epoch().count();
274 bool is_first =
true;
275 for (
const auto& item : data.
items) {
276 if (is_first ==
false) {
282 return std::make_tuple(ts,
302 using sv = std::string_view;
315 {
sv(
"source_timestamp"),
sv(
"")},
316 {
sv(
"origin"),
sv(
"")},
317 {
sv(
"items"),
sv(
"")},
318 {
sv(
"state"),
sv(
"")},
319 {
sv(
"hrtc_origin"),
sv(
"")},
320 {
sv(
"hrtc_timestamp"),
sv(
"")},
321 {
sv(
"hrtc_sample_id"),
sv(
"")}}};
324 auto ts = taiclock::TaiClock::now().time_since_epoch().count();
326 bool is_first =
true;
327 for (
const auto& item : data.
items) {
328 if (is_first ==
false) {
334 return std::make_tuple(ts,
354 using sv = std::string_view;
359 {{
sv(
"timestamp"),
sv(
"")}, {
sv(
"source_timestamp"),
sv(
"")}, {
sv(
"origin"),
sv(
"")}}};
362 auto ts = taiclock::TaiClock::now().time_since_epoch().count();
363 return std::make_tuple(ts, data.
time, data.
origin);
376 using sv = std::string_view;
386 {
sv(
"source_timestamp"),
sv(
"")},
387 {
sv(
"origin"),
sv(
"")},
388 {
sv(
"entity"),
sv(
"")},
389 {
sv(
"state"),
sv(
"")}}};
392 auto ts = taiclock::TaiClock::now().time_since_epoch().count();
406 using sv = std::string_view;
418 {
sv(
"source_timestamp"),
sv(
"")},
419 {
sv(
"origin"),
sv(
"")},
420 {
sv(
"entity"),
sv(
"")},
421 {
sv(
"state"),
sv(
"")},
422 {
sv(
"hrtc_timestamp"),
sv(
"")},
423 {
sv(
"hrtc_sample_id"),
sv(
"")}}};
426 auto ts = taiclock::TaiClock::now().time_since_epoch().count();
427 return std::make_tuple(ts,
446 using sv = std::string_view;
456 {
sv(
"source_timestamp"),
sv(
"")},
457 {
sv(
"origin"),
sv(
"")},
458 {
sv(
"status"),
sv(
"")},
459 {
sv(
"active_alerts"),
sv(
"")}}};
462 auto ts = taiclock::TaiClock::now().time_since_epoch().count();
466 json_active.push_back(
JsonPayload{{
"origin", alert.origin},
468 {
"description", alert.description},
469 {
"since", alert.since}});
472 return std::make_tuple(
497 const std::string& unit_id,
502 , m_subscriber(m_event_service.MakeSubscriber<EventType>())
503 , m_input_filter(input_filter)
505 auto topic_path =
DataPointPath(fmt::format(OLDB_PATH_TOPIC_NAME, comp_id, unit_id));
506 m_oldb.CreateDataPoint<std::string>(topic_path);
507 m_oldb.SetDataPoint<std::string>(topic_path, EventType::TOPIC_NAME);
509 m_samples_written_reg = m_metrics.AddCounter(
510 &m_samples_written,
CounterMetricInfo(unit_id +
"/samples_written",
"Samples written"));
516 if (m_process_thread.joinable()) {
517 m_process_thread.join();
526 void Prepare(
const std::filesystem::path& file_path)
override {
528 State::PREPARING, State::STOPPED,
"tried to prepare a non-stopped EventRecordingUnit");
530 m_file_path = file_path / (GetId() + m_output.DefaultFileExtension());
532 auto policies = numapp::NumaPolicies();
534 numapp::MakeThread(m_unit_id.substr(0, 15), policies, [&]() { return Process(); });
546 std::vector<std::filesystem::path>
Stop()
override {
548 if (m_process_thread.joinable()) {
549 m_process_thread.join();
552 std::vector<std::filesystem::path> files;
554 files.push_back(*m_file_path);
563 using namespace std::chrono_literals;
566 m_output.Open(*m_file_path);
567 m_samples_written.Store(0);
569 m_subscriber->Subscribe([&](
const EventType& ev) {
570 if (GetState() == State::RUNNING) {
572 if (m_input_filter) {
573 if (m_input_filter(ev)) {
578 m_output.Write(RecordingInfo<EventType>::AsTuple(ev));
582 SetFailed(std::current_exception());
588 SetState(State::IDLE,
590 "EventRecordingUnit tried to go to IDLE from another state than PREPARING");
592 while (m_stop ==
false) {
593 switch (GetState()) {
596 SetState(State::WAITING,
598 "EventRecorder illegal state transition, tried going to WAITING "
599 "from another state than IDLE");
602 std::this_thread::sleep_for(1ms);
605 if (not HasLeaders() or (HasLeaders() and HasFirstLeaderStarted())) {
606 SetState(State::RUNNING,
608 "EventRecorder illegal state transition, tried going to RUNNING "
609 "from another state than WAITING");
612 std::this_thread::sleep_for(1ms);
615 if (HasLeaders() and HasLastLeaderFinished()) {
616 SetState(State::FINISHED,
618 "EventRecorder illegal state transition, tried going to FINISHED "
619 "from another state than RUNNING");
622 std::this_thread::sleep_for(1ms);
625 std::this_thread::sleep_for(1ms);
629 m_subscriber->Unsubscribe();
636 m_subscriber->Unsubscribe();
640 SetFailed(std::current_exception());
646#pragma GCC diagnostic push
647#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
648 TypedEventService m_event_service;
649 std::unique_ptr<TypedEventSubscriber<EventType>> m_subscriber;
650#pragma GCC diagnostic pop
652 FilterMethod m_input_filter;
654 OutputStage m_output;
656 std::atomic<bool> m_start =
false;
657 std::atomic<bool> m_stop =
false;
658 std::thread m_process_thread;
660 perfc::CounterI64 m_samples_written;
661 perfc::ScopedRegistration m_samples_written_reg;
666 inline static constexpr std::string_view OLDB_PATH_TOPIC_NAME =
"/{}/rec_units/{}/topic_name";
676template <
typename OutputStage = CsvDataRecorder<taiclock::TaiClock::time_po
int::rep, std::
string>>
679 using sv = std::string_view;
693 const std::string& unit_id,
695 const std::string& topic_name,
699 , m_subscriber(m_event_service.MakeSubscriber(topic_name))
700 , m_input_filter(std::move(input_filter))
701 , m_output(COLUMNS) {
702 auto topic_path =
DataPointPath(fmt::format(OLDB_PATH_TOPIC_NAME, comp_id, unit_id));
703 m_oldb.CreateDataPoint<std::string>(topic_path);
704 m_oldb.SetDataPoint<std::string>(topic_path, topic_name);
706 m_samples_written_reg = m_metrics.AddCounter(
707 &m_samples_written,
CounterMetricInfo(unit_id +
"/samples_written",
"Samples written"));
713 if (m_process_thread.joinable()) {
714 m_process_thread.join();
723 void Prepare(
const std::filesystem::path& file_path)
override {
724 SetState(State::PREPARING,
726 "EventRecorder tried to go from non-STOPPED State to PREPARING");
728 m_file_path = file_path / (GetId() + m_output.DefaultFileExtension());
730 auto policies = numapp::NumaPolicies();
732 numapp::MakeThread(m_unit_id.substr(0, 15), policies, [&]() { return Process(); });
744 std::vector<std::filesystem::path>
Stop()
override {
746 if (m_process_thread.joinable()) {
747 m_process_thread.join();
750 std::vector<std::filesystem::path> files;
752 files.push_back(*m_file_path);
759 using namespace std::chrono_literals;
762 m_output.Open(*m_file_path);
763 m_samples_written.Store(0);
765 m_subscriber->Subscribe([&](
const JsonPayload& ev) {
766 if (GetState() == State::RUNNING) {
768 if (m_input_filter) {
769 if (m_input_filter(ev)) {
770 m_output.Write(AsTuple(ev));
774 m_output.Write(AsTuple(ev));
778 SetFailed(std::current_exception());
784 SetState(State::IDLE,
786 "Event recorder was not in PREPARING when trying to go to IDLE");
788 while (m_stop ==
false) {
789 switch (GetState()) {
792 SetState(State::WAITING,
794 "Event recorder was not in IDLE when trying to go to WAITING");
797 std::this_thread::sleep_for(1ms);
800 if (not HasLeaders() or (HasLeaders() and HasFirstLeaderStarted())) {
801 SetState(State::RUNNING,
803 "Event recorder was not in WAITING when trying to go to RUNNING");
806 std::this_thread::sleep_for(1ms);
809 if (HasLeaders() and HasLastLeaderFinished()) {
810 SetState(State::FINISHED,
812 "Event recorder was not running when trying to go to finish");
815 std::this_thread::sleep_for(1ms);
818 std::this_thread::sleep_for(1ms);
822 m_subscriber->Unsubscribe();
829 m_subscriber->Unsubscribe();
833 SetFailed(std::current_exception());
838 static typename OutputStage::TupleType AsTuple(
const JsonPayload& data) {
839 auto ts = taiclock::TaiClock::now().time_since_epoch().count();
840 return std::make_tuple(ts, data.dump());
843 static constexpr ColumnDescription COLUMNS{ColumnMetaData{sv(
"timestamp"), sv(
"")},
844 ColumnMetaData{sv(
"payload"), sv(
"")}};
846 EventServiceIf& m_event_service;
847 std::unique_ptr<EventSubscriberIf> m_subscriber;
849 FilterMethod m_input_filter;
851 OutputStage m_output;
853 std::atomic<bool> m_start =
false;
854 std::atomic<bool> m_stop =
false;
855 std::thread m_process_thread;
857 perfc::CounterI64 m_samples_written;
858 perfc::ScopedRegistration m_samples_written_reg;
863 inline static constexpr std::string_view OLDB_PATH_TOPIC_NAME =
"/{}/rec_units/{}/topic_name";
873template <
class OutputStage = std::ofstream>
894 m_input_filter = [](
const JsonPayload&) {
return true; };
913 if (m_process_thread.joinable()) {
914 m_process_thread.join();
926 "EventRecorder tried to go from non-STOPPED State to PREPARING");
930 auto policies = numapp::NumaPolicies();
932 numapp::MakeThread(
m_unit_id.substr(0, 15),
policies, [&]() { return Process(); });
944 std::vector<std::filesystem::path>
Stop()
override {
946 if (m_process_thread.joinable()) {
947 m_process_thread.join();
950 std::vector<std::filesystem::path>
files;
959 using namespace std::chrono_literals;
965 m_samples_written.Store(0);
970 if (m_input_filter(
ev)) {
983 "Event recorder was not in PREPARING when trying to go to IDLE");
985 while (m_stop ==
false) {
991 "Event recorder was not in IDLE when trying to go to WAITING");
994 std::this_thread::sleep_for(1
ms);
1000 "Event recorder was not in WAITING when trying to go to RUNNING");
1003 std::this_thread::sleep_for(1
ms);
1009 "Event recorder was not running when trying to go to finish");
1012 std::this_thread::sleep_for(1
ms);
1015 std::this_thread::sleep_for(1
ms);
1019 m_subscriber->Unsubscribe();
1025 m_subscriber->Unsubscribe();
1033 EventServiceIf& m_event_service;
1034 std::unique_ptr<EventSubscriberIf> m_subscriber;
1038 std::atomic<bool> m_start =
false;
1039 std::atomic<bool> m_stop =
false;
1040 std::thread m_process_thread;
1042 perfc::CounterI64 m_samples_written;
1043 perfc::ScopedRegistration m_samples_written_reg;
1048 inline static constexpr std::string_view RTR_PATH_TOPIC_NAME =
1049 "/{}/static/rec_units/{}/topic_name";
1054 inline static constexpr std::string_view OLDB_PATH_TOPIC_NAME =
"/{}/rec_units/{}/topic_name";
virtual perfc::ScopedRegistration AddCounter(CounterVariant counter, CounterMetricInfo info)=0
Add a counter to be included in component metrics, identified by its address, together with info to t...
Defines auxiliary information associated with each counter registered with ComponentMetricsIf.
Definition componentMetricsIf.hpp:46
Recorder used for writing data to a CSV file.
Definition csvDataRecorder.hpp:33
typename DataRecorder< T... >::ColumnDescription ColumnDescription
Definition csvDataRecorder.hpp:35
This class provides a wrapper for a data point path.
Definition dataPointPath.hpp:74
std::tuple< T... > TupleType
Type of the tuple returned by user-defined method AsTuple.
Definition dataRecorder.hpp:43
Recording Unit that records JSON events in JSON Lines format (.jsonl)
Definition eventRecordingUnit.hpp:874
std::function< bool(const JsonPayload &)> FilterMethod
Definition eventRecordingUnit.hpp:876
EventRecordingUnit(const std::string &comp_id, const std::string &unit_id, ServiceContainer &services, FilterMethod input_filter=nullptr)
Create a new recording unit.
Definition eventRecordingUnit.hpp:885
std::vector< std::filesystem::path > Stop() override
Stop the recording and wait for it's termination.
Definition eventRecordingUnit.hpp:944
void Prepare(const std::filesystem::path &file_path) override
Prepare the recording.
Definition eventRecordingUnit.hpp:923
virtual ~EventRecordingUnit()
Definition eventRecordingUnit.hpp:911
void Start() override
Start the recording.
Definition eventRecordingUnit.hpp:937
Interface class for providing pub/sub facilities for JSON events.
Definition eventServiceIf.hpp:29
virtual std::unique_ptr< EventSubscriberIf > MakeSubscriber(const std::string &topic)=0
Creates a new subscriber for a specified topic.
Recording Unit that can record JSON events.
Definition eventRecordingUnit.hpp:677
typename OutputStage::ColumnMetaData ColumnMetaData
Definition eventRecordingUnit.hpp:682
std::function< bool(const JsonPayload &)> FilterMethod
Definition eventRecordingUnit.hpp:680
void Prepare(const std::filesystem::path &file_path) override
Prepare the recording.
Definition eventRecordingUnit.hpp:723
JsonEventRecordingUnit(const std::string &comp_id, const std::string &unit_id, ServiceContainer &services, const std::string &topic_name, FilterMethod input_filter=nullptr)
Create a new recording unit.
Definition eventRecordingUnit.hpp:692
virtual ~JsonEventRecordingUnit()
Definition eventRecordingUnit.hpp:711
void Start() override
Start the recording.
Definition eventRecordingUnit.hpp:737
std::string_view sv
Definition eventRecordingUnit.hpp:679
typename OutputStage::ColumnDescription ColumnDescription
Definition eventRecordingUnit.hpp:681
std::vector< std::filesystem::path > Stop() override
Stop the recording and wait for it's termination.
Definition eventRecordingUnit.hpp:744
Abstract base class for all sources that can be recorded by the MetadataCollector and TelemetryRecord...
Definition recordingUnit.hpp:51
bool HasLeaders()
Check if this unit is following any leaders.
Definition recordingUnit.cpp:97
OldbIf & m_oldb
Definition recordingUnit.hpp:173
bool HasLastLeaderFinished()
This function is used to determine if this unit should stop recording when waiting for leaders.
Definition recordingUnit.cpp:106
bool HasFirstLeaderStarted()
This function is used to determine if this unit should start recording when waiting for leaders.
Definition recordingUnit.cpp:101
virtual void Update()
Update dynamic settings.
Definition recordingUnit.cpp:166
void SetFailed(const std::exception_ptr &exception)
Set the unit into failed state, with the given exception.
Definition recordingUnit.cpp:142
std::string GetId()
Get the unit_it of this RecordingUnit.
Definition recordingUnit.cpp:120
std::string m_unit_id
Definition recordingUnit.hpp:171
void ResetLeaderStates()
Definition recordingUnit.cpp:111
ComponentMetricsIf & m_metrics
Definition recordingUnit.hpp:174
RuntimeRepoIf & m_rtr
Definition recordingUnit.hpp:172
void SetStopped()
Set the Unit state to STOPPED independent of the current State.
Definition recordingUnit.cpp:149
State GetState()
Get the current state of the Recording Unit.
Definition recordingUnit.cpp:154
bool SetState(State state, State precondition)
Sets the new state, only goes to new state, if expected state matches.
Definition recordingUnit.cpp:124
std::optional< std::filesystem::path > m_file_path
Definition recordingUnit.hpp:175
T GetDataPoint(const DataPointPath &path) const
Fetches a datapoint from the repository.
Definition repositoryIf.ipp:1711
void CreateDataPoint(const DataPointPath &path)
Creates a new datapoint in the repository.
Definition repositoryIf.ipp:1696
void SetDataPoint(const DataPointPath &path, const T &value)
Sets a datapoint in the repository.
Definition repositoryIf.ipp:1720
Container class that holds services of any type.
Definition serviceContainer.hpp:39
Recording Unit that can record typed events.
Definition eventRecordingUnit.hpp:485
std::function< bool(const EventType &)> FilterMethod
Definition eventRecordingUnit.hpp:487
std::vector< std::filesystem::path > Stop() override
Stop the recording and wait for it's termination.
Definition eventRecordingUnit.hpp:546
TypedEventRecordingUnit(const std::string &comp_id, const std::string &unit_id, ServiceContainer &services, FilterMethod input_filter=nullptr)
Create a new recording unit.
Definition eventRecordingUnit.hpp:496
virtual ~TypedEventRecordingUnit()
Definition eventRecordingUnit.hpp:514
void Prepare(const std::filesystem::path &file_path) override
Prepare the recording.
Definition eventRecordingUnit.hpp:526
void Start() override
Start the recording.
Definition eventRecordingUnit.hpp:539
Header file for ComponentMetricsIf.
CSVDataRecorder allows to record as CSV files .
Framework-provided event definitions.
Low-level interface of the event service.
Provides macros and utilities for exception handling.
FitsRecorder allows to write ColumnData to into fits files in a specified directory.
Definition commandReplier.cpp:22
nlohmann::json JsonPayload
Type requirements:
Definition jsonPayload.hpp:25
elt::mal::future< std::string > InjectReqRepEvent(StateMachineEngine &engine)
Definition malEventInjector.hpp:23
FitsRecorder allows to write ColumnData to into fits files in a specified directory.
Abstract base class defining functionality common to all recording units.
TimeString time
Definition eventDefinitions.hpp:94
std::string origin
Definition eventDefinitions.hpp:93
Event published when alert status is changed.
Definition eventDefinitions.hpp:553
bool status
Reduced alert status.
Definition eventDefinitions.hpp:595
std::vector< Alert > active_alerts
List of active alerts.
Definition eventDefinitions.hpp:600
Abstract Event Type that is used as a base for computation events.
Definition eventDefinitions.hpp:111
std::string item
Definition eventDefinitions.hpp:126
std::string state
Definition eventDefinitions.hpp:127
Event Type used to signal that a computation has finished.
Definition eventDefinitions.hpp:164
JsonPayload result
Definition eventDefinitions.hpp:177
Event Type used to signal that a computation has started.
Definition eventDefinitions.hpp:141
Abstract Event Type that is used as a base for configuration events.
Definition eventDefinitions.hpp:191
std::string state
Definition eventDefinitions.hpp:257
ItemList items
Definition eventDefinitions.hpp:256
Event Type used to signal that configuration data items were retrieved from RTR.
Definition eventDefinitions.hpp:312
Event Type used to signal that configuration data items were updated in RTR.
Definition eventDefinitions.hpp:271
Abstract Event Type that is used as a base for coordination events.
Definition eventDefinitions.hpp:464
Event Type used to signal that configuration data items were applied in HRTC.
Definition eventDefinitions.hpp:409
uint64_t hrtc_sample_id
Definition eventDefinitions.hpp:450
TimeString hrtc_timestamp
Definition eventDefinitions.hpp:449
std::string hrtc_origin
Definition eventDefinitions.hpp:448
Event Type used to signal that configuration data items were scheduled to be applied in HRTC.
Definition eventDefinitions.hpp:354
uint64_t hrtc_sample_id
Definition eventDefinitions.hpp:395
TimeString hrtc_timestamp
Definition eventDefinitions.hpp:394
std::string hrtc_origin
Definition eventDefinitions.hpp:393
Event Type used to signal that some entity in HRTC changed its state.
Definition eventDefinitions.hpp:519
TimeString hrtc_timestamp
Definition eventDefinitions.hpp:534
uint64_t hrtc_sample_id
Definition eventDefinitions.hpp:535
std::string_view sv
Definition eventRecordingUnit.hpp:446
static Recorder::TupleType AsTuple(const DataType &data)
Definition eventRecordingUnit.hpp:461
static Recorder::TupleType AsTuple(const DataType &data)
Definition eventRecordingUnit.hpp:62
std::string_view sv
Definition eventRecordingUnit.hpp:47
static Recorder::TupleType AsTuple(const DataType &data)
Definition eventRecordingUnit.hpp:92
std::string_view sv
Definition eventRecordingUnit.hpp:77
std::string_view sv
Definition eventRecordingUnit.hpp:107
static Recorder::TupleType AsTuple(const DataType &data)
Definition eventRecordingUnit.hpp:118
static Recorder::TupleType AsTuple(const DataType &data)
Definition eventRecordingUnit.hpp:148
std::string_view sv
Definition eventRecordingUnit.hpp:133
static Recorder::TupleType AsTuple(const DataType &data)
Definition eventRecordingUnit.hpp:226
std::string_view sv
Definition eventRecordingUnit.hpp:211
std::string_view sv
Definition eventRecordingUnit.hpp:172
static Recorder::TupleType AsTuple(const DataType &data)
Definition eventRecordingUnit.hpp:187
static Recorder::TupleType AsTuple(const DataType &data)
Definition eventRecordingUnit.hpp:361
std::string_view sv
Definition eventRecordingUnit.hpp:354
std::string_view sv
Definition eventRecordingUnit.hpp:302
static Recorder::TupleType AsTuple(const DataType &data)
Definition eventRecordingUnit.hpp:323
static Recorder::TupleType AsTuple(const DataType &data)
Definition eventRecordingUnit.hpp:271
std::string_view sv
Definition eventRecordingUnit.hpp:250
std::string_view sv
Definition eventRecordingUnit.hpp:406
static Recorder::TupleType AsTuple(const DataType &data)
Definition eventRecordingUnit.hpp:425
std::string_view sv
Definition eventRecordingUnit.hpp:376
static Recorder::TupleType AsTuple(const DataType &data)
Definition eventRecordingUnit.hpp:391
Definition recordingInfo.hpp:23
Event Type used to signal that some entity changed its state.
Definition eventDefinitions.hpp:489
std::string entity
Definition eventDefinitions.hpp:504
std::string state
Definition eventDefinitions.hpp:505
High-level API of the event service.