Skip to content

Commit 2001ff4

Browse files
authored
fix: attach error reporting directly to logs; sourceLocation (#4855)
Add a `@type` field to the error logs in Google cloud to send them to error reporting directly, instead of making a separate API call (see https://docs.cloud.google.com/error-reporting/docs/formatting-error-messages#log-text). This is what python was already doing. Also, changed the `sourceLocation` field to the more complete key so it gets put into the top-level log instead of within the jsonPayload.
1 parent 7067244 commit 2001ff4

5 files changed

Lines changed: 10 additions & 64 deletions

File tree

deployment/terraform/modules/osv/gcp_apis.tf

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,3 @@ resource "google_project_service" "certificate_manager" {
103103
service = "certificatemanager.googleapis.com"
104104
disable_on_destroy = false
105105
}
106-
107-
resource "google_project_service" "error_reporting" {
108-
project = var.project_id
109-
service = "clouderrorreporting.googleapis.com"
110-
disable_on_destroy = false
111-
}

go/go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ go 1.26.0
44

55
require (
66
cloud.google.com/go/datastore v1.22.0
7-
cloud.google.com/go/errorreporting v0.4.0
87
cloud.google.com/go/monitoring v1.24.3
98
cloud.google.com/go/pubsub/v2 v2.4.0
109
cloud.google.com/go/storage v1.60.0

go/go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdB
1111
cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
1212
cloud.google.com/go/datastore v1.22.0 h1:FOyx2Ag6ibD2wFkz9S8EiNrmBugia8pQOfpyJxi2yqA=
1313
cloud.google.com/go/datastore v1.22.0/go.mod h1:aopSX+Whx0lHspWWBj+AjWt68/zjYsPfDe3LjWtqZg8=
14-
cloud.google.com/go/errorreporting v0.4.0 h1:uLcasn2hKpj6iSPvHrzRjkJcaNVaKx8yKQcP3VTS6aI=
15-
cloud.google.com/go/errorreporting v0.4.0/go.mod h1:dZGEhqzdHZSRxxWLVjC3Ue5CVaROzvP58D9rU6zbBfw=
1614
cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc=
1715
cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU=
1816
cloud.google.com/go/logging v1.13.1 h1:O7LvmO0kGLaHY/gq8cV7T0dyp6zJhYAOtZPX4TF3QtY=

go/logger/init.go

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"strings"
1111
"sync"
1212

13-
"cloud.google.com/go/errorreporting"
1413
texporter "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace"
1514
"go.opentelemetry.io/contrib/detectors/gcp"
1615
"go.opentelemetry.io/otel"
@@ -21,11 +20,10 @@ import (
2120
)
2221

2322
var (
24-
slogLogger = slog.New(newLocalHandler(os.Stdout))
25-
errorClient *errorreporting.Client
26-
once sync.Once
27-
tp *sdktrace.TracerProvider
28-
projectID string
23+
slogLogger = slog.New(newLocalHandler(os.Stdout))
24+
once sync.Once
25+
tp *sdktrace.TracerProvider
26+
projectID string
2927
)
3028

3129
// InitGlobalLogger initializes the global slog logger and GCP observability clients.
@@ -48,39 +46,22 @@ func InitGlobalLogger() {
4846
serviceName = filepath.Base(os.Args[0])
4947
}
5048

51-
initErrorReporting(context.Background(), projectID, serviceName)
5249
initTracing(context.Background(), projectID, serviceName)
5350
}
5451
handler := slog.NewJSONHandler(os.Stdout, cloudHandlerOptions())
5552
slogLogger = slog.New(handler)
5653
})
5754
}
5855

59-
// Close flushes any buffered log, trace or error reports.
56+
// Close flushes any buffered log or trace reports.
6057
func Close() {
61-
if errorClient != nil {
62-
errorClient.Close()
63-
}
6458
if tp != nil {
6559
if err := tp.Shutdown(context.Background()); err != nil {
6660
fmt.Fprintf(os.Stderr, "Error shutting down tracer provider: %v", err)
6761
}
6862
}
6963
}
7064

71-
func initErrorReporting(ctx context.Context, projectID, serviceName string) {
72-
var err error
73-
errorClient, err = errorreporting.NewClient(ctx, projectID, errorreporting.Config{
74-
ServiceName: serviceName,
75-
OnError: func(err error) {
76-
fmt.Fprintf(os.Stderr, "Could not log error to Error Reporting: %v\n", err)
77-
},
78-
})
79-
if err != nil {
80-
fmt.Fprintf(os.Stderr, "Failed to create errorreporting client: %v\n", err)
81-
}
82-
}
83-
8465
func initTracing(ctx context.Context, projectID, serviceName string) {
8566
exporter, err := texporter.New(texporter.WithProjectID(projectID))
8667
if err != nil {
@@ -165,7 +146,7 @@ func cloudHandlerOptions() *slog.HandlerOptions {
165146
source := a.Value.Any().(*slog.Source)
166147
source.File = filepath.Base(source.File)
167148

168-
return slog.Attr{Key: "sourceLocation", Value: slog.AnyValue(source)}
149+
return slog.Attr{Key: "logging.googleapis.com/sourceLocation", Value: slog.AnyValue(source)}
169150
}
170151

171152
return a

go/logger/logger.go

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,12 @@ package logger
33

44
import (
55
"context"
6-
"errors"
76
"fmt"
87
"log/slog"
98
"os"
109
"runtime"
1110
"time"
1211

13-
"cloud.google.com/go/errorreporting"
1412
"go.opentelemetry.io/otel/trace"
1513
)
1614

@@ -29,40 +27,16 @@ func log(ctx context.Context, level slog.Level, msg string, a []any) {
2927
slog.Bool("logging.googleapis.com/trace_sampled", spanContext.IsSampled()),
3028
)
3129
}
30+
31+
if level >= slog.LevelError {
32+
r.Add(slog.String("@type", "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent"))
33+
}
3234
}
3335

3436
if slogLogger.Handler().Enabled(ctx, level) {
3537
//nolint:errcheck
3638
slogLogger.Handler().Handle(ctx, r)
3739
}
38-
39-
if level >= slog.LevelError && errorClient != nil {
40-
// Try find an error in the attributes
41-
var err error
42-
hasErr := false
43-
for _, attr := range a {
44-
if att, ok := attr.(slog.Attr); ok {
45-
if attrErr, ok := att.Value.Any().(error); ok {
46-
err = attrErr
47-
hasErr = true
48-
49-
break
50-
}
51-
}
52-
}
53-
// Fallback to using the message as the error if no error was provided.
54-
if !hasErr {
55-
err = errors.New(msg)
56-
}
57-
// Report the error to Google Cloud Error Reporting.
58-
// We leave Stack nil to let the client automatically capture the stack trace.
59-
// Note: This will include the logger functions at the top of the stack.
60-
// If we want to hide them, we would need to manually capture and trim the stack.
61-
errorClient.Report(errorreporting.Entry{
62-
Error: err,
63-
Stack: nil,
64-
})
65-
}
6640
}
6741

6842
// Debug prints a Debug level log.

0 commit comments

Comments
 (0)