55
55
)
56
56
from snowflake .connector .errors import BindUploadError , DatabaseError
57
57
from snowflake .connector .file_transfer_agent import SnowflakeProgressPercentage
58
- from snowflake .connector .telemetry import TelemetryField
58
+ from snowflake .connector .telemetry import TelemetryData , TelemetryField
59
59
from snowflake .connector .time_util import get_time_millis
60
60
61
61
if TYPE_CHECKING :
@@ -361,8 +361,9 @@ async def _init_result_and_meta(self, data: dict[Any, Any]) -> None:
361
361
self ._total_rowcount += updated_rows
362
362
363
363
async def _init_multi_statement_results (self , data : dict ) -> None :
364
- # TODO: async telemetry SNOW-1572217
365
- # self._log_telemetry_job_data(TelemetryField.MULTI_STATEMENT, TelemetryData.TRUE)
364
+ await self ._log_telemetry_job_data (
365
+ TelemetryField .MULTI_STATEMENT , TelemetryData .TRUE
366
+ )
366
367
self .multi_statement_savedIds = data ["resultIds" ].split ("," )
367
368
self ._multi_statement_resultIds = collections .deque (
368
369
self .multi_statement_savedIds
@@ -382,8 +383,24 @@ async def _init_multi_statement_results(self, data: dict) -> None:
382
383
async def _log_telemetry_job_data (
383
384
self , telemetry_field : TelemetryField , value : Any
384
385
) -> None :
385
- # TODO: async telemetry SNOW-1572217
386
- pass
386
+ ts = get_time_millis ()
387
+ try :
388
+ await self ._connection ._log_telemetry (
389
+ TelemetryData .from_telemetry_data_dict (
390
+ from_dict = {
391
+ TelemetryField .KEY_TYPE .value : telemetry_field .value ,
392
+ TelemetryField .KEY_SFQID .value : self ._sfqid ,
393
+ TelemetryField .KEY_VALUE .value : value ,
394
+ },
395
+ timestamp = ts ,
396
+ connection = self ._connection ,
397
+ )
398
+ )
399
+ except AttributeError :
400
+ logger .warning (
401
+ "Cursor failed to log to telemetry. Connection object may be None." ,
402
+ exc_info = True ,
403
+ )
387
404
388
405
async def _preprocess_pyformat_query (
389
406
self ,
@@ -394,16 +411,15 @@ async def _preprocess_pyformat_query(
394
411
# client side binding
395
412
processed_params = self ._connection ._process_params_pyformat (params , self )
396
413
# SNOW-513061 collect telemetry for empty sequence usage before we make the breaking change announcement
397
- # TODO: async telemetry support
398
- # if params is not None and len(params) == 0:
399
- # await self._log_telemetry_job_data(
400
- # TelemetryField.EMPTY_SEQ_INTERPOLATION,
401
- # (
402
- # TelemetryData.TRUE
403
- # if self.connection._interpolate_empty_sequences
404
- # else TelemetryData.FALSE
405
- # ),
406
- # )
414
+ if params is not None and len (params ) == 0 :
415
+ await self ._log_telemetry_job_data (
416
+ TelemetryField .EMPTY_SEQ_INTERPOLATION ,
417
+ (
418
+ TelemetryData .TRUE
419
+ if self .connection ._interpolate_empty_sequences
420
+ else TelemetryData .FALSE
421
+ ),
422
+ )
407
423
if logger .getEffectiveLevel () <= logging .DEBUG :
408
424
logger .debug (
409
425
f"binding: [{ self ._format_query_for_log (command )} ] "
@@ -585,14 +601,13 @@ async def execute(
585
601
self ._first_chunk_time = get_time_millis ()
586
602
587
603
# if server gives a send time, log the time it took to arrive
588
- # TODO: telemetry support in asyncio
589
- # if "data" in ret and "sendResultTime" in ret["data"]:
590
- # time_consume_first_result = (
591
- # self._first_chunk_time - ret["data"]["sendResultTime"]
592
- # )
593
- # self._log_telemetry_job_data(
594
- # TelemetryField.TIME_CONSUME_FIRST_RESULT, time_consume_first_result
595
- # )
604
+ if "data" in ret and "sendResultTime" in ret ["data" ]:
605
+ time_consume_first_result = (
606
+ self ._first_chunk_time - ret ["data" ]["sendResultTime" ]
607
+ )
608
+ await self ._log_telemetry_job_data (
609
+ TelemetryField .TIME_CONSUME_FIRST_RESULT , time_consume_first_result
610
+ )
596
611
597
612
if ret ["success" ]:
598
613
logger .debug ("SUCCESS" )
@@ -893,10 +908,9 @@ async def fetch_arrow_batches(self) -> AsyncIterator[Table]:
893
908
await self ._prefetch_hook ()
894
909
if self ._query_result_format != "arrow" :
895
910
raise NotSupportedError
896
- # TODO: async telemetry SNOW-1572217
897
- # self._log_telemetry_job_data(
898
- # TelemetryField.ARROW_FETCH_BATCHES, TelemetryData.TRUE
899
- # )
911
+ await self ._log_telemetry_job_data (
912
+ TelemetryField .ARROW_FETCH_BATCHES , TelemetryData .TRUE
913
+ )
900
914
return await self ._result_set ._fetch_arrow_batches ()
901
915
902
916
@overload
@@ -920,8 +934,9 @@ async def fetch_arrow_all(self, force_return_table: bool = False) -> Table | Non
920
934
await self ._prefetch_hook ()
921
935
if self ._query_result_format != "arrow" :
922
936
raise NotSupportedError
923
- # TODO: async telemetry SNOW-1572217
924
- # self._log_telemetry_job_data(TelemetryField.ARROW_FETCH_ALL, TelemetryData.TRUE)
937
+ await self ._log_telemetry_job_data (
938
+ TelemetryField .ARROW_FETCH_ALL , TelemetryData .TRUE
939
+ )
925
940
return await self ._result_set ._fetch_arrow_all (
926
941
force_return_table = force_return_table
927
942
)
@@ -933,10 +948,9 @@ async def fetch_pandas_batches(self, **kwargs: Any) -> AsyncIterator[DataFrame]:
933
948
await self ._prefetch_hook ()
934
949
if self ._query_result_format != "arrow" :
935
950
raise NotSupportedError
936
- # TODO: async telemetry
937
- # self._log_telemetry_job_data(
938
- # TelemetryField.PANDAS_FETCH_BATCHES, TelemetryData.TRUE
939
- # )
951
+ await self ._log_telemetry_job_data (
952
+ TelemetryField .PANDAS_FETCH_BATCHES , TelemetryData .TRUE
953
+ )
940
954
return await self ._result_set ._fetch_pandas_batches (** kwargs )
941
955
942
956
async def fetch_pandas_all (self , ** kwargs : Any ) -> DataFrame :
@@ -946,9 +960,9 @@ async def fetch_pandas_all(self, **kwargs: Any) -> DataFrame:
946
960
if self ._query_result_format != "arrow" :
947
961
raise NotSupportedError
948
962
# # TODO: async telemetry
949
- # self._log_telemetry_job_data(
950
- # TelemetryField.PANDAS_FETCH_ALL, TelemetryData.TRUE
951
- # )
963
+ await self ._log_telemetry_job_data (
964
+ TelemetryField .PANDAS_FETCH_ALL , TelemetryData .TRUE
965
+ )
952
966
return await self ._result_set ._fetch_pandas_all (** kwargs )
953
967
954
968
async def nextset (self ) -> SnowflakeCursor | None :
@@ -981,9 +995,9 @@ async def get_result_batches(self) -> list[ResultBatch] | None:
981
995
if self ._result_set is None :
982
996
return None
983
997
# TODO: async telemetry SNOW-1572217
984
- # self._log_telemetry_job_data(
985
- # TelemetryField.GET_PARTITIONS_USED, TelemetryData.TRUE
986
- # )
998
+ await self ._log_telemetry_job_data (
999
+ TelemetryField .GET_PARTITIONS_USED , TelemetryData .TRUE
1000
+ )
987
1001
return self ._result_set .batches
988
1002
989
1003
async def get_results_from_sfqid (self , sfqid : str ) -> None :
0 commit comments