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,
59 std::ostream& out)
noexcept
62 assert(
metrics.size() == specs.size());
68 boost::property_tree::ptree root;
69 for (
unsigned int idx = 0; idx <
metrics.size(); ++idx) {
71 const auto& deviceMetrics =
metrics[idx];
72 boost::property_tree::ptree deviceRoot;
74 for (
size_t mi = 0; mi < deviceMetrics.metricLabels.size(); mi++) {
75 std::string_view metricLabel{deviceMetrics.metricLabels[mi].label, deviceMetrics.metricLabels[mi].size};
77 auto same = [metricLabel](std::regex
const& matcher) ->
bool {
78 return std::regex_match(metricLabel.begin(), metricLabel.end(), matcher);
81 if (std::find_if(std::begin(performanceMetricsRegex), std::end(performanceMetricsRegex), same) == performanceMetricsRegex.end()) {
84 auto storeIdx = deviceMetrics.metrics[mi].storeIdx;
86 if (deviceMetrics.metrics[mi].filledMetrics == 0) {
91 boost::property_tree::ptree metricNode;
93 switch (deviceMetrics.metrics[mi].type) {
98 case MetricType::Float:
102 case MetricType::String:
103 metricNode =
fillNodeWithValue(deviceMetrics, deviceMetrics.stringMetrics, deviceMetrics.stringTimestamps, mi,
storeIdx);
106 case MetricType::Uint64:
107 metricNode =
fillNodeWithValue(deviceMetrics, deviceMetrics.uint64Metrics, deviceMetrics.uint64Timestamps, mi,
storeIdx);
113 deviceRoot.add_child(std::string(metricLabel), metricNode);
116 root.add_child(specs[idx].
id, deviceRoot);
119 boost::property_tree::ptree driverRoot;
120 for (
size_t mi = 0; mi < driverMetrics.metricLabels.size(); mi++) {
121 std::string_view
const metricLabel{driverMetrics.metricLabels[mi].label, driverMetrics.metricLabels[mi].size};
122 auto same = [metricLabel](std::regex
const& matcher) ->
bool {
123 return std::regex_match(metricLabel.begin(), metricLabel.end(), matcher);
127 if (std::find_if(std::begin(performanceMetricsRegex), std::end(performanceMetricsRegex), same) == performanceMetricsRegex.end()) {
131 auto storeIdx = driverMetrics.metrics[mi].storeIdx;
133 if (driverMetrics.metrics[mi].filledMetrics == 0) {
138 boost::property_tree::ptree metricNode;
140 switch (driverMetrics.metrics[mi].type) {
141 case MetricType::Int:
145 case MetricType::Float:
149 case MetricType::String:
150 metricNode =
fillNodeWithValue(driverMetrics, driverMetrics.stringMetrics, driverMetrics.stringTimestamps, mi,
storeIdx);
153 case MetricType::Uint64:
154 metricNode =
fillNodeWithValue(driverMetrics, driverMetrics.uint64Metrics, driverMetrics.uint64Timestamps, mi,
storeIdx);
160 driverRoot.add_child(std::string{metricLabel}, metricNode);
163 root.add_child(
"driver", driverRoot);
165 boost::property_tree::json_parser::write_json(out, root);