Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions deployment/terraform/modules/osv/gcp_apis.tf
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,3 @@ resource "google_project_service" "certificate_manager" {
service = "certificatemanager.googleapis.com"
disable_on_destroy = false
}

resource "google_project_service" "error_reporting" {
project = var.project_id
service = "clouderrorreporting.googleapis.com"
disable_on_destroy = false
}
1 change: 0 additions & 1 deletion go/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ go 1.26.0

require (
cloud.google.com/go/datastore v1.22.0
cloud.google.com/go/errorreporting v0.4.0
cloud.google.com/go/monitoring v1.24.3
cloud.google.com/go/pubsub/v2 v2.4.0
cloud.google.com/go/storage v1.60.0
Expand Down
2 changes: 0 additions & 2 deletions go/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdB
cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
cloud.google.com/go/datastore v1.22.0 h1:FOyx2Ag6ibD2wFkz9S8EiNrmBugia8pQOfpyJxi2yqA=
cloud.google.com/go/datastore v1.22.0/go.mod h1:aopSX+Whx0lHspWWBj+AjWt68/zjYsPfDe3LjWtqZg8=
cloud.google.com/go/errorreporting v0.4.0 h1:uLcasn2hKpj6iSPvHrzRjkJcaNVaKx8yKQcP3VTS6aI=
cloud.google.com/go/errorreporting v0.4.0/go.mod h1:dZGEhqzdHZSRxxWLVjC3Ue5CVaROzvP58D9rU6zbBfw=
cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc=
cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU=
cloud.google.com/go/logging v1.13.1 h1:O7LvmO0kGLaHY/gq8cV7T0dyp6zJhYAOtZPX4TF3QtY=
Expand Down
31 changes: 6 additions & 25 deletions go/logger/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"strings"
"sync"

"cloud.google.com/go/errorreporting"
texporter "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace"
"go.opentelemetry.io/contrib/detectors/gcp"
"go.opentelemetry.io/otel"
Expand All @@ -21,11 +20,10 @@ import (
)

var (
slogLogger = slog.New(newLocalHandler(os.Stdout))
errorClient *errorreporting.Client
once sync.Once
tp *sdktrace.TracerProvider
projectID string
slogLogger = slog.New(newLocalHandler(os.Stdout))
once sync.Once
tp *sdktrace.TracerProvider
projectID string
)

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

initErrorReporting(context.Background(), projectID, serviceName)
initTracing(context.Background(), projectID, serviceName)
}
handler := slog.NewJSONHandler(os.Stdout, cloudHandlerOptions())
slogLogger = slog.New(handler)
})
}

// Close flushes any buffered log, trace or error reports.
// Close flushes any buffered log or trace reports.
func Close() {
if errorClient != nil {
errorClient.Close()
}
if tp != nil {
if err := tp.Shutdown(context.Background()); err != nil {
fmt.Fprintf(os.Stderr, "Error shutting down tracer provider: %v", err)
}
}
}

func initErrorReporting(ctx context.Context, projectID, serviceName string) {
var err error
errorClient, err = errorreporting.NewClient(ctx, projectID, errorreporting.Config{
ServiceName: serviceName,
OnError: func(err error) {
fmt.Fprintf(os.Stderr, "Could not log error to Error Reporting: %v\n", err)
},
})
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to create errorreporting client: %v\n", err)
}
}

func initTracing(ctx context.Context, projectID, serviceName string) {
exporter, err := texporter.New(texporter.WithProjectID(projectID))
if err != nil {
Expand Down Expand Up @@ -165,7 +146,7 @@ func cloudHandlerOptions() *slog.HandlerOptions {
source := a.Value.Any().(*slog.Source)
source.File = filepath.Base(source.File)

return slog.Attr{Key: "sourceLocation", Value: slog.AnyValue(source)}
return slog.Attr{Key: "logging.googleapis.com/sourceLocation", Value: slog.AnyValue(source)}
}

return a
Expand Down
34 changes: 4 additions & 30 deletions go/logger/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,12 @@ package logger

import (
"context"
"errors"
"fmt"
"log/slog"
"os"
"runtime"
"time"

"cloud.google.com/go/errorreporting"
"go.opentelemetry.io/otel/trace"
)

Expand All @@ -29,40 +27,16 @@ func log(ctx context.Context, level slog.Level, msg string, a []any) {
slog.Bool("logging.googleapis.com/trace_sampled", spanContext.IsSampled()),
)
}

if level >= slog.LevelError {
r.Add(slog.String("@type", "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent"))
}
}

if slogLogger.Handler().Enabled(ctx, level) {
//nolint:errcheck
slogLogger.Handler().Handle(ctx, r)
}

if level >= slog.LevelError && errorClient != nil {
// Try find an error in the attributes
var err error
hasErr := false
for _, attr := range a {
if att, ok := attr.(slog.Attr); ok {
if attrErr, ok := att.Value.Any().(error); ok {
err = attrErr
hasErr = true

break
}
}
}
// Fallback to using the message as the error if no error was provided.
if !hasErr {
err = errors.New(msg)
}
// Report the error to Google Cloud Error Reporting.
// We leave Stack nil to let the client automatically capture the stack trace.
// Note: This will include the logger functions at the top of the stack.
// If we want to hide them, we would need to manually capture and trim the stack.
errorClient.Report(errorreporting.Entry{
Error: err,
Stack: nil,
})
}
}

// Debug prints a Debug level log.
Expand Down
Loading