| //===-- Telemetry.cpp -----------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/Config/llvm-config.h" |
| |
| #ifdef LLVM_BUILD_TELEMETRY |
| |
| #include "lldb/Core/Telemetry.h" |
| #include "lldb/Core/Debugger.h" |
| #include "lldb/Utility/LLDBLog.h" |
| #include "lldb/Utility/UUID.h" |
| #include "lldb/lldb-enumerations.h" |
| #include "lldb/lldb-forward.h" |
| #include "llvm/ADT/StringRef.h" |
| #include "llvm/Support/Error.h" |
| #include "llvm/Support/RandomNumberGenerator.h" |
| #include "llvm/Telemetry/Telemetry.h" |
| #include <chrono> |
| #include <cstdlib> |
| #include <memory> |
| #include <string> |
| #include <utility> |
| |
| namespace lldb_private { |
| namespace telemetry { |
| |
| using namespace llvm::telemetry; |
| |
| static uint64_t ToNanosec(const SteadyTimePoint Point) { |
| return std::chrono::nanoseconds(Point.time_since_epoch()).count(); |
| } |
| |
| void LLDBBaseTelemetryInfo::serialize(Serializer &serializer) const { |
| serializer.write("entry_kind", getKind()); |
| serializer.write("session_id", SessionId); |
| serializer.write("start_time", ToNanosec(start_time)); |
| if (end_time.has_value()) |
| serializer.write("end_time", ToNanosec(end_time.value())); |
| } |
| |
| [[maybe_unused]] static std::string MakeUUID(Debugger *debugger) { |
| uint8_t random_bytes[16]; |
| if (auto ec = llvm::getRandomBytes(random_bytes, 16)) { |
| LLDB_LOG(GetLog(LLDBLog::Object), |
| "Failed to generate random bytes for UUID: {0}", ec.message()); |
| // Fallback to using timestamp + debugger ID. |
| return llvm::formatv( |
| "{0}_{1}", std::chrono::steady_clock::now().time_since_epoch().count(), |
| debugger->GetID()); |
| } |
| return UUID(random_bytes).GetAsString(); |
| } |
| |
| TelemetryManager::TelemetryManager(std::unique_ptr<Config> config) |
| : m_config(std::move(config)) {} |
| |
| llvm::Error TelemetryManager::preDispatch(TelemetryInfo *entry) { |
| // Do nothing for now. |
| // In up-coming patch, this would be where the manager |
| // attach the session_uuid to the entry. |
| return llvm::Error::success(); |
| } |
| |
| std::unique_ptr<TelemetryManager> TelemetryManager::g_instance = nullptr; |
| TelemetryManager *TelemetryManager::getInstance() { return g_instance.get(); } |
| |
| void TelemetryManager::setInstance(std::unique_ptr<TelemetryManager> manager) { |
| g_instance = std::move(manager); |
| } |
| |
| } // namespace telemetry |
| } // namespace lldb_private |
| |
| #endif // LLVM_BUILD_TELEMETRY |