Skip to content

Commit 94465a1

Browse files
authored
Enable log/slog from Go v1.21 and migrate scheduler. (#845)
* Enable slogging and add a way to set slog.Attrs in the context. Signed-off-by: Caleb Brown <[email protected]> * Migrate scheduler of zap logging to slog. Signed-off-by: Caleb Brown <[email protected]> * Bump golang version for the Dockerfiles. Signed-off-by: Caleb Brown <[email protected]> * Bump go version for workflows. Signed-off-by: Caleb Brown <[email protected]> * Add tags to the dockerfile Signed-off-by: Caleb Brown <[email protected]> --------- Signed-off-by: Caleb Brown <[email protected]>
1 parent 039fb69 commit 94465a1

File tree

13 files changed

+196
-28
lines changed

13 files changed

+196
-28
lines changed

.github/workflows/build-images.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
- name: setup-go
2020
uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0
2121
with:
22-
go-version: '1.19.1'
22+
go-version: '1.21.0'
2323

2424
- name: Enable docker experimental
2525
run: |

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
1414
- uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0
1515
with:
16-
go-version: '1.19.1'
16+
go-version: '1.21.0'
1717
- name: Install libpcap-dev
1818
run: sudo apt-get install -y libpcap-dev
1919
- run: go build -o scheduler cmd/scheduler/main.go

.github/workflows/test.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
1515
- uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0
1616
with:
17-
go-version: 1.19
17+
go-version: '1.21.0'
1818
- uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1
1919
with:
2020
node-version: 18
@@ -28,6 +28,6 @@ jobs:
2828
- uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
2929
- uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0
3030
with:
31-
go-version: 1.19
31+
go-version: '1.21.0'
3232
- name: golangci-lint
3333
uses: golangci/golangci-lint-action@3a919529898de77ec3da873e3063ca4b10e7f5cc # v3.7.0

cmd/analyze/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM golang@sha256:122f3484f844467ebe0674cf57272e61981770eb0bc7d316d1f0be281a88229f as build
1+
FROM golang:1.21.0@sha256:12359f96c43077803959dab88ce60c87cd2543f3b907bf54a34a5104270f404f as build
22
RUN apt-get update && apt-get install -y libpcap-dev
33
WORKDIR /src
44

cmd/scheduler/Dockerfile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM golang@sha256:122f3484f844467ebe0674cf57272e61981770eb0bc7d316d1f0be281a88229f as build
1+
FROM golang:1.21.0@sha256:12359f96c43077803959dab88ce60c87cd2543f3b907bf54a34a5104270f404f as build
22
WORKDIR /src
33

44
# First cache the dependencies to avoid downloading again on code change
@@ -7,11 +7,11 @@ COPY ./go.sum ./
77
RUN go mod download
88

99
COPY . ./
10-
RUN go build -o scheduler ./cmd/scheduler/main.go
10+
RUN CGO_ENABLED=0 go build -o scheduler ./cmd/scheduler/main.go
1111

1212

1313
FROM gcr.io/distroless/base:nonroot@sha256:bc84925113289d139a9ef2f309f0dd7ac46ea7b786f172ba9084ffdb4cbd9490
1414

1515
COPY --from=build /src/scheduler /usr/local/bin/scheduler
1616

17-
ENTRYPOINT /usr/local/bin/scheduler
17+
ENTRYPOINT ["/usr/local/bin/scheduler"]

cmd/scheduler/main.go

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import (
44
"context"
55
"encoding/json"
66
"fmt"
7+
"log/slog"
78
"os"
89
"regexp"
910

1011
"github.com/ossf/package-feeds/pkg/feeds"
11-
"go.uber.org/zap"
1212
"gocloud.dev/pubsub"
1313
_ "gocloud.dev/pubsub/gcppubsub"
1414
_ "gocloud.dev/pubsub/kafkapubsub"
@@ -60,15 +60,15 @@ var supportedPkgManagers = map[string]*ManagerConfig{
6060
func main() {
6161
subscriptionURL := os.Getenv("OSSMALWARE_SUBSCRIPTION_URL")
6262
topicURL := os.Getenv("OSSMALWARE_WORKER_TOPIC")
63-
logger := log.Initialize(os.Getenv("LOGGER_ENV")).Desugar()
63+
log.Initialize(os.Getenv("LOGGER_ENV")).Desugar()
6464

65-
err := listenLoop(logger, subscriptionURL, topicURL)
65+
err := listenLoop(subscriptionURL, topicURL)
6666
if err != nil {
67-
logger.With(zap.Error(err)).Error("Error encountered")
67+
slog.Error("Error encountered", "error", err)
6868
}
6969
}
7070

71-
func listenLoop(logger *zap.Logger, subURL, topicURL string) error {
71+
func listenLoop(subURL, topicURL string) error {
7272
ctx := context.Background()
7373

7474
sub, err := pubsub.OpenSubscription(ctx, subURL)
@@ -82,12 +82,10 @@ func listenLoop(logger *zap.Logger, subURL, topicURL string) error {
8282
}
8383

8484
srv := proxy.New(topic, sub)
85-
logger.Info("Listening for messages to proxy...")
85+
slog.InfoContext(ctx, "Listening for messages to proxy...")
8686

87-
err = srv.Listen(ctx, logger, func(m *pubsub.Message) (*pubsub.Message, error) {
88-
logger.With(
89-
zap.ByteString("body", m.Body),
90-
).Info("Handling message")
87+
err = srv.Listen(ctx, func(m *pubsub.Message) (*pubsub.Message, error) {
88+
slog.InfoContext(ctx, "Handling message", "body", string(m.Body))
9189
pkg := feeds.Package{}
9290
if err := json.Unmarshal(m.Body, &pkg); err != nil {
9391
return nil, fmt.Errorf("error unmarshalling json: %w", err)

cmd/scheduler/proxy/proxy.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ package proxy
22

33
import (
44
"context"
5+
"log/slog"
56

6-
"go.uber.org/zap"
7+
"github.com/ossf/package-analysis/internal/log"
78
"gocloud.dev/pubsub"
89
)
910

@@ -21,29 +22,29 @@ func New(topic *pubsub.Topic, subscription *pubsub.Subscription) *PubSubProxy {
2122
}
2223
}
2324

24-
func (proxy *PubSubProxy) Listen(ctx context.Context, logger *zap.Logger, preprocess MessageMutateFunc) error {
25+
func (proxy *PubSubProxy) Listen(ctx context.Context, preprocess MessageMutateFunc) error {
2526
for {
2627
msg, err := proxy.subscription.Receive(ctx)
2728
if err != nil {
28-
logger.With(zap.Error(err)).Error("Error receiving message")
29+
slog.ErrorContext(ctx, "Error receiving message", "error", err)
2930
return err
3031
}
3132
go func(m *pubsub.Message) {
32-
logger := logger.With(zap.String("message_id", m.LoggableID))
33+
innerCtx := log.ContextWithAttrs(ctx, slog.String("message_id", m.LoggableID))
3334
outMsg, err := preprocess(msg)
3435
if err != nil {
3536
// Failure to parse and process messages should result in an acknowledgement
3637
// to avoid the message being redelivered.
37-
logger.With(zap.Error(err)).Warn("Error processing message")
38+
slog.WarnContext(innerCtx, "Error processing message", "error", err)
3839
m.Ack()
3940
return
4041
}
41-
logger.Info("Sending message to topic")
42+
slog.InfoContext(innerCtx, "Sending message to topic")
4243
if err := proxy.topic.Send(ctx, outMsg); err != nil {
43-
logger.With(zap.Error(err)).Error("Error sending message")
44+
slog.ErrorContext(ctx, "Error sending message", "error", err)
4445
return
4546
}
46-
logger.Info("Sent message successfully")
47+
slog.InfoContext(innerCtx, "Sent message successfully")
4748
msg.Ack()
4849
}(msg)
4950
}

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ require (
1313
go.uber.org/zap v1.25.0
1414
gocloud.dev v0.33.1-0.20230808164326-dee61a596af0
1515
gocloud.dev/pubsub/kafkapubsub v0.33.0
16-
golang.org/x/exp v0.0.0-20230321023759-10a507213a29
16+
golang.org/x/exp v0.0.0-20230425010034-47ecfdc1ba53
1717
google.golang.org/api v0.138.0
1818
google.golang.org/grpc v1.57.0
1919
google.golang.org/protobuf v1.31.0
@@ -84,6 +84,7 @@ require (
8484
github.com/zeebo/xxh3 v1.0.2 // indirect
8585
go.opencensus.io v0.24.0 // indirect
8686
go.uber.org/multierr v1.11.0 // indirect
87+
go.uber.org/zap/exp v0.1.1-0.20230825131617-98e9c4fe632c // indirect
8788
golang.org/x/crypto v0.12.0 // indirect
8889
golang.org/x/mod v0.10.0 // indirect
8990
golang.org/x/net v0.14.0 // indirect

go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,10 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8
459459
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
460460
go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c=
461461
go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk=
462+
go.uber.org/zap/exp v0.1.0 h1:Ol9zQNvAEAgFHSBiR5LlwS9Xq8u5QF+7HBwNHUB8rcI=
463+
go.uber.org/zap/exp v0.1.0/go.mod h1:z/0T3As39ttolxZGOsvk1OEvQfwwfTZpmV9YTp+VAkc=
464+
go.uber.org/zap/exp v0.1.1-0.20230825131617-98e9c4fe632c h1:GIiV03MzB73EsQ7Hj8et4lHV+98RplF4tLznIqsmeIc=
465+
go.uber.org/zap/exp v0.1.1-0.20230825131617-98e9c4fe632c/go.mod h1:t0gqAIdh1MfKv9EwN/dLwfZnJxe9ITAZN78HEWPFWDQ=
462466
gocloud.dev v0.22.0/go.mod h1:z3jKIQ0Es9LALVZFQ3wOvwqAsSLq1R5c/2RdmghDucw=
463467
gocloud.dev v0.33.1-0.20230808164326-dee61a596af0 h1://FYsd3KnVdEJOVT6JaWvAKvUjvKnDnnovQnuwc33Ec=
464468
gocloud.dev v0.33.1-0.20230808164326-dee61a596af0/go.mod h1:z6W8qorjrfM09H8t1MDk8KLPj3Xi26aFBzDKAHWIgLU=
@@ -492,6 +496,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH
492496
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
493497
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug=
494498
golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
499+
golang.org/x/exp v0.0.0-20230425010034-47ecfdc1ba53 h1:5llv2sWeaMSnA3w2kS57ouQQ4pudlXrR0dCgw51QK9o=
500+
golang.org/x/exp v0.0.0-20230425010034-47ecfdc1ba53/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
495501
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
496502
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
497503
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=

internal/log/context.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package log
2+
3+
import (
4+
"context"
5+
"log/slog"
6+
)
7+
8+
var contextAttrSliceKey = struct{}{}
9+
10+
func attrSliceFromContext(ctx context.Context) []slog.Attr {
11+
if v := ctx.Value(contextAttrSliceKey); v != nil {
12+
return v.([]slog.Attr)
13+
}
14+
return nil
15+
}
16+
17+
// ContextWithAttrs is used to add attrs to the context so they are included
18+
// when logs are output.
19+
func ContextWithAttrs(ctx context.Context, attr ...slog.Attr) context.Context {
20+
if len(attr) == 0 {
21+
return ctx
22+
}
23+
attrSlice := attrSliceFromContext(ctx)
24+
attrSlice = append(attrSlice, attr...)
25+
return context.WithValue(ctx, contextAttrSliceKey, attrSlice)
26+
}
27+
28+
type contextLogHandler struct {
29+
slog.Handler
30+
}
31+
32+
func (h *contextLogHandler) Handle(ctx context.Context, r slog.Record) error {
33+
attrSlice := attrSliceFromContext(ctx)
34+
if attrSlice != nil {
35+
r.AddAttrs(attrSlice...)
36+
}
37+
return h.Handler.Handle(ctx, r)
38+
}
39+
40+
// NewContextLogHandler returns a new slog.Handler that will pass the attrs set
41+
// using ContextWithAttrs to handler when Handle is called.
42+
func NewContextLogHandler(handler slog.Handler) slog.Handler {
43+
return &contextLogHandler{
44+
Handler: handler,
45+
}
46+
}

0 commit comments

Comments
 (0)