@@ -53,6 +53,14 @@ void LLDBBaseTelemetryInfo::serialize(Serializer &serializer) const {
5353 serializer.write (" end_time" , ToNanosec (end_time.value ()));
5454}
5555
56+ void ClientInfo::serialize (Serializer &serializer) const {
57+ LLDBBaseTelemetryInfo::serialize (serializer);
58+ serializer.write (" client_data" , client_data);
59+ serializer.write (" client_name" , client_name);
60+ if (error_msg.has_value ())
61+ serializer.write (" error_msg" , error_msg.value ());
62+ }
63+
5664void CommandInfo::serialize (Serializer &serializer) const {
5765 LLDBBaseTelemetryInfo::serialize (serializer);
5866
@@ -112,6 +120,63 @@ llvm::Error TelemetryManager::preDispatch(TelemetryInfo *entry) {
112120 return llvm::Error::success ();
113121}
114122
123+ void TelemetryManager::DispatchClientTelemetry (
124+ const lldb_private::StructuredDataImpl &entry, Debugger *debugger) {
125+ if (!m_config->enable_client_telemetry )
126+ return ;
127+
128+ ClientInfo client_info;
129+ client_info.debugger = debugger;
130+ if (entry.GetObjectSP ()->GetType () != lldb::eStructuredDataTypeDictionary) {
131+ LLDB_LOG (GetLog (LLDBLog::Object), " Expected Dictionary type but got {0}." ,
132+ entry.GetObjectSP ()->GetType ());
133+ return ;
134+ }
135+
136+ auto *dict = entry.GetObjectSP ()->GetAsDictionary ();
137+
138+ llvm::StringRef client_name;
139+ if (dict->GetValueForKeyAsString (" client_name" , client_name))
140+ client_info.client_name = client_name.str ();
141+ else
142+ LLDB_LOG (GetLog (LLDBLog::Object),
143+ " Cannot determine client_name from client-telemetry entry" );
144+
145+ llvm::StringRef client_data;
146+ if (dict->GetValueForKeyAsString (" client_data" , client_data))
147+ client_info.client_data = client_data.str ();
148+ else
149+ LLDB_LOG (GetLog (LLDBLog::Object),
150+ " Cannot determine client_data from client-telemetry entry" );
151+
152+ int64_t start_time;
153+ if (dict->GetValueForKeyAsInteger (" start_time" , start_time)) {
154+ client_info.start_time +=
155+ std::chrono::nanoseconds (static_cast <size_t >(start_time));
156+ } else {
157+ LLDB_LOG (GetLog (LLDBLog::Object),
158+ " Cannot determine start-time from client-telemetry entry" );
159+ }
160+
161+ int64_t end_time;
162+ if (dict->GetValueForKeyAsInteger (" end_time" , end_time)) {
163+ SteadyTimePoint epoch;
164+ client_info.end_time =
165+ epoch + std::chrono::nanoseconds (static_cast <size_t >(end_time));
166+ } else {
167+ LLDB_LOG (GetLog (LLDBLog::Object),
168+ " Cannot determine end-time from client-telemetry entry" );
169+ }
170+
171+ llvm::StringRef error_msg;
172+ if (dict->GetValueForKeyAsString (" error" , error_msg))
173+ client_info.error_msg = error_msg.str ();
174+
175+ if (llvm::Error er = dispatch (&client_info))
176+ LLDB_LOG_ERROR (GetLog (LLDBLog::Object), std::move (er),
177+ " Failed to dispatch client telemetry" );
178+ }
179+
115180class NoOpTelemetryManager : public TelemetryManager {
116181public:
117182 llvm::Error preDispatch (llvm::telemetry::TelemetryInfo *entry) override {
@@ -121,12 +186,18 @@ class NoOpTelemetryManager : public TelemetryManager {
121186
122187 explicit NoOpTelemetryManager ()
123188 : TelemetryManager(std::make_unique<LLDBConfig>(
124- /* EnableTelemetry*/ false , /* DetailedCommand*/ false )) {}
189+ /* EnableTelemetry=*/ false , /* DetailedCommand=*/ false ,
190+ /* ClientTelemery=*/ false )) {}
125191
126192 virtual llvm::StringRef GetInstanceName () const override {
127193 return " NoOpTelemetryManager" ;
128194 }
129195
196+ void DispatchClientTelemetry (const lldb_private::StructuredDataImpl &entry,
197+ Debugger *debugger) override {
198+ // Does nothing.
199+ }
200+
130201 llvm::Error dispatch (llvm::telemetry::TelemetryInfo *entry) override {
131202 // Does nothing.
132203 return llvm::Error::success ();
0 commit comments