diff --git a/pkg/infra/supportbundles/supportbundlesimpl/collectors.go b/pkg/infra/supportbundles/supportbundlesimpl/collectors.go index 73f05255b55..eee4a047df6 100644 --- a/pkg/infra/supportbundles/supportbundlesimpl/collectors.go +++ b/pkg/infra/supportbundles/supportbundlesimpl/collectors.go @@ -3,6 +3,8 @@ package supportbundlesimpl import ( "context" "encoding/json" + "fmt" + "runtime" "time" "github.com/grafana/grafana/pkg/infra/supportbundles" @@ -21,13 +23,52 @@ func basicCollector(cfg *setting.Cfg) supportbundles.Collector { Default: true, Fn: func(ctx context.Context) (*supportbundles.SupportItem, error) { type basicInfo struct { - Version string `json:"version"` - Commit string `json:"commit"` + Version string `json:"version"` // Version is the version of Grafana instance. + Commit string `json:"commit"` // Commit is the commit hash of the Grafana instance. + CollectionDate time.Time `json:"collection_date"` // CollectionDate is the date when the support bundle was created. + DefaultTimezone string `json:"default_timezone"` // DefaultTimezone is the default timezone of the Grafana instance. + Alloc uint64 `json:"alloc"` // Alloc is bytes of allocated heap objects. + TotalAlloc uint64 `json:"total_alloc"` // TotalAlloc is cumulative bytes allocated for heap objects. + Sys uint64 `json:"sys"` // Sys is the total bytes of memory obtained from the OS. + Mallocs uint64 `json:"mallocs"` // Mallocs is the cumulative count of heap objects allocated. + Frees uint64 `json:"frees"` // Frees is the cumulative count of heap objects freed. + NumGC uint32 `json:"num_gc"` // NumGC is the number of completed GC cycles. + PauseTotalNs uint64 `json:"pause_total_ns"` // PauseTotalNs is the cumulative nanoseconds in GC + NumCPU int `json:"num_cpu"` // NumCPU is the number of logical CPUs usable by the current process. + NumGoRoutines int `json:"num_go_routines"` // NumGoRoutines is the number of goroutines that currently exist. + GoVersion string `json:"go_version"` // GoVersion is the version of Go used to build the binary. + GoOS string `json:"go_os"` // GoOS is the operating system target used to build the binary. + GoArch string `json:"go_arch"` // GoArch is the architecture target used to build the binary. + GoCompiler string `json:"go_compiler"` // GoCompiler is the compiler used to build the binary. } + memstats := runtime.MemStats{} + runtime.ReadMemStats(&memstats) + + collectionDate := time.Now() + tz, offset := collectionDate.Zone() + + loc, _ := time.LoadLocation("UTC") + now := collectionDate.In(loc) + data, err := json.Marshal(basicInfo{ - Version: cfg.BuildVersion, - Commit: cfg.BuildCommit, + Version: cfg.BuildVersion, + Commit: cfg.BuildCommit, + CollectionDate: now, + DefaultTimezone: fmt.Sprintf("%s (UTC%+d)", tz, offset/60/60), + Alloc: memstats.Alloc, + TotalAlloc: memstats.TotalAlloc, + Sys: memstats.Sys, + Mallocs: memstats.Mallocs, + Frees: memstats.Frees, + NumGC: memstats.NumGC, + PauseTotalNs: memstats.PauseTotalNs, + NumCPU: runtime.NumCPU(), + NumGoRoutines: runtime.NumGoroutine(), + GoVersion: runtime.Version(), + GoOS: runtime.GOOS, + GoArch: runtime.GOARCH, + GoCompiler: runtime.Compiler, }) if err != nil { return nil, err