mirror of
https://github.com/lancedb/lancedb.git
synced 2026-01-03 18:32:55 +00:00
feat: telemetry, error tracking, CLI & config manager (#538)
Co-authored-by: Lance Release <lance-dev@lancedb.com> Co-authored-by: Rob Meng <rob.xu.meng@gmail.com> Co-authored-by: Will Jones <willjones127@gmail.com> Co-authored-by: Chang She <759245+changhiskhan@users.noreply.github.com> Co-authored-by: rmeng <rob@lancedb.com> Co-authored-by: Chang She <chang@lancedb.com> Co-authored-by: Rok Mihevc <rok@mihevc.org>
This commit is contained in:
35
python/tests/test_cli.py
Normal file
35
python/tests/test_cli.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from click.testing import CliRunner
|
||||
|
||||
from lancedb.cli.cli import cli
|
||||
from lancedb.utils import CONFIG
|
||||
|
||||
|
||||
def test_entry():
|
||||
runner = CliRunner()
|
||||
result = runner.invoke(cli)
|
||||
assert result.exit_code == 0 # Main check
|
||||
assert "lancedb" in result.output.lower() # lazy check
|
||||
|
||||
|
||||
def test_diagnostics():
|
||||
runner = CliRunner()
|
||||
result = runner.invoke(cli, ["diagnostics", "--disabled"])
|
||||
assert result.exit_code == 0 # Main check
|
||||
assert CONFIG["diagnostics"] == False
|
||||
|
||||
result = runner.invoke(cli, ["diagnostics", "--enabled"])
|
||||
assert result.exit_code == 0 # Main check
|
||||
assert CONFIG["diagnostics"] == True
|
||||
|
||||
|
||||
def test_config():
|
||||
runner = CliRunner()
|
||||
result = runner.invoke(cli, ["config"])
|
||||
assert result.exit_code == 0 # Main check
|
||||
cfg = CONFIG.copy()
|
||||
cfg.pop("uuid")
|
||||
for (
|
||||
item,
|
||||
_,
|
||||
) in cfg.items(): # check for keys only as formatting is subject to change
|
||||
assert item in result.output
|
||||
60
python/tests/test_telemetry.py
Normal file
60
python/tests/test_telemetry.py
Normal file
@@ -0,0 +1,60 @@
|
||||
import json
|
||||
|
||||
import pytest
|
||||
|
||||
import lancedb
|
||||
from lancedb.utils.events import _Events
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
def request_log_path(tmp_path):
|
||||
return tmp_path / "request.json"
|
||||
|
||||
|
||||
def mock_register_event(name: str, **kwargs):
|
||||
if _Events._instance is None:
|
||||
_Events._instance = _Events()
|
||||
|
||||
_Events._instance.enabled = True
|
||||
_Events._instance.rate_limit = 0
|
||||
_Events._instance(name, **kwargs)
|
||||
|
||||
|
||||
def test_event_reporting(monkeypatch, request_log_path, tmp_path) -> None:
|
||||
def mock_request(**kwargs):
|
||||
json_data = kwargs.get("json", {})
|
||||
with open(request_log_path, "w") as f:
|
||||
json.dump(json_data, f)
|
||||
|
||||
monkeypatch.setattr(
|
||||
lancedb.table, "register_event", mock_register_event
|
||||
) # Force enable registering events and strip exception handling
|
||||
monkeypatch.setattr(lancedb.utils.events, "threaded_request", mock_request)
|
||||
|
||||
db = lancedb.connect(tmp_path)
|
||||
db.create_table(
|
||||
"test",
|
||||
data=[
|
||||
{"vector": [3.1, 4.1], "item": "foo", "price": 10.0},
|
||||
{"vector": [5.9, 26.5], "item": "bar", "price": 20.0},
|
||||
],
|
||||
mode="overwrite",
|
||||
)
|
||||
|
||||
assert request_log_path.exists() # test if event was registered
|
||||
|
||||
with open(request_log_path, "r") as f:
|
||||
json_data = json.load(f)
|
||||
|
||||
# TODO: don't hardcode these here. Instead create a module level json scehma in lancedb.utils.events for better evolvability
|
||||
batch_keys = ["api_key", "distinct_id", "batch"]
|
||||
event_keys = ["event", "properties", "timestamp", "distinct_id"]
|
||||
property_keys = ["cli", "install", "platforms", "version", "session_id"]
|
||||
|
||||
assert all([key in json_data for key in batch_keys])
|
||||
assert all([key in json_data["batch"][0] for key in event_keys])
|
||||
assert all([key in json_data["batch"][0]["properties"] for key in property_keys])
|
||||
|
||||
# cleanup & reset
|
||||
monkeypatch.undo()
|
||||
_Events._instance = None
|
||||
Reference in New Issue
Block a user