pkg/utils/gwlog/metadata.go (64 lines of code) (raw):
package gwlog
import (
"context"
"github.com/google/uuid"
)
type key string
const metadataKey key = "metadata_key"
const traceID string = "trace_id"
type metadata struct {
m map[string]string
}
func (mv *metadata) set(key, val string) {
mv.m[key] = val
}
func newMetadata() *metadata {
return &metadata{
m: make(map[string]string),
}
}
func NewTrace(ctx context.Context) context.Context {
currID := uuid.New()
newCtx := context.WithValue(ctx, metadataKey, newMetadata())
AddMetadata(newCtx, traceID, currID.String())
return newCtx
}
func AddMetadata(ctx context.Context, key, value string) {
if ctx.Value(metadataKey) != nil {
ctx.Value(metadataKey).(*metadata).set(key, value)
}
}
func getMetadata(ctx context.Context) []interface{} {
var fields []interface{}
if ctx.Value(metadataKey) != nil {
for k, v := range ctx.Value(metadataKey).(*metadata).m {
if k == traceID {
// skip since there's a separate method to grab the trace id
continue
}
fields = append(fields, k)
fields = append(fields, v)
}
}
return fields
}
func GetTraceID(ctx context.Context) string {
if ctx.Value(metadataKey) != nil {
m := ctx.Value(metadataKey).(*metadata).m
if m == nil {
return ""
}
return ctx.Value(metadataKey).(*metadata).m[traceID]
}
return ""
}
func StartReconcileTrace(ctx context.Context, log Logger, k8sresourcetype, name, namespace string) context.Context {
ctx = NewTrace(ctx)
AddMetadata(ctx, "type", k8sresourcetype)
AddMetadata(ctx, "name", name)
AddMetadata(ctx, "namespace", namespace)
log.Infow(ctx, ReconcileStart, getMetadata(ctx)...)
return ctx
}
func EndReconcileTrace(ctx context.Context, log Logger) {
log.Infow(ctx, ReconcileEnd, getMetadata(ctx)...)
}