Repository: syncthing/syncthing
File: cmd/syncthing/gui.go (Go)

Code before:
	}

	// Errors as a JSON
	panicFiles, ok := checkPanicFile(baseDirs["config"])
	if ok {
		for _, f := range panicFiles {
			panicF, err := ioutil.ReadFile(f)
			if err != nil {
				arrayFile = append(arrayFile, fileEntry{name: filepath.Base(f), data: panicF})
			}
		}
	}

	// Version and platform information as a JSON
	versionPlatform, _ := json.MarshalIndent(map[string]string{
		"version":     Version,
		"codename":    Codename,
		"longVersion": LongVersion,
		"os":          runtime.GOOS,
		"arch":        runtime.GOARCH,
	}, "", "  ")
	arrayFile = append(arrayFile, fileEntry{name: "versionPlatform.json", data: versionPlatform})

	// Report Data as a JSON
	version := usageReportVersion
	if val, _ := strconv.Atoi(r.URL.Query().Get("version")); val > 0 {
		version = val
	}

	usageReportingData, _ := json.MarshalIndent(reportData(s.cfg, s.model, s.connectionsService, version, true), "", "  ")
	arrayFile = append(arrayFile, fileEntry{name: "usageReportingData.json", data: usageReportingData})

	// Heap and CPU Proofs as a pprof extension
	var heapBuffer, cpuBuffer bytes.Buffer
	filename := fmt.Sprintf("syncthing-heap-%s-%s-%s-%s.pprof", runtime.GOOS, runtime.GOARCH, Version, time.Now().Format("150405")) // hhmmss
	runtime.GC()
	pprof.WriteHeapProfile(&heapBuffer)
	arrayFile = append(arrayFile, fileEntry{name: filename, data: heapBuffer.Bytes()})

	const duration = 4 * time.Second
	filename = fmt.Sprintf("syncthing-cpu-%s-%s-%s-%s.pprof", runtime.GOOS, runtime.GOARCH, Version, time.Now().Format("150405")) // hhmmss
	pprof.StartCPUProfile(&cpuBuffer)
	time.Sleep(duration)
	pprof.StopCPUProfile()
	arrayFile = append(arrayFile, fileEntry{name: filename, data: cpuBuffer.Bytes()})

	path := filepath.Join(baseDirs["config"], "support_bundle")
	os.MkdirAll(path, 0700)

	output := time.Now().Format("2006-01-02T15.04.05") + ".zip"
	newfilepath := filepath.Join(path, output)

Review comment (suggestion):
I think skip this. On the regular usage reporting endpoint we need to be able to select usage reporting version, but here's that's not relevant. You can just pass the `usageReportVersion` constant directly to `reportData` to get the latest version.

Code after:
	}

	// Log as a text
	var buflog bytes.Buffer
	for _, line := range s.systemLog.Since(time.Time{}) {
		fmt.Fprintf(&buflog, "%s: %s\n", line.When.Format(time.RFC3339), line.Message)
	}
	files = append(files, fileEntry{name: "log.txt", data: buflog.Bytes()})

	// Errors as a JSON
	if errs := s.guiErrors.Since(time.Time{}); len(errs) > 0 {
		if jsonError, err := json.MarshalIndent(errs, "", "  "); err != nil {
			files = append(files, fileEntry{name: "errors.json.txt", data: jsonError})
		} else {
			l.Warnln("Support bundle: failed to create errors.json:", err)
		}
	}

	// Panic files as a JSON
	if panicFiles, err := filepath.Glob(filepath.Join(baseDirs["config"], "panic*")); err == nil {
		for _, f := range panicFiles {
			if panicFile, err := ioutil.ReadFile(f); err != nil {
				l.Warnf("Support bundle: failed to load %s: %s", filepath.Base(f), err)
			} else {
				files = append(files, fileEntry{name: filepath.Base(f), data: panicFile})
			}
		}
	}

	// Version and platform information as a JSON
	if versionPlatform, err := json.MarshalIndent(map[string]string{
		"now":         time.Now().Format(time.RFC3339),
		"version":     Version,
		"codename":    Codename,
		"longVersion": LongVersion,
		"os":          runtime.GOOS,
		"arch":        runtime.GOARCH,
	}, "", "  "); err == nil {
		files = append(files, fileEntry{name: "version-platform.json.txt", data: versionPlatform})
	} else {
		l.Warnln("Failed to create versionPlatform.json: ", err)
	}

	// Report Data as a JSON
	if usageReportingData, err := json.MarshalIndent(reportData(s.cfg, s.model, s.connectionsService, usageReportVersion, true), "", "  "); err != nil {
		l.Warnln("Support bundle: failed to create versionPlatform.json:", err)
	} else {
		files = append(files, fileEntry{name: "usage-reporting.json.txt", data: usageReportingData})
	}

	// Heap and CPU Proofs as a pprof extension