Skip to content

Commit bc29756

Browse files
authored
SNOW-1570328: fix disabling client telemetry (#2013)
1 parent 34abbaf commit bc29756

File tree

3 files changed

+57
-5
lines changed

3 files changed

+57
-5
lines changed

DESCRIPTION.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
1010

1111
- v3.12.1(TBD)
1212
- Fixed a bug that session token is logged when renewing session.
13+
- Fixed a bug that disabling client telemetry does not work.
1314

1415
- v3.12.0(July 24,2024)
1516
- Set default connection timeout of 10 seconds and socket read timeout of 10 minutes for HTTP calls in file transfer.

src/snowflake/connector/connection.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,8 @@ def __init__(
407407
self.messages = []
408408
self._async_sfqids: dict[str, None] = {}
409409
self._done_async_sfqids: dict[str, None] = {}
410-
self.telemetry_enabled = False
410+
self._client_param_telemetry_enabled = True
411+
self._server_param_telemetry_enabled = False
411412
self._session_parameters: dict[str, str | int | bool] = {}
412413
logger.info(
413414
"Snowflake Connector for Python Version: %s, "
@@ -624,11 +625,22 @@ def consent_cache_id_token(self):
624625

625626
@property
626627
def telemetry_enabled(self) -> bool:
627-
return self._telemetry_enabled
628+
return bool(
629+
self._client_param_telemetry_enabled
630+
and self._server_param_telemetry_enabled
631+
)
628632

629633
@telemetry_enabled.setter
630634
def telemetry_enabled(self, value) -> None:
631-
self._telemetry_enabled = True if value else False
635+
self._client_param_telemetry_enabled = True if value else False
636+
if (
637+
self._client_param_telemetry_enabled
638+
and not self._server_param_telemetry_enabled
639+
):
640+
logger.info(
641+
"Telemetry has been disabled by the session parameter CLIENT_TELEMETRY_ENABLED."
642+
" Set session parameter CLIENT_TELEMETRY_ENABLED to true to enable telemetry."
643+
)
632644

633645
@property
634646
def service_name(self) -> str | None:
@@ -774,7 +786,7 @@ def close(self, retry: bool = True) -> None:
774786

775787
# close telemetry first, since it needs rest to send remaining data
776788
logger.info("closed")
777-
self._telemetry.close(send_on_close=retry)
789+
self._telemetry.close(send_on_close=bool(retry and self.telemetry_enabled))
778790
if (
779791
self._all_async_queries_finished()
780792
and not self._server_session_keep_alive
@@ -1714,7 +1726,7 @@ def _update_parameters(
17141726
for name, value in parameters.items():
17151727
self._session_parameters[name] = value
17161728
if PARAMETER_CLIENT_TELEMETRY_ENABLED == name:
1717-
self.telemetry_enabled = value
1729+
self._server_param_telemetry_enabled = value
17181730
elif PARAMETER_CLIENT_SESSION_KEEP_ALIVE == name:
17191731
# Only set if the local config is None.
17201732
# Always give preference to user config.

test/integ/test_connection.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1404,3 +1404,42 @@ def test_mock_non_existing_server(conn_cnx, caplog):
14041404
"writing OCSP response cache file to",
14051405
]
14061406
)
1407+
1408+
1409+
@pytest.mark.skipolddriver
1410+
def test_disable_telemetry(conn_cnx, caplog):
1411+
# default behavior, closing connection, it will send telemetry
1412+
with caplog.at_level(logging.DEBUG):
1413+
with conn_cnx() as conn:
1414+
with conn.cursor() as cur:
1415+
cur.execute("select 1").fetchall()
1416+
assert (
1417+
len(conn._telemetry._log_batch) == 3
1418+
) # 3 events are import package, fetch first, fetch last
1419+
assert "POST /telemetry/send" in caplog.text
1420+
caplog.clear()
1421+
1422+
# set session parameters to false
1423+
with caplog.at_level(logging.DEBUG):
1424+
with conn_cnx(
1425+
session_parameters={"CLIENT_TELEMETRY_ENABLED": False}
1426+
) as conn, conn.cursor() as cur:
1427+
cur.execute("select 1").fetchall()
1428+
assert not conn.telemetry_enabled and not conn._telemetry._log_batch
1429+
# this enable won't work as the session parameter is set to false
1430+
conn.telemetry_enabled = True
1431+
cur.execute("select 1").fetchall()
1432+
assert not conn.telemetry_enabled and not conn._telemetry._log_batch
1433+
1434+
assert "POST /telemetry/send" not in caplog.text
1435+
caplog.clear()
1436+
1437+
# test disable telemetry in the client
1438+
with caplog.at_level(logging.DEBUG):
1439+
with conn_cnx() as conn:
1440+
assert conn.telemetry_enabled and len(conn._telemetry._log_batch) == 1
1441+
conn.telemetry_enabled = False
1442+
with conn.cursor() as cur:
1443+
cur.execute("select 1").fetchall()
1444+
assert not conn.telemetry_enabled
1445+
assert "POST /telemetry/send" not in caplog.text

0 commit comments

Comments
 (0)