Skip to content

Commit

Permalink
Merge pull request #3551 from PetrusZ/cp/release_3.0.0_5
Browse files Browse the repository at this point in the history
cherry pick #3550 to release 3.0.0
  • Loading branch information
jamsman94 authored Jun 6, 2024
2 parents fd6cbf3 + 543f9c4 commit c7d9bec
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -509,7 +509,7 @@ func updateCVMProduct(exitedProd *commonmodels.Product, user, requestID string,
return fmt.Errorf("ListMaxRevisionsAllSvcByProduct: %s", err)
}
if services != nil {
svcNames := make([]string, len(services))
svcNames := make([]string, 0, len(services))
for _, svc := range services {
svcNames = append(svcNames, svc.ServiceName)
}
Expand Down
1 change: 1 addition & 0 deletions pkg/microservice/aslan/core/stat/service/ai/ai_analysis.go
Original file line number Diff line number Diff line change
Expand Up @@ -431,6 +431,7 @@ type AIAttentionResp struct {

type AttentionAnswer struct {
Project string `json:"project"`
ProjectAlias string `json:"project_alias"`
Result string `json:"result"`
Name string `json:"name"`
CurrentMonth string `json:"current_month"`
Expand Down
3 changes: 3 additions & 0 deletions pkg/microservice/aslan/core/stat/service/ai/stat_prompt.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,20 +65,23 @@ const AttentionPrompt = `你需要从两个月数据中做对比,分析出两
\"answer\": [
{
\"project\": \"项目A\",
\"project_alias\": \"项目A别名\",
\"result\": \"项目A测试成功率提升了47.2%\",
\"name\": \"test_success_rate\",
\"current_month\": \"77.20\",
\"last_month\": \"30.00\"
},
{
\"project\": \"项目B\",
\"project_alias\": \"项目B别名\",
\"result\": \"项目B需求交付周期延长5天\",
\"name\": \"requirement_development_lead_time\",
\"current_month\": \"20\",
\"last_month\": \"15\"
},
{
\"project\": \"项目R\",
\"project_alias\": \"项目R别名\",
\"result\": \"项目R发布频次提升20%\",
\"name\": \"release_frequency\",
\"current_month\": \"60.20\",
Expand Down
140 changes: 101 additions & 39 deletions pkg/microservice/aslan/core/stat/service/stat_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -356,8 +356,13 @@ func initializeStatDashboardConfig() error {
}

type DailyJobInfo struct {
Name string `json:"name"`
Data []int `json:"data"`
Name string `json:"name"`
Datas []DailyJobInfoData `json:"datas"`
}

type DailyJobInfoData struct {
Timestamp int64 `json:"timestamp"`
Count int `json:"count"`
}

type project30DayOverview struct {
Expand All @@ -373,7 +378,8 @@ type currently30DayOverview struct {
func GetProjectsOverview(start, end int64, logger *zap.SugaredLogger) ([]*DailyJobInfo, error) {
result, err := commonrepo.NewJobInfoColl().GetJobInfos(start, end, nil)
if err != nil {
logger.Debugf("failed to get coarse grained data from job_info collection, error: %s", err)
err = fmt.Errorf("failed to get coarse grained data from job_info collection, error: %s", err)
logger.Error(err)
return nil, err
}

Expand All @@ -391,21 +397,41 @@ func GetProjectsOverview(start, end int64, logger *zap.SugaredLogger) ([]*DailyJ
data: make([]*currently30DayOverview, 0),
}

currently30DayOverviewMap := map[int64]*struct {
buildDayData *currently30DayOverview
testDayData *currently30DayOverview
deployDayData *currently30DayOverview
}{}
for i := 0; i < len(result); i++ {
start := util.GetMidnightTimestamp(result[i].StartTime)
end := time.Unix(start, 0).Add(time.Hour*24 - time.Second).Unix()
buildDayData := &currently30DayOverview{
day: start,
count: 0,
}
testDayData := &currently30DayOverview{
day: start,
count: 0,
}
deployDayData := &currently30DayOverview{
day: start,
count: 0,
weekdayTimeStamp := util.GetEndOfWeekDayTimeStamp(time.Unix(result[i].StartTime, 0))
start := weekdayTimeStamp - 24*60*60*6
end := weekdayTimeStamp + 24*60*60

var (
buildDayData *currently30DayOverview
testDayData *currently30DayOverview
deployDayData *currently30DayOverview
)

if _, ok := currently30DayOverviewMap[weekdayTimeStamp]; !ok {
buildDayData = &currently30DayOverview{
day: weekdayTimeStamp,
count: 0,
}
testDayData = &currently30DayOverview{
day: weekdayTimeStamp,
count: 0,
}
deployDayData = &currently30DayOverview{
day: weekdayTimeStamp,
count: 0,
}
} else {
buildDayData = currently30DayOverviewMap[weekdayTimeStamp].buildDayData
testDayData = currently30DayOverviewMap[weekdayTimeStamp].testDayData
deployDayData = currently30DayOverviewMap[weekdayTimeStamp].deployDayData
}

for j := i; j < len(result); j++ {
if result[j].StartTime >= start && result[j].StartTime <= end {
switch result[j].Type {
Expand All @@ -431,36 +457,35 @@ func GetProjectsOverview(start, end int64, logger *zap.SugaredLogger) ([]*DailyJ
}

func reBuildData(start, end int64, data *project30DayOverview) *DailyJobInfo {
start = util.GetMidnightTimestamp(start)
resp := &DailyJobInfo{
Name: data.name,
Data: make([]int, 0),
Name: data.name,
Datas: make([]DailyJobInfoData, 0),
}

sort.Slice(data.data, func(i, j int) bool {
return data.data[i].day < data.data[j].day
})

index := 0
for day := start; day <= end; day = time.Unix(day, 0).Add(time.Hour * 24).Unix() {
if index < len(data.data) && util.IsSameDay(data.data[index].day, day) {
resp.Data = append(resp.Data, data.data[index].count)
index++
} else {
resp.Data = append(resp.Data, 0)
for _, d := range data.data {
jobInfodata := DailyJobInfoData{
Timestamp: d.day,
Count: d.count,
}
resp.Datas = append(resp.Datas, jobInfodata)
}
return resp
}

type Currently30DayBuildTrend struct {
Name string `json:"name"`
Data []int `json:"data"`
Name string `json:"name"`
Alias string `json:"alias"`
Data []int `json:"data"`
}

type project30DayBuildData struct {
Name string `json:"name"`
Data []*currently30DayBuildData `json:"data"`
Name string `json:"name"`
Alias string `json:"alias"`
Data []*currently30DayBuildData `json:"data"`
}

type currently30DayBuildData struct {
Expand All @@ -483,12 +508,24 @@ func GetCurrently30DayBuildTrend(startTime, endTime int64, projects []string, lo
return nil, err
}

projectInfos, err := templaterepo.NewProductColl().ListProjectBriefs(projects)
if err != nil {
err = fmt.Errorf("failed to get project infos for %v, error: %s", projects, err)
logger.Error(err)
return nil, err
}
projectAliasMap := map[string]string{}
for _, projectInfo := range projectInfos {
projectAliasMap[projectInfo.Name] = projectInfo.Alias
}

logger.Infof("start:%d, end:%d, get all project name: %v", startTime, endTime, projects)
resp := make([]*project30DayBuildData, 0)
for _, project := range projects {
trend := &project30DayBuildData{
Name: project,
Data: make([]*currently30DayBuildData, 0),
Name: project,
Alias: projectAliasMap[project],
Data: make([]*currently30DayBuildData, 0),
}

for i := 0; i < len(result); i++ {
Expand Down Expand Up @@ -543,8 +580,9 @@ func RebuildCurrently30DayBuildData(start, end int64, data []*project30DayBuildD
for _, project := range data {
index := 0
buildTrend := &Currently30DayBuildTrend{
Name: project.Name,
Data: make([]int, 0),
Name: project.Name,
Alias: project.Alias,
Data: make([]int, 0),
}
for day := start; day <= end; day = time.Unix(day, 0).Add(time.Hour * 24).Unix() {
sort.Slice(project.Data, func(i, j int) bool {
Expand All @@ -565,6 +603,7 @@ func RebuildCurrently30DayBuildData(start, end int64, data []*project30DayBuildD

type EfficiencyRadarData struct {
Name string `json:"name"`
Alias string `json:"alias"`
TestSuccessRate float64 `json:"test_success_rate"`
ReleaseFrequency float64 `json:"release_frequency"`
BuildFrequency float64 `json:"build_frequency"`
Expand All @@ -579,11 +618,22 @@ func GetEfficiencyRadar(startTime, endTime int64, projects []string, logger *zap
logger.Errorf("failed to get all project name from job_info collection, error: %s", err)
return nil, err
}
projectInfos, err := templaterepo.NewProductColl().ListProjectBriefs(projects)
if err != nil {
err = fmt.Errorf("failed to get project infos for %v, error: %s", projects, err)
logger.Error(err)
return nil, err
}
projectAliasMap := map[string]string{}
for _, projectInfo := range projectInfos {
projectAliasMap[projectInfo.Name] = projectInfo.Alias
}

resp := make([]*EfficiencyRadarData, 0)
for _, project := range projects {
radarData := &EfficiencyRadarData{
Name: project,
Name: project,
Alias: projectAliasMap[project],
}
// test pass rate
testStat, err := GetProjectTestStat(startTime, endTime, project)
Expand Down Expand Up @@ -639,8 +689,9 @@ func GetEfficiencyRadar(startTime, endTime int64, projects []string, logger *zap
}

type MonthAttention struct {
ProjectName string `json:"project_name"`
Facts []*MonthAttentionData `json:"facts"`
ProjectName string `json:"project_name"`
ProjectAlias string `json:"project_alias"`
Facts []*MonthAttentionData `json:"facts"`
}

type MonthAttentionData struct {
Expand All @@ -660,12 +711,23 @@ func GetMonthAttention(startTime, endTime int64, projects []string, logger *zap.
logger.Errorf("failed to get all project name from job_info collection, error: %s", err)
return nil, err
}
projectInfos, err := templaterepo.NewProductColl().ListProjectBriefs(projects)
if err != nil {
err = fmt.Errorf("failed to get project infos for %v, error: %s", projects, err)
logger.Error(err)
return nil, err
}
projectAliasMap := map[string]string{}
for _, projectInfo := range projectInfos {
projectAliasMap[projectInfo.Name] = projectInfo.Alias
}

resp := make([]*MonthAttention, 0)
for _, project := range projects {
monthAttention := &MonthAttention{
ProjectName: project,
Facts: []*MonthAttentionData{},
ProjectName: project,
ProjectAlias: projectAliasMap[project],
Facts: []*MonthAttentionData{},
}
// get build_success_rate
currentBuild, err := GetProjectBuildStat(CurrentMonthStart, CurrentMonthEnd, project)
Expand Down
15 changes: 15 additions & 0 deletions pkg/util/time.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ func IsSameDay(timestamp1 int64, timestamp2 int64) bool {

return t1.Year() == t2.Year() && t1.Month() == t2.Month() && t1.Day() == t2.Day()
}

func UnixStampToCronExpr(unixStamp int64) string {
// 将 Unix 时间戳转换为时间
t := time.Unix(unixStamp, 0)
Expand All @@ -121,3 +122,17 @@ func UnixStampToCronExpr(unixStamp int64) string {
cronExpr := fmt.Sprintf("%d %d %d %d", minute, hour, day, month)
return cronExpr
}

func GetEndOfWeekDayTimeStamp(t time.Time) int64 {
// 找到该时间的星期几
weekday := t.Weekday()

// 计算距离周日的天数
daysUntilSunday := (7 - int(weekday)) % 7

// 计算该周结束时那天的 0 点
endOfWeek := t.AddDate(0, 0, daysUntilSunday).Truncate(24 * time.Hour)

// 将计算结果转换为 Unix 时间戳
return endOfWeek.Unix()
}

0 comments on commit c7d9bec

Please sign in to comment.