Improve telemetry data (#89)
* Add query type count to telemetry * Extract telemetry data in different structure * Add global event counter
This commit is contained in:
parent
2e0dd19bac
commit
a9f5f45b3d
@ -1,4 +1,5 @@
|
||||
#include <algorithm>
|
||||
#include <atomic>
|
||||
#include <chrono>
|
||||
#include <csignal>
|
||||
#include <cstdint>
|
||||
@ -29,6 +30,7 @@
|
||||
#include "storage/v2/storage.hpp"
|
||||
#include "storage/v2/view.hpp"
|
||||
#include "telemetry/telemetry.hpp"
|
||||
#include "utils/event_counter.hpp"
|
||||
#include "utils/file.hpp"
|
||||
#include "utils/flag_validation.hpp"
|
||||
#include "utils/logging.hpp"
|
||||
@ -970,10 +972,17 @@ int main(int argc, char **argv) {
|
||||
if (FLAGS_telemetry_enabled) {
|
||||
telemetry.emplace("https://telemetry.memgraph.com/88b5e7e8-746a-11e8-9f85-538a9e9690cc/",
|
||||
data_directory / "telemetry", std::chrono::minutes(10));
|
||||
telemetry->AddCollector("db", [&db]() -> nlohmann::json {
|
||||
telemetry->AddCollector("storage", [&db]() -> nlohmann::json {
|
||||
auto info = db.GetInfo();
|
||||
return {{"vertices", info.vertex_count}, {"edges", info.edge_count}};
|
||||
});
|
||||
telemetry->AddCollector("event_counters", []() -> nlohmann::json {
|
||||
nlohmann::json ret;
|
||||
for (size_t i = 0; i < EventCounter::End(); ++i) {
|
||||
ret[EventCounter::GetName(i)] = EventCounter::global_counters[i].load(std::memory_order_relaxed);
|
||||
}
|
||||
return ret;
|
||||
});
|
||||
}
|
||||
|
||||
// Handler for regular termination signals
|
||||
|
@ -35,7 +35,7 @@ add_library(mg-query STATIC ${mg_query_sources})
|
||||
add_dependencies(mg-query generate_lcp_query)
|
||||
target_include_directories(mg-query PUBLIC ${CMAKE_SOURCE_DIR}/include)
|
||||
target_link_libraries(mg-query dl cppitertools)
|
||||
target_link_libraries(mg-query mg-storage-v2)
|
||||
target_link_libraries(mg-query mg-storage-v2 mg-utils)
|
||||
if("${MG_PYTHON_VERSION}" STREQUAL "")
|
||||
find_package(Python3 3.5 REQUIRED COMPONENTS Development)
|
||||
else()
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "query/interpreter.hpp"
|
||||
|
||||
#include <atomic>
|
||||
#include <limits>
|
||||
|
||||
#include "glue/communication.hpp"
|
||||
@ -18,6 +19,7 @@
|
||||
#include "query/plan/vertex_count_cache.hpp"
|
||||
#include "query/typed_value.hpp"
|
||||
#include "utils/algorithm.hpp"
|
||||
#include "utils/event_counter.hpp"
|
||||
#include "utils/exceptions.hpp"
|
||||
#include "utils/flag_validation.hpp"
|
||||
#include "utils/logging.hpp"
|
||||
@ -29,8 +31,35 @@ DEFINE_HIDDEN_bool(query_cost_planner, true, "Use the cost-estimating query plan
|
||||
DEFINE_VALIDATED_int32(query_plan_cache_ttl, 60, "Time to live for cached query plans, in seconds.",
|
||||
FLAG_IN_RANGE(0, std::numeric_limits<int32_t>::max()));
|
||||
|
||||
namespace EventCounter {
|
||||
extern Event ReadQuery;
|
||||
extern Event WriteQuery;
|
||||
extern Event ReadWriteQuery;
|
||||
|
||||
extern const Event LabelIndexCreated;
|
||||
extern const Event LabelPropertyIndexCreated;
|
||||
} // namespace EventCounter
|
||||
|
||||
namespace query {
|
||||
|
||||
namespace {
|
||||
void UpdateTypeCount(const plan::ReadWriteTypeChecker::RWType type) {
|
||||
switch (type) {
|
||||
case plan::ReadWriteTypeChecker::RWType::R:
|
||||
EventCounter::IncrementCounter(EventCounter::ReadQuery);
|
||||
break;
|
||||
case plan::ReadWriteTypeChecker::RWType::W:
|
||||
EventCounter::IncrementCounter(EventCounter::WriteQuery);
|
||||
break;
|
||||
case plan::ReadWriteTypeChecker::RWType::RW:
|
||||
EventCounter::IncrementCounter(EventCounter::ReadWriteQuery);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
/**
|
||||
* A container for data related to the parsing of a query.
|
||||
*/
|
||||
@ -998,9 +1027,11 @@ PreparedQuery PrepareIndexQuery(ParsedQuery parsed_query, bool in_explicit_trans
|
||||
invalidate_plan_cache = std::move(invalidate_plan_cache)] {
|
||||
if (properties.empty()) {
|
||||
interpreter_context->db->CreateIndex(label);
|
||||
EventCounter::IncrementCounter(EventCounter::LabelIndexCreated);
|
||||
} else {
|
||||
MG_ASSERT(properties.size() == 1U);
|
||||
interpreter_context->db->CreateIndex(label, properties[0]);
|
||||
EventCounter::IncrementCounter(EventCounter::LabelPropertyIndexCreated);
|
||||
}
|
||||
invalidate_plan_cache();
|
||||
};
|
||||
@ -1458,10 +1489,10 @@ Interpreter::PrepareResult Interpreter::Prepare(const std::string &query_string,
|
||||
query_execution->summary["planning_time"] = planning_timer.Elapsed().count();
|
||||
query_execution->prepared_query.emplace(std::move(prepared_query));
|
||||
|
||||
query_execution->summary["type"] =
|
||||
query_execution->prepared_query
|
||||
? plan::ReadWriteTypeChecker::TypeToString(query_execution->prepared_query->rw_type)
|
||||
: "rw";
|
||||
const auto rw_type = query_execution->prepared_query->rw_type;
|
||||
query_execution->summary["type"] = plan::ReadWriteTypeChecker::TypeToString(rw_type);
|
||||
|
||||
UpdateTypeCount(rw_type);
|
||||
|
||||
#ifdef MG_ENTERPRISE
|
||||
if (const auto query_type = query_execution->prepared_query->rw_type;
|
||||
@ -1474,6 +1505,7 @@ Interpreter::PrepareResult Interpreter::Prepare(const std::string &query_string,
|
||||
|
||||
return {query_execution->prepared_query->header, query_execution->prepared_query->privileges, qid};
|
||||
} catch (const utils::BasicException &) {
|
||||
EventCounter::IncrementCounter(EventCounter::FailedQuery);
|
||||
AbortCommand(&query_execution);
|
||||
throw;
|
||||
}
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "query/plan/read_write_type_checker.hpp"
|
||||
#include "query/stream.hpp"
|
||||
#include "query/typed_value.hpp"
|
||||
#include "utils/event_counter.hpp"
|
||||
#include "utils/logging.hpp"
|
||||
#include "utils/memory.hpp"
|
||||
#include "utils/skip_list.hpp"
|
||||
@ -23,6 +24,10 @@
|
||||
DECLARE_bool(query_cost_planner);
|
||||
DECLARE_int32(query_plan_cache_ttl);
|
||||
|
||||
namespace EventCounter {
|
||||
extern const Event FailedQuery;
|
||||
} // namespace EventCounter
|
||||
|
||||
namespace query {
|
||||
|
||||
static constexpr size_t kExecutionMemoryBlockSize = 1U * 1024U * 1024U;
|
||||
@ -200,7 +205,7 @@ struct PlanCacheEntry {
|
||||
* been passed to an `Interpreter` instance.
|
||||
*/
|
||||
struct InterpreterContext {
|
||||
explicit InterpreterContext(storage::Storage *db) : db(db) { MG_ASSERT(db, "Storage must not be NULL"); }
|
||||
explicit InterpreterContext(storage::Storage *db) : db(db) {}
|
||||
|
||||
storage::Storage *db;
|
||||
|
||||
@ -428,6 +433,7 @@ std::map<std::string, TypedValue> Interpreter::Pull(TStream *result_stream, std:
|
||||
query_execution.reset(nullptr);
|
||||
throw;
|
||||
} catch (const utils::BasicException &) {
|
||||
EventCounter::IncrementCounter(EventCounter::FailedQuery);
|
||||
AbortCommand(&query_execution);
|
||||
throw;
|
||||
}
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "query/procedure/mg_procedure_impl.hpp"
|
||||
#include "query/procedure/module.hpp"
|
||||
#include "utils/algorithm.hpp"
|
||||
#include "utils/event_counter.hpp"
|
||||
#include "utils/exceptions.hpp"
|
||||
#include "utils/fnv.hpp"
|
||||
#include "utils/logging.hpp"
|
||||
@ -51,6 +52,42 @@
|
||||
LOG_FATAL("Operator " #class_name " has no single input!"); \
|
||||
}
|
||||
|
||||
namespace EventCounter {
|
||||
extern const Event OnceOperator;
|
||||
extern const Event CreateNodeOperator;
|
||||
extern const Event CreateExpandOperator;
|
||||
extern const Event ScanAllOperator;
|
||||
extern const Event ScanAllByLabelOperator;
|
||||
extern const Event ScanAllByLabelPropertyRangeOperator;
|
||||
extern const Event ScanAllByLabelPropertyValueOperator;
|
||||
extern const Event ScanAllByLabelPropertyOperator;
|
||||
extern const Event ScanAllByIdOperator;
|
||||
extern const Event ExpandOperator;
|
||||
extern const Event ExpandVariableOperator;
|
||||
extern const Event ConstructNamedPathOperator;
|
||||
extern const Event FilterOperator;
|
||||
extern const Event ProduceOperator;
|
||||
extern const Event DeleteOperator;
|
||||
extern const Event SetPropertyOperator;
|
||||
extern const Event SetPropertiesOperator;
|
||||
extern const Event SetLabelsOperator;
|
||||
extern const Event RemovePropertyOperator;
|
||||
extern const Event RemoveLabelsOperator;
|
||||
extern const Event EdgeUniquenessFilterOperator;
|
||||
extern const Event AccumulateOperator;
|
||||
extern const Event AggregateOperator;
|
||||
extern const Event SkipOperator;
|
||||
extern const Event LimitOperator;
|
||||
extern const Event OrderByOperator;
|
||||
extern const Event MergeOperator;
|
||||
extern const Event OptionalOperator;
|
||||
extern const Event UnwindOperator;
|
||||
extern const Event DistinctOperator;
|
||||
extern const Event UnionOperator;
|
||||
extern const Event CartesianOperator;
|
||||
extern const Event CallProcedureOperator;
|
||||
} // namespace EventCounter
|
||||
|
||||
namespace query::plan {
|
||||
|
||||
namespace {
|
||||
@ -99,7 +136,11 @@ bool Once::OnceCursor::Pull(Frame &, ExecutionContext &context) {
|
||||
return false;
|
||||
}
|
||||
|
||||
UniqueCursorPtr Once::MakeCursor(utils::MemoryResource *mem) const { return MakeUniqueCursorPtr<OnceCursor>(mem); }
|
||||
UniqueCursorPtr Once::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::OnceOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<OnceCursor>(mem);
|
||||
}
|
||||
|
||||
WITHOUT_SINGLE_INPUT(Once);
|
||||
|
||||
@ -144,6 +185,8 @@ VertexAccessor &CreateLocalVertex(const NodeCreationInfo &node_info, Frame *fram
|
||||
ACCEPT_WITH_INPUT(CreateNode)
|
||||
|
||||
UniqueCursorPtr CreateNode::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::CreateNodeOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<CreateNodeCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -182,6 +225,8 @@ CreateExpand::CreateExpand(const NodeCreationInfo &node_info, const EdgeCreation
|
||||
ACCEPT_WITH_INPUT(CreateExpand)
|
||||
|
||||
UniqueCursorPtr CreateExpand::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::CreateNodeOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<CreateExpandCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -324,6 +369,8 @@ ScanAll::ScanAll(const std::shared_ptr<LogicalOperator> &input, Symbol output_sy
|
||||
ACCEPT_WITH_INPUT(ScanAll)
|
||||
|
||||
UniqueCursorPtr ScanAll::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::ScanAllOperator);
|
||||
|
||||
auto vertices = [this](Frame &, ExecutionContext &context) {
|
||||
auto *db = context.db_accessor;
|
||||
return std::make_optional(db->Vertices(view_));
|
||||
@ -345,6 +392,8 @@ ScanAllByLabel::ScanAllByLabel(const std::shared_ptr<LogicalOperator> &input, Sy
|
||||
ACCEPT_WITH_INPUT(ScanAllByLabel)
|
||||
|
||||
UniqueCursorPtr ScanAllByLabel::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::ScanAllByLabelOperator);
|
||||
|
||||
auto vertices = [this](Frame &, ExecutionContext &context) {
|
||||
auto *db = context.db_accessor;
|
||||
return std::make_optional(db->Vertices(view_, label_));
|
||||
@ -373,6 +422,8 @@ ScanAllByLabelPropertyRange::ScanAllByLabelPropertyRange(const std::shared_ptr<L
|
||||
ACCEPT_WITH_INPUT(ScanAllByLabelPropertyRange)
|
||||
|
||||
UniqueCursorPtr ScanAllByLabelPropertyRange::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::ScanAllByLabelPropertyRangeOperator);
|
||||
|
||||
auto vertices = [this](Frame &frame, ExecutionContext &context)
|
||||
-> std::optional<decltype(context.db_accessor->Vertices(view_, label_, property_, std::nullopt, std::nullopt))> {
|
||||
auto *db = context.db_accessor;
|
||||
@ -430,6 +481,8 @@ ScanAllByLabelPropertyValue::ScanAllByLabelPropertyValue(const std::shared_ptr<L
|
||||
ACCEPT_WITH_INPUT(ScanAllByLabelPropertyValue)
|
||||
|
||||
UniqueCursorPtr ScanAllByLabelPropertyValue::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::ScanAllByLabelPropertyValueOperator);
|
||||
|
||||
auto vertices = [this](Frame &frame, ExecutionContext &context)
|
||||
-> std::optional<decltype(context.db_accessor->Vertices(view_, label_, property_, storage::PropertyValue()))> {
|
||||
auto *db = context.db_accessor;
|
||||
@ -453,6 +506,8 @@ ScanAllByLabelProperty::ScanAllByLabelProperty(const std::shared_ptr<LogicalOper
|
||||
ACCEPT_WITH_INPUT(ScanAllByLabelProperty)
|
||||
|
||||
UniqueCursorPtr ScanAllByLabelProperty::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::ScanAllByLabelPropertyOperator);
|
||||
|
||||
auto vertices = [this](Frame &frame, ExecutionContext &context) {
|
||||
auto *db = context.db_accessor;
|
||||
return std::make_optional(db->Vertices(view_, label_, property_));
|
||||
@ -470,6 +525,8 @@ ScanAllById::ScanAllById(const std::shared_ptr<LogicalOperator> &input, Symbol o
|
||||
ACCEPT_WITH_INPUT(ScanAllById)
|
||||
|
||||
UniqueCursorPtr ScanAllById::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::ScanAllByIdOperator);
|
||||
|
||||
auto vertices = [this](Frame &frame, ExecutionContext &context) -> std::optional<std::vector<VertexAccessor>> {
|
||||
auto *db = context.db_accessor;
|
||||
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context, context.db_accessor, view_);
|
||||
@ -523,6 +580,8 @@ Expand::Expand(const std::shared_ptr<LogicalOperator> &input, Symbol input_symbo
|
||||
ACCEPT_WITH_INPUT(Expand)
|
||||
|
||||
UniqueCursorPtr Expand::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::ExpandOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<ExpandCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -1525,6 +1584,8 @@ class ExpandWeightedShortestPathCursor : public query::plan::Cursor {
|
||||
};
|
||||
|
||||
UniqueCursorPtr ExpandVariable::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::ExpandVariableOperator);
|
||||
|
||||
switch (type_) {
|
||||
case EdgeAtom::Type::BREADTH_FIRST:
|
||||
if (common_.existing_node) {
|
||||
@ -1624,6 +1685,8 @@ class ConstructNamedPathCursor : public Cursor {
|
||||
ACCEPT_WITH_INPUT(ConstructNamedPath)
|
||||
|
||||
UniqueCursorPtr ConstructNamedPath::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::ConstructNamedPathOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<ConstructNamedPathCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -1639,6 +1702,8 @@ Filter::Filter(const std::shared_ptr<LogicalOperator> &input, Expression *expres
|
||||
ACCEPT_WITH_INPUT(Filter)
|
||||
|
||||
UniqueCursorPtr Filter::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::FilterOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<FilterCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -1670,6 +1735,8 @@ Produce::Produce(const std::shared_ptr<LogicalOperator> &input, const std::vecto
|
||||
ACCEPT_WITH_INPUT(Produce)
|
||||
|
||||
UniqueCursorPtr Produce::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::ProduceOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<ProduceCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -1711,6 +1778,8 @@ Delete::Delete(const std::shared_ptr<LogicalOperator> &input_, const std::vector
|
||||
ACCEPT_WITH_INPUT(Delete)
|
||||
|
||||
UniqueCursorPtr Delete::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::DeleteOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<DeleteCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -1821,6 +1890,8 @@ SetProperty::SetProperty(const std::shared_ptr<LogicalOperator> &input, storage:
|
||||
ACCEPT_WITH_INPUT(SetProperty)
|
||||
|
||||
UniqueCursorPtr SetProperty::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::SetPropertyOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<SetPropertyCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -1874,6 +1945,8 @@ SetProperties::SetProperties(const std::shared_ptr<LogicalOperator> &input, Symb
|
||||
ACCEPT_WITH_INPUT(SetProperties)
|
||||
|
||||
UniqueCursorPtr SetProperties::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::SetPropertiesOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<SetPropertiesCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -2004,6 +2077,8 @@ SetLabels::SetLabels(const std::shared_ptr<LogicalOperator> &input, Symbol input
|
||||
ACCEPT_WITH_INPUT(SetLabels)
|
||||
|
||||
UniqueCursorPtr SetLabels::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::SetLabelsOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<SetLabelsCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -2054,6 +2129,8 @@ RemoveProperty::RemoveProperty(const std::shared_ptr<LogicalOperator> &input, st
|
||||
ACCEPT_WITH_INPUT(RemoveProperty)
|
||||
|
||||
UniqueCursorPtr RemoveProperty::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::RemovePropertyOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<RemovePropertyCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -2120,6 +2197,8 @@ RemoveLabels::RemoveLabels(const std::shared_ptr<LogicalOperator> &input, Symbol
|
||||
ACCEPT_WITH_INPUT(RemoveLabels)
|
||||
|
||||
UniqueCursorPtr RemoveLabels::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::RemoveLabelsOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<RemoveLabelsCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -2170,6 +2249,8 @@ EdgeUniquenessFilter::EdgeUniquenessFilter(const std::shared_ptr<LogicalOperator
|
||||
ACCEPT_WITH_INPUT(EdgeUniquenessFilter)
|
||||
|
||||
UniqueCursorPtr EdgeUniquenessFilter::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::EdgeUniquenessFilterOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<EdgeUniquenessFilterCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -2281,6 +2362,8 @@ class AccumulateCursor : public Cursor {
|
||||
};
|
||||
|
||||
UniqueCursorPtr Accumulate::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::AccumulateOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<AccumulateCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -2607,6 +2690,8 @@ class AggregateCursor : public Cursor {
|
||||
};
|
||||
|
||||
UniqueCursorPtr Aggregate::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::AggregateOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<AggregateCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -2616,6 +2701,8 @@ Skip::Skip(const std::shared_ptr<LogicalOperator> &input, Expression *expression
|
||||
ACCEPT_WITH_INPUT(Skip)
|
||||
|
||||
UniqueCursorPtr Skip::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::SkipOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<SkipCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -2667,6 +2754,8 @@ Limit::Limit(const std::shared_ptr<LogicalOperator> &input, Expression *expressi
|
||||
ACCEPT_WITH_INPUT(Limit)
|
||||
|
||||
UniqueCursorPtr Limit::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::LimitOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<LimitCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -2813,6 +2902,8 @@ class OrderByCursor : public Cursor {
|
||||
};
|
||||
|
||||
UniqueCursorPtr OrderBy::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::OrderByOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<OrderByCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -2828,6 +2919,8 @@ bool Merge::Accept(HierarchicalLogicalOperatorVisitor &visitor) {
|
||||
}
|
||||
|
||||
UniqueCursorPtr Merge::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::MergeOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<MergeCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -2908,6 +3001,8 @@ bool Optional::Accept(HierarchicalLogicalOperatorVisitor &visitor) {
|
||||
}
|
||||
|
||||
UniqueCursorPtr Optional::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::OptionalOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<OptionalCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -3034,6 +3129,8 @@ class UnwindCursor : public Cursor {
|
||||
};
|
||||
|
||||
UniqueCursorPtr Unwind::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::UnwindOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<UnwindCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -3080,6 +3177,8 @@ Distinct::Distinct(const std::shared_ptr<LogicalOperator> &input, const std::vec
|
||||
ACCEPT_WITH_INPUT(Distinct)
|
||||
|
||||
UniqueCursorPtr Distinct::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::DistinctOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<DistinctCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -3100,6 +3199,8 @@ Union::Union(const std::shared_ptr<LogicalOperator> &left_op, const std::shared_
|
||||
right_symbols_(right_symbols) {}
|
||||
|
||||
UniqueCursorPtr Union::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::UnionOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<Union::UnionCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -3257,6 +3358,8 @@ class CartesianCursor : public Cursor {
|
||||
} // namespace
|
||||
|
||||
UniqueCursorPtr Cartesian::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::CartesianOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<CartesianCursor>(mem, *this, mem);
|
||||
}
|
||||
|
||||
@ -3558,6 +3661,8 @@ class CallProcedureCursor : public Cursor {
|
||||
};
|
||||
|
||||
UniqueCursorPtr CallProcedure::MakeCursor(utils::MemoryResource *mem) const {
|
||||
EventCounter::IncrementCounter(EventCounter::CallProcedureOperator);
|
||||
|
||||
return MakeUniqueCursorPtr<CallProcedureCursor>(mem, this, mem);
|
||||
}
|
||||
|
||||
|
@ -45,7 +45,7 @@ Telemetry::Telemetry(std::string url, std::filesystem::path storage_directory,
|
||||
|
||||
void Telemetry::AddCollector(const std::string &name, const std::function<const nlohmann::json(void)> &func) {
|
||||
std::lock_guard<std::mutex> guard(lock_);
|
||||
collectors_.push_back({name, func});
|
||||
collectors_.emplace_back(name, func);
|
||||
}
|
||||
|
||||
Telemetry::~Telemetry() {
|
||||
|
@ -1,4 +1,5 @@
|
||||
set(utils_src_files
|
||||
event_counter.cpp
|
||||
file.cpp
|
||||
file_locker.cpp
|
||||
memory.cpp
|
||||
|
90
src/utils/event_counter.cpp
Normal file
90
src/utils/event_counter.cpp
Normal file
@ -0,0 +1,90 @@
|
||||
#include "utils/event_counter.hpp"
|
||||
|
||||
#define APPLY_FOR_EVENTS(M) \
|
||||
M(ReadQuery, "Number of read-only queries executed.") \
|
||||
M(WriteQuery, "Number of write-only queries executed.") \
|
||||
M(ReadWriteQuery, "Number of read-write queries executed.") \
|
||||
\
|
||||
M(OnceOperator, "Number of times Once operator was used.") \
|
||||
M(CreateNodeOperator, "Number of times CreateNode operator was used.") \
|
||||
M(CreateExpandOperator, "Number of times CreateExpand operator was used.") \
|
||||
M(ScanAllOperator, "Number of times ScanAll operator was used.") \
|
||||
M(ScanAllByLabelOperator, "Number of times ScanAllByLabel operator was used.") \
|
||||
M(ScanAllByLabelPropertyRangeOperator, "Number of times ScanAllByLabelPropertyRange operator was used.") \
|
||||
M(ScanAllByLabelPropertyValueOperator, "Number of times ScanAllByLabelPropertyValue operator was used.") \
|
||||
M(ScanAllByLabelPropertyOperator, "Number of times ScanAllByLabelProperty operator was used.") \
|
||||
M(ScanAllByIdOperator, "Number of times ScanAllById operator was used.") \
|
||||
M(ExpandOperator, "Number of times Expand operator was used.") \
|
||||
M(ExpandVariableOperator, "Number of times ExpandVariable operator was used.") \
|
||||
M(ConstructNamedPathOperator, "Number of times ConstructNamedPath operator was used.") \
|
||||
M(FilterOperator, "Number of times Filter operator was used.") \
|
||||
M(ProduceOperator, "Number of times Produce operator was used.") \
|
||||
M(DeleteOperator, "Number of times Delete operator was used.") \
|
||||
M(SetPropertyOperator, "Number of times SetProperty operator was used.") \
|
||||
M(SetPropertiesOperator, "Number of times SetProperties operator was used.") \
|
||||
M(SetLabelsOperator, "Number of times SetLabels operator was used.") \
|
||||
M(RemovePropertyOperator, "Number of times RemoveProperty operator was used.") \
|
||||
M(RemoveLabelsOperator, "Number of times RemoveLabels operator was used.") \
|
||||
M(EdgeUniquenessFilterOperator, "Number of times EdgeUniquenessFilter operator was used.") \
|
||||
M(AccumulateOperator, "Number of times Accumulate operator was used.") \
|
||||
M(AggregateOperator, "Number of times Aggregate operator was used.") \
|
||||
M(SkipOperator, "Number of times Skip operator was used.") \
|
||||
M(LimitOperator, "Number of times Limit operator was used.") \
|
||||
M(OrderByOperator, "Number of times OrderBy operator was used.") \
|
||||
M(MergeOperator, "Number of times Merge operator was used.") \
|
||||
M(OptionalOperator, "Number of times Optional operator was used.") \
|
||||
M(UnwindOperator, "Number of times Unwind operator was used.") \
|
||||
M(DistinctOperator, "Number of times Distinct operator was used.") \
|
||||
M(UnionOperator, "Number of times Union operator was used.") \
|
||||
M(CartesianOperator, "Number of times Cartesian operator was used.") \
|
||||
M(CallProcedureOperator, "Number of times CallProcedure operator was used.") \
|
||||
\
|
||||
M(FailedQuery, "Number of times executing a query failed.") \
|
||||
M(LabelIndexCreated, "Number of times a label index was created.") \
|
||||
M(LabelPropertyIndexCreated, "Number of times a label property index was created.")
|
||||
|
||||
namespace EventCounter {
|
||||
|
||||
// define every Event as an index in the array of counters
|
||||
#define M(NAME, DOCUMENTATION) extern const Event NAME = __COUNTER__;
|
||||
APPLY_FOR_EVENTS(M)
|
||||
#undef M
|
||||
|
||||
constexpr Event END = __COUNTER__;
|
||||
|
||||
// Initialize array for the global counter with all values set to 0
|
||||
Counter global_counters_array[END]{};
|
||||
// Initialize global counters
|
||||
EventCounters global_counters(global_counters_array);
|
||||
|
||||
const Event EventCounters::num_counters = END;
|
||||
|
||||
void EventCounters::Increment(const Event event, Count amount) {
|
||||
counters_[event].fetch_add(amount, std::memory_order_relaxed);
|
||||
}
|
||||
|
||||
void IncrementCounter(const Event event, Count amount) { global_counters.Increment(event, amount); }
|
||||
|
||||
const char *GetName(const Event event) {
|
||||
static const char *strings[] = {
|
||||
#define M(NAME, DOCUMENTATION) #NAME,
|
||||
APPLY_FOR_EVENTS(M)
|
||||
#undef M
|
||||
};
|
||||
|
||||
return strings[event];
|
||||
}
|
||||
|
||||
const char *GetDocumentation(const Event event) {
|
||||
static const char *strings[] = {
|
||||
#define M(NAME, DOCUMENTATION) DOCUMENTATION,
|
||||
APPLY_FOR_EVENTS(M)
|
||||
#undef M
|
||||
};
|
||||
|
||||
return strings[event];
|
||||
}
|
||||
|
||||
Event End() { return END; }
|
||||
|
||||
} // namespace EventCounter
|
36
src/utils/event_counter.hpp
Normal file
36
src/utils/event_counter.hpp
Normal file
@ -0,0 +1,36 @@
|
||||
#pragma once
|
||||
#include <atomic>
|
||||
#include <cstdlib>
|
||||
#include <memory>
|
||||
|
||||
namespace EventCounter {
|
||||
using Event = uint64_t;
|
||||
using Count = uint64_t;
|
||||
using Counter = std::atomic<Count>;
|
||||
|
||||
class EventCounters {
|
||||
public:
|
||||
explicit EventCounters(Counter *allocated_counters) noexcept : counters_(allocated_counters) {}
|
||||
|
||||
auto &operator[](const Event event) { return counters_[event]; }
|
||||
|
||||
const auto &operator[](const Event event) const { return counters_[event]; }
|
||||
|
||||
void Increment(Event event, Count amount = 1);
|
||||
|
||||
static const Event num_counters;
|
||||
|
||||
private:
|
||||
Counter *counters_;
|
||||
};
|
||||
|
||||
extern EventCounters global_counters;
|
||||
|
||||
void IncrementCounter(Event event, Count amount = 1);
|
||||
|
||||
const char *GetName(Event event);
|
||||
const char *GetDocumentation(Event event);
|
||||
|
||||
Event End();
|
||||
|
||||
} // namespace EventCounter
|
Loading…
Reference in New Issue
Block a user