feat: add support for request ID tracking across services

- Implemented request ID handling in various services and handlers to improve traceability of requests.
- Added new AuthOptions endpoint to expose WxWork and OIDC configuration options.
- Updated message and event logging to include request ID for better debugging.
- Enhanced login form to dynamically show available authentication options based on server configuration.
- Introduced utility functions for normalizing and ensuring valid request IDs.
- Updated tests to verify request ID functionality in message sending and event logging.
This commit is contained in:
mlogclub
2026-05-27 22:18:43 +08:00
parent 498932de61
commit c246b85a9e
30 changed files with 504 additions and 59 deletions
+57
View File
@@ -0,0 +1,57 @@
package tracex
import (
"context"
"crypto/rand"
"encoding/hex"
"strings"
)
const (
RequestIDHeader = "X-Request-Id"
GinRequestIDKey = "requestId"
)
type requestIDContextKey struct{}
func NormalizeRequestID(value string) string {
value = strings.TrimSpace(value)
if value == "" || len(value) > 128 {
return ""
}
for _, r := range value {
if r < 33 || r > 126 {
return ""
}
}
return value
}
func EnsureRequestID(value string) string {
if normalized := NormalizeRequestID(value); normalized != "" {
return normalized
}
var b [16]byte
if _, err := rand.Read(b[:]); err != nil {
return ""
}
return hex.EncodeToString(b[:])
}
func ContextWithRequestID(ctx context.Context, requestID string) context.Context {
requestID = NormalizeRequestID(requestID)
if requestID == "" {
return ctx
}
return context.WithValue(ctx, requestIDContextKey{}, requestID)
}
func RequestIDFromContext(ctx context.Context) string {
if ctx == nil {
return ""
}
if value, ok := ctx.Value(requestIDContextKey{}).(string); ok {
return NormalizeRequestID(value)
}
return ""
}
+24
View File
@@ -0,0 +1,24 @@
package tracex
import "testing"
func TestNormalizeRequestID(t *testing.T) {
if got := NormalizeRequestID(" trace-123 "); got != "trace-123" {
t.Fatalf("NormalizeRequestID()=%q want %q", got, "trace-123")
}
if got := NormalizeRequestID("bad\nid"); got != "" {
t.Fatalf("NormalizeRequestID()=%q want empty", got)
}
if got := NormalizeRequestID(""); got != "" {
t.Fatalf("NormalizeRequestID()=%q want empty", got)
}
}
func TestEnsureRequestID(t *testing.T) {
if got := EnsureRequestID("trace-123"); got != "trace-123" {
t.Fatalf("EnsureRequestID(existing)=%q want %q", got, "trace-123")
}
if got := EnsureRequestID(""); got == "" {
t.Fatalf("EnsureRequestID(empty) should generate a value")
}
}