11import threading
22import time
3- import json
43import requests
54import logging
65from concurrent .futures import ThreadPoolExecutor
7- from typing import Dict , Optional , List
6+ from typing import Dict , Optional
87from databricks .sql .telemetry .models .event import (
98 TelemetryEvent ,
109 DriverSystemConfiguration ,
3029import platform
3130import uuid
3231import locale
33- from abc import ABC , abstractmethod
32+ from databricks . sql . telemetry . utils import BaseTelemetryClient
3433
3534logger = logging .getLogger (__name__ )
3635
@@ -94,33 +93,6 @@ def get_auth_flow(auth_provider):
9493 return None
9594
9695
97- class BaseTelemetryClient (ABC ):
98- """
99- Base class for telemetry clients.
100- It is used to define the interface for telemetry clients.
101- """
102-
103- @abstractmethod
104- def export_initial_telemetry_log (self , driver_connection_params , user_agent ):
105- logger .debug ("subclass must implement export_initial_telemetry_log" )
106- pass
107-
108- @abstractmethod
109- def export_failure_log (self , error_name , error_message ):
110- logger .debug ("subclass must implement export_failure_log" )
111- pass
112-
113- @abstractmethod
114- def export_latency_log (self , latency_ms , sql_execution_event , sql_statement_id ):
115- logger .debug ("subclass must implement export_latency_log" )
116- pass
117-
118- @abstractmethod
119- def close (self ):
120- logger .debug ("subclass must implement close" )
121- pass
122-
123-
12496class NoopTelemetryClient (BaseTelemetryClient ):
12597 """
12698 NoopTelemetryClient is a telemetry client that does not send any events to the server.
@@ -212,6 +184,8 @@ def _send_telemetry(self, events):
212184 protoLogs = [event .to_json () for event in events ],
213185 )
214186
187+ sent_count = len (events )
188+
215189 path = (
216190 self .TELEMETRY_AUTHENTICATED_PATH
217191 if self ._auth_provider
@@ -231,26 +205,47 @@ def _send_telemetry(self, events):
231205 url ,
232206 data = request .to_json (),
233207 headers = headers ,
234- timeout = 10 ,
208+ timeout = 900 ,
235209 )
236- future .add_done_callback (self ._telemetry_request_callback )
210+ future .add_done_callback (self ._telemetry_request_callback , sent_count )
237211 except Exception as e :
238212 logger .debug ("Failed to submit telemetry request: %s" , e )
239213
240- def _telemetry_request_callback (self , future ):
214+ def _telemetry_request_callback (self , future , sent_count : int ):
241215 """Callback function to handle telemetry request completion"""
242216 try :
243217 response = future .result ()
244218
245- if response .status_code == 200 :
246- logger .debug ("Telemetry request completed successfully" )
247- else :
219+ if not response .ok :
248220 logger .debug (
249221 "Telemetry request failed with status code: %s, response: %s" ,
250222 response .status_code ,
251223 response .text ,
252224 )
253225
226+ telemetry_response = TelemetryResponse .from_json (** response .json ())
227+
228+ logger .debug (
229+ "Pushed Telemetry logs with success count: %s, error count: %s" ,
230+ telemetry_response .numProtoSuccess ,
231+ len (telemetry_response .errors ),
232+ )
233+
234+ if telemetry_response .errors :
235+ logger .debug (
236+ "Telemetry push failed for some events with errors: %s" ,
237+ telemetry_response .errors ,
238+ )
239+
240+ # Check for partial failures
241+ if sent_count != telemetry_response .numProtoSuccess :
242+ logger .debug (
243+ "Partial failure pushing telemetry. Sent: %s, Succeeded: %s, Errors: %s" ,
244+ sent_count ,
245+ telemetry_response .numProtoSuccess ,
246+ telemetry_response .errors ,
247+ )
248+
254249 except Exception as e :
255250 logger .debug ("Telemetry request failed with exception: %s" , e )
256251
@@ -335,7 +330,7 @@ def _initialize(cls):
335330 cls ._clients = {}
336331 cls ._executor = ThreadPoolExecutor (
337332 max_workers = 10
338- ) # Thread pool for async operations TODO: Decide on max workers
333+ ) # Thread pool for async operations
339334 cls ._install_exception_hook ()
340335 cls ._initialized = True
341336 logger .debug (
0 commit comments