golang.org/x/mod v0.17.1-0.20240514174713-c0bdc7bd01c9
golang.org/x/sync v0.7.0
golang.org/x/sys v0.20.0
- golang.org/x/telemetry v0.0.0-20240514182607-7d78a974cc44
+ golang.org/x/telemetry v0.0.0-20240515190011-ac8fed89e775
golang.org/x/term v0.18.0
golang.org/x/tools v0.20.1-0.20240429173604-74c9cfe4d22f
)
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/telemetry v0.0.0-20240514182607-7d78a974cc44 h1:aVJH+bdTb68otvUnahQ3CwIZTrJdYAW/gji9t6wuqcE=
-golang.org/x/telemetry v0.0.0-20240514182607-7d78a974cc44/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
+golang.org/x/telemetry v0.0.0-20240515190011-ac8fed89e775 h1:rWPDGnFE+SjKc7S5CrkYqx8I7hiwWV9oYcnZhmHAcm0=
+golang.org/x/telemetry v0.0.0-20240515190011-ac8fed89e775/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
package crashmonitor
-import "runtime/debug"
+import (
+ "os"
+ "runtime/debug"
+)
func init() {
- setCrashOutput = debug.SetCrashOutput
+ setCrashOutput = func(f *os.File) error { return debug.SetCrashOutput(f) }
}
var distantPast = 21 * 24 * time.Hour
// reports that are too old (21 days) are not uploaded
-func (u *Uploader) tooOld(date string, uploadStartTime time.Time) bool {
+func (u *uploader) tooOld(date string, uploadStartTime time.Time) bool {
t, err := time.Parse("2006-01-02", date)
if err != nil {
u.logger.Printf("tooOld: %v", err)
// counterDateSpan parses the counter file named fname and returns the (begin,
// end) span recorded in its metadata, or an error if this data could not be
// extracted.
-func (u *Uploader) counterDateSpan(fname string) (begin, end time.Time, _ error) {
+func (u *uploader) counterDateSpan(fname string) (begin, end time.Time, _ error) {
parsed, err := u.parseCountFile(fname)
if err != nil {
return time.Time{}, time.Time{}, err
m map[string]*counter.File
}
-func (u *Uploader) parseCountFile(fname string) (*counter.File, error) {
+func (u *uploader) parseCountFile(fname string) (*counter.File, error) {
u.cache.mu.Lock()
defer u.cache.mu.Unlock()
if u.cache.m == nil {
// find all the files that look like counter files or reports
// that need to be uploaded. (There may be unexpected leftover files
// and uploading is supposed to be idempotent.)
-func (u *Uploader) findWork() work {
+func (u *uploader) findWork() work {
localdir, uploaddir := u.dir.LocalDir(), u.dir.UploadDir()
var ans work
fis, err := os.ReadDir(localdir)
)
// reports generates reports from inactive count files
-func (u *Uploader) reports(todo *work) ([]string, error) {
+func (u *uploader) reports(todo *work) ([]string, error) {
if mode, _ := u.dir.Mode(); mode == "off" {
return nil, nil // no reports
}
return false
}
-func (u *Uploader) deleteFiles(files []string) {
+func (u *uploader) deleteFiles(files []string) {
for _, f := range files {
if err := os.Remove(f); err != nil {
// this could be a race condition.
// createReport for all the count files for the same date.
// returns the absolute path name of the file containing the report
-func (u *Uploader) createReport(start time.Time, expiryDate string, countFiles []string, lastWeek string) (string, error) {
+func (u *uploader) createReport(start time.Time, expiryDate string, countFiles []string, lastWeek string) (string, error) {
uploadOK := true
mode, asof := u.dir.Mode()
if mode != "on" {
StartTime time.Time // if set, overrides the upload start time
}
-// Uploader encapsulates a single upload operation, carrying parameters and
+// Run generates and uploads reports, as allowed by the mode file.
+func Run(config RunConfig) error {
+ defer func() {
+ if err := recover(); err != nil {
+ log.Printf("upload recover: %v", err)
+ }
+ }()
+ uploader, err := newUploader(config)
+ if err != nil {
+ return err
+ }
+ defer uploader.Close()
+ return uploader.Run()
+}
+
+// uploader encapsulates a single upload operation, carrying parameters and
// shared state.
-type Uploader struct {
+type uploader struct {
// config is used to select counters to upload.
config *telemetry.UploadConfig //
configVersion string // version of the config
logger *log.Logger
}
-// NewUploader creates a new uploader to use for running the upload for the
+// newUploader creates a new uploader to use for running the upload for the
// given config.
//
-// Uploaders should only be used for one call to [Run].
-func NewUploader(rcfg RunConfig) (*Uploader, error) {
+// Uploaders should only be used for one call to [uploader.Run].
+func newUploader(rcfg RunConfig) (*uploader, error) {
// Determine the upload directory.
var dir telemetry.Dir
if rcfg.TelemetryDir != "" {
startTime = rcfg.StartTime
}
- return &Uploader{
+ return &uploader{
config: config,
configVersion: configVersion,
dir: dir,
}
// Close cleans up any resources associated with the uploader.
-func (u *Uploader) Close() error {
+func (u *uploader) Close() error {
if u.logFile == nil {
return nil
}
}
// Run generates and uploads reports
-func (u *Uploader) Run() error {
+func (u *uploader) Run() error {
if telemetry.DisabledOnPlatform {
return nil
}
// uploadReportDate returns the date component of the upload file name, or "" if the
// date was unmatched.
-func (u *Uploader) uploadReportDate(fname string) time.Time {
+func (u *uploader) uploadReportDate(fname string) time.Time {
match := dateRE.FindStringSubmatch(fname)
if match == nil || len(match) < 2 {
u.logger.Printf("malformed report name: missing date: %q", filepath.Base(fname))
return d
}
-func (u *Uploader) uploadReport(fname string) {
+func (u *uploader) uploadReport(fname string) {
thisInstant := u.startTime
// TODO(rfindley): use uploadReportDate here, once we've done a gopls release.
}
// try to upload the report, 'true' if successful
-func (u *Uploader) uploadReportContents(fname string, buf []byte) bool {
+func (u *uploader) uploadReportContents(fname string, buf []byte) bool {
b := bytes.NewReader(buf)
fdate := strings.TrimSuffix(filepath.Base(fname), ".json")
fdate = fdate[len(fdate)-len("2006-01-02"):]
"golang.org/x/telemetry/counter"
"golang.org/x/telemetry/internal/crashmonitor"
"golang.org/x/telemetry/internal/telemetry"
- "golang.org/x/telemetry/upload"
+ "golang.org/x/telemetry/internal/upload"
)
// Config controls the behavior of [Start].
+++ /dev/null
-// Copyright 2023 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package upload
-
-import (
- "log"
-
- "golang.org/x/telemetry/internal/upload"
-)
-
-// TODO(rfindley): remove, in favor of all callers using Start.
-
-// A RunConfig controls the behavior of Run.
-// The zero value RunConfig is the default behavior; fields may be set to
-// override various reporting and uploading choices.
-type RunConfig = upload.RunConfig
-
-// Run generates and uploads reports, as allowed by the mode file.
-func Run(config RunConfig) error {
- defer func() {
- if err := recover(); err != nil {
- log.Printf("upload recover: %v", err)
- }
- }()
- uploader, err := upload.NewUploader(config)
- if err != nil {
- return err
- }
- defer uploader.Close()
- return uploader.Run()
-}
golang.org/x/sys/plan9
golang.org/x/sys/unix
golang.org/x/sys/windows
-# golang.org/x/telemetry v0.0.0-20240514182607-7d78a974cc44
+# golang.org/x/telemetry v0.0.0-20240515190011-ac8fed89e775
## explicit; go 1.20
golang.org/x/telemetry
golang.org/x/telemetry/counter
golang.org/x/telemetry/internal/mmap
golang.org/x/telemetry/internal/telemetry
golang.org/x/telemetry/internal/upload
-golang.org/x/telemetry/upload
# golang.org/x/term v0.18.0
## explicit; go 1.18
golang.org/x/term