[Lldb-commits] [lldb] e1a393e - Define Telemetry plugin for LLDB. (#126588)
via lldb-commits
lldb-commits at lists.llvm.org
Tue Feb 18 07:44:22 PST 2025
Author: Vy Nguyen
Date: 2025-02-18T10:44:16-05:00
New Revision: e1a393e39275ca0fea4bb19fa08c88bae3178cf8
URL: https://github.com/llvm/llvm-project/commit/e1a393e39275ca0fea4bb19fa08c88bae3178cf8
DIFF: https://github.com/llvm/llvm-project/commit/e1a393e39275ca0fea4bb19fa08c88bae3178cf8.diff
LOG: Define Telemetry plugin for LLDB. (#126588)
Details:
Make LLDB's TelemetryManager a "plugin" so that vendor can supply
appropriate implementation.
The rest of LLDB code will simply call `TelemetryManager::getInstance`
---------
Co-authored-by: Pavel Labath <pavel at labath.sk>
Added:
lldb/unittests/Core/TelemetryTest.cpp
Modified:
lldb/include/lldb/Core/Telemetry.h
lldb/source/Core/Telemetry.cpp
lldb/unittests/Core/CMakeLists.txt
Removed:
################################################################################
diff --git a/lldb/include/lldb/Core/Telemetry.h b/lldb/include/lldb/Core/Telemetry.h
index 60a7097de5eee..7923b208e3b48 100644
--- a/lldb/include/lldb/Core/Telemetry.h
+++ b/lldb/include/lldb/Core/Telemetry.h
@@ -61,12 +61,19 @@ struct LLDBBaseTelemetryInfo : public llvm::telemetry::TelemetryInfo {
/// applicable to LLDB.
class TelemetryManager : public llvm::telemetry::Manager {
public:
+ llvm::Error preDispatch(llvm::telemetry::TelemetryInfo *entry) override;
+
+ virtual llvm::StringRef GetInstanceName() const = 0;
+ static TelemetryManager *getInstance();
+
+protected:
TelemetryManager(std::unique_ptr<llvm::telemetry::Config> config);
- llvm::Error preDispatch(llvm::telemetry::TelemetryInfo *entry) override;
+ static void setInstance(std::unique_ptr<TelemetryManager> manger);
private:
std::unique_ptr<llvm::telemetry::Config> m_config;
+ static std::unique_ptr<TelemetryManager> g_instance;
};
} // namespace telemetry
diff --git a/lldb/source/Core/Telemetry.cpp b/lldb/source/Core/Telemetry.cpp
index 0d0d7c1df3bb9..f2a9d4bd00dad 100644
--- a/lldb/source/Core/Telemetry.cpp
+++ b/lldb/source/Core/Telemetry.cpp
@@ -70,6 +70,13 @@ llvm::Error TelemetryManager::preDispatch(TelemetryInfo *entry) {
return 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
diff --git a/lldb/unittests/Core/CMakeLists.txt b/lldb/unittests/Core/CMakeLists.txt
index 949963fd40346..d4d3764b67ae3 100644
--- a/lldb/unittests/Core/CMakeLists.txt
+++ b/lldb/unittests/Core/CMakeLists.txt
@@ -1,3 +1,7 @@
+if (LLVM_BUILD_TELEMETRY)
+ set(TELEMETRY_DEPS Telemetry)
+endif()
+
add_lldb_unittest(LLDBCoreTests
CommunicationTest.cpp
DiagnosticEventTest.cpp
@@ -10,6 +14,7 @@ add_lldb_unittest(LLDBCoreTests
RichManglingContextTest.cpp
SourceLocationSpecTest.cpp
SourceManagerTest.cpp
+ TelemetryTest.cpp
UniqueCStringMapTest.cpp
LINK_LIBS
@@ -26,4 +31,5 @@ add_lldb_unittest(LLDBCoreTests
LLVMTestingSupport
LINK_COMPONENTS
Support
+ ${TELEMETRY_DEPS}
)
diff --git a/lldb/unittests/Core/TelemetryTest.cpp b/lldb/unittests/Core/TelemetryTest.cpp
new file mode 100644
index 0000000000000..03bd8a59ba7dc
--- /dev/null
+++ b/lldb/unittests/Core/TelemetryTest.cpp
@@ -0,0 +1,98 @@
+//===-- TelemetryTest.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/PluginInterface.h"
+#include "lldb/Core/PluginManager.h"
+#include "lldb/Core/Telemetry.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/Error.h"
+#include "llvm/Telemetry/Telemetry.h"
+#include "llvm/Testing/Support/Error.h"
+#include "gtest/gtest.h"
+#include <memory>
+#include <vector>
+
+namespace lldb_private {
+
+struct FakeTelemetryInfo : public llvm::telemetry::TelemetryInfo {
+ std::string msg;
+};
+
+class TestDestination : public llvm::telemetry::Destination {
+public:
+ TestDestination(std::vector<const llvm::telemetry::TelemetryInfo *> *entries)
+ : received_entries(entries) {}
+
+ llvm::Error
+ receiveEntry(const llvm::telemetry::TelemetryInfo *entry) override {
+ received_entries->push_back(entry);
+ return llvm::Error::success();
+ }
+
+ llvm::StringLiteral name() const override { return "TestDestination"; }
+
+private:
+ std::vector<const llvm::telemetry::TelemetryInfo *> *received_entries;
+};
+
+class FakePlugin : public telemetry::TelemetryManager {
+public:
+ FakePlugin()
+ : telemetry::TelemetryManager(
+ std::make_unique<llvm::telemetry::Config>(true)) {}
+
+ // TelemetryManager interface
+ llvm::Error preDispatch(llvm::telemetry::TelemetryInfo *entry) override {
+ if (auto *fake_entry = llvm::dyn_cast<FakeTelemetryInfo>(entry))
+ fake_entry->msg = "In FakePlugin";
+
+ return llvm::Error::success();
+ }
+
+ llvm::StringRef GetInstanceName() const override {
+ return "FakeTelemetryPlugin";
+ }
+
+ static void Initialize() {
+ telemetry::TelemetryManager::setInstance(std::make_unique<FakePlugin>());
+ }
+
+ static void Terminate() { telemetry::TelemetryManager::setInstance(nullptr); }
+};
+
+} // namespace lldb_private
+
+TEST(TelemetryTest, PluginTest) {
+ // This would have been called by the plugin reg in a "real" plugin
+ // For tests, we just call it directly.
+ lldb_private::FakePlugin::Initialize();
+
+ auto *ins = lldb_private::telemetry::TelemetryManager::getInstance();
+ ASSERT_NE(ins, nullptr);
+
+ std::vector<const ::llvm::telemetry::TelemetryInfo *> expected_entries;
+ ins->addDestination(
+ std::make_unique<lldb_private::TestDestination>(&expected_entries));
+
+ lldb_private::FakeTelemetryInfo entry;
+ entry.msg = "";
+
+ ASSERT_THAT_ERROR(ins->dispatch(&entry), ::llvm::Succeeded());
+ ASSERT_EQ(1, expected_entries.size());
+ EXPECT_EQ("In FakePlugin",
+ llvm::dyn_cast<lldb_private::FakeTelemetryInfo>(expected_entries[0])
+ ->msg);
+
+ ASSERT_EQ("FakeTelemetryPlugin", ins->GetInstanceName());
+}
+
+#endif // LLVM_BUILD_TELEMETRY
More information about the lldb-commits
mailing list