31 unsigned int loopRange = std::min(filledMetrics, metricsStorage.size());
34 for (
unsigned int idx = 0; idx < loopRange; ++idx) {
38 w.String(s.c_str(), s.size());
40 if constexpr (std::is_arithmetic_v<T>) {
43 w.String(metricsStorage[idx].
data);
52 const std::vector<DeviceSpec>& specs,
53 std::vector<std::regex>
const& performanceMetricsRegex,
54 std::ostream& out)
noexcept
56 assert(
metrics.size() == specs.size());
62 rapidjson::OStreamWrapper osw(out);
63 rapidjson::PrettyWriter<rapidjson::OStreamWrapper>
w(osw);
68 for (
unsigned int idx = 0; idx <
metrics.size(); ++idx) {
69 w.Key(specs[idx].
id.c_str());
70 const auto& deviceMetrics =
metrics[idx];
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 size_t filledMetrics = deviceMetrics.metrics[mi].filledMetrics;
86 if (deviceMetrics.metrics[mi].filledMetrics == 0) {
89 w.Key(metricLabel.data(), metricLabel.size());
90 switch (deviceMetrics.metrics[mi].type) {
93 deviceMetrics.intTimestamps[
storeIdx]);
96 case MetricType::Float:
98 deviceMetrics.floatTimestamps[
storeIdx]);
101 case MetricType::String:
103 deviceMetrics.stringTimestamps[
storeIdx]);
106 case MetricType::Uint64:
108 deviceMetrics.uint64Timestamps[
storeIdx]);
121 for (
size_t mi = 0; mi < driverMetrics.metricLabels.size(); mi++) {
122 std::string_view
const metricLabel{driverMetrics.metricLabels[mi].label, driverMetrics.metricLabels[mi].size};
123 auto same = [metricLabel](std::regex
const& matcher) ->
bool {
124 return std::regex_match(metricLabel.begin(), metricLabel.end(), matcher);
128 if (std::find_if(std::begin(performanceMetricsRegex), std::end(performanceMetricsRegex), same) == performanceMetricsRegex.end()) {
132 auto storeIdx = driverMetrics.metrics[mi].storeIdx;
134 size_t filledMetrics = driverMetrics.metrics[mi].filledMetrics;
135 if (filledMetrics == 0) {
139 w.Key(metricLabel.data(), metricLabel.size());
140 switch (driverMetrics.metrics[mi].type) {
141 case MetricType::Int:
143 driverMetrics.intTimestamps[
storeIdx]);
146 case MetricType::Float:
148 driverMetrics.floatTimestamps[
storeIdx]);
151 case MetricType::String:
153 driverMetrics.stringTimestamps[
storeIdx]);
156 case MetricType::Uint64:
158 driverMetrics.uint64Timestamps[
storeIdx]);