]> git.proxmox.com Git - ceph.git/blame - ceph/src/mgr/MetricCollector.h
import ceph quincy 17.2.4
[ceph.git] / ceph / src / mgr / MetricCollector.h
CommitLineData
9f95a23c
TL
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2// vim: ts=8 sw=2 smarttab
3
4#ifndef CEPH_MGR_METRIC_COLLECTOR_H
5#define CEPH_MGR_METRIC_COLLECTOR_H
6
7#include <map>
8#include <set>
9#include <tuple>
10#include <vector>
11#include <utility>
12#include <algorithm>
13
14#include "common/ceph_mutex.h"
15#include "msg/Message.h"
16#include "mgr/Types.h"
17#include "mgr/MetricTypes.h"
18
19class MMgrReport;
20
21template <typename Query, typename Limit, typename Key, typename Report>
22class MetricCollector {
23public:
24 virtual ~MetricCollector() {
25 }
26
27 using Limits = std::set<Limit>;
28
29 MetricCollector(MetricListener &listener);
30
31 MetricQueryID add_query(const Query &query, const std::optional<Limit> &limit);
32
33 int remove_query(MetricQueryID query_id);
34
35 void remove_all_queries();
36
33c7a0ef
TL
37 void reregister_queries();
38
9f95a23c
TL
39 std::map<Query, Limits> get_queries() const {
40 std::lock_guard locker(lock);
41
42 std::map<Query, Limits> result;
43 for (auto& [query, limits] : queries) {
44 auto result_it = result.insert({query, {}}).first;
45 if (is_limited(limits)) {
46 for (auto& limit : limits) {
a4b75251
TL
47 if (limit.second) {
48 result_it->second.insert(*limit.second);
49 }
9f95a23c
TL
50 }
51 }
52 }
53
54 return result;
55 }
56
57 virtual void process_reports(const MetricPayload &payload) = 0;
f67539c2 58 virtual int get_counters(PerfCollector *collector) = 0;
9f95a23c
TL
59
60protected:
61 typedef std::optional<Limit> OptionalLimit;
62 typedef std::map<MetricQueryID, OptionalLimit> QueryIDLimit;
63 typedef std::map<Query, QueryIDLimit> Queries;
64 typedef std::map<MetricQueryID, std::map<Key, PerformanceCounters>> Counters;
65 typedef std::function<void(PerformanceCounter *, const PerformanceCounter &)> UpdateCallback;
66
67 mutable ceph::mutex lock = ceph::make_mutex("mgr::metric::collector::lock");
68
69 Queries queries;
70 Counters counters;
71
72 void process_reports_generic(const std::map<Query, Report> &reports, UpdateCallback callback);
f67539c2 73 int get_counters_generic(MetricQueryID query_id, std::map<Key, PerformanceCounters> *counters);
9f95a23c
TL
74
75private:
76 MetricListener &listener;
77 MetricQueryID next_query_id = 0;
78
79 bool is_limited(const std::map<MetricQueryID, OptionalLimit> &limits) const {
80 return std::any_of(begin(limits), end(limits),
81 [](auto &limits) { return limits.second.has_value(); });
82 }
83};
84
85#endif // CEPH_MGR_METRIC_COLLECTOR_H