From 3731734ea6bc0682e5c8e227cb8f84cd0d127590 Mon Sep 17 00:00:00 2001 From: John Kew Date: Thu, 16 Jan 2025 16:25:36 -0800 Subject: [PATCH 1/7] add "interactive mode" detection to our telemetry --- src/snowflake/snowpark/_internal/telemetry.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/snowflake/snowpark/_internal/telemetry.py b/src/snowflake/snowpark/_internal/telemetry.py index f149c796f8..fdb2549ea4 100644 --- a/src/snowflake/snowpark/_internal/telemetry.py +++ b/src/snowflake/snowpark/_internal/telemetry.py @@ -63,6 +63,7 @@ class TelemetryField(Enum): KEY_PYTHON_VERSION = "python_version" KEY_CLIENT_LANGUAGE = "client_language" KEY_OS = "operating_system" + KEY_IS_INTERACTIVE = "interactive" KEY_DATA = "data" KEY_CATEGORY = "category" KEY_CREATED_BY_SNOWPARK = "created_by_snowpark" @@ -319,6 +320,10 @@ def send(self, msg: Dict, timestamp: Optional[int] = None): telemetry_data = PCTelemetryData(message=msg, timestamp=timestamp) self.telemetry.try_add_log_to_batch(telemetry_data) + def _is_interactive(): + import sys + return hasattr(sys, 'ps1') or sys.flags.interactive or "snowbook" in sys.modules + def _create_basic_telemetry_data(self, telemetry_type: str) -> Dict[str, Any]: message = { PCTelemetryField.KEY_SOURCE.value: self.source, @@ -326,6 +331,7 @@ def _create_basic_telemetry_data(self, telemetry_type: str) -> Dict[str, Any]: TelemetryField.KEY_PYTHON_VERSION.value: self.python_version, TelemetryField.KEY_OS.value: self.os, PCTelemetryField.KEY_TYPE.value: telemetry_type, + TelemetryField.KEY_IS_INTERACTIVE: self._is_interactive(), } return message From 100769a7d08cfe76408c22489b58299b8374cdba Mon Sep 17 00:00:00 2001 From: John Kew Date: Thu, 16 Jan 2025 16:54:11 -0800 Subject: [PATCH 2/7] lint --- src/snowflake/snowpark/_internal/telemetry.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/snowflake/snowpark/_internal/telemetry.py b/src/snowflake/snowpark/_internal/telemetry.py index 9c18cc8691..ae52d801a1 100644 --- a/src/snowflake/snowpark/_internal/telemetry.py +++ b/src/snowflake/snowpark/_internal/telemetry.py @@ -319,7 +319,8 @@ def send(self, msg: Dict, timestamp: Optional[int] = None): def _is_interactive(): import sys - return hasattr(sys, 'ps1') or sys.flags.interactive or "snowbook" in sys.modules + + return hasattr(sys, "ps1") or sys.flags.interactive or "snowbook" in sys.modules def _create_basic_telemetry_data(self, telemetry_type: str) -> Dict[str, Any]: message = { From b79ee6fef8d12adaebae939b3b0339668d458894 Mon Sep 17 00:00:00 2001 From: John Kew Date: Thu, 16 Jan 2025 17:03:39 -0800 Subject: [PATCH 3/7] misc --- CHANGELOG.md | 2 ++ src/snowflake/snowpark/_internal/telemetry.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a85685d4d6..afd3bb5f2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,8 @@ - Added an option `keep_column_order` for keeping original column order in `DataFrame.with_column` and `DataFrame.with_columns`. - Added support for `contains_null` parameter to ArrayType. - Added support for `value_contains_null` parameter to MapType. +- Added `interactive` to telemetry that indicates whether the current environment is an interactive one. + #### Bug Fixes diff --git a/src/snowflake/snowpark/_internal/telemetry.py b/src/snowflake/snowpark/_internal/telemetry.py index ae52d801a1..900c8738df 100644 --- a/src/snowflake/snowpark/_internal/telemetry.py +++ b/src/snowflake/snowpark/_internal/telemetry.py @@ -317,7 +317,7 @@ def send(self, msg: Dict, timestamp: Optional[int] = None): telemetry_data = PCTelemetryData(message=msg, timestamp=timestamp) self.telemetry.try_add_log_to_batch(telemetry_data) - def _is_interactive(): + def _is_interactive(self): import sys return hasattr(sys, "ps1") or sys.flags.interactive or "snowbook" in sys.modules From 49bef248a0f088f71a900a062240acaf72a794dc Mon Sep 17 00:00:00 2001 From: John Kew Date: Fri, 17 Jan 2025 11:19:52 -0800 Subject: [PATCH 4/7] More telemetry --- src/snowflake/snowpark/_internal/telemetry.py | 11 +++++------ src/snowflake/snowpark/_internal/utils.py | 7 +++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/snowflake/snowpark/_internal/telemetry.py b/src/snowflake/snowpark/_internal/telemetry.py index 900c8738df..f449ffc5cc 100644 --- a/src/snowflake/snowpark/_internal/telemetry.py +++ b/src/snowflake/snowpark/_internal/telemetry.py @@ -28,6 +28,7 @@ get_python_version, get_version, is_in_stored_procedure, + is_interactive, ) @@ -309,6 +310,7 @@ def __init__(self, conn: SnowflakeConnection) -> None: self.version: str = get_version() self.python_version: str = get_python_version() self.os: str = get_os_name() + self.is_interactive = is_interactive() def send(self, msg: Dict, timestamp: Optional[int] = None): if self.telemetry: @@ -317,11 +319,6 @@ def send(self, msg: Dict, timestamp: Optional[int] = None): telemetry_data = PCTelemetryData(message=msg, timestamp=timestamp) self.telemetry.try_add_log_to_batch(telemetry_data) - def _is_interactive(self): - import sys - - return hasattr(sys, "ps1") or sys.flags.interactive or "snowbook" in sys.modules - def _create_basic_telemetry_data(self, telemetry_type: str) -> Dict[str, Any]: message = { PCTelemetryField.KEY_SOURCE.value: self.source, @@ -329,7 +326,9 @@ def _create_basic_telemetry_data(self, telemetry_type: str) -> Dict[str, Any]: TelemetryField.KEY_PYTHON_VERSION.value: self.python_version, TelemetryField.KEY_OS.value: self.os, PCTelemetryField.KEY_TYPE.value: telemetry_type, - TelemetryField.KEY_IS_INTERACTIVE: self._is_interactive(), + TelemetryField.KEY_IS_INTERACTIVE.value: PCTelemetryData.TRUE + if self.is_interactive + else PCTelemetryData.FALSE, } return message diff --git a/src/snowflake/snowpark/_internal/utils.py b/src/snowflake/snowpark/_internal/utils.py index 91e642a0cc..8b02772807 100644 --- a/src/snowflake/snowpark/_internal/utils.py +++ b/src/snowflake/snowpark/_internal/utils.py @@ -309,6 +309,13 @@ def get_python_version() -> str: return platform.python_version() +@lru_cache +def is_interactive() -> bool: + import sys + + return hasattr(sys, "ps1") or sys.flags.interactive or "snowbook" in sys.modules + + @lru_cache def get_connector_version() -> str: return ".".join([str(d) for d in connector_version if d is not None]) From 1394277145b93fecaef6ce2241a5f138e2a6346d Mon Sep 17 00:00:00 2001 From: John Kew Date: Fri, 17 Jan 2025 11:26:42 -0800 Subject: [PATCH 5/7] misc --- src/snowflake/snowpark/_internal/utils.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/snowflake/snowpark/_internal/utils.py b/src/snowflake/snowpark/_internal/utils.py index 8b02772807..7d4331ecbd 100644 --- a/src/snowflake/snowpark/_internal/utils.py +++ b/src/snowflake/snowpark/_internal/utils.py @@ -18,6 +18,7 @@ import random import re import string +import sys import threading import traceback import zipfile @@ -311,8 +312,6 @@ def get_python_version() -> str: @lru_cache def is_interactive() -> bool: - import sys - return hasattr(sys, "ps1") or sys.flags.interactive or "snowbook" in sys.modules From f3d13cd0f0da0da536b67b6188caed54c2c437bc Mon Sep 17 00:00:00 2001 From: John Kew Date: Fri, 17 Jan 2025 12:48:14 -0800 Subject: [PATCH 6/7] Fix modin test --- tests/integ/modin/test_telemetry.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integ/modin/test_telemetry.py b/tests/integ/modin/test_telemetry.py index e74a3e9b0b..9f816d5db9 100644 --- a/tests/integ/modin/test_telemetry.py +++ b/tests/integ/modin/test_telemetry.py @@ -189,6 +189,7 @@ def test_send_snowpark_pandas_telemetry_helper(send_mock): "python_version": ANY, "operating_system": ANY, "type": "test_send_type", + "interactive": ANY, "data": { "func_name": "test_send_func", "category": "snowpark_pandas", From 538329d37580031ebdde15090a4a2e73b0d1ba1c Mon Sep 17 00:00:00 2001 From: John Kew Date: Tue, 21 Jan 2025 09:34:19 -0800 Subject: [PATCH 7/7] remove empty line --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index afd3bb5f2a..f600e43a2e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,7 +53,6 @@ - Added support for `value_contains_null` parameter to MapType. - Added `interactive` to telemetry that indicates whether the current environment is an interactive one. - #### Bug Fixes - Fixed a bug in local testing mode that caused a column to contain None when it should contain 0