2016-01-20 21:32:01 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
2016-01-21 01:47:28 +00:00
|
|
|
|
#include <cstdint>
|
2016-01-20 21:32:01 +00:00
|
|
|
|
#include <utility>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Позволяет считать количество одновременно происходящих событий или текущее значение какой-либо метрики.
|
|
|
|
|
* - для высокоуровневого профайлинга.
|
|
|
|
|
*
|
|
|
|
|
* Также смотрите ProfileEvents.h
|
|
|
|
|
* В ProfileEvents считается общее количество произошедших (точечных) событий - например, сколько раз были выполнены запросы.
|
|
|
|
|
* В CurrentMetrics считается количество одновременных событий - например, сколько сейчас одновременно выполняется запросов,
|
|
|
|
|
* или текущее значение метрики - например, величина отставания реплики в секундах.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#define APPLY_FOR_METRICS(M) \
|
|
|
|
|
M(Query) \
|
2016-01-21 01:47:28 +00:00
|
|
|
|
M(Merge) \
|
|
|
|
|
M(ReplicatedFetch) \
|
|
|
|
|
M(ReplicatedSend) \
|
|
|
|
|
M(ReplicatedChecks) \
|
|
|
|
|
M(BackgroundPoolTask) \
|
|
|
|
|
M(DiskSpaceReservedForMerge) \
|
|
|
|
|
M(DistributedSend) \
|
|
|
|
|
M(QueryPreempted) \
|
|
|
|
|
M(TCPConnection) \
|
|
|
|
|
M(HTTPConnection) \
|
|
|
|
|
M(InterserverConnection) \
|
|
|
|
|
M(OpenFileForRead) \
|
|
|
|
|
M(OpenFileForWrite) \
|
|
|
|
|
M(Read) \
|
|
|
|
|
M(Write) \
|
|
|
|
|
M(SendExternalTables) \
|
|
|
|
|
M(QueryThread) \
|
|
|
|
|
M(ReadonlyReplica) \
|
|
|
|
|
M(MemoryTracking) \
|
2016-01-20 21:32:01 +00:00
|
|
|
|
\
|
|
|
|
|
M(END)
|
|
|
|
|
|
|
|
|
|
namespace CurrentMetrics
|
|
|
|
|
{
|
|
|
|
|
/// Виды метрик.
|
|
|
|
|
enum Metric
|
|
|
|
|
{
|
|
|
|
|
#define M(NAME) NAME,
|
|
|
|
|
APPLY_FOR_METRICS(M)
|
|
|
|
|
#undef M
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Получить текстовое описание метрики по его enum-у.
|
|
|
|
|
inline const char * getDescription(Metric event)
|
|
|
|
|
{
|
|
|
|
|
static const char * descriptions[] =
|
|
|
|
|
{
|
|
|
|
|
#define M(NAME) #NAME,
|
|
|
|
|
APPLY_FOR_METRICS(M)
|
|
|
|
|
#undef M
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return descriptions[event];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2016-01-21 01:47:28 +00:00
|
|
|
|
using Value = int64_t;
|
|
|
|
|
|
2016-01-20 21:32:01 +00:00
|
|
|
|
/// Счётчики - текущие значения метрик.
|
2016-01-21 01:47:28 +00:00
|
|
|
|
extern Value values[END];
|
2016-01-20 21:32:01 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Выставить значение указанной метрики.
|
2016-01-21 01:47:28 +00:00
|
|
|
|
inline void set(Metric metric, Value value)
|
2016-01-20 21:32:01 +00:00
|
|
|
|
{
|
|
|
|
|
values[metric] = value;
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-21 01:47:28 +00:00
|
|
|
|
/// Прибавить величину к значению указанной метрики. Вы затем должны вычесть величину самостоятельно. Или см. ниже class Increment.
|
|
|
|
|
inline void add(Metric metric, Value value = 1)
|
|
|
|
|
{
|
|
|
|
|
__sync_fetch_and_add(&values[metric], value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void sub(Metric metric, Value value = 1)
|
|
|
|
|
{
|
|
|
|
|
add(metric, -value);
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-20 21:32:01 +00:00
|
|
|
|
/// На время жизни объекта, увеличивает указанное значение на указанную величину.
|
|
|
|
|
class Increment
|
|
|
|
|
{
|
|
|
|
|
private:
|
2016-01-21 01:47:28 +00:00
|
|
|
|
Value * what;
|
|
|
|
|
Value amount;
|
2016-01-20 21:32:01 +00:00
|
|
|
|
|
2016-01-21 01:47:28 +00:00
|
|
|
|
Increment(Value * what, Value amount)
|
2016-01-20 21:32:01 +00:00
|
|
|
|
: what(what), amount(amount)
|
|
|
|
|
{
|
|
|
|
|
__sync_fetch_and_add(what, amount);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public:
|
2016-01-21 01:47:28 +00:00
|
|
|
|
Increment(Metric metric, Value amount = 1)
|
2016-01-20 21:32:01 +00:00
|
|
|
|
: Increment(&values[metric], amount) {}
|
|
|
|
|
|
|
|
|
|
~Increment()
|
|
|
|
|
{
|
|
|
|
|
if (what)
|
|
|
|
|
__sync_fetch_and_sub(what, amount);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Increment(Increment && old)
|
|
|
|
|
{
|
|
|
|
|
*this = std::move(old);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Increment & operator= (Increment && old)
|
|
|
|
|
{
|
|
|
|
|
what = old.what;
|
|
|
|
|
amount = old.amount;
|
|
|
|
|
old.what = nullptr;
|
|
|
|
|
return *this;
|
|
|
|
|
}
|
2016-01-21 01:47:28 +00:00
|
|
|
|
|
|
|
|
|
void changeTo(Value new_amount)
|
|
|
|
|
{
|
|
|
|
|
__sync_fetch_and_add(what, new_amount - amount);
|
|
|
|
|
amount = new_amount;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Уменьшить значение раньше вызова деструктора.
|
|
|
|
|
void destroy()
|
|
|
|
|
{
|
|
|
|
|
__sync_fetch_and_sub(what, amount);
|
|
|
|
|
what = nullptr;
|
|
|
|
|
}
|
2016-01-20 21:32:01 +00:00
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#undef APPLY_FOR_METRICS
|