Skip to content

Commit 997af26

Browse files
committed
skip null fields in telemetry request
Signed-off-by: Sai Shree Pradhan <saishree.pradhan@databricks.com>
1 parent e448aa3 commit 997af26

File tree

3 files changed

+34
-13
lines changed

3 files changed

+34
-13
lines changed

src/databricks/sql/telemetry/models/event.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
ExecutionResultFormat,
1010
)
1111
from typing import Optional
12-
from databricks.sql.telemetry.utils import EnumEncoder
12+
from databricks.sql.telemetry.utils import to_json_compact
1313

1414

1515
@dataclass
@@ -26,7 +26,7 @@ class HostDetails:
2626
port: int
2727

2828
def to_json(self):
29-
return json.dumps(asdict(self))
29+
return to_json_compact(self)
3030

3131

3232
@dataclass
@@ -52,7 +52,7 @@ class DriverConnectionParameters:
5252
socket_timeout: Optional[int] = None
5353

5454
def to_json(self):
55-
return json.dumps(asdict(self), cls=EnumEncoder)
55+
return to_json_compact(self)
5656

5757

5858
@dataclass
@@ -88,7 +88,7 @@ class DriverSystemConfiguration:
8888
locale_name: Optional[str] = None
8989

9090
def to_json(self):
91-
return json.dumps(asdict(self), cls=EnumEncoder)
91+
return to_json_compact(self)
9292

9393

9494
@dataclass
@@ -106,7 +106,7 @@ class DriverVolumeOperation:
106106
volume_path: str
107107

108108
def to_json(self):
109-
return json.dumps(asdict(self), cls=EnumEncoder)
109+
return to_json_compact(self)
110110

111111

112112
@dataclass
@@ -124,7 +124,7 @@ class DriverErrorInfo:
124124
stack_trace: str
125125

126126
def to_json(self):
127-
return json.dumps(asdict(self), cls=EnumEncoder)
127+
return to_json_compact(self)
128128

129129

130130
@dataclass
@@ -146,7 +146,7 @@ class SqlExecutionEvent:
146146
retry_count: int
147147

148148
def to_json(self):
149-
return json.dumps(asdict(self), cls=EnumEncoder)
149+
return to_json_compact(self)
150150

151151

152152
@dataclass
@@ -179,4 +179,4 @@ class TelemetryEvent:
179179
operation_latency_ms: Optional[int] = None
180180

181181
def to_json(self):
182-
return json.dumps(asdict(self), cls=EnumEncoder)
182+
return to_json_compact(self)

src/databricks/sql/telemetry/models/frontend_logs.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import json
22
from dataclasses import dataclass, asdict
33
from databricks.sql.telemetry.models.event import TelemetryEvent
4-
from databricks.sql.telemetry.utils import EnumEncoder
4+
from databricks.sql.telemetry.utils import to_json_compact
55
from typing import Optional
66

77

@@ -20,7 +20,7 @@ class TelemetryClientContext:
2020
user_agent: str
2121

2222
def to_json(self):
23-
return json.dumps(asdict(self), cls=EnumEncoder)
23+
return to_json_compact(self)
2424

2525

2626
@dataclass
@@ -36,7 +36,7 @@ class FrontendLogContext:
3636
client_context: TelemetryClientContext
3737

3838
def to_json(self):
39-
return json.dumps(asdict(self), cls=EnumEncoder)
39+
return to_json_compact(self)
4040

4141

4242
@dataclass
@@ -52,7 +52,7 @@ class FrontendLogEntry:
5252
sql_driver_log: TelemetryEvent
5353

5454
def to_json(self):
55-
return json.dumps(asdict(self), cls=EnumEncoder)
55+
return to_json_compact(self)
5656

5757

5858
@dataclass
@@ -75,4 +75,4 @@ class TelemetryFrontendLog:
7575
workspace_id: Optional[int] = None
7676

7777
def to_json(self):
78-
return json.dumps(asdict(self), cls=EnumEncoder)
78+
return to_json_compact(self)

src/databricks/sql/telemetry/utils.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import json
22
from enum import Enum
3+
from dataclasses import asdict
34

45

56
class EnumEncoder(json.JSONEncoder):
@@ -13,3 +14,23 @@ def default(self, obj):
1314
if isinstance(obj, Enum):
1415
return obj.value
1516
return super().default(obj)
17+
18+
19+
def filter_none_values(data):
20+
"""
21+
Recursively remove None values from dictionaries.
22+
This reduces telemetry payload size by excluding null fields.
23+
"""
24+
if isinstance(data, dict):
25+
return {k: filter_none_values(v) for k, v in data.items() if v is not None}
26+
else:
27+
return data
28+
29+
30+
def to_json_compact(dataclass_obj):
31+
"""
32+
Convert a dataclass to JSON string, excluding None values.
33+
"""
34+
data_dict = asdict(dataclass_obj)
35+
filtered_dict = filter_none_values(data_dict)
36+
return json.dumps(filtered_dict, cls=EnumEncoder)

0 commit comments

Comments
 (0)