diff options
author | Jess Balint <jbalint@gmail.com> | 2022-04-08 23:31:18 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-04-09 00:23:49 +0000 |
commit | 43434627e89822b7e19e3a9d3aeb341be331aae6 (patch) | |
tree | 141b28e6d6d597ff6d79c3a55a90bfbc5ac5ed21 /src/mongo/util/histogram.h | |
parent | 86efc4be5f8921af9e8b89ef4219b089ef0c67cd (diff) | |
download | mongo-43434627e89822b7e19e3a9d3aeb341be331aae6.tar.gz |
SERVER-63642 Add serverStatus histogram metrics to measure multi-planning performance
Diffstat (limited to 'src/mongo/util/histogram.h')
-rw-r--r-- | src/mongo/util/histogram.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/mongo/util/histogram.h b/src/mongo/util/histogram.h index 0a07c82d9bc..78ba29664ba 100644 --- a/src/mongo/util/histogram.h +++ b/src/mongo/util/histogram.h @@ -184,4 +184,48 @@ void appendHistogram(BSONObjBuilder& bob, const Histogram<T>& hist, const String histBob.append("totalCount", totalCount); } +namespace histogram_detail { +/** + * Append the histogram as an array of {bound: <lower>, count: <count>} objects. + */ +template <typename T> +void appendHistogramAsArray(const Histogram<T>& hist, + const StringData histKey, + bool includeFirstBucket, + BSONObjBuilder& bob) { + BSONArrayBuilder histBob(bob.subarrayStart(histKey)); + + for (auto&& [count, lower, upper] : hist) { + // First bucket is indicated by 'lower' = nullptr. + if (lower) { + histBob.append( + BSON("lowerBound" << static_cast<long long>(*lower) << "count" << count)); + } else if (includeFirstBucket) { + histBob.append(BSON("lowerBound" + << "-INF" + << "count" << count)); + } + } +} +} // namespace histogram_detail + +/** + * A metric reported in serverStatus with type histogram. This is a partial specialization of + * ServerStatusMetricField<T>. We cannot include it there due to cyclic header dependency via + * "commands.h". + */ +template <typename T> +class ServerStatusMetricField<Histogram<T>> : public ServerStatusMetric { +public: + ServerStatusMetricField(const std::string& name, const Histogram<T>& t) + : ServerStatusMetric(name), _hist(t) {} + + virtual void appendAtLeaf(BSONObjBuilder& b) const { + histogram_detail::appendHistogramAsArray(_hist, _leafName, false, b); + } + +private: + const Histogram<T>& _hist; +}; + } // namespace mongo |