Skip to content

Commit 6bfc5d3

Browse files
committed
Add row count and affected rows to Trilogy spans
Identifying queries that return/update many rows is very useful for improving database performance. Queries that return many rows can cause applications to use excess memory (or in some cases like Vitess) could be blocked altogether. Queries that update many rows can cause replication lag and generally put more pressure on a database. This commit adds both of these values (row_count and affected_rows) to spans created from Trilogy#query to help identify these problematic queries. Trilogy::Result#count will always return a value (0 for mutations), but #affected_rows only returns values for mutations (nil for SELECTs).
1 parent 45d0a54 commit 6bfc5d3

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

instrumentation/trilogy/lib/opentelemetry/instrumentation/trilogy/patches/client.rb

+9-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def query(sql)
4949
OpenTelemetry::Instrumentation::Trilogy.attributes
5050
),
5151
kind: :client
52-
) do |_span, context|
52+
) do |span, context|
5353
if propagator && sql.frozen?
5454
sql = +sql
5555
propagator.inject(sql, context: context)
@@ -58,7 +58,14 @@ def query(sql)
5858
propagator.inject(sql, context: context)
5959
end
6060

61-
super
61+
result = super
62+
63+
attributes = { 'db.response.returned_rows' => result.count }
64+
attributes['db.response.affected_rows'] = result.affected_rows unless result.affected_rows.nil?
65+
66+
span.add_attributes(attributes)
67+
68+
result
6269
end
6370
end
6471

instrumentation/trilogy/test/opentelemetry/instrumentation/trilogy/instrumentation_test.rb

+20
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,26 @@
164164
_(span.attributes[OpenTelemetry::SemanticConventions::Trace::DB_SYSTEM]).must_equal 'mysql'
165165
_(span.attributes[OpenTelemetry::SemanticConventions::Trace::DB_STATEMENT]).must_equal 'DESELECT ?'
166166
end
167+
168+
it 'includes row count' do
169+
client.query('SELECT 1')
170+
171+
_(span.attributes['db.response.returned_rows']).must_equal(1)
172+
end
173+
174+
it 'includes affected rows' do
175+
client.query(<<~SQL)
176+
CREATE TABLE products (
177+
product_id int
178+
)
179+
SQL
180+
181+
client.query('INSERT INTO products (product_id) VALUES (1), (2), (3)')
182+
183+
_(exporter.finished_spans.last.attributes['db.response.affected_rows']).must_equal(3)
184+
ensure
185+
client.query('DROP TABLE IF EXISTS products')
186+
end
167187
end
168188

169189
describe 'when connecting' do

0 commit comments

Comments
 (0)