From f84fd438f2942a65f776b98d02fd866d9704a5f6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=83=88=E9=A6=99?= <hengyoush1@163.com>
Date: Thu, 19 Dec 2024 01:54:08 +0800
Subject: [PATCH] feat: Print osinfo when start failed (#191)

* feat: print os info when start failed

* feat: add system info logging for crash reports

* refactor: remove unsed log

* refactor: add faq url
---
 agent/agent.go | 52 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 51 insertions(+), 1 deletion(-)

diff --git a/agent/agent.go b/agent/agent.go
index 7ef6825d..c1298296 100644
--- a/agent/agent.go
+++ b/agent/agent.go
@@ -2,6 +2,7 @@ package agent
 
 import (
 	"context"
+	"fmt"
 	"kyanos/agent/analysis"
 	anc "kyanos/agent/analysis/common"
 	ac "kyanos/agent/common"
@@ -15,7 +16,10 @@ import (
 	"kyanos/bpf/loader"
 	"kyanos/common"
 	"os"
+	"os/exec"
 	"os/signal"
+	"runtime"
+	"strings"
 	"sync"
 	"syscall"
 	"time"
@@ -139,7 +143,7 @@ func SetupAgent(options ac.AgentOptions) {
 		common.AgentLog.Info("Waiting for events..")
 	}
 	if _bf.Err != nil {
-		common.AgentLog.Error("Failed to load BPF: ", _bf.Err)
+		logSystemInfo(_bf.Err)
 		return
 	}
 
@@ -170,6 +174,52 @@ func SetupAgent(options ac.AgentOptions) {
 	return
 }
 
+func logSystemInfo(loadError error) {
+	common.SetLogToStdout()
+	info := []string{
+		"OS: " + runtime.GOOS,
+		"Arch: " + runtime.GOARCH,
+		"NumCPU: " + fmt.Sprintf("%d", runtime.NumCPU()),
+		"GoVersion: " + runtime.Version(),
+	}
+
+	kernelVersion, err := exec.Command("uname", "-r").Output()
+	if err == nil {
+		info = append(info, "Kernel Version: "+strings.TrimSpace(string(kernelVersion)))
+	} else {
+		info = append(info, "Failed to get kernel version: "+err.Error())
+	}
+
+	osRelease, err := exec.Command("cat", "/etc/os-release").Output()
+	if err == nil {
+		info = append(info, strings.TrimSpace(string(osRelease)))
+	} else {
+		info = append(info, "Failed to get Linux distribution: "+err.Error())
+	}
+
+	const crashReportFormat = `
+===================================
+	  Kyanos Crash Report
+=========Error Message=============
+%s
+============OS Info================
+%s
+===================================
+FAQ         : https://kyanos.io/faq.html
+Submit issue: https://github.com/hengyoush/kyanos/issues
+
+`
+
+	var errorInfo string
+	if loadError != nil {
+		errorInfo = "Error: " + loadError.Error()
+	} else {
+		errorInfo = "No load errors detected."
+	}
+
+	fmt.Printf(crashReportFormat, errorInfo, strings.Join(info, "\n"))
+}
+
 func startGopsServer(opts ac.AgentOptions) {
 	if opts.WatchOptions.DebugOutput {
 		if err := gops.Listen(gops.Options{}); err != nil {