agent/clientreport/panicreport.go (45 lines of code) (raw):
package clientreport
import (
"encoding/json"
"fmt"
"github.com/aliyun/aliyun_assist_client/agent/log"
"github.com/aliyun/aliyun_assist_client/thirdparty/sirupsen/logrus"
)
type panicInfo struct {
Panic string `json:"panic"`
Stacktrace string `json:"stacktrace"`
Ignore bool `json:"ignore"`
}
// LogAndReportPanic reports panic to server and log to file then exit
func LogAndReportPanic(payload interface{}, stacktrace []byte) {
ReportPanic(payload, stacktrace, true)
}
func LogAndReportIgnorePanic(payload interface{}, stacktrace []byte) {
ReportPanic(payload, stacktrace, false)
}
// ReportPanic reports panic to server and log to file, exit program or ignore according to exit parameter
func ReportPanic(payload interface{}, stacktrace []byte, exit bool) {
info := panicInfo{
Panic: fmt.Sprint(payload),
Stacktrace: string(stacktrace),
Ignore: !exit,
}
infoJSONBytes, err := json.Marshal(info)
if err != nil {
log.GetLogger().WithError(err).Errorln("Failed to stringify panic information")
} else {
report := ClientReport{
ReportType: "AgentPanic",
Info: string(infoJSONBytes),
}
_, err = SendReport(report)
if err != nil {
log.GetLogger().WithFields(logrus.Fields{
"report": report,
}).WithError(err).Errorln("Failed to send panic report")
}
}
if exit {
log.GetLogger().Fatalf("panic: %v\n\n%s", payload, stacktrace)
} else {
log.GetLogger().Errorf("panic ignored: %v\n\n%s", payload, stacktrace)
}
}