Skip to content

Commit e1a393e

Browse files
oontvoolabath
andauthored
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 <[email protected]>
1 parent 3305d9f commit e1a393e

File tree

4 files changed

+119
-1
lines changed

4 files changed

+119
-1
lines changed

lldb/include/lldb/Core/Telemetry.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,19 @@ struct LLDBBaseTelemetryInfo : public llvm::telemetry::TelemetryInfo {
6161
/// applicable to LLDB.
6262
class TelemetryManager : public llvm::telemetry::Manager {
6363
public:
64+
llvm::Error preDispatch(llvm::telemetry::TelemetryInfo *entry) override;
65+
66+
virtual llvm::StringRef GetInstanceName() const = 0;
67+
static TelemetryManager *getInstance();
68+
69+
protected:
6470
TelemetryManager(std::unique_ptr<llvm::telemetry::Config> config);
6571

66-
llvm::Error preDispatch(llvm::telemetry::TelemetryInfo *entry) override;
72+
static void setInstance(std::unique_ptr<TelemetryManager> manger);
6773

6874
private:
6975
std::unique_ptr<llvm::telemetry::Config> m_config;
76+
static std::unique_ptr<TelemetryManager> g_instance;
7077
};
7178

7279
} // namespace telemetry

lldb/source/Core/Telemetry.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,13 @@ llvm::Error TelemetryManager::preDispatch(TelemetryInfo *entry) {
7070
return Error::success();
7171
}
7272

73+
std::unique_ptr<TelemetryManager> TelemetryManager::g_instance = nullptr;
74+
TelemetryManager *TelemetryManager::getInstance() { return g_instance.get(); }
75+
76+
void TelemetryManager::setInstance(std::unique_ptr<TelemetryManager> manager) {
77+
g_instance = std::move(manager);
78+
}
79+
7380
} // namespace telemetry
7481
} // namespace lldb_private
7582

lldb/unittests/Core/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
if (LLVM_BUILD_TELEMETRY)
2+
set(TELEMETRY_DEPS Telemetry)
3+
endif()
4+
15
add_lldb_unittest(LLDBCoreTests
26
CommunicationTest.cpp
37
DiagnosticEventTest.cpp
@@ -10,6 +14,7 @@ add_lldb_unittest(LLDBCoreTests
1014
RichManglingContextTest.cpp
1115
SourceLocationSpecTest.cpp
1216
SourceManagerTest.cpp
17+
TelemetryTest.cpp
1318
UniqueCStringMapTest.cpp
1419

1520
LINK_LIBS
@@ -26,4 +31,5 @@ add_lldb_unittest(LLDBCoreTests
2631
LLVMTestingSupport
2732
LINK_COMPONENTS
2833
Support
34+
${TELEMETRY_DEPS}
2935
)

lldb/unittests/Core/TelemetryTest.cpp

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
//===-- TelemetryTest.cpp ------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "llvm/Config/llvm-config.h"
10+
11+
#ifdef LLVM_BUILD_TELEMETRY
12+
13+
#include "lldb/Core/PluginInterface.h"
14+
#include "lldb/Core/PluginManager.h"
15+
#include "lldb/Core/Telemetry.h"
16+
#include "llvm/ADT/StringRef.h"
17+
#include "llvm/Support/Error.h"
18+
#include "llvm/Telemetry/Telemetry.h"
19+
#include "llvm/Testing/Support/Error.h"
20+
#include "gtest/gtest.h"
21+
#include <memory>
22+
#include <vector>
23+
24+
namespace lldb_private {
25+
26+
struct FakeTelemetryInfo : public llvm::telemetry::TelemetryInfo {
27+
std::string msg;
28+
};
29+
30+
class TestDestination : public llvm::telemetry::Destination {
31+
public:
32+
TestDestination(std::vector<const llvm::telemetry::TelemetryInfo *> *entries)
33+
: received_entries(entries) {}
34+
35+
llvm::Error
36+
receiveEntry(const llvm::telemetry::TelemetryInfo *entry) override {
37+
received_entries->push_back(entry);
38+
return llvm::Error::success();
39+
}
40+
41+
llvm::StringLiteral name() const override { return "TestDestination"; }
42+
43+
private:
44+
std::vector<const llvm::telemetry::TelemetryInfo *> *received_entries;
45+
};
46+
47+
class FakePlugin : public telemetry::TelemetryManager {
48+
public:
49+
FakePlugin()
50+
: telemetry::TelemetryManager(
51+
std::make_unique<llvm::telemetry::Config>(true)) {}
52+
53+
// TelemetryManager interface
54+
llvm::Error preDispatch(llvm::telemetry::TelemetryInfo *entry) override {
55+
if (auto *fake_entry = llvm::dyn_cast<FakeTelemetryInfo>(entry))
56+
fake_entry->msg = "In FakePlugin";
57+
58+
return llvm::Error::success();
59+
}
60+
61+
llvm::StringRef GetInstanceName() const override {
62+
return "FakeTelemetryPlugin";
63+
}
64+
65+
static void Initialize() {
66+
telemetry::TelemetryManager::setInstance(std::make_unique<FakePlugin>());
67+
}
68+
69+
static void Terminate() { telemetry::TelemetryManager::setInstance(nullptr); }
70+
};
71+
72+
} // namespace lldb_private
73+
74+
TEST(TelemetryTest, PluginTest) {
75+
// This would have been called by the plugin reg in a "real" plugin
76+
// For tests, we just call it directly.
77+
lldb_private::FakePlugin::Initialize();
78+
79+
auto *ins = lldb_private::telemetry::TelemetryManager::getInstance();
80+
ASSERT_NE(ins, nullptr);
81+
82+
std::vector<const ::llvm::telemetry::TelemetryInfo *> expected_entries;
83+
ins->addDestination(
84+
std::make_unique<lldb_private::TestDestination>(&expected_entries));
85+
86+
lldb_private::FakeTelemetryInfo entry;
87+
entry.msg = "";
88+
89+
ASSERT_THAT_ERROR(ins->dispatch(&entry), ::llvm::Succeeded());
90+
ASSERT_EQ(1, expected_entries.size());
91+
EXPECT_EQ("In FakePlugin",
92+
llvm::dyn_cast<lldb_private::FakeTelemetryInfo>(expected_entries[0])
93+
->msg);
94+
95+
ASSERT_EQ("FakeTelemetryPlugin", ins->GetInstanceName());
96+
}
97+
98+
#endif // LLVM_BUILD_TELEMETRY

0 commit comments

Comments
 (0)