generated from xmidt-org/.go-template
-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add "isDecodable" option to middleware function call #141
Merged
+20
−9
Merged
Changes from 2 commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
6737d67
Add bool param to middleware for decoding
renaz6 04301ea
Merge branch 'main' into tr1d1umCandlelightBug
renaz6 9da3452
Add Check for traceheader, ensure tracing
renaz6 f7ba5dc
Merge branch 'tr1d1umCandlelightBug' of https://github.com/xmidt-org/…
renaz6 8bc6dc3
Correct Xmidt header
renaz6 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,6 +17,7 @@ | |
package candlelight | ||
|
||
import ( | ||
"context" | ||
"crypto/rand" | ||
"encoding/base64" | ||
"net/http" | ||
|
@@ -62,34 +63,42 @@ func (traceConfig *TraceConfig) TraceMiddleware(delegate http.Handler) http.Hand | |
}) | ||
} | ||
|
||
// EchoFirstNodeTraceInfo captures the trace information from a request and writes it | ||
// back in the response headers if the request is the first one in the trace path. | ||
func EchoFirstTraceNodeInfo(propagator propagation.TextMapPropagator) func(http.Handler) http.Handler { | ||
// EchoFirstNodeTraceInfo captures the trace information from a request, writes it | ||
// back in the response headers, and adds it to the request's context | ||
// It can also decode the request and save the resulting WRP object in the context if isDecodable is true | ||
func EchoFirstTraceNodeInfo(propagator propagation.TextMapPropagator, isDecodable bool) func(http.Handler) http.Handler { | ||
return func(delegate http.Handler) http.Handler { | ||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | ||
|
||
if req, err := wrphttp.DecodeRequest(r, nil); err == nil { | ||
r = req | ||
} | ||
var ctx context.Context | ||
|
||
var traceHeaders []string | ||
ctx := propagator.Extract(r.Context(), propagation.HeaderCarrier(r.Header)) | ||
if msg, ok := wrpcontext.Get[*wrp.Message](ctx); ok { | ||
traceHeaders = msg.Headers | ||
} | ||
if isDecodable { | ||
if req, err := wrphttp.DecodeRequest(r, nil); err == nil { | ||
r = req | ||
} | ||
denopink marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
// Iterate through the trace headers (if any), format them, and add them to ctx | ||
var tmp propagation.TextMapCarrier = propagation.MapCarrier{} | ||
for _, f := range traceHeaders { | ||
if f != "" { | ||
parts := strings.Split(f, ":") | ||
// Remove leading space if there's any | ||
parts[1] = strings.Trim(parts[1], " ") | ||
tmp.Set(parts[0], parts[1]) | ||
var traceHeaders []string | ||
ctx = propagator.Extract(r.Context(), propagation.HeaderCarrier(r.Header)) | ||
if msg, ok := wrpcontext.Get[*wrp.Message](ctx); ok { | ||
traceHeaders = msg.Headers | ||
} | ||
|
||
// Iterate through the trace headers (if any), format them, and add them to ctx | ||
var tmp propagation.TextMapCarrier = propagation.MapCarrier{} | ||
for _, f := range traceHeaders { | ||
if f != "" { | ||
parts := strings.Split(f, ":") | ||
// Remove leading space if there's any | ||
parts[1] = strings.Trim(parts[1], " ") | ||
tmp.Set(parts[0], parts[1]) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. do we want to check whether or not There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Updated! |
||
} | ||
} | ||
|
||
ctx = propagation.TraceContext{}.Extract(ctx, tmp) | ||
} else { | ||
ctx = propagator.Extract(r.Context(), propagation.HeaderCarrier(r.Header)) | ||
} | ||
|
||
ctx = propagation.TraceContext{}.Extract(ctx, tmp) | ||
sc := trace.SpanContextFromContext(ctx) | ||
if sc.IsValid() { | ||
w.Header().Set(spanIDHeaderName, sc.SpanID().String()) | ||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For future:
This is the kind of function that will probably grow over time, with new parameters. This makes the API brittle, since you wind up breaking existing clients when you change the function's signature.
If we add more parameters here, it would probably be better to move to either the builder pattern or the functional options pattern described by https://golang.cafe/blog/golang-functional-options-pattern.html.
An really trivial example:
Alternatively, you can expose the builder as part of your API.
gorilla/mux
takes this approach. The choice of which is really more about what will be more stable for a client.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Created a ticket for this work: #142