@@ -46,9 +46,13 @@ def test_trace_integration(self):
46
46
cnx .execute ("SELECT 1 + 1;" ).fetchall ()
47
47
spans = self .memory_exporter .get_finished_spans ()
48
48
49
- self .assertEqual (len (spans ), 1 )
50
- self .assertEqual (spans [0 ].name , "SELECT :memory:" )
49
+ self .assertEqual (len (spans ), 2 )
50
+ # first span - the connection to the db
51
+ self .assertEqual (spans [0 ].name , "connect" )
51
52
self .assertEqual (spans [0 ].kind , trace .SpanKind .CLIENT )
53
+ # second span - the query itself
54
+ self .assertEqual (spans [1 ].name , "SELECT :memory:" )
55
+ self .assertEqual (spans [1 ].kind , trace .SpanKind .CLIENT )
52
56
53
57
def test_instrument_two_engines (self ):
54
58
engine_1 = create_engine ("sqlite:///:memory:" )
@@ -65,8 +69,20 @@ def test_instrument_two_engines(self):
65
69
cnx_2 .execute ("SELECT 1 + 1;" ).fetchall ()
66
70
67
71
spans = self .memory_exporter .get_finished_spans ()
72
+ # 2 queries + 2 engine connect
73
+ self .assertEqual (len (spans ), 4 )
68
74
69
- self .assertEqual (len (spans ), 2 )
75
+ def test_instrument_engine_connect (self ):
76
+ engine = create_engine ("sqlite:///:memory:" )
77
+
78
+ SQLAlchemyInstrumentor ().instrument (
79
+ engine = engine ,
80
+ tracer_provider = self .tracer_provider ,
81
+ )
82
+
83
+ engine .connect ()
84
+ spans = self .memory_exporter .get_finished_spans ()
85
+ self .assertEqual (len (spans ), 1 )
70
86
71
87
@pytest .mark .skipif (
72
88
not sqlalchemy .__version__ .startswith ("1.4" ),
@@ -85,11 +101,15 @@ async def run():
85
101
async with engine .connect () as cnx :
86
102
await cnx .execute (sqlalchemy .text ("SELECT 1 + 1;" ))
87
103
spans = self .memory_exporter .get_finished_spans ()
88
- self .assertEqual (len (spans ), 1 )
89
- self .assertEqual (spans [0 ].name , "SELECT :memory:" )
104
+ self .assertEqual (len (spans ), 2 )
105
+ # first span - the connection to the db
106
+ self .assertEqual (spans [0 ].name , "connect" )
90
107
self .assertEqual (spans [0 ].kind , trace .SpanKind .CLIENT )
108
+ # second span - the query
109
+ self .assertEqual (spans [1 ].name , "SELECT :memory:" )
110
+ self .assertEqual (spans [1 ].kind , trace .SpanKind .CLIENT )
91
111
self .assertEqual (
92
- spans [0 ].instrumentation_scope .name ,
112
+ spans [1 ].instrumentation_scope .name ,
93
113
"opentelemetry.instrumentation.sqlalchemy" ,
94
114
)
95
115
@@ -99,7 +119,10 @@ def test_not_recording(self):
99
119
mock_tracer = mock .Mock ()
100
120
mock_span = mock .Mock ()
101
121
mock_span .is_recording .return_value = False
122
+ mock_span .__enter__ = mock .Mock (return_value = (mock .Mock (), None ))
123
+ mock_span .__exit__ = mock .Mock (return_value = None )
102
124
mock_tracer .start_span .return_value = mock_span
125
+ mock_tracer .start_as_current_span .return_value = mock_span
103
126
with mock .patch ("opentelemetry.trace.get_tracer" ) as tracer :
104
127
tracer .return_value = mock_tracer
105
128
engine = create_engine ("sqlite:///:memory:" )
@@ -123,11 +146,15 @@ def test_create_engine_wrapper(self):
123
146
cnx .execute ("SELECT 1 + 1;" ).fetchall ()
124
147
spans = self .memory_exporter .get_finished_spans ()
125
148
126
- self .assertEqual (len (spans ), 1 )
127
- self .assertEqual (spans [0 ].name , "SELECT :memory:" )
149
+ self .assertEqual (len (spans ), 2 )
150
+ # first span - the connection to the db
151
+ self .assertEqual (spans [0 ].name , "connect" )
128
152
self .assertEqual (spans [0 ].kind , trace .SpanKind .CLIENT )
153
+ # second span - the query
154
+ self .assertEqual (spans [1 ].name , "SELECT :memory:" )
155
+ self .assertEqual (spans [1 ].kind , trace .SpanKind .CLIENT )
129
156
self .assertEqual (
130
- spans [0 ].instrumentation_scope .name ,
157
+ spans [1 ].instrumentation_scope .name ,
131
158
"opentelemetry.instrumentation.sqlalchemy" ,
132
159
)
133
160
@@ -153,7 +180,7 @@ def test_custom_tracer_provider(self):
153
180
cnx .execute ("SELECT 1 + 1;" ).fetchall ()
154
181
spans = self .memory_exporter .get_finished_spans ()
155
182
156
- self .assertEqual (len (spans ), 1 )
183
+ self .assertEqual (len (spans ), 2 )
157
184
self .assertEqual (spans [0 ].resource .attributes ["service.name" ], "test" )
158
185
self .assertEqual (
159
186
spans [0 ].resource .attributes ["deployment.environment" ], "env"
@@ -177,11 +204,15 @@ async def run():
177
204
async with engine .connect () as cnx :
178
205
await cnx .execute (sqlalchemy .text ("SELECT 1 + 1;" ))
179
206
spans = self .memory_exporter .get_finished_spans ()
180
- self .assertEqual (len (spans ), 1 )
181
- self .assertEqual (spans [0 ].name , "SELECT :memory:" )
207
+ self .assertEqual (len (spans ), 2 )
208
+ # first span - the connection to the db
209
+ self .assertEqual (spans [0 ].name , "connect" )
182
210
self .assertEqual (spans [0 ].kind , trace .SpanKind .CLIENT )
211
+ # second span - the query
212
+ self .assertEqual (spans [1 ].name , "SELECT :memory:" )
213
+ self .assertEqual (spans [1 ].kind , trace .SpanKind .CLIENT )
183
214
self .assertEqual (
184
- spans [0 ].instrumentation_scope .name ,
215
+ spans [1 ].instrumentation_scope .name ,
185
216
"opentelemetry.instrumentation.sqlalchemy" ,
186
217
)
187
218
@@ -199,8 +230,8 @@ def test_generate_commenter(self):
199
230
cnx = engine .connect ()
200
231
cnx .execute ("SELECT 1 + 1;" ).fetchall ()
201
232
spans = self .memory_exporter .get_finished_spans ()
202
- self .assertEqual (len (spans ), 1 )
203
- span = spans [0 ]
233
+ self .assertEqual (len (spans ), 2 )
234
+ span = spans [1 ]
204
235
self .assertIn (
205
236
EngineTracer ._generate_comment (span ),
206
237
self .caplog .records [- 2 ].getMessage (),
0 commit comments