@@ -61,7 +61,59 @@ def test_sqlcommenter_enabled(self):
6161 r"SELECT 1 /\*db_driver='(.*)',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;" ,
6262 )
6363
64- def test_sqlcommenter_enabled_stmt_disabled_default_matches_db_statement_attribute (
64+ def test_sqlcommenter_default_stmt_enabled_no_comments_anywhere (self ):
65+ engine = create_engine ("sqlite:///:memory:" )
66+ SQLAlchemyInstrumentor ().instrument (
67+ engine = engine ,
68+ tracer_provider = self .tracer_provider ,
69+ # enable_commenter not set
70+ enable_attribute_commenter = True ,
71+ )
72+ cnx = engine .connect ()
73+ cnx .execute (text ("SELECT 1;" )).fetchall ()
74+ query_log = self .caplog .records [- 2 ].getMessage ()
75+ self .assertEqual (
76+ query_log ,
77+ "SELECT 1;" ,
78+ )
79+ spans = self .memory_exporter .get_finished_spans ()
80+ self .assertEqual (len (spans ), 2 )
81+ # first span is connection to db
82+ self .assertEqual (spans [0 ].name , "connect" )
83+ # second span is query itself
84+ query_span = spans [1 ]
85+ self .assertEqual (
86+ query_span .attributes [SpanAttributes .DB_STATEMENT ],
87+ "SELECT 1;" ,
88+ )
89+
90+ def test_sqlcommenter_disabled_stmt_enabled_no_comments_anywhere (self ):
91+ engine = create_engine ("sqlite:///:memory:" )
92+ SQLAlchemyInstrumentor ().instrument (
93+ engine = engine ,
94+ tracer_provider = self .tracer_provider ,
95+ enable_commenter = False ,
96+ enable_attribute_commenter = True ,
97+ )
98+ cnx = engine .connect ()
99+ cnx .execute (text ("SELECT 1;" )).fetchall ()
100+ query_log = self .caplog .records [- 2 ].getMessage ()
101+ self .assertEqual (
102+ query_log ,
103+ "SELECT 1;" ,
104+ )
105+ spans = self .memory_exporter .get_finished_spans ()
106+ self .assertEqual (len (spans ), 2 )
107+ # first span is connection to db
108+ self .assertEqual (spans [0 ].name , "connect" )
109+ # second span is query itself
110+ query_span = spans [1 ]
111+ self .assertEqual (
112+ query_span .attributes [SpanAttributes .DB_STATEMENT ],
113+ "SELECT 1;" ,
114+ )
115+
116+ def test_sqlcommenter_enabled_stmt_disabled_default (
65117 self ,
66118 ):
67119 engine = create_engine ("sqlite:///:memory:" )
@@ -142,6 +194,45 @@ def test_sqlcommenter_enabled_otel_values_false(self):
142194 self .caplog .records [- 2 ].getMessage (),
143195 r"SELECT 1 /\*db_driver='(.*)'\*/;" ,
144196 )
197+ spans = self .memory_exporter .get_finished_spans ()
198+ self .assertEqual (len (spans ), 2 )
199+ # first span is connection to db
200+ self .assertEqual (spans [0 ].name , "connect" )
201+ # second span is query itself
202+ query_span = spans [1 ]
203+ self .assertEqual (
204+ query_span .attributes [SpanAttributes .DB_STATEMENT ],
205+ r"SELECT 1;" ,
206+ )
207+
208+ def test_sqlcommenter_enabled_stmt_enabled_otel_values_false (self ):
209+ engine = create_engine ("sqlite:///:memory:" )
210+ SQLAlchemyInstrumentor ().instrument (
211+ engine = engine ,
212+ tracer_provider = self .tracer_provider ,
213+ enable_commenter = True ,
214+ commenter_options = {
215+ "db_framework" : False ,
216+ "opentelemetry_values" : False ,
217+ },
218+ enable_attribute_commenter = True ,
219+ )
220+ cnx = engine .connect ()
221+ cnx .execute (text ("SELECT 1;" )).fetchall ()
222+ self .assertRegex (
223+ self .caplog .records [- 2 ].getMessage (),
224+ r"SELECT 1 /\*db_driver='(.*)'\*/;" ,
225+ )
226+ spans = self .memory_exporter .get_finished_spans ()
227+ self .assertEqual (len (spans ), 2 )
228+ # first span is connection to db
229+ self .assertEqual (spans [0 ].name , "connect" )
230+ # second span is query itself
231+ query_span = spans [1 ]
232+ self .assertRegex (
233+ query_span .attributes [SpanAttributes .DB_STATEMENT ],
234+ r"SELECT 1 /\*db_driver='(.*)'*/;" ,
235+ )
145236
146237 def test_sqlcommenter_flask_integration (self ):
147238 engine = create_engine ("sqlite:///:memory:" )
@@ -164,6 +255,49 @@ def test_sqlcommenter_flask_integration(self):
164255 self .caplog .records [- 2 ].getMessage (),
165256 r"SELECT 1 /\*db_driver='(.*)',flask=1,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;" ,
166257 )
258+ spans = self .memory_exporter .get_finished_spans ()
259+ self .assertEqual (len (spans ), 2 )
260+ # first span is connection to db
261+ self .assertEqual (spans [0 ].name , "connect" )
262+ # second span is query itself
263+ query_span = spans [1 ]
264+ self .assertEqual (
265+ query_span .attributes [SpanAttributes .DB_STATEMENT ],
266+ "SELECT 1;" ,
267+ )
268+
269+ def test_sqlcommenter_stmt_enabled_flask_integration (self ):
270+ engine = create_engine ("sqlite:///:memory:" )
271+ SQLAlchemyInstrumentor ().instrument (
272+ engine = engine ,
273+ tracer_provider = self .tracer_provider ,
274+ enable_commenter = True ,
275+ commenter_options = {"db_framework" : False },
276+ enable_attribute_commenter = True ,
277+ )
278+ cnx = engine .connect ()
279+
280+ current_context = context .get_current ()
281+ sqlcommenter_context = context .set_value (
282+ "SQLCOMMENTER_ORM_TAGS_AND_VALUES" , {"flask" : 1 }, current_context
283+ )
284+ context .attach (sqlcommenter_context )
285+
286+ cnx .execute (text ("SELECT 1;" )).fetchall ()
287+ self .assertRegex (
288+ self .caplog .records [- 2 ].getMessage (),
289+ r"SELECT 1 /\*db_driver='(.*)',flask=1,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;" ,
290+ )
291+ spans = self .memory_exporter .get_finished_spans ()
292+ self .assertEqual (len (spans ), 2 )
293+ # first span is connection to db
294+ self .assertEqual (spans [0 ].name , "connect" )
295+ # second span is query itself
296+ query_span = spans [1 ]
297+ self .assertRegex (
298+ query_span .attributes [SpanAttributes .DB_STATEMENT ],
299+ r"SELECT 1 /\*db_driver='(.*)',flask=1,traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;" ,
300+ )
167301
168302 def test_sqlcommenter_enabled_create_engine_after_instrumentation (self ):
169303 SQLAlchemyInstrumentor ().instrument (
@@ -179,6 +313,44 @@ def test_sqlcommenter_enabled_create_engine_after_instrumentation(self):
179313 self .caplog .records [- 2 ].getMessage (),
180314 r"SELECT 1 /\*db_driver='(.*)',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;" ,
181315 )
316+ spans = self .memory_exporter .get_finished_spans ()
317+ self .assertEqual (len (spans ), 2 )
318+ # first span is connection to db
319+ self .assertEqual (spans [0 ].name , "connect" )
320+ # second span is query itself
321+ query_span = spans [1 ]
322+ self .assertEqual (
323+ query_span .attributes [SpanAttributes .DB_STATEMENT ],
324+ "SELECT 1;" ,
325+ )
326+
327+ def test_sqlcommenter_enabled_stmt_enabled_create_engine_after_instrumentation (
328+ self ,
329+ ):
330+ SQLAlchemyInstrumentor ().instrument (
331+ tracer_provider = self .tracer_provider ,
332+ enable_commenter = True ,
333+ enable_attribute_commenter = True ,
334+ )
335+ from sqlalchemy import create_engine # pylint: disable-all
336+
337+ engine = create_engine ("sqlite:///:memory:" )
338+ cnx = engine .connect ()
339+ cnx .execute (text ("SELECT 1;" )).fetchall ()
340+ self .assertRegex (
341+ self .caplog .records [- 2 ].getMessage (),
342+ r"SELECT 1 /\*db_driver='(.*)',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;" ,
343+ )
344+ spans = self .memory_exporter .get_finished_spans ()
345+ self .assertEqual (len (spans ), 2 )
346+ # first span is connection to db
347+ self .assertEqual (spans [0 ].name , "connect" )
348+ # second span is query itself
349+ query_span = spans [1 ]
350+ self .assertRegex (
351+ query_span .attributes [SpanAttributes .DB_STATEMENT ],
352+ r"SELECT 1 /\*db_driver='(.*)',traceparent='\d{1,2}-[a-zA-Z0-9_]{32}-[a-zA-Z0-9_]{16}-\d{1,2}'\*/;" ,
353+ )
182354
183355 def test_sqlcommenter_disabled_create_engine_after_instrumentation (self ):
184356 SQLAlchemyInstrumentor ().instrument (
0 commit comments