Skip to content

Commit dc41f5a

Browse files
authored
[Monitoring] Adding a blackbox fuzzer testcase generation time metric (#4414)
### Motivation Chrome folks need to know how long on average a fuzzer takes to generate a testcase. This PR implements that. Part of #4271
1 parent 28eb374 commit dc41f5a

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

src/clusterfuzz/_internal/bot/tasks/utasks/fuzz_task.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,6 +1567,23 @@ def do_engine_fuzzing(self, engine_impl):
15671567

15681568
return crashes, fuzzer_metadata
15691569

1570+
def _emit_testcase_generation_time_metric(self, start_time, testcase_count,
1571+
fuzzer, job):
1572+
testcase_generation_finish = time.time()
1573+
elapsed_testcase_generation_time = testcase_generation_finish
1574+
elapsed_testcase_generation_time -= start_time
1575+
# Avoid division by zero.
1576+
if testcase_count:
1577+
average_time_per_testcase = elapsed_testcase_generation_time
1578+
average_time_per_testcase = average_time_per_testcase / testcase_count
1579+
monitoring_metrics.TESTCASE_GENERATION_AVERAGE_TIME.add(
1580+
average_time_per_testcase,
1581+
labels={
1582+
'job': job,
1583+
'fuzzer': fuzzer,
1584+
'platform': environment.platform(),
1585+
})
1586+
15701587
def do_blackbox_fuzzing(self, fuzzer, fuzzer_directory, job_type):
15711588
"""Run blackbox fuzzing. Currently also used for engine fuzzing."""
15721589
# Set the thread timeout values.
@@ -1590,11 +1607,15 @@ def do_blackbox_fuzzing(self, fuzzer, fuzzer_directory, job_type):
15901607

15911608
# Run the fuzzer to generate testcases. If error occurred while trying
15921609
# to run the fuzzer, bail out.
1610+
testcase_generation_start = time.time()
15931611
generate_result = self.generate_blackbox_testcases(
15941612
fuzzer, job_type, fuzzer_directory, testcase_count)
15951613
if not generate_result.success:
15961614
return None, None, None, None
15971615

1616+
self._emit_testcase_generation_time_metric(
1617+
testcase_generation_start, testcase_count, fuzzer.name, job_type)
1618+
15981619
environment.set_value('FUZZER_NAME', self.fully_qualified_fuzzer_name)
15991620

16001621
# Initialize a list of crashes.

src/clusterfuzz/_internal/metrics/monitoring_metrics.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,19 @@
140140
],
141141
)
142142

143+
TESTCASE_GENERATION_AVERAGE_TIME = monitor.CumulativeDistributionMetric(
144+
'task/fuzz/fuzzer/testcase_generation_duration',
145+
bucketer=monitor.GeometricBucketer(),
146+
description=('Distribution of blackbox fuzzer average testcase '
147+
' generation time, in seconds '
148+
'(grouped by fuzzer, job and platform).'),
149+
field_spec=[
150+
monitor.StringField('platform'),
151+
monitor.StringField('job'),
152+
monitor.StringField('fuzzer'),
153+
],
154+
)
155+
143156
FUZZER_TESTCASE_COUNT_RATIO = monitor.CumulativeDistributionMetric(
144157
'task/fuzz/fuzzer/testcase_count_ratio',
145158
bucketer=monitor.FixedWidthBucketer(width=0.05, num_finite_buckets=20),

0 commit comments

Comments
 (0)