Skip to content

Commit 15345a1

Browse files
committed
feat(dora): populate IsAuthoredByBot in project_pr_metrics based on env-defined pattern
Use ENABLE_BOT_FILTERING and BOT_FILTERING_PATTERN to flag PRs authored by bots during change lead time calculation.
1 parent 5691f59 commit 15345a1

File tree

4 files changed

+45
-16
lines changed

4 files changed

+45
-16
lines changed

backend/plugins/dora/e2e/calculate_change_lead_time_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ import (
3232
func TestCalculateCLTimeDataFlow(t *testing.T) {
3333
var plugin impl.Dora
3434
dataflowTester := e2ehelper.NewDataFlowTester(t, "dora", plugin)
35+
//setting these
36+
t.Setenv("ENABLE_BOT_FILTERING", "true")
37+
t.Setenv("BOT_FILTERING_PATTERN", ".*Renovate|Dependabot.*")
3538

3639
taskData := &tasks.DoraTaskData{
3740
Options: &tasks.DoraOptions{
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
id,project_name,first_commit_sha,pr_coding_time,first_review_id,pr_pickup_time,pr_review_time,deployment_commit_id,pr_deploy_time,pr_cycle_time,first_commit_authored_date,first_comment_date,pr_created_date,pr_merged_date,pr_deployed_date
2-
pr0,project1,pr0_commit0,1440,,,,,,44640,2022-01-10T04:51:47.000+00:00,,2022-01-11T04:51:47.000+00:00,2022-02-10T04:51:47.000+00:00,
3-
pr1,project1,08d2f2b6de0fa8de4d0e2b55b4b9a2e244214029,1440,comment02,5,55,5,2978,4478,2023-04-10T04:51:47.000+00:00,2023-04-11T04:56:47.000+00:00,2023-04-11T04:51:47.000+00:00,2023-04-11T05:51:47.000+00:00,2023-04-13T07:29:14.000+00:00
4-
pr2,project1,2537845559d8db99e9cda6190f32b50ec979c722,,comment04,1,60,5,1538,1598,2023-04-13T04:51:47.000+00:00,2023-04-12T04:51:49.000+00:00,2023-04-12T04:51:47.000+00:00,2023-04-12T05:51:47.000+00:00,2023-04-13T07:29:14.000+00:00
5-
pr3,project1,55f445997abbd5918da59d202d28762cd56fbd44,5883,comment07,,5760,6,,10203,2023-04-07T04:51:47.000+00:00,2023-04-10T06:53:51.000+00:00,2023-04-11T06:53:51.000+00:00,2023-04-14T06:53:51.000+00:00,2023-04-13T07:30:34.000+00:00
6-
pr4,project1,5ad0c09c447c19338f1dfbb65d89a3728962b3b7,11704,comment10,1500,,,,11764,2023-04-05T04:51:47.000+00:00,2023-04-14T08:55:01.000+00:00,2023-04-13T07:55:01.000+00:00,2023-04-13T08:55:01.000+00:00,
7-
pr5,project1,62535543802631a0d3daf0b0b78c6a7e05e508fb,13144,comment12,,313068,,,13204,2023-04-04T04:51:47.000+00:00,2022-09-07T23:07:13.000+00:00,2023-04-13T07:55:01.000+00:00,2023-04-13T08:55:01.000+00:00,
1+
id,project_name,first_commit_sha,pr_coding_time,first_review_id,pr_pickup_time,pr_review_time,deployment_commit_id,pr_deploy_time,pr_cycle_time,first_commit_authored_date,first_comment_date,pr_created_date,pr_merged_date,pr_deployed_date,is_authored_by_bot
2+
pr0,project1,pr0_commit0,1440,,,,,,44640,2022-01-10T04:51:47.000+00:00,,2022-01-11T04:51:47.000+00:00,2022-02-10T04:51:47.000+00:00,,0
3+
pr1,project1,08d2f2b6de0fa8de4d0e2b55b4b9a2e244214029,1440,comment02,5,55,5,2978,4478,2023-04-10T04:51:47.000+00:00,2023-04-11T04:56:47.000+00:00,2023-04-11T04:51:47.000+00:00,2023-04-11T05:51:47.000+00:00,2023-04-13T07:29:14.000+00:00,0
4+
pr2,project1,2537845559d8db99e9cda6190f32b50ec979c722,,comment04,1,60,5,1538,1598,2023-04-13T04:51:47.000+00:00,2023-04-12T04:51:49.000+00:00,2023-04-12T04:51:47.000+00:00,2023-04-12T05:51:47.000+00:00,2023-04-13T07:29:14.000+00:00,1
5+
pr3,project1,55f445997abbd5918da59d202d28762cd56fbd44,5883,comment07,,5760,6,,10203,2023-04-07T04:51:47.000+00:00,2023-04-10T06:53:51.000+00:00,2023-04-11T06:53:51.000+00:00,2023-04-14T06:53:51.000+00:00,2023-04-13T07:30:34.000+00:00,1
6+
pr4,project1,5ad0c09c447c19338f1dfbb65d89a3728962b3b7,11704,comment10,1500,,,,11764,2023-04-05T04:51:47.000+00:00,2023-04-14T08:55:01.000+00:00,2023-04-13T07:55:01.000+00:00,2023-04-13T08:55:01.000+00:00,,0
7+
pr5,project1,62535543802631a0d3daf0b0b78c6a7e05e508fb,13144,comment12,,313068,,,13204,2023-04-04T04:51:47.000+00:00,2022-09-07T23:07:13.000+00:00,2023-04-13T07:55:01.000+00:00,2023-04-13T08:55:01.000+00:00,,0
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
id,base_repo_id,author_id,merge_commit_sha,created_date,merged_date,_raw_data_remark,base_commit_sha,head_commit_sha
2-
pr0,repo1,a,pr_merge_commit0,2022-1-11 4:51:47,2022-2-10 4:51:47,deployment_commit 0,,
3-
pr1,repo1,a,pr_merge_commit1,2023-4-11 4:51:47,2023-4-11 5:51:47,deployment_commit 5,,
4-
pr2,repo1,a,pr_merge_commit2,2023-4-12 4:51:47,2023-4-12 5:51:47,deployment_commit 5,,
5-
pr3,repo1,a,pr_merge_commit3,2023-4-11 6:53:51,2023-4-14 6:53:51,deployment_commit 6,,
6-
pr4,repo1,,pr_merge_commit4,2023-4-13 7:55:01,2023-4-13 8:55:01,,,
7-
pr5,repo1,,pr_merge_commit5,2023-4-13 7:55:01,2023-4-13 8:55:01,,,
8-
pr6,repo1,,pr_merge_commit6,2023-4-13 7:55:01,,,,
1+
id,base_repo_id,author_id,author_name,merge_commit_sha,created_date,merged_date,_raw_data_remark,base_commit_sha,head_commit_sha
2+
pr0,repo1,a,John Doe,pr_merge_commit0,2022-1-11 4:51:47,2022-2-10 4:51:47,deployment_commit 0,,
3+
pr1,repo1,a,John Doe,pr_merge_commit1,2023-4-11 4:51:47,2023-4-11 5:51:47,deployment_commit 5,,
4+
pr2,repo1,a,Renovate,pr_merge_commit2,2023-4-12 4:51:47,2023-4-12 5:51:47,deployment_commit 5,,
5+
pr3,repo1,a,Dependabot,pr_merge_commit3,2023-4-11 6:53:51,2023-4-14 6:53:51,deployment_commit 6,,
6+
pr4,repo1,,,pr_merge_commit4,2023-4-13 7:55:01,2023-4-13 8:55:01,,,
7+
pr5,repo1,,,pr_merge_commit5,2023-4-13 7:55:01,2023-4-13 8:55:01,,,
8+
pr6,repo1,,,pr_merge_commit6,2023-4-13 7:55:01,,,,

backend/plugins/dora/tasks/change_lead_time_calculator.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ package tasks
2020
import (
2121
"math"
2222
"reflect"
23+
"regexp"
2324
"time"
2425

26+
"github.com/apache/incubator-devlake/core/config"
2527
"github.com/apache/incubator-devlake/core/dal"
2628
"github.com/apache/incubator-devlake/core/errors"
2729
"github.com/apache/incubator-devlake/core/models/domainlayer/code"
@@ -52,9 +54,25 @@ func CalculateChangeLeadTime(taskCtx plugin.SubTaskContext) errors.Error {
5254
return errors.Default.Wrap(err, "error deleting previous project_pr_metrics")
5355
}
5456

57+
// Get env vars
58+
cfg := config.GetConfig()
59+
enableBotFiltering := cfg.GetBool("ENABLE_BOT_FILTERING")
60+
botFilteringPattern := cfg.GetString("BOT_FILTERING_PATTERN")
61+
62+
// Precompile bot filtering regex if enabled and pattern is set
63+
var botFilteringRegex *regexp.Regexp
64+
if enableBotFiltering && botFilteringPattern != "" {
65+
var err error
66+
botFilteringRegex, err = regexp.Compile(botFilteringPattern)
67+
if err != nil {
68+
logger.Warn(err, "Invalid bot filtering pattern: %s", botFilteringPattern)
69+
botFilteringRegex = nil
70+
}
71+
}
72+
5573
// Get pull requests by repo project_name
5674
var clauses = []dal.Clause{
57-
dal.Select("pr.id, pr.pull_request_key, pr.author_id, pr.merge_commit_sha, pr.created_date, pr.merged_date"),
75+
dal.Select("pr.id, pr.pull_request_key, pr.author_id, pr.author_name, pr.merge_commit_sha, pr.created_date, pr.merged_date"),
5876
dal.From("pull_requests pr"),
5977
dal.Join(`LEFT JOIN project_mapping pm ON (pm.row_id = pr.base_repo_id)`),
6078
dal.Where("pr.merged_date IS NOT NULL AND pm.project_name = ? AND pm.table = 'repos'", data.Options.ProjectName),
@@ -95,6 +113,7 @@ func CalculateChangeLeadTime(taskCtx plugin.SubTaskContext) errors.Error {
95113
projectPrMetric.FirstCommitSha = firstCommit.CommitSha
96114
projectPrMetric.FirstCommitAuthoredDate = &firstCommit.CommitAuthoredDate
97115
}
116+
projectPrMetric.IsAuthoredByBot = matchesBotFilter(botFilteringRegex, pr.AuthorName)
98117

99118
// Get the first review for the PR
100119
firstReview, err := getFirstReview(pr.Id, pr.AuthorId, db)
@@ -244,3 +263,10 @@ func computeTimeSpan(start, end *time.Time) *int64 {
244263
}
245264
return &minutes
246265
}
266+
267+
func matchesBotFilter(botFilterRegex *regexp.Regexp, name string) bool {
268+
if botFilterRegex == nil {
269+
return false
270+
}
271+
return botFilterRegex.MatchString(name)
272+
}

0 commit comments

Comments
 (0)