memgraph/src/telemetry/telemetry.hpp
2023-11-06 11:50:49 +00:00

94 lines
3.2 KiB
C++

// Copyright 2023 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
#pragma once
#include <mutex>
#include <string>
#include <json/json.hpp>
#include "dbms/dbms_handler.hpp"
#include "kvstore/kvstore.hpp"
#include "utils/scheduler.hpp"
#include "utils/timer.hpp"
namespace memgraph::telemetry {
/**
* This class implements the telemetry collector service. It periodically scapes
* all registered collectors and stores their data. With periodically scraping
* the collectors the service collects machine information in the constructor
* and stores it. Also, it calls all collectors once more in the destructor so
* that final stats can be collected. All data is stored persistently. If there
* is no internet connection the data will be sent when the internet connection
* is reestablished. If there is an issue with the internet connection that
* won't effect normal operation of the service (it won't crash).
*/
class Telemetry final {
public:
Telemetry(std::string url, std::filesystem::path storage_directory, std::string uuid, std::string machine_id,
bool ssl, std::filesystem::path root_directory,
std::chrono::duration<int64_t> refresh_interval = std::chrono::minutes(10), uint64_t send_every_n = 10);
// Generic/user-defined collector
void AddCollector(const std::string &name, const std::function<const nlohmann::json(void)> &func);
// Specialized collectors
void AddStorageCollector(
dbms::DbmsHandler &dbms_handler,
memgraph::utils::Synchronized<memgraph::auth::Auth, memgraph::utils::WritePrioritizedRWLock> &auth);
#ifdef MG_ENTERPRISE
void AddDatabaseCollector(dbms::DbmsHandler &dbms_handler);
#else
void AddDatabaseCollector() {
AddCollector("database", []() -> nlohmann::json { return nlohmann::json::array(); });
}
#endif
void AddClientCollector();
void AddEventsCollector();
void AddQueryModuleCollector();
void AddExceptionCollector();
void AddReplicationCollector();
~Telemetry();
Telemetry(const Telemetry &) = delete;
Telemetry(Telemetry &&) = delete;
Telemetry &operator=(const Telemetry &) = delete;
Telemetry &operator=(Telemetry &&) = delete;
private:
void StoreData(const nlohmann::json &event, const nlohmann::json &data);
void SendData();
void CollectData(const std::string &event = "");
const nlohmann::json GetUptime();
const std::string url_;
const std::string uuid_;
const std::string machine_id_;
const bool ssl_;
uint64_t num_{0};
utils::Scheduler scheduler_;
utils::Timer timer_;
const uint64_t send_every_n_;
std::mutex lock_;
std::vector<std::pair<std::string, std::function<const nlohmann::json(void)>>> collectors_;
kvstore::KVStore storage_;
};
} // namespace memgraph::telemetry