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  }