Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions ptelemetry/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ class Telemetry:
def __init__(
self,
write_key: str | None = None,
ingest_key: str | None = None,
api_url: str | None = None,
disabled: bool = False,
flush_interval: float = 30.0,
Expand All @@ -52,15 +53,22 @@ def __init__(
Initialize the telemetry client.

Args:
write_key: Project write key (or set OPS_WRITE_KEY env var)
write_key: Project write key (deprecated, use ingest_key)
ingest_key: Project ingest key (or set OPS_INGEST_KEY env var)
api_url: API endpoint URL (default: https://producttelemetry.com/api)
disabled: Disable all telemetry (or set DO_NOT_TRACK=1 / OPS_TELEMETRY=0)
flush_interval: Seconds between automatic flushes (default: 30)
flush_at: Number of events to trigger a flush (default: 10)
max_queue_size: Maximum events to queue before dropping (default: 1000)
project_slug: Project slug for client_id isolation (default: "default")
"""
self._write_key = write_key or os.environ.get("OPS_WRITE_KEY", "")
# Support both ingest_key (preferred) and write_key (deprecated) for backwards compatibility
self._write_key = (
ingest_key
or write_key
or os.environ.get("OPS_INGEST_KEY")
or os.environ.get("OPS_WRITE_KEY", "")
)
self._api_url = (api_url or os.environ.get("OPS_API_URL", DEFAULT_API_URL)).rstrip("/")
# Sanitize project_slug to prevent path traversal
if not re.match(r"^[a-zA-Z0-9_-]+$", project_slug):
Expand Down
27 changes: 27 additions & 0 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,39 @@ def test_init_with_write_key(self, temp_config_dir):
assert not t._disabled
t.shutdown()

def test_init_with_ingest_key(self, temp_config_dir):
"""Test ingest_key parameter (preferred over write_key)."""
t = Telemetry(ingest_key="ik_test_key")
assert t._write_key == "ik_test_key"
assert not t._disabled
t.shutdown()

def test_ingest_key_takes_precedence(self, temp_config_dir):
"""Test that ingest_key takes precedence over write_key."""
t = Telemetry(ingest_key="ik_new", write_key="wk_old")
assert t._write_key == "ik_new"
t.shutdown()

def test_init_from_env_var(self, temp_config_dir):
with patch.dict(os.environ, {"OPS_WRITE_KEY": "env_key"}):
t = Telemetry()
assert t._write_key == "env_key"
t.shutdown()

def test_init_from_ingest_key_env_var(self, temp_config_dir):
"""Test OPS_INGEST_KEY env var (preferred over OPS_WRITE_KEY)."""
with patch.dict(os.environ, {"OPS_INGEST_KEY": "ik_env_key"}):
t = Telemetry()
assert t._write_key == "ik_env_key"
t.shutdown()

def test_ingest_key_env_takes_precedence(self, temp_config_dir):
"""Test that OPS_INGEST_KEY takes precedence over OPS_WRITE_KEY."""
with patch.dict(os.environ, {"OPS_INGEST_KEY": "ik_new", "OPS_WRITE_KEY": "wk_old"}):
t = Telemetry()
assert t._write_key == "ik_new"
t.shutdown()

def test_init_disabled(self, temp_config_dir):
t = Telemetry(write_key="test", disabled=True)
assert t._disabled
Expand Down
Loading
Loading