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
11namespace DB
12{
13
14class 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 */
21class AsynchronousMetrics
22{
23public:
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
37private:
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