Skip to content

Commit 52eb228

Browse files
committed
internal/frontend: remove dependency on cloud error reporting client
This removes the dependency of internal/frontend on the cloud error reporting client, both directly, and through the derrors package by introducing a new interface Reporter that is used both to set the reporting client for internal/derrors, and on the Server. For golang/go#61399 Change-Id: Id4d4def522cda9b4e49f53cff6708019dec2693c Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/514676 Reviewed-by: Jamal Carvalho <[email protected]> kokoro-CI: kokoro <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Run-TryBot: Michael Matloob <[email protected]>
1 parent 1e93998 commit 52eb228

File tree

9 files changed

+89
-92
lines changed

9 files changed

+89
-92
lines changed

cmd/frontend/main.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func main() {
107107
}
108108
}
109109

110-
rc := cmdconfig.ReportingClient(ctx, cfg)
110+
reporter := cmdconfig.Reporter(ctx, cfg)
111111
vc, err := vuln.NewClient(cfg.VulnDB)
112112
if err != nil {
113113
log.Fatalf(ctx, "vuln.NewClient: %v", err)
@@ -124,7 +124,7 @@ func main() {
124124
ThirdPartyFS: os.DirFS(*thirdPartyPath),
125125
DevMode: *devMode,
126126
LocalMode: *localMode,
127-
ReportingClient: rc,
127+
Reporter: reporter,
128128
VulndbClient: vc,
129129
})
130130
if err != nil {
@@ -174,12 +174,12 @@ func main() {
174174
log.Fatal(ctx, err)
175175
}
176176
log.Infof(ctx, "cmd/frontend: initializing cmdconfig.Experimenter")
177-
experimenter := cmdconfig.Experimenter(ctx, cfg, expg, rc)
177+
experimenter := cmdconfig.Experimenter(ctx, cfg, expg, reporter)
178178
log.Infof(ctx, "cmd/frontend: initialized cmdconfig.Experimenter")
179179

180180
ermw := middleware.Identity()
181-
if rc != nil {
182-
ermw = middleware.ErrorReporting(rc.Report)
181+
if reporter != nil {
182+
ermw = middleware.ErrorReporting(reporter)
183183
}
184184
mw := middleware.Chain(
185185
middleware.RequestLog(cmdconfig.Logger(ctx, cfg, "frontend-log")),

cmd/internal/cmdconfig/cmdconfig.go

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package cmdconfig
88
import (
99
"context"
1010
"fmt"
11+
"net/http"
1112
"strings"
1213
"time"
1314

@@ -44,12 +45,12 @@ func Logger(ctx context.Context, cfg *config.Config, logName string) middleware.
4445
return middleware.LocalLogger{}
4546
}
4647

47-
// ReportingClient configures an Error Reporting client.
48-
func ReportingClient(ctx context.Context, cfg *config.Config) *errorreporting.Client {
48+
// Reporter configures an Error Reporting client.
49+
func Reporter(ctx context.Context, cfg *config.Config) derrors.Reporter {
4950
if !cfg.OnGCP() || cfg.DisableErrorReporting {
5051
return nil
5152
}
52-
reporter, err := errorreporting.NewClient(ctx, cfg.ProjectID, errorreporting.Config{
53+
reportingClient, err := errorreporting.NewClient(ctx, cfg.ProjectID, errorreporting.Config{
5354
ServiceName: cfg.ServiceID,
5455
OnError: func(err error) {
5556
log.Errorf(ctx, "Error reporting failed: %v", err)
@@ -58,13 +59,22 @@ func ReportingClient(ctx context.Context, cfg *config.Config) *errorreporting.Cl
5859
if err != nil {
5960
log.Fatal(ctx, err)
6061
}
61-
derrors.SetReportingClient(reporter)
62+
reporter := &reporter{reportingClient}
63+
derrors.SetReporter(reporter)
6264
return reporter
6365
}
6466

67+
type reporter struct {
68+
c *errorreporting.Client
69+
}
70+
71+
func (r *reporter) Report(err error, req *http.Request, stack []byte) {
72+
r.c.Report(errorreporting.Entry{Error: err, Req: req, Stack: stack})
73+
}
74+
6575
// Experimenter configures a middleware.Experimenter.
66-
func Experimenter(ctx context.Context, cfg *config.Config, getter middleware.ExperimentGetter, reportingClient *errorreporting.Client) *middleware.Experimenter {
67-
e, err := middleware.NewExperimenter(ctx, 1*time.Minute, getter, reportingClient)
76+
func Experimenter(ctx context.Context, cfg *config.Config, getter middleware.ExperimentGetter, reporter derrors.Reporter) *middleware.Experimenter {
77+
e, err := middleware.NewExperimenter(ctx, 1*time.Minute, getter, reporter)
6878
if err != nil {
6979
log.Fatal(ctx, err)
7080
}

cmd/worker/main.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,10 @@ func main() {
9090
log.Fatalf(ctx, "gcpqueue.New: %v", err)
9191
}
9292

93-
reportingClient := cmdconfig.ReportingClient(ctx, cfg)
93+
reporter := cmdconfig.Reporter(ctx, cfg)
9494
redisCacheClient := getCacheRedis(ctx, cfg)
9595
redisBetaCacheClient := getBetaCacheRedis(ctx, cfg)
96-
experimenter := cmdconfig.Experimenter(ctx, cfg, expg, reportingClient)
96+
experimenter := cmdconfig.Experimenter(ctx, cfg, expg, reporter)
9797
server, err := worker.NewServer(cfg, worker.ServerConfig{
9898
DB: db,
9999
IndexClient: indexClient,
@@ -102,7 +102,7 @@ func main() {
102102
RedisCacheClient: redisCacheClient,
103103
RedisBetaCacheClient: redisBetaCacheClient,
104104
Queue: fetchQueue,
105-
ReportingClient: reportingClient,
105+
Reporter: reporter,
106106
StaticPath: template.TrustedSourceFromFlag(flag.Lookup("static").Value),
107107
GetExperiments: experimenter.Experiments,
108108
})

internal/derrors/derrors.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ import (
1111
"fmt"
1212
"net/http"
1313
"runtime"
14-
15-
"cloud.google.com/go/errorreporting"
1614
)
1715

1816
//lint:file-ignore ST1012 prefixing error values with Err would stutter
@@ -284,16 +282,21 @@ func WrapAndReport(errp *error, format string, args ...any) {
284282
}
285283
}
286284

287-
var repClient *errorreporting.Client
285+
var reporter Reporter
286+
287+
// SetReporter the Reporter to use, for use by Report.
288+
func SetReporter(r Reporter) {
289+
reporter = r
290+
}
288291

289-
// SetReportingClient sets an errorreporting client, for use by Report.
290-
func SetReportingClient(c *errorreporting.Client) {
291-
repClient = c
292+
// Reporter is an interface used for reporting errors.
293+
type Reporter interface {
294+
Report(err error, req *http.Request, stack []byte)
292295
}
293296

294-
// Report uses the errorreporting API to report an error.
297+
// Report uses the Reporter to report an error.
295298
func Report(err error) {
296-
if repClient != nil {
297-
repClient.Report(errorreporting.Entry{Error: err})
299+
if reporter != nil {
300+
reporter.Report(err, nil, nil)
298301
}
299302
}

internal/frontend/server.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"sync"
2222
"time"
2323

24-
"cloud.google.com/go/errorreporting"
2524
"github.com/google/safehtml"
2625
"github.com/google/safehtml/template"
2726
"golang.org/x/pkgsite/internal"
@@ -58,7 +57,7 @@ type Server struct {
5857
appVersionLabel string
5958
googleTagManagerID string
6059
serveStats bool
61-
reportingClient *errorreporting.Client
60+
reporter derrors.Reporter
6261
fileMux *http.ServeMux
6362
vulnClient *vuln.Client
6463
versionID string
@@ -83,7 +82,7 @@ type ServerConfig struct {
8382
LocalMode bool
8483
LocalModules []LocalModule
8584
StaticPath string // used only for dynamic loading in dev mode
86-
ReportingClient *errorreporting.Client
85+
Reporter derrors.Reporter
8786
VulndbClient *vuln.Client
8887
}
8988

@@ -107,7 +106,7 @@ func NewServer(scfg ServerConfig) (_ *Server, err error) {
107106
staticPath: scfg.StaticPath,
108107
templates: ts,
109108
taskIDChangeInterval: scfg.TaskIDChangeInterval,
110-
reportingClient: scfg.ReportingClient,
109+
reporter: scfg.Reporter,
111110
fileMux: http.NewServeMux(),
112111
vulnClient: scfg.VulndbClient,
113112
}
@@ -588,19 +587,15 @@ func (s *Server) serveError(w http.ResponseWriter, r *http.Request, err error) {
588587

589588
// reportError sends the error to the GCP Error Reporting service.
590589
func (s *Server) reportError(ctx context.Context, err error, w http.ResponseWriter, r *http.Request) {
591-
if s.reportingClient == nil {
590+
if s.reporter == nil {
592591
return
593592
}
594593
// Extract the stack trace from the error if there is one.
595594
var stack []byte
596595
if serr := (*derrors.StackError)(nil); errors.As(err, &serr) {
597596
stack = serr.Stack
598597
}
599-
s.reportingClient.Report(errorreporting.Entry{
600-
Error: err,
601-
Req: r,
602-
Stack: stack,
603-
})
598+
s.reporter.Report(err, r, stack)
604599
log.Debugf(ctx, "reported error %v with stack size %d", err, len(stack))
605600
// Bypass the error-reporting middleware.
606601
w.Header().Set(config.BypassErrorReportingHeader, "true")

internal/middleware/errorreporting.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,13 @@ import (
88
"fmt"
99
"net/http"
1010

11-
"cloud.google.com/go/errorreporting"
1211
"golang.org/x/pkgsite/internal/config"
1312
"golang.org/x/pkgsite/internal/derrors"
1413
)
1514

1615
// ErrorReporting returns a middleware that reports any server errors using the
1716
// report func.
18-
func ErrorReporting(report func(errorreporting.Entry)) Middleware {
17+
func ErrorReporting(reporter derrors.Reporter) Middleware {
1918
return func(h http.Handler) http.Handler {
2019
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
2120
w2 := &erResponseWriter{ResponseWriter: w}
@@ -44,10 +43,8 @@ func ErrorReporting(report func(errorreporting.Entry)) Middleware {
4443
if w2.status == derrors.ToStatus(derrors.VulnDBError) {
4544
return
4645
}
47-
report(errorreporting.Entry{
48-
Error: fmt.Errorf("handler for %q returned status code %d", r.URL.Path, w2.status),
49-
Req: r,
50-
})
46+
reporter.Report(
47+
fmt.Errorf("handler for %q returned status code %d", r.URL.Path, w2.status), r, nil)
5148
})
5249
}
5350
}

internal/middleware/errorreporting_test.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"net/http/httptest"
1111
"testing"
1212

13-
"cloud.google.com/go/errorreporting"
1413
"golang.org/x/pkgsite/internal/config"
1514
)
1615

@@ -37,19 +36,25 @@ func TestErrorReporting(t *testing.T) {
3736
}
3837
w.WriteHeader(test.code)
3938
})
40-
reports := 0
41-
mw := ErrorReporting(func(errorreporting.Entry) {
42-
reports++
43-
})
39+
fr := &fakeReporter{}
40+
mw := ErrorReporting(fr)
4441
ts := httptest.NewServer(mw(handler))
4542
resp, err := http.Get(ts.URL)
4643
if err != nil {
4744
t.Fatal(err)
4845
}
4946
resp.Body.Close()
50-
if got := reports; got != test.wantReports {
47+
if got := fr.reports; got != test.wantReports {
5148
t.Errorf("Got %d reports, want %d", got, test.wantReports)
5249
}
5350
})
5451
}
5552
}
53+
54+
type fakeReporter struct {
55+
reports int
56+
}
57+
58+
func (f *fakeReporter) Report(error, *http.Request, []byte) {
59+
f.reports++
60+
}

internal/middleware/experiment.go

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"net/http"
1212
"time"
1313

14-
"cloud.google.com/go/errorreporting"
1514
"golang.org/x/pkgsite/internal"
1615
"golang.org/x/pkgsite/internal/derrors"
1716
"golang.org/x/pkgsite/internal/experiment"
@@ -21,11 +20,6 @@ import (
2120

2221
const experimentQueryParamKey = "experiment"
2322

24-
// A Reporter sends errors to the Error-Reporting service.
25-
type Reporter interface {
26-
Report(errorreporting.Entry)
27-
}
28-
2923
// ExperimentGetter is the signature of a function that gets experiments.
3024
type ExperimentGetter func(context.Context) ([]*internal.Experiment, error)
3125

@@ -37,7 +31,7 @@ type Experimenter struct {
3731

3832
// NewExperimenter returns an Experimenter for use in the middleware. The
3933
// experimenter regularly polls for updates to the snapshot in the background.
40-
func NewExperimenter(ctx context.Context, pollEvery time.Duration, getter ExperimentGetter, rep Reporter) (_ *Experimenter, err error) {
34+
func NewExperimenter(ctx context.Context, pollEvery time.Duration, getter ExperimentGetter, rep derrors.Reporter) (_ *Experimenter, err error) {
4135
defer derrors.Wrap(&err, "middleware.NewExperimenter")
4236

4337
initial, err := getter(ctx)
@@ -55,9 +49,7 @@ func NewExperimenter(ctx context.Context, pollEvery time.Duration, getter Experi
5549
// Log and report // the error.
5650
log.Error(ctx, err)
5751
if rep != nil {
58-
rep.Report(errorreporting.Entry{
59-
Error: fmt.Errorf("loading experiments: %v", err),
60-
})
52+
rep.Report(fmt.Errorf("loading experiments: %v", err), nil, nil)
6153
}
6254
}),
6355
}

0 commit comments

Comments
 (0)