summaryrefslogtreecommitdiff
path: root/src/mongo/util/histogram.h
diff options
context:
space:
mode:
authorJess Balint <jbalint@gmail.com>2022-04-08 23:31:18 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-04-09 00:23:49 +0000
commit43434627e89822b7e19e3a9d3aeb341be331aae6 (patch)
tree141b28e6d6d597ff6d79c3a55a90bfbc5ac5ed21 /src/mongo/util/histogram.h
parent86efc4be5f8921af9e8b89ef4219b089ef0c67cd (diff)
downloadmongo-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.h44
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