tsweb: add optional on completion callback func

Updates corp#17075

Co-Authored-By: Anton Tolchanov <anton@tailscale.com>
Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
This commit is contained in:
Kristoffer Dalby 2024-02-22 09:42:12 +01:00 committed by Kristoffer Dalby
parent b8cf852881
commit 95f266f1ce

View File

@ -254,11 +254,19 @@ type HandlerOptions struct {
// is intended to be used to present pretty error pages if // is intended to be used to present pretty error pages if
// the user agent is determined to be a browser. // the user agent is determined to be a browser.
OnError ErrorHandlerFunc OnError ErrorHandlerFunc
// OnCompletion is called when ServeHTTP is finished and gets
// useful data that the implementor can use for metrics.
OnCompletion OnCompletionFunc
} }
// ErrorHandlerFunc is called to present a error response. // ErrorHandlerFunc is called to present a error response.
type ErrorHandlerFunc func(http.ResponseWriter, *http.Request, HTTPError) type ErrorHandlerFunc func(http.ResponseWriter, *http.Request, HTTPError)
// OnCompletionFunc is called when ServeHTTP is finished and gets
// useful data that the implementor can use for metrics.
type OnCompletionFunc func(*http.Request, AccessLogRecord)
// ReturnHandlerFunc is an adapter to allow the use of ordinary // ReturnHandlerFunc is an adapter to allow the use of ordinary
// functions as ReturnHandlers. If f is a function with the // functions as ReturnHandlers. If f is a function with the
// appropriate signature, ReturnHandlerFunc(f) is a ReturnHandler that // appropriate signature, ReturnHandlerFunc(f) is a ReturnHandler that
@ -435,6 +443,10 @@ func (h retHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} }
} }
if h.opts.OnCompletion != nil {
h.opts.OnCompletion(r, msg)
}
if bs := h.opts.BucketedStats; bs != nil && bs.Finished != nil { if bs := h.opts.BucketedStats; bs != nil && bs.Finished != nil {
// Only increment metrics for buckets that result in good HTTP statuses // Only increment metrics for buckets that result in good HTTP statuses
// or when we know the start was already counted. // or when we know the start was already counted.