@@ -69,19 +69,24 @@ def test_method_for_line_probe
69
69
end
70
70
end
71
71
72
- def run_benchmark
72
+ attr_reader :instrumenter
73
+
74
+ def logger
75
+ @logger ||= Logger . new ( STDERR )
76
+ end
77
+
78
+ def configure
73
79
settings = Datadog . configuration
74
- # We benchmark untargeted and targeted trace points; untargeted ones
75
- # are prohibited by default, permit them.
76
- begin
77
- settings . dynamic_instrumentation . internal . untargeted_trace_points = true
78
- rescue NoMethodError
79
- settings . dynamic_instrumentation . untargeted_trace_points = true
80
- end
80
+ yield settings if block_given?
81
+
81
82
redactor = Datadog ::DI ::Redactor . new ( settings )
82
83
serializer = Datadog ::DI ::Serializer . new ( settings , redactor )
83
- logger = Logger . new ( STDERR )
84
- instrumenter = Datadog ::DI ::Instrumenter . new ( settings , serializer , logger )
84
+ @instrumenter = Datadog ::DI ::Instrumenter . new ( settings , serializer , logger ,
85
+ code_tracker : Datadog ::DI . code_tracker )
86
+ end
87
+
88
+ def run_benchmark
89
+ configure
85
90
86
91
m = Target . instance_method ( :test_method_for_line_probe )
87
92
file , line = m . source_location
@@ -103,9 +108,12 @@ def run_benchmark
103
108
calls = 0
104
109
probe = Datadog ::DI ::Probe . new ( id : 1 , type : :log ,
105
110
type_name : 'DIInstrumentBenchmark::Target' , method_name : 'test_method' )
106
- instrumenter . hook_method ( probe ) do
111
+ rv = instrumenter . hook_method ( probe ) do
107
112
calls += 1
108
113
end
114
+ unless rv
115
+ raise "Method probe was not successfully installed"
116
+ end
109
117
110
118
Benchmark . ips do |x |
111
119
benchmark_time = VALIDATE_BENCHMARK_MODE ? { time : 0.01 , warmup : 0 } : { time : 10 , warmup : 2 }
@@ -131,21 +139,31 @@ def run_benchmark
131
139
132
140
instrumenter . unhook ( probe )
133
141
134
- =begin Line probes require more of DI code to be merged
142
+ # We benchmark untargeted and targeted trace points; untargeted ones
143
+ # are prohibited by default, permit them.
144
+ # In order to install untargeted trace point, we currently need to
145
+ # disable code tracking.
146
+ Datadog ::DI . deactivate_tracking!
147
+ configure do |c |
148
+ c . dynamic_instrumentation . internal . untargeted_trace_points = true
149
+ end
150
+
135
151
calls = 0
136
152
probe = Datadog ::DI ::Probe . new ( id : 1 , type : :log ,
137
153
file : file , line_no : line + 1 )
138
- instrumenter.hook_line(probe) do
154
+ rv = instrumenter . hook_line ( probe ) do
139
155
calls += 1
140
156
end
157
+ unless rv
158
+ raise "Line probe (in method) was not successfully installed"
159
+ end
141
160
142
161
Benchmark . ips do |x |
143
162
benchmark_time = VALIDATE_BENCHMARK_MODE ? { time : 0.01 , warmup : 0 } : { time : 10 , warmup : 2 }
144
163
x . config (
145
164
**benchmark_time ,
146
165
)
147
-
148
- x.report('line instrumentation') do
166
+ x . report ( 'line instrumentation - untargeted' ) do
149
167
Target . new . test_method_for_line_probe
150
168
end
151
169
@@ -161,7 +179,13 @@ def run_benchmark
161
179
raise "Expected at least 1000 calls to the method, got #{ calls } "
162
180
end
163
181
182
+ instrumenter . unhook ( probe )
183
+
164
184
Datadog ::DI . activate_tracking!
185
+ configure do |c |
186
+ c . dynamic_instrumentation . internal . untargeted_trace_points = false
187
+ end
188
+
165
189
if defined? ( DITarget )
166
190
raise "DITarget is already defined, this should not happen"
167
191
end
@@ -173,13 +197,15 @@ def run_benchmark
173
197
m = DITarget . instance_method ( :test_method_for_line_probe )
174
198
targeted_file , targeted_line = m . source_location
175
199
176
- instrumenter.unhook(probe)
177
200
calls = 0
178
201
probe = Datadog ::DI ::Probe . new ( id : 1 , type : :log ,
179
202
file : targeted_file , line_no : targeted_line + 1 )
180
- instrumenter.hook_line(probe) do
203
+ rv = instrumenter . hook_line ( probe ) do
181
204
calls += 1
182
205
end
206
+ unless rv
207
+ raise "Line probe (targeted) was not successfully installed"
208
+ end
183
209
184
210
Benchmark . ips do |x |
185
211
benchmark_time = VALIDATE_BENCHMARK_MODE ? { time : 0.01 , warmup : 0 } : { time : 10 , warmup : 2 }
@@ -207,7 +233,6 @@ def run_benchmark
207
233
# target code is approximately what it was prior to hook installation.
208
234
209
235
instrumenter . unhook ( probe )
210
- =end
211
236
212
237
calls = 0
213
238
0 commit comments