Skip to content

Commit 8edaa11

Browse files
committed
[ffapi] [ffresty] Allow for Configuring Request Header for Distributed Trace Logging
Signed-off-by: hfuss <[email protected]>
1 parent db05736 commit 8edaa11

File tree

4 files changed

+39
-6
lines changed

4 files changed

+39
-6
lines changed

pkg/ffapi/handler.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,24 @@ import (
3939
"github.com/sirupsen/logrus"
4040
)
4141

42-
const FFRequestIDHeader = "X-FireFly-Request-ID"
42+
const DefaultRequestIDHeader = "X-FireFly-Request-ID"
43+
44+
var (
45+
requestIDHeader string = DefaultRequestIDHeader
46+
)
47+
48+
// RequestIDHeader returns the header name used to pass the request ID for
49+
// ffapi server and ffresty client requests.
50+
func RequestIDHeader() string {
51+
return requestIDHeader
52+
}
53+
54+
// SetRequestIDHeader configures the header used to pass the request ID between
55+
// ffapi server and ffresty client requests. Should be set at initialization of
56+
// a process.
57+
func SetRequestIDHeader(header string) {
58+
requestIDHeader = header
59+
}
4360

4461
type (
4562
CtxHeadersKey struct{}
@@ -343,7 +360,7 @@ func (hs *HandlerFactory) APIWrapper(handler HandlerFunction) http.HandlerFunc {
343360

344361
reqTimeout := hs.getTimeout(req)
345362
ctx, cancel := context.WithTimeout(req.Context(), reqTimeout)
346-
httpReqID := req.Header.Get(FFRequestIDHeader)
363+
httpReqID := req.Header.Get(RequestIDHeader())
347364
if httpReqID == "" {
348365
httpReqID = fftypes.ShortID()
349366
}

pkg/ffapi/handler_test.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,13 +108,23 @@ func TestRouteServePOST201WithParams(t *testing.T) {
108108
assert.Equal(t, "true", r.QP["param2"])
109109
assert.Equal(t, "false", r.QP["param3"])
110110
assert.Equal(t, []string{"x", "y"}, r.QAP["param4"])
111+
assert.Equal(t, "12345", r.Req.Context().Value(CtxFFRequestIDKey{}).(string))
112+
assert.Equal(t, "custom-value", r.Req.Context().Value(CtxHeadersKey{}).(http.Header).Get("X-Custom-Header"))
111113
return map[string]interface{}{"output1": "value2"}, nil
112114
},
113115
}}, "", nil)
114116
defer done()
117+
SetRequestIDHeader("x-unittest-req-id") // tests custom req header
115118

116119
b, _ := json.Marshal(map[string]interface{}{"input1": "value1"})
117-
res, err := http.Post(fmt.Sprintf("http://%s/test/stuff?param1=thing&param2&param3=false&param4=x&param4=y", s.Addr()), "application/json", bytes.NewReader(b))
120+
121+
req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("http://%s/test/stuff?param1=thing&param2&param3=false&param4=x&param4=y", s.Addr()), bytes.NewReader(b))
122+
require.NoError(t, err)
123+
req.Header.Set("Content-Type", "application/json")
124+
req.Header.Set("X-Custom-Header", "custom-value") // tests custom header
125+
req.Header.Set("x-unittest-req-id", "12345") // tests custom req header
126+
127+
res, err := http.DefaultClient.Do(req)
118128
assert.NoError(t, err)
119129
assert.Equal(t, 201, res.StatusCode)
120130
var resJSON map[string]interface{}
@@ -134,13 +144,19 @@ func TestRouteServePOST201WithParamsLargeNumber(t *testing.T) {
134144
JSONOutputCodes: []int{201},
135145
JSONHandler: func(r *APIRequest) (output interface{}, err error) {
136146
assert.Equal(t, r.Input, map[string]interface{}{"largeNumberParam": json.Number("10000000000000000000000000001")})
147+
assert.Equal(t, "12345", r.Req.Context().Value(CtxFFRequestIDKey{}).(string))
137148
// Echo the input back as the response
138149
return r.Input, nil
139150
},
140151
}}, "", nil)
141152
defer done()
142153

143-
res, err := http.Post(fmt.Sprintf("http://%s/test/stuff", s.Addr()), "application/json", bytes.NewReader([]byte(largeParamLiteral)))
154+
req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("http://%s/test/stuff", s.Addr()), bytes.NewReader([]byte(largeParamLiteral)))
155+
require.NoError(t, err)
156+
req.Header.Set("Content-Type", "application/json")
157+
req.Header.Set(DefaultRequestIDHeader, "12345") // tests client setting req header
158+
159+
res, err := http.DefaultClient.Do(req)
144160
assert.NoError(t, err)
145161
assert.Equal(t, 201, res.StatusCode)
146162
var resJSON map[string]interface{}

pkg/ffresty/ffresty.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ func NewWithConfig(ctx context.Context, ffrestyConfig Config) (client *resty.Cli
305305
// If an X-FireFlyRequestID was set on the context, pass that header on this request too
306306
ffRequestID := rCtx.Value(ffapi.CtxFFRequestIDKey{})
307307
if ffRequestID != nil {
308-
req.Header.Set(ffapi.FFRequestIDHeader, ffRequestID.(string))
308+
req.Header.Set(ffapi.RequestIDHeader(), ffRequestID.(string))
309309
}
310310

311311
if ffrestyConfig.OnBeforeRequest != nil {

pkg/ffresty/ffresty_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ func TestPassthroughHeaders(t *testing.T) {
558558

559559
httpmock.RegisterResponder("GET", "http://localhost:12345/test",
560560
func(req *http.Request) (*http.Response, error) {
561-
assert.Equal(t, "customReqID", req.Header.Get(ffapi.FFRequestIDHeader))
561+
assert.Equal(t, "customReqID", req.Header.Get(ffapi.RequestIDHeader()))
562562
assert.Equal(t, "headervalue", req.Header.Get("someheader"))
563563
assert.Equal(t, "custom value", req.Header.Get("X-Custom-Header"))
564564
assert.Equal(t, "Basic dXNlcjpwYXNz", req.Header.Get("Authorization"))

0 commit comments

Comments
 (0)