github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/store/logger.go (about) 1 package store 2 3 import ( 4 "context" 5 "fmt" 6 7 "k8s.io/apimachinery/pkg/api/meta" 8 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 9 10 "github.com/tilt-dev/tilt/pkg/apis/core/v1alpha1" 11 "github.com/tilt-dev/tilt/pkg/logger" 12 "github.com/tilt-dev/tilt/pkg/model" 13 "github.com/tilt-dev/tilt/pkg/model/logstore" 14 ) 15 16 func NewLogActionLogger(ctx context.Context, dispatch func(action Action)) logger.Logger { 17 l := logger.Get(ctx) 18 return logger.NewFuncLogger(l.SupportsColor(), l.Level(), func(level logger.Level, fields logger.Fields, b []byte) error { 19 dispatch(NewGlobalLogAction(level, b)) 20 return nil 21 }) 22 } 23 24 // Read labels and annotations of the given API object to determine where to log, 25 // panicking if there's no info available. 26 func MustObjectLogHandler(ctx context.Context, st Dispatcher, obj metav1.Object) context.Context { 27 ctx, err := WithObjectLogHandler(ctx, st, obj) 28 if err != nil { 29 panic(err) 30 } 31 return ctx 32 } 33 34 // Read labels and annotations of the given API object to determine where to log. 35 func WithObjectLogHandler(ctx context.Context, st Dispatcher, obj metav1.Object) (context.Context, error) { 36 // It's ok if the manifest or span id don't exist, they will just 37 // get dumped in the global log. 38 mn := obj.GetAnnotations()[v1alpha1.AnnotationManifest] 39 spanID := obj.GetAnnotations()[v1alpha1.AnnotationSpanID] 40 typ, err := meta.TypeAccessor(obj) 41 if err != nil { 42 return nil, fmt.Errorf("object missing type data: %T", obj) 43 } 44 if spanID == "" { 45 spanID = fmt.Sprintf("%s-%s", typ.GetKind(), obj.GetName()) 46 } 47 48 return WithManifestLogHandler(ctx, st, model.ManifestName(mn), model.LogSpanID(spanID)), nil 49 } 50 51 func WithManifestLogHandler(ctx context.Context, st Dispatcher, mn model.ManifestName, spanID logstore.SpanID) context.Context { 52 w := manifestLogWriter{ 53 store: st, 54 manifestName: mn, 55 spanID: spanID, 56 } 57 return logger.CtxWithLogHandler(ctx, w) 58 } 59 60 type manifestLogWriter struct { 61 store Dispatcher 62 manifestName model.ManifestName 63 spanID model.LogSpanID 64 } 65 66 func (w manifestLogWriter) Write(level logger.Level, fields logger.Fields, p []byte) error { 67 w.store.Dispatch(NewLogAction(w.manifestName, w.spanID, level, fields, p)) 68 return nil 69 } 70 71 type Dispatcher interface { 72 Dispatch(action Action) 73 }