ClickHouse/src/Common/CurrentMetrics.h

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

123 lines
3.4 KiB
C++
Raw Normal View History

#pragma once
#include <cstddef>
#include <cstdint>
#include <utility>
2016-07-31 03:53:16 +00:00
#include <atomic>
2021-10-02 07:13:14 +00:00
#include <base/types.h>
/** Allows to count number of simultaneously happening processes or current value of some metric.
* - for high-level profiling.
*
* See also ProfileEvents.h
* ProfileEvents counts number of happened events - for example, how many times queries was executed.
* CurrentMetrics counts number of simultaneously happening events - for example, number of currently executing queries, right now,
* or just current value of some metric - for example, replica delay in seconds.
*
* CurrentMetrics are updated instantly and are correct for any point in time.
* For periodically (asynchronously) updated metrics, see AsynchronousMetrics.h
*/
namespace CurrentMetrics
{
/// Metric identifier (index in array).
using Metric = size_t;
using Value = DB::Int64;
/// Get name of metric by identifier. Returns statically allocated string.
const char * getName(Metric event);
/// Get text description of metric by identifier. Returns statically allocated string.
const char * getDocumentation(Metric event);
/// Metric identifier -> current value of metric.
extern std::atomic<Value> values[];
/// Get index just after last metric identifier.
Metric end();
/// Set value of specified metric.
inline void set(Metric metric, Value value)
{
2017-09-17 00:13:26 +00:00
values[metric].store(value, std::memory_order_relaxed);
}
2021-08-30 11:04:59 +00:00
/// Get value of specified metric.
inline Value get(Metric metric)
{
return values[metric].load(std::memory_order_relaxed);
}
/// Add value for specified metric. You must subtract value later; or see class Increment below.
inline void add(Metric metric, Value value = 1)
{
2017-09-17 00:13:26 +00:00
values[metric].fetch_add(value, std::memory_order_relaxed);
}
inline void sub(Metric metric, Value value = 1)
{
add(metric, -value);
}
2020-06-27 19:05:00 +00:00
/// For lifetime of object, add amount for specified metric. Then subtract.
class Increment
{
private:
2016-07-31 03:53:16 +00:00
std::atomic<Value> * what;
Value amount;
2019-08-03 11:02:40 +00:00
Increment(std::atomic<Value> * what_, Value amount_)
: what(what_), amount(amount_)
{
2016-07-31 03:53:16 +00:00
*what += amount;
}
public:
explicit Increment(Metric metric, Value amount_ = 1)
2019-08-03 11:02:40 +00:00
: Increment(&values[metric], amount_) {}
~Increment()
{
if (what)
2017-09-17 00:13:26 +00:00
what->fetch_sub(amount, std::memory_order_relaxed);
}
Increment(Increment && old) noexcept
{
*this = std::move(old);
}
Increment & operator=(Increment && old) noexcept
{
what = old.what;
amount = old.amount;
old.what = nullptr;
return *this;
}
void changeTo(Value new_amount)
{
2017-09-17 00:13:26 +00:00
what->fetch_add(new_amount - amount, std::memory_order_relaxed);
amount = new_amount;
}
void sub(Value value = 1)
{
what->fetch_sub(value, std::memory_order_relaxed);
amount -= value;
}
void add(Value value = 1)
{
what->fetch_add(value, std::memory_order_relaxed);
amount += value;
}
/// Subtract value before destructor.
void destroy()
{
2017-09-17 00:13:26 +00:00
what->fetch_sub(amount, std::memory_order_relaxed);
what = nullptr;
}
};
}