[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