made MetricValues persistent
MetricValues are persistent for reportUpdates AppendStopsWhenFull and
reportingType different than OnRequest.
Tested:
- New unit tests are passing
- Confirmed MetricValues are preserved after restarting telemetry
service
Change-Id: I7e1990fb391da9debb0d7df2f1dbda86473350cc
Signed-off-by: Krzysztof Grobelny <krzysztof.grobelny@intel.com>
diff --git a/src/report.cpp b/src/report.cpp
index d9d89b8..945d4e6 100644
--- a/src/report.cpp
+++ b/src/report.cpp
@@ -27,14 +27,16 @@
interfaces::JsonStorage& reportStorageIn,
std::vector<std::shared_ptr<interfaces::Metric>> metricsIn,
const interfaces::ReportFactory& reportFactory,
- const bool enabledIn, std::unique_ptr<interfaces::Clock> clock) :
+ const bool enabledIn, std::unique_ptr<interfaces::Clock> clock,
+ Readings readingsIn) :
id(reportId),
name(reportName), reportingType(reportingTypeIn), interval(intervalIn),
reportActions(reportActionsIn.begin(), reportActionsIn.end()),
sensorCount(getSensorCount(metricsIn)),
appendLimit(deduceAppendLimit(appendLimitIn)),
- reportUpdates(reportUpdatesIn),
- readingsBuffer(deduceBufferSize(reportUpdates, reportingType)),
+ reportUpdates(reportUpdatesIn), readings(std::move(readingsIn)),
+ readingsBuffer(std::get<1>(readings),
+ deduceBufferSize(reportUpdates, reportingType)),
objServer(objServer), metrics(std::move(metricsIn)), timer(ioc),
triggerIds(collectTriggerIds(ioc)), reportStorage(reportStorageIn),
enabled(enabledIn), clock(std::move(clock)), messanger(ioc)
@@ -62,8 +64,11 @@
dbusIface.register_method("Delete", [this, &ioc, &reportManager] {
if (persistency)
{
- reportStorage.remove(fileName());
+ persistency = false;
+
+ reportIface->signal_property("Persistency");
}
+
boost::asio::post(ioc, [this, &reportManager] {
reportManager.removeReport(this);
});
@@ -117,6 +122,21 @@
});
}
+Report::~Report()
+{
+ if (persistency)
+ {
+ if (shouldStoreMetricValues())
+ {
+ storeConfiguration();
+ }
+ }
+ else
+ {
+ reportStorage.remove(reportFileName());
+ }
+}
+
uint64_t Report::getSensorCount(
const std::vector<std::shared_ptr<interfaces::Metric>>& metrics)
{
@@ -242,7 +262,7 @@
}
else
{
- reportStorage.remove(fileName());
+ reportStorage.remove(reportFileName());
persistency = false;
}
return 1;
@@ -458,10 +478,9 @@
}
}
- readings = {
+ std::get<0>(readings) =
std::chrono::duration_cast<Milliseconds>(clock->systemTimestamp())
- .count(),
- std::vector<ReadingData>(readingsBuffer.begin(), readingsBuffer.end())};
+ .count();
if (utils::contains(reportActions, ReportAction::emitsReadingsUpdate))
{
@@ -469,6 +488,12 @@
}
}
+bool Report::shouldStoreMetricValues() const
+{
+ return reportingType != ReportingType::onRequest &&
+ reportUpdates == ReportUpdates::appendStopsWhenFull;
+}
+
bool Report::storeConfiguration() const
{
try
@@ -493,7 +518,12 @@
return metric->dumpConfiguration();
});
- reportStorage.store(fileName(), data);
+ if (shouldStoreMetricValues())
+ {
+ data["MetricValues"] = utils::toLabeledReadings(readings);
+ }
+
+ reportStorage.store(reportFileName(), data);
}
catch (const std::exception& e)
{
@@ -506,7 +536,7 @@
return true;
}
-interfaces::JsonStorage::FilePath Report::fileName() const
+interfaces::JsonStorage::FilePath Report::reportFileName() const
{
return interfaces::JsonStorage::FilePath{
std::to_string(std::hash<std::string>{}(id))};