37 const T& metricsStorage,
const TIMESTAMPS& timestampsStorage,
size_t labelIndex,
size_t storeIndex)
39 unsigned int loopRange = std::min(deviceMetrics.
metrics[labelIndex].filledMetrics, metricsStorage[storeIndex].size());
40 boost::property_tree::ptree metricNode;
42 for (
unsigned int idx = 0; idx < loopRange; ++idx) {
43 boost::property_tree::ptree
values;
44 values.add(
"timestamp", timestampsStorage[storeIndex][idx]);
45 if constexpr (std::is_arithmetic_v<T>) {
48 values.add(
"value", retriveValue(std::cref(metricsStorage[storeIndex][idx])));
50 metricNode.push_back(std::make_pair(
"",
values));
57 const std::vector<DeviceSpec>& specs,
58 std::vector<std::regex>
const& performanceMetricsRegex)
noexcept
61 assert(
metrics.size() == specs.size());
67 boost::property_tree::ptree root;
68 for (
unsigned int idx = 0; idx <
metrics.size(); ++idx) {
70 const auto& deviceMetrics =
metrics[idx];
71 boost::property_tree::ptree deviceRoot;
73 for (
size_t mi = 0; mi < deviceMetrics.metricLabels.size(); mi++) {
74 std::string_view metricLabel{deviceMetrics.metricLabels[mi].label, deviceMetrics.metricLabels[mi].size};
76 auto same = [metricLabel](std::regex
const& matcher) ->
bool {
77 return std::regex_match(metricLabel.begin(), metricLabel.end(), matcher);
80 if (std::find_if(std::begin(performanceMetricsRegex), std::end(performanceMetricsRegex), same) == performanceMetricsRegex.end()) {
83 auto storeIdx = deviceMetrics.metrics[mi].storeIdx;
85 if (deviceMetrics.metrics[mi].filledMetrics == 0) {
90 boost::property_tree::ptree metricNode;
92 switch (deviceMetrics.metrics[mi].type) {
97 case MetricType::Float:
101 case MetricType::String:
102 metricNode =
fillNodeWithValue(deviceMetrics, deviceMetrics.stringMetrics, deviceMetrics.stringTimestamps, mi,
storeIdx);
105 case MetricType::Uint64:
106 metricNode =
fillNodeWithValue(deviceMetrics, deviceMetrics.uint64Metrics, deviceMetrics.uint64Timestamps, mi,
storeIdx);
112 deviceRoot.add_child(std::string(metricLabel), metricNode);
115 root.add_child(specs[idx].
id, deviceRoot);
118 boost::property_tree::ptree driverRoot;
119 for (
size_t mi = 0; mi < driverMetrics.metricLabels.size(); mi++) {
120 std::string_view
const metricLabel{driverMetrics.metricLabels[mi].label, driverMetrics.metricLabels[mi].size};
121 auto same = [metricLabel](std::regex
const& matcher) ->
bool {
122 return std::regex_match(metricLabel.begin(), metricLabel.end(), matcher);
126 if (std::find_if(std::begin(performanceMetricsRegex), std::end(performanceMetricsRegex), same) == performanceMetricsRegex.end()) {
130 auto storeIdx = driverMetrics.metrics[mi].storeIdx;
132 if (driverMetrics.metrics[mi].filledMetrics == 0) {
137 boost::property_tree::ptree metricNode;
139 switch (driverMetrics.metrics[mi].type) {
140 case MetricType::Int:
144 case MetricType::Float:
148 case MetricType::String:
149 metricNode =
fillNodeWithValue(driverMetrics, driverMetrics.stringMetrics, driverMetrics.stringTimestamps, mi,
storeIdx);
152 case MetricType::Uint64:
153 metricNode =
fillNodeWithValue(driverMetrics, driverMetrics.uint64Metrics, driverMetrics.uint64Timestamps, mi,
storeIdx);
159 driverRoot.add_child(std::string{metricLabel}, metricNode);
162 root.add_child(
"driver", driverRoot);
164 std::ofstream
file(
"performanceMetrics.json", std::ios::out);
165 if (
file.is_open()) {
166 boost::property_tree::json_parser::write_json(
file, root);