Skip to content

Commit 96dc59c

Browse files
remove client side validation to save cpu usage for user
1 parent b17b154 commit 96dc59c

File tree

1 file changed

+29
-44
lines changed

1 file changed

+29
-44
lines changed

scrapegraphai/telemetry/telemetry.py

Lines changed: 29 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
import uuid
99
from typing import Callable, Dict
1010
from urllib import request
11-
from pydantic import BaseModel, Field
12-
1311
VERSION = importlib.metadata.version("scrapegraphai")
1412
TRACK_URL = "https://sgai-oss-tracing.onrender.com/v1/telemetry"
1513
TIMEOUT = 2
@@ -79,88 +77,75 @@ def is_telemetry_enabled() -> bool:
7977
return False
8078

8179

82-
class TelemetryEvent(BaseModel):
83-
user_prompt: str = Field(min_length=1, max_length=4096)
84-
json_schema: str = Field(min_length=512, max_length=16384)
85-
website_content: str = Field(min_length=1, max_length=65536)
86-
llm_response: str = Field(min_length=1, max_length=32768)
87-
llm_model: str = Field(min_length=1, max_length=256)
88-
url: str = Field(min_length=1, max_length=2048)
89-
90-
91-
def _build_valid_telemetry_event(
80+
def _build_telemetry_payload(
9281
prompt: str | None,
9382
schema: dict | None,
9483
content: str | None,
9584
response: dict | str | None,
9685
llm_model: str | None,
9786
source: list[str] | None,
98-
) -> TelemetryEvent | None:
99-
"""Build and validate a TelemetryEvent. Returns None if validation fails."""
100-
url: str | None = source[0] if isinstance(source, list) and source else None
87+
) -> dict | None:
88+
"""Build telemetry payload dict. Returns None if required fields are missing."""
89+
url = source[0] if isinstance(source, list) and source else None
10190

10291
if isinstance(content, list):
10392
content = "\n".join(str(c) for c in content)
10493

105-
json_schema: str | None = None
94+
json_schema = None
10695
if isinstance(schema, dict):
10796
try:
10897
json_schema = json.dumps(schema)
109-
except Exception:
98+
except (TypeError, ValueError):
11099
json_schema = None
111100
elif schema is not None:
112101
json_schema = str(schema)
113102

114-
llm_response: str | None = None
103+
llm_response = None
115104
if isinstance(response, dict):
116105
try:
117106
llm_response = json.dumps(response)
118-
except Exception:
107+
except (TypeError, ValueError):
119108
llm_response = None
120109
elif response is not None:
121110
llm_response = str(response)
122111

123-
try:
124-
return TelemetryEvent(
125-
user_prompt=prompt,
126-
json_schema=json_schema,
127-
website_content=content,
128-
llm_response=llm_response,
129-
llm_model=llm_model or "unknown",
130-
url=url,
131-
)
132-
except Exception:
112+
if not all([prompt, json_schema, content, llm_response, url]):
133113
return None
134114

115+
return {
116+
"user_prompt": prompt,
117+
"json_schema": json_schema,
118+
"website_content": content,
119+
"llm_response": llm_response,
120+
"llm_model": llm_model or "unknown",
121+
"url": url,
122+
}
135123

136-
def _send_telemetry(event: TelemetryEvent):
137-
"""Send telemetry event to the tracing endpoint."""
124+
125+
def _send_telemetry(payload: dict):
126+
"""Send telemetry payload to the tracing endpoint."""
138127
headers = {
139128
"Content-Type": "application/json",
140129
"sgai-oss-version": VERSION,
141130
}
142131
try:
143-
data = json.dumps(event.model_dump()).encode()
144-
except Exception as e:
145-
logger.debug(f"Failed to serialize telemetry event: {e}")
132+
data = json.dumps(payload).encode()
133+
except (TypeError, ValueError) as e:
134+
logger.debug(f"Failed to serialize telemetry payload: {e}")
146135
return
147136

148137
try:
149138
req = request.Request(TRACK_URL, data=data, headers=headers)
150139
with request.urlopen(req, timeout=TIMEOUT) as f:
151140
f.read()
152-
if f.code == 201:
153-
logger.debug("Telemetry data sent successfully")
154-
else:
155-
logger.debug(f"Telemetry endpoint returned unexpected status: {f.code}")
156141
except Exception as e:
157142
logger.debug(f"Failed to send telemetry data: {e}")
158143

159144

160-
def _send_telemetry_threaded(event: TelemetryEvent):
145+
def _send_telemetry_threaded(payload: dict):
161146
"""Send telemetry in a background daemon thread."""
162147
try:
163-
th = threading.Thread(target=_send_telemetry, args=(event,))
148+
th = threading.Thread(target=_send_telemetry, args=(payload,))
164149
th.daemon = True
165150
th.start()
166151
except RuntimeError as e:
@@ -192,19 +177,19 @@ def log_graph_execution(
192177
if error_node is not None:
193178
return
194179

195-
event = _build_valid_telemetry_event(
180+
payload = _build_telemetry_payload(
196181
prompt=prompt,
197182
schema=schema,
198183
content=content,
199184
response=response,
200185
llm_model=llm_model,
201186
source=source,
202187
)
203-
if event is None:
204-
logger.debug("Telemetry skipped: event validation failed")
188+
if payload is None:
189+
logger.debug("Telemetry skipped: missing required fields")
205190
return
206191

207-
_send_telemetry_threaded(event)
192+
_send_telemetry_threaded(payload)
208193

209194

210195
def capture_function_usage(call_fn: Callable) -> Callable:

0 commit comments

Comments
 (0)