3030
3131from garf_core import query_editor , report
3232from google .cloud import exceptions as google_cloud_exceptions
33+ from opentelemetry import trace
3334
3435from garf_executors import exceptions , execution_context , executor
3536from garf_executors .telemetry import tracer
@@ -68,6 +69,7 @@ def __init__(
6869 )
6970 self .project_id = project_id
7071 self .location = location
72+ super ().__init__ ()
7173
7274 @property
7375 def client (self ) -> bigquery .Client :
@@ -93,41 +95,47 @@ def execute(
9395 Returns:
9496 Report with data if query returns some data otherwise empty Report.
9597 """
98+ span = trace .get_current_span ()
99+ logger .info ('Executing script: %s' , title )
96100 query_text = self .replace_params_template (query , context .query_parameters )
97101 self .create_datasets (context .query_parameters .macro )
98102 job = self .client .query (query_text )
99103 try :
100104 result = job .result ()
105+ except google_cloud_exceptions .GoogleCloudError as e :
106+ raise BigQueryExecutorError (
107+ f'Failed to execute query { title } : Reason: { e } '
108+ ) from e
101109 logger .debug ('%s launched successfully' , title )
102- if result .total_rows :
103- results = report .GarfReport .from_pandas (result .to_dataframe ())
110+ if result .total_rows :
111+ results = report .GarfReport .from_pandas (result .to_dataframe ())
112+ else :
113+ results = report .GarfReport ()
114+ if context .writer and results :
115+ writer_clients = context .writer_clients
116+ if not writer_clients :
117+ logger .warning ('No writers configured, skipping write operation' )
104118 else :
105- results = report .GarfReport ()
106- if context .writer and results :
107- writer_clients = context .writer_clients
108- if not writer_clients :
109- logger .warning ('No writers configured, skipping write operation' )
110- else :
111- writing_results = []
112- for writer_client in writer_clients :
113- logger .debug (
114- 'Start writing data for query %s via %s writer' ,
115- title ,
116- type (writer_client ),
117- )
118- writing_result = writer_client .write (results , title )
119- logger .debug (
120- 'Finish writing data for query %s via %s writer' ,
121- title ,
122- type (writer_client ),
123- )
124- writing_results .append (writing_result )
125- logger .info ('%s executed successfully' , title )
126- # Return the last writer's result for backward compatibility
127- return writing_results [- 1 ] if writing_results else None
128- return results
129- except google_cloud_exceptions .GoogleCloudError as e :
130- raise BigQueryExecutorError (e ) from e
119+ writing_results = []
120+ for writer_client in writer_clients :
121+ logger .debug (
122+ 'Start writing data for query %s via %s writer' ,
123+ title ,
124+ type (writer_client ),
125+ )
126+ writing_result = writer_client .write (results , title )
127+ logger .debug (
128+ 'Finish writing data for query %s via %s writer' ,
129+ title ,
130+ type (writer_client ),
131+ )
132+ writing_results .append (writing_result )
133+ # Return the last writer's result for backward compatibility
134+ logger .info ('%s executed successfully' , title )
135+ return writing_results [- 1 ] if writing_results else None
136+ logger .info ('%s executed successfully' , title )
137+ span .set_attribute ('execute.num_results' , len (results ))
138+ return results
131139
132140 @tracer .start_as_current_span ('bq.create_datasets' )
133141 def create_datasets (self , macros : dict | None ) -> None :
0 commit comments