src/server/pkg/metrics/metrics.go
func ReportUserAction(ctx context.Context, r *Reporter, action string) func(time.Time, error) {
	if r == nil {
		// This happens when stubbing out metrics for testing, e.g. src/server/pfs/server/server_test.go
		return func(time.Time, error) {}
	}
	// If we report nil, segment sees it, but mixpanel omits the field
	r.reportUserAction(ctx, fmt.Sprintf("%vStarted", action), 1)
	return func(start time.Time, err error) {
		if err == nil {
			r.reportUserAction(ctx, fmt.Sprintf("%vFinished", action), time.Since(start).Seconds())
		} else {
			r.reportUserAction(ctx, fmt.Sprintf("%vErrored", action), err.Error())
		}
	}
}
func ReportUserAction(ctx context.Context, r *Reporter, action string) func(time.Time, error) {
	if r == nil {
		// This happens when stubbing out metrics for testing, e.g. src/server/pfs/server/server_test.go
		return func(time.Time, error) {}
	}
	// If we report nil, segment sees it, but mixpanel omits the field
	r.reportUserAction(ctx, fmt.Sprintf("%vStarted", action), 1)
	return func(start time.Time, err error) {
		if err == nil {
			r.reportUserAction(ctx, fmt.Sprintf("%vFinished", action), time.Since(start).Seconds())
		} else {
			r.reportUserAction(ctx, fmt.Sprintf("%vErrored", action), err.Error())
		}
	}
}
func ReportUserAction ( ctx context . Context , r * Reporter , action string ) func ( time . Time , error ) { if r == nil { // This happens when stubbing out metrics for testing, e.g. src/server/pfs/server/server_test.go return func ( time . Time , error ) { } } // If we report nil, segment sees it, but mixpanel omits the field r . reportUserAction ( ctx , fmt . Sprintf ( " " , action ) , 1 ) return func ( start time . Time , err error ) { if err == nil { r . reportUserAction ( ctx , fmt . Sprintf ( " " , action ) , time . Since ( start ) . Seconds ( ) ) } else { r . reportUserAction ( ctx , fmt . Sprintf ( " " , action ) , err . Error ( ) ) } } }
//ReportUserAction pushes the action into a queue for reporting,
// and reports the start, finish, and error conditions
ReportUserAction pushes the action into a queue for reporting and reports the start finish and error conditions