1
- import functools
2
1
import time
3
2
from datetime import datetime
4
3
from textwrap import dedent
10
9
from snowflake .cli .api .sql_execution import SqlExecutionMixin
11
10
from snowflake .connector .cursor import SnowflakeCursor
12
11
13
- LogsTableQueryResult = NamedTuple (
14
- "LogsTableQueryResult" ,
15
- [
16
- ("key" , str ),
17
- ("table_name" , str ),
18
- ("default" , str ),
19
- ("level" , str ),
20
- ("description" , str ),
21
- ("type" , str ),
22
- ],
23
- )
24
-
25
12
LogsQueryRow = NamedTuple (
26
13
"LogsQueryRow" ,
27
14
[
@@ -42,13 +29,18 @@ def stream_logs(
42
29
object_type : str = ObjectArgument ,
43
30
object_name : FQN = NameArgument ,
44
31
from_time : Optional [datetime ] = None ,
32
+ event_table : Optional [str ] = None ,
45
33
) -> Iterable [List [LogsQueryRow ]]:
46
34
try :
47
35
previous_end = from_time
48
36
49
37
while True :
50
38
raw_logs = self .get_raw_logs (
51
- object_type , object_name , previous_end , None
39
+ object_type = object_type ,
40
+ object_name = object_name ,
41
+ from_time = previous_end ,
42
+ to_time = None ,
43
+ event_table = event_table ,
52
44
).fetchall ()
53
45
54
46
if raw_logs :
@@ -67,12 +59,19 @@ def get_logs(
67
59
object_name : FQN = NameArgument ,
68
60
from_time : Optional [datetime ] = None ,
69
61
to_time : Optional [datetime ] = None ,
62
+ event_table : Optional [str ] = None ,
70
63
) -> Iterable [LogsQueryRow ]:
71
64
"""
72
65
Basic function to get a single batch of logs from the server
73
66
"""
74
67
75
- logs = self .get_raw_logs (object_type , object_name , from_time , to_time )
68
+ logs = self .get_raw_logs (
69
+ object_type = object_type ,
70
+ object_name = object_name ,
71
+ from_time = from_time ,
72
+ to_time = to_time ,
73
+ event_table = event_table ,
74
+ )
76
75
77
76
return self .sanitize_logs (logs )
78
77
@@ -82,7 +81,11 @@ def get_raw_logs(
82
81
object_name : FQN = NameArgument ,
83
82
from_time : Optional [datetime ] = None ,
84
83
to_time : Optional [datetime ] = None ,
84
+ event_table : Optional [str ] = None ,
85
85
) -> SnowflakeCursor :
86
+
87
+ table = event_table if event_table else "SNOWFLAKE.TELEMETRY.EVENTS"
88
+
86
89
query = dedent (
87
90
f"""
88
91
SELECT
@@ -92,7 +95,7 @@ def get_raw_logs(
92
95
resource_attributes:"snow.{ object_type } .name"::string as object_name,
93
96
record:severity_text::string as log_level,
94
97
value::string as log_message
95
- FROM { self . logs_table }
98
+ FROM { table }
96
99
WHERE record_type = 'LOG'
97
100
AND (record:severity_text = 'INFO' or record:severity_text is NULL )
98
101
AND object_name = '{ object_name } '
@@ -105,22 +108,6 @@ def get_raw_logs(
105
108
106
109
return result
107
110
108
- @functools .cached_property
109
- def logs_table (self ) -> str :
110
- """
111
- Get the table where logs are."""
112
- query_result = self .execute_query (
113
- f"SHOW PARAMETERS LIKE 'event_table' IN ACCOUNT;"
114
- ).fetchone ()
115
-
116
- try :
117
- logs_table_query_result = LogsTableQueryResult (* query_result )
118
- except TypeError :
119
- raise ClickException (
120
- "Encountered error while querying for logs table. Please check if your account has an event_table"
121
- )
122
- return logs_table_query_result .table_name
123
-
124
111
def _get_timestamp_query (
125
112
self , from_time : Optional [datetime ], to_time : Optional [datetime ]
126
113
):
0 commit comments