Skip to content

Commit 3c3440d

Browse files
Merge pull request #378 from monstermunchkin/grpc-external-dependencies
grpc: Add external dependencies to context
2 parents 68dbe32 + 3503b4c commit 3c3440d

File tree

5 files changed

+72
-20
lines changed

5 files changed

+72
-20
lines changed

grpc/client.go

+9-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"google.golang.org/grpc/credentials/insecure"
1111
"google.golang.org/grpc/metadata"
1212

13+
"github.com/pace/bricks/http/middleware"
1314
"github.com/pace/bricks/http/security"
1415
"github.com/pace/bricks/locale"
1516
"github.com/pace/bricks/maintenance/log"
@@ -72,14 +73,19 @@ func dialCtx(ctx context.Context, addr string) (*grpc.ClientConn, error) {
7273

7374
func prepareClientContext(ctx context.Context) context.Context {
7475
if loc, ok := locale.FromCtx(ctx); ok {
75-
ctx = metadata.AppendToOutgoingContext(ctx, "locale", loc.Serialize())
76+
ctx = metadata.AppendToOutgoingContext(ctx, MetadataKeyLocale, loc.Serialize())
7677
}
7778
if token, ok := security.GetTokenFromContext(ctx); ok {
78-
ctx = metadata.AppendToOutgoingContext(ctx, "bearer_token", token.GetValue())
79+
ctx = metadata.AppendToOutgoingContext(ctx, MetadataKeyBearerToken, token.GetValue())
7980
}
8081
if reqID := log.RequestIDFromContext(ctx); reqID != "" {
81-
ctx = metadata.AppendToOutgoingContext(ctx, "req_id", reqID)
82+
ctx = metadata.AppendToOutgoingContext(ctx, MetadataKeyRequestID, reqID)
8283
}
8384
ctx = EncodeContextWithUTMData(ctx)
85+
86+
if dep := middleware.ExternalDependencyContextFromContext(ctx); dep != nil {
87+
ctx = metadata.AppendToOutgoingContext(ctx, MetadataKeyExternalDependencies, dep.String())
88+
}
89+
8490
return ctx
8591
}

grpc/consts.go

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package grpc
2+
3+
const (
4+
MetadataKeyBearerToken = "bearer_token"
5+
MetadataKeyContentType = "content-type"
6+
MetadataKeyExternalDependencies = "external_dependencies"
7+
MetadataKeyLocale = "locale"
8+
MetadataKeyRequestID = "req_id"
9+
)

grpc/server.go

+19-7
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
grpc_prometheus "github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus"
1515
grpc_ctxtags "github.com/grpc-ecosystem/go-grpc-middleware/tags"
1616
grpc_opentracing "github.com/grpc-ecosystem/go-grpc-middleware/tracing/opentracing"
17+
"github.com/pace/bricks/http/middleware"
1718
"github.com/pace/bricks/http/security"
1819
"github.com/pace/bricks/locale"
1920
"github.com/pace/bricks/maintenance/errors"
@@ -151,7 +152,7 @@ func prepareContext(ctx context.Context) (context.Context, metadata.MD) {
151152

152153
// add request context if req_id is given
153154
var reqID xid.ID
154-
if ri := md.Get("req_id"); len(ri) > 0 {
155+
if ri := md.Get(MetadataKeyRequestID); len(ri) > 0 {
155156
var err error
156157
reqID, err = xid.FromString(ri[0])
157158
if err != nil {
@@ -174,7 +175,7 @@ func prepareContext(ctx context.Context) (context.Context, metadata.MD) {
174175
})
175176

176177
// handle locale
177-
if l := md.Get("locale"); len(l) > 0 {
178+
if l := md.Get(MetadataKeyLocale); len(l) > 0 {
178179
loc, err := locale.ParseLocale(l[0])
179180
if err != nil {
180181
log.Ctx(ctx).Debug().Err(err).Msgf("unable to parse locale: %v", err)
@@ -186,13 +187,24 @@ func prepareContext(ctx context.Context) (context.Context, metadata.MD) {
186187
ctx = ContextWithUTMFromMetadata(ctx, md)
187188

188189
// add security context if bearer token is given
189-
if bt := md.Get("bearer_token"); len(bt) > 0 {
190+
if bt := md.Get(MetadataKeyBearerToken); len(bt) > 0 {
190191
ctx = security.ContextWithToken(ctx, security.TokenString(bt[0]))
191192
}
192-
delete(md, "content-type")
193-
delete(md, "locale")
194-
delete(md, "bearer_token")
195-
delete(md, "req_id")
193+
194+
// add external dependencies to context
195+
externalDependencyContext := middleware.ExternalDependencyContext{}
196+
197+
if externalDependencies := md.Get(MetadataKeyExternalDependencies); len(externalDependencies) > 0 {
198+
externalDependencyContext.Parse(externalDependencies[0])
199+
}
200+
201+
ctx = middleware.ContextWithExternalDependency(ctx, &externalDependencyContext)
202+
203+
delete(md, MetadataKeyContentType)
204+
delete(md, MetadataKeyLocale)
205+
delete(md, MetadataKeyBearerToken)
206+
delete(md, MetadataKeyRequestID)
207+
delete(md, MetadataKeyExternalDependencies)
196208

197209
return ctx, md
198210
}

grpc/server_test.go

+31-9
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ import (
77
"context"
88
"testing"
99

10+
"github.com/pace/bricks/http/middleware"
1011
"github.com/pace/bricks/locale"
1112
"github.com/pace/bricks/maintenance/log"
1213
"github.com/stretchr/testify/assert"
14+
"github.com/stretchr/testify/require"
1315
"google.golang.org/grpc/metadata"
1416
)
1517

@@ -29,14 +31,14 @@ func TestPrepareContext(t *testing.T) {
2931

3032
// remote site is providing data using a bearer token
3133
ctx = metadata.NewIncomingContext(ctx, metadata.MD{
32-
"req_id": []string{"c690uu0ta2rv348epm8g"},
33-
"locale": []string{"fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5|Europe/Paris"},
34-
"bearer_token": []string{"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"},
34+
MetadataKeyRequestID: []string{"c690uu0ta2rv348epm8g"},
35+
MetadataKeyLocale: []string{"fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5|Europe/Paris"},
36+
MetadataKeyBearerToken: []string{"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"},
3537
})
3638

3739
ctx1, md := prepareContext(ctx)
38-
assert.Len(t, md.Get("req_id"), 0)
39-
assert.Len(t, md.Get("bearer_token"), 0)
40+
assert.Len(t, md.Get(MetadataKeyRequestID), 0)
41+
assert.Len(t, md.Get(MetadataKeyBearerToken), 0)
4042
assert.Equal(t, "c690uu0ta2rv348epm8g", log.RequestIDFromContext(ctx1))
4143
loc, ok := locale.FromCtx(ctx1)
4244
assert.True(t, ok)
@@ -51,13 +53,13 @@ func TestPrepareContext(t *testing.T) {
5153

5254
// remote site is providing data using a bearer token
5355
ctx = metadata.NewIncomingContext(ctx, metadata.MD{
54-
"req_id": []string{"c690uu0ta2rv348epm8g"},
55-
"bearer_token": []string{"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"},
56+
MetadataKeyRequestID: []string{"c690uu0ta2rv348epm8g"},
57+
MetadataKeyBearerToken: []string{"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"},
5658
})
5759

5860
ctx2, md := prepareContext(ctx)
59-
assert.Len(t, md.Get("req_id"), 0)
60-
assert.Len(t, md.Get("bearer_token"), 0)
61+
assert.Len(t, md.Get(MetadataKeyRequestID), 0)
62+
assert.Len(t, md.Get(MetadataKeyBearerToken), 0)
6163
assert.Equal(t, "c690uu0ta2rv348epm8g", log.RequestIDFromContext(ctx1))
6264

6365
var buf2 bytes.Buffer
@@ -67,4 +69,24 @@ func TestPrepareContext(t *testing.T) {
6769
assert.Contains(t, buf2.String(), ",\"message\":\"test\"}\n")
6870
_, ok = locale.FromCtx(ctx2)
6971
assert.False(t, ok)
72+
73+
ctx = metadata.NewIncomingContext(ctx, metadata.MD{
74+
MetadataKeyExternalDependencies: []string{"foo:60000,bar:1000"},
75+
})
76+
77+
ctx3, md := prepareContext(ctx)
78+
assert.Len(t, md.Get(MetadataKeyExternalDependencies), 0)
79+
80+
externalDependencyContext := middleware.ExternalDependencyContextFromContext(ctx3)
81+
require.NotNil(t, externalDependencyContext)
82+
assert.Equal(t, "foo:60000,bar:1000", externalDependencyContext.String())
83+
84+
ctx = metadata.NewIncomingContext(context.Background(), metadata.MD{})
85+
86+
ctx4, md := prepareContext(ctx)
87+
assert.Len(t, md.Get(MetadataKeyExternalDependencies), 0)
88+
89+
externalDependencyContext = middleware.ExternalDependencyContextFromContext(ctx4)
90+
require.NotNil(t, externalDependencyContext)
91+
assert.Empty(t, externalDependencyContext.String())
7092
}

pkg/context/transfer.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ func Transfer(in context.Context) context.Context {
2828
out = utm.ContextTransfer(in, out)
2929
out = hlog.ContextTransfer(in, out)
3030
out = TransferTracingContext(in, out)
31-
return locale.ContextTransfer(in, out)
31+
out = locale.ContextTransfer(in, out)
32+
out = TransferExternalDependencyContext(in, out)
33+
34+
return out
3235
}
3336

3437
func TransferTracingContext(in, out context.Context) context.Context {

0 commit comments

Comments
 (0)