blendle / zapdriver

Blazing fast, Zap-based Stackdriver logging.
ISC License
175 stars 45 forks source link

Include trace in every log #38

Open Mistic92 opened 3 years ago

Mistic92 commented 3 years ago

Hi, is there a way to include traceId for every log? I'm using gin with otel and trying to figure out how to approach this issue

amammay commented 3 years ago

@Mistic92 just was browsing through and i ended up doing something like this

func (i *AppLogger) WrapTraceContext(ctx context.Context) *zap.SugaredLogger {
    sc := trace.SpanContextFromContext(ctx)
    fields := zapdriver.TraceContext(sc.TraceID().String(), sc.SpanID().String(), sc.IsSampled(), i.projectID)
    setFields := i.zap.With(fields...)
    return setFields.Sugar()
}

and then used it like so

func (s *server) handleGetDog(dogService *gotoproduction.DogService) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        ctx := r.Context()
        logger := s.appLogger.WrapTraceContext(ctx)
        vars := mux.Vars(r)
        dogID, ok := vars["dogID"]
        logger.Infof("searching for dog %s", dogID)
        if !ok {
            s.respond(w, nil, http.StatusBadRequest)
            return
        }
        dog, err := dogService.GetDogByID(ctx, dogID)
        if err == gotoproduction.ErrDogNotFound {
            s.respond(w, nil, http.StatusNotFound)
            return
        }
        if err != nil {
            s.respond(w, nil, http.StatusInternalServerError)
            return
        }
        logger.Infof("search found dog: %s", dog.ID)
        s.respond(w, dog, http.StatusOK)
    }
}

my full reference is in this repo. https://github.com/amammay/gotoproduction