Skip to content

Commit c38d7c7

Browse files
Changes done for package level telemetry
1 parent 1a81f26 commit c38d7c7

3 files changed

Lines changed: 71 additions & 1 deletion

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ classifiers = [
2424
"Programming Language :: Python :: Implementation :: CPython",
2525
"Programming Language :: Python :: Implementation :: PyPy",
2626
]
27-
dependencies = ["haystack-ai>=2.3.0", "couchbase==4.*","backports-datetime-fromisoformat"]
27+
dependencies = ["haystack-ai>=2.3.0", "couchbase==4.*","backports-datetime-fromisoformat", "scarf-sdk>=0.2.1"]
2828

2929
[project.urls]
3030
Documentation = "https://github.com/Couchbase-Ecosystem/couchbase-haystack#readme"

src/couchbase_haystack/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,8 @@
3434
"QueryVectorSearchSimilarity",
3535
"QueryVectorSearchType",
3636
]
37+
38+
# --- Package-level telemetry (non-blocking, fire-and-forget) ---
39+
from couchbase_haystack.telemetry import send_telemetry as _send_telemetry
40+
41+
_send_telemetry()
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
"""
2+
Package-level telemetry for couchbase-haystack using Scarf.
3+
4+
Sends a single, non-blocking telemetry ping when the package is first imported.
5+
Respects DO_NOT_TRACK and SCARF_NO_ANALYTICS environment variables (handled by the Scarf SDK).
6+
All errors are silently suppressed — telemetry must never interrupt the user.
7+
"""
8+
9+
import platform
10+
import threading
11+
12+
SCARF_ENDPOINT_URL = "https://couchbase.gateway.scarf.sh/couchbase-haystack"
13+
14+
_telemetry_sent = False
15+
_telemetry_lock = threading.Lock()
16+
17+
def _get_package_version() -> str:
18+
"""Return the installed package version, or 'unknown' if unavailable."""
19+
try:
20+
from importlib.metadata import version
21+
22+
return version("couchbase-haystack")
23+
except Exception:
24+
return "unknown"
25+
26+
def _send_telemetry() -> None:
27+
"""Send a single telemetry event to Scarf."""
28+
global _telemetry_sent
29+
30+
with _telemetry_lock:
31+
if _telemetry_sent:
32+
return
33+
_telemetry_sent = True
34+
35+
try:
36+
from scarf import ScarfEventLogger
37+
38+
logger = ScarfEventLogger(
39+
endpoint_url=SCARF_ENDPOINT_URL,
40+
timeout=2.0,
41+
)
42+
43+
logger.log_event(
44+
{
45+
"package": "couchbase-haystack",
46+
"version": _get_package_version(),
47+
"python_version": platform.python_version(),
48+
"os": platform.system(),
49+
"arch": platform.machine(),
50+
}
51+
)
52+
except Exception:
53+
# Telemetry must never raise — silently ignore all errors.
54+
pass
55+
56+
def send_telemetry() -> None:
57+
"""Fire-and-forget telemetry in a background daemon thread.
58+
59+
Safe to call multiple times; only the first invocation actually sends.
60+
"""
61+
try:
62+
t = threading.Thread(target=_send_telemetry, daemon=True)
63+
t.start()
64+
except Exception:
65+
pass

0 commit comments

Comments
 (0)