diff --git a/bugbot/rules/performancebug.py b/bugbot/rules/performancebug.py new file mode 100644 index 000000000..2876976cc --- /dev/null +++ b/bugbot/rules/performancebug.py @@ -0,0 +1,80 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. + +from bugbot.bugbug_utils import get_bug_ids_classification +from bugbot.bzcleaner import BzCleaner +from bugbot.utils import nice_round + + +class PerformanceBug(BzCleaner): + def __init__(self, confidence_threshold: float = 0.9): + """ + Initialize the PerformanceBug class. + + Args: + confidence_threshold: The confidence threshold for + considering a bug as a performance bug. + """ + super().__init__() + self.confidence_threshold = confidence_threshold + + def description(self): + return "[Using ML] Bugs with Missing Performance Impact" + + def columns(self): + return ["id", "summary", "confidence", "autofixed"] + + def get_bz_params(self, date): + start_date, _ = self.get_dates(date) + + params = { + "f1": "creation_ts", + "o1": "greaterthan", + "v1": start_date, + "f2": "keywords", + "o2": "nowords", + "v2": "perf,topperf,main-thread-io", + "f3": "cf_performance_impact", + "o3": "equals", + "v3": ["---"], + } + + return params + + def get_bugs(self, date="today", bug_ids=[]): + raw_bugs = super().get_bugs(date=date, bug_ids=bug_ids, chunk_size=7000) + + if len(raw_bugs) == 0: + return {} + + bug_ids = list(raw_bugs.keys()) + + bugs = get_bug_ids_classification("performancebug", bug_ids) + + results = {} + + for bug_id, bug_data in bugs.items(): + if not bug_data.get("available", True): + # The bug was not available, it was either removed or is a + # security bug + continue + + bug = raw_bugs[bug_id] + prob = bug_data["prob"] + + if prob[1] < 0.2: + continue + + results[bug_id] = { + "id": bug_id, + "summary": bug["summary"], + "confidence": nice_round(prob[1]), + "autofixed": prob[1] >= self.confidence_threshold, + } + + return results + + +if __name__ == "__main__": + PerformanceBug().run() diff --git a/configs/rules.json b/configs/rules.json index 7bbdd4db7..c6020fd02 100644 --- a/configs/rules.json +++ b/configs/rules.json @@ -419,6 +419,10 @@ "confidence_threshold": 0.95, "cc": [] }, + "performancebug": { + "max_days_in_cache": 7, + "days_lookup": 7 + }, "stepstoreproduce": { "max_days_in_cache": 7, "days_lookup": 3, diff --git a/scripts/cron_run_daily.sh b/scripts/cron_run_daily.sh index adb3ca9e7..6b8f91f81 100755 --- a/scripts/cron_run_daily.sh +++ b/scripts/cron_run_daily.sh @@ -9,6 +9,9 @@ python -m bugbot.iam # Daily (but really runs during the soft freeze week) python -m bugbot.rules.code_freeze_week -D yesterday --production +# Try to detect potential performance-related bugs using bugbug +python -m bugbot.rules.performancebug --production + # Send a mail if the logs are not empty # MUST ALWAYS BE THE LAST COMMAND python -m bugbot.log --send diff --git a/templates/performancebug.html b/templates/performancebug.html new file mode 100644 index 000000000..38c227940 --- /dev/null +++ b/templates/performancebug.html @@ -0,0 +1,25 @@ +
+ The following {{ plural('bug is', data, pword='bugs are') }} probably performance related and {{ plural('doesn\'t', data, pword='don\'t') }} have performance impact value: +
+Bug | +Summary | +Confidence (%) | +
---|---|---|
+ {{ bugid }} + | +{{ summary | e }} | +{{ confidence }} | +