1 | #pragma once |
---|---|
2 | |
3 | #include <thread> |
4 | #include <mutex> |
5 | #include <condition_variable> |
6 | #include <unordered_map> |
7 | #include <string> |
8 | #include <Common/ThreadPool.h> |
9 | |
10 | |
11 | namespace DB |
12 | { |
13 | |
14 | class Context; |
15 | |
16 | |
17 | /** Periodically (each minute, starting at 30 seconds offset) |
18 | * calculates and updates some metrics, |
19 | * that are not updated automatically (so, need to be asynchronously calculated). |
20 | */ |
21 | class AsynchronousMetrics |
22 | { |
23 | public: |
24 | AsynchronousMetrics(Context & context_) |
25 | : context(context_), thread([this] { run(); }) |
26 | { |
27 | } |
28 | |
29 | ~AsynchronousMetrics(); |
30 | |
31 | using Value = double; |
32 | using Container = std::unordered_map<std::string, Value>; |
33 | |
34 | /// Returns copy of all values. |
35 | Container getValues() const; |
36 | |
37 | private: |
38 | Context & context; |
39 | |
40 | bool quit {false}; |
41 | std::mutex wait_mutex; |
42 | std::condition_variable wait_cond; |
43 | |
44 | Container container; |
45 | mutable std::mutex container_mutex; |
46 | |
47 | ThreadFromGlobalPool thread; |
48 | |
49 | void run(); |
50 | void update(); |
51 | |
52 | void set(const std::string & name, Value value); |
53 | }; |
54 | |
55 | } |
56 |