package monkey
import (
"autogo/common"
"autogo/controllers"
"autogo/dbsql"
"autogo/models"
"encoding/json"
"fmt"
"net/http"
"strings"
"github.com/gin-gonic/gin"
"github.com/spf13/cast"
)
type anomaly struct {
TaskId int `json:"task_id"`
Udid string `json:"udid"`
Anomalies []string `json:"anomalies"`
CoverdPages []string `json:"coverd_pages"`
Logs []string `json:"logs"`
}
// @Tags Monkey相关 /api/monkey/v2/
// @Summary 上报Monkey异常
// @Description 上报Monkey异常
// @accept x-www-form-urlencoded
// @Param task_id formData int true "任务id"
// @Param crash_log_list formData string false "要更新的任务状态"
// @Param activity_name_info formData string false "要更新的任务状态"
// @Param device_name formData string false "要更新的任务状态"
// @Param status formData string false "要更新的任务状态"
// @Success 200 {object} models.Response "返回更新后的任务信息"
// @Router /api/monkey/v2/task/store_anomaly [post]
func StoreMonkeyAnomaly(c *gin.Context) {
rsp := controllers.NewResponse()
var ano anomaly
err := c.ShouldBindJSON(&ano)
if err != nil {
c.JSON(http.StatusOK, rsp.Error("json解析失败: "+err.Error()))
return
}
var res models.MonkeyAnomaly
res.TaskId = cast.ToInt(ano.TaskId)
if res.TaskId < 1 {
rsp.Error("task_id error:" + c.PostForm("task_id"))
c.JSON(http.StatusOK, rsp)
return
}
if len(ano.Anomalies) > 0 {
buf, _ := json.Marshal(ano.Anomalies)
res.Anomalies = ano.Anomalies
res.AnomalyInfos = string(buf)
}
if len(ano.CoverdPages) > 0 {
res.CoverdPages = strings.Join(ano.CoverdPages, ",")
}
res.Udid = ano.Udid
if len(ano.Logs) > 0 {
res.Logs = strings.Join(ano.Logs, ",")
}
db, err := dbsql.GetConn(dbsql.DSN)
if err != nil {
rsp.Error(err.Error())
c.JSON(http.StatusOK, rsp)
return
}
defer dbsql.Close(db)
db.Table(res.TableName()).Model(models.MonkeyAnomaly{}).Create(&res)
if res.ID < 1 {
rsp.Error("保存Monkey异常失败")
c.JSON(http.StatusOK, rsp)
return
}
rsp.Success()
rsp.Data = res
c.JSON(http.StatusOK, rsp)
go createTbBug(res)
}
// @Tags Monkey相关 /api/monkey/v2/
// @Summary 获取Monkey异常信息
// @Description 通过任务id获取Monkey异常信息
// @accept x-www-form-urlencoded
// @Param task_id query int true "任务id"
// @Success 200 {object} models.Response "返回任务结果"
// @Router /api/monkey/v2/task/get_anomalies [get]
func GetMonkeyAnomaliesByTaskId(c *gin.Context) {
rsp := controllers.NewResponse()
var list []models.MonkeyAnomaly
db, err := dbsql.GetConn(dbsql.DSN)
if err != nil {
rsp.Error(err.Error())
c.JSON(http.StatusOK, rsp)
return
}
defer dbsql.Close(db)
db.Where("task_id = ?", c.Query("task_id")).Find(&list)
for i, _ := range list {
list[i].JsonReady()
}
rsp.Success()
rsp.Data = list
c.JSON(http.StatusOK, rsp)
}
func createTbBug(ano models.MonkeyAnomaly) {
// 暂时忽略anr提单
if strings.Contains(ano.AnomalyInfos, "ANR in") {
fmt.Println("[Debug]", "anr异常将跳过提单逻辑")
return
}
db, err := dbsql.GetConn(dbsql.DSN)
if err != nil {
fmt.Println("[createTbBug]", err)
return
}
defer dbsql.Close(db)
// 先查询当前monkey任务已有的异常
var list []models.MonkeyAnomaly
db.Table(ano.TableName()).Model(models.MonkeyAnomaly{}).Where("task_id = ?", ano.TaskId).Find(&list)
// 标记当前异常是否已上报过
is_exist := false
var task models.MonkeyTask
db.Model(models.MonkeyTask{}).Where("id = ?", ano.TaskId).Last(&task)
if task.Id < 1 {
fmt.Println("[createTbBug]", "没有找到monkey任务,id -", ano.TaskId)
return
}
bug_type := "Other"
if strings.Contains(ano.AnomalyInfos, "FATAL EXCEPTION") {
bug_type = "EXCEPTION"
}
content := "**异常ID:**" + cast.ToString(ano.ID) + " "
content += "**关联Monkey报告:** [点击查看](http://qa.flatincbr.work/#/monkey/result/" + cast.ToString(ano.TaskId) + ")" + "\n\n
\n\n"
content += "**上报时间:**" + ano.CreateTime.Format("2006-01-02 15:04:05") + "\n\n
\n\n"
content += "**应用版本:**" + task.Version + "\n\n
\n\n"
content += "**信息预览:**" + "\n\n"
title := "【Monkey测试】"
ano.JsonReady()
for i, v := range ano.Anomalies {
for ii, vv := range strings.Split(v, "\n") {
content += "> " + vv + "\n"
switch bug_type {
case "EXCEPTION":
// 取第一行(异常发生未知)和第三行(异常类型)内容拼接
if i == 0 && ii == 0 {
_strs := strings.Split(vv, "): ")
if len(_strs) > 1 {
title += _strs[1] + " - "
}
} else if i == 0 && ii == 2 {
_strs := strings.Split(vv, "): ")
if len(_strs) > 1 {
title += _strs[1]
// 比较历史异常中是否已经出现
for _, v := range list {
if strings.Contains(v.AnomalyInfos, _strs[1]) {
// 相似,不上报了,但还是会存库里
is_exist = true
}
}
}
}
default:
if i == 0 && ii == 0 {
title += "未知异常 - " + vv
}
}
if ii > 10 {
break
}
}
content += "> " + "——————————————————————" + "\n"
}
content += "> " + "(...更多请查看Monkey报告)" + "\n"
content += "\n"
// 如果已标记当前异常已经上报过,则跳过提单逻辑
if is_exist {
// 这里可以再额外处理
common.PushLog("Monkey", "相似异常已存在,不再提单,task_id="+cast.ToString(ano.TaskId)+"\n"+title)
return
}
// 初始化提单bug对象
bug := common.NewBug(task.Project) // task.Project
bug.SetTitle(title).
SetPlatform(task.Platform).
SetContent(content)
if task.Platform == "adr" {
bug.SetCategory(common.BugCategory_Anomaly_adr)
} else {
bug.SetCategory(common.BugCategory_Anomaly_ios)
}
id, err := bug.Create()
if err != nil {
fmt.Println(err)
return
}
fmt.Println("缺陷创建成功:", "https://www.teambition.com/task/"+id)
db.Table(ano.TableName()).Model(models.MonkeyAnomaly{}).Where("id = ?", ano.ID).Update("bug_id", id)
}