mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-10-29 10:02:24 -05:00
[feature] Add a request ID and include it in logs (#1476)
This adds a lightweight form of tracing to GTS. Each incoming request is assigned a Request ID which we then pass on and log in all our log lines. Any function that gets called downstream from an HTTP handler should now emit a requestID=value pair whenever it logs something. Co-authored-by: kim <grufwub@gmail.com>
This commit is contained in:
parent
b5993095fa
commit
68e6d08c76
118 changed files with 813 additions and 591 deletions
|
|
@ -454,8 +454,8 @@ func scheduleCleanupJobs(m *manager) {
|
|||
m.state.Workers.Scheduler.Schedule(sched.NewJob(func(now time.Time) {
|
||||
err := m.PruneAll(doneCtx, config.GetMediaRemoteCacheDays(), true)
|
||||
if err != nil {
|
||||
log.Errorf("error during prune: %v", err)
|
||||
log.Errorf(nil, "error during prune: %v", err)
|
||||
}
|
||||
log.Infof("finished pruning all in %s", time.Since(now))
|
||||
log.Infof(nil, "finished pruning all in %s", time.Since(now))
|
||||
}).EveryAt(midnight, day))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ func (p *ProcessingEmoji) LoadEmoji(ctx context.Context) (*gtsmodel.Emoji, error
|
|||
if !done {
|
||||
// Provided context was cancelled, e.g. request cancelled
|
||||
// early. Queue this item for asynchronous processing.
|
||||
log.Warnf("reprocessing emoji %s after canceled ctx", p.emoji.ID)
|
||||
log.Warnf(ctx, "reprocessing emoji %s after canceled ctx", p.emoji.ID)
|
||||
go p.mgr.state.Workers.Media.Enqueue(p.Process)
|
||||
}
|
||||
|
||||
|
|
@ -77,7 +77,7 @@ func (p *ProcessingEmoji) LoadEmoji(ctx context.Context) (*gtsmodel.Emoji, error
|
|||
// Process allows the receiving object to fit the runners.WorkerFunc signature. It performs a (blocking) load and logs on error.
|
||||
func (p *ProcessingEmoji) Process(ctx context.Context) {
|
||||
if _, _, err := p.load(ctx); err != nil {
|
||||
log.Errorf("error processing emoji: %v", err)
|
||||
log.Errorf(ctx, "error processing emoji: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -167,7 +167,7 @@ func (p *ProcessingEmoji) store(ctx context.Context) error {
|
|||
|
||||
// Ensure post callback gets called.
|
||||
if err := p.postFn(ctx); err != nil {
|
||||
log.Errorf("error executing postdata function: %v", err)
|
||||
log.Errorf(ctx, "error executing postdata function: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
|
|
@ -180,7 +180,7 @@ func (p *ProcessingEmoji) store(ctx context.Context) error {
|
|||
defer func() {
|
||||
// Ensure data reader gets closed on return.
|
||||
if err := rc.Close(); err != nil {
|
||||
log.Errorf("error closing data reader: %v", err)
|
||||
log.Errorf(ctx, "error closing data reader: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
|
|
@ -251,7 +251,7 @@ func (p *ProcessingEmoji) store(ctx context.Context) error {
|
|||
|
||||
// This shouldn't already exist, but we do a check as it's worth logging.
|
||||
if have, _ := p.mgr.state.Storage.Has(ctx, p.emoji.ImagePath); have {
|
||||
log.Warnf("emoji already exists at storage path: %s", p.emoji.ImagePath)
|
||||
log.Warnf(ctx, "emoji already exists at storage path: %s", p.emoji.ImagePath)
|
||||
|
||||
// Attempt to remove existing emoji at storage path (might be broken / out-of-date)
|
||||
if err := p.mgr.state.Storage.Delete(ctx, p.emoji.ImagePath); err != nil {
|
||||
|
|
@ -267,8 +267,9 @@ func (p *ProcessingEmoji) store(ctx context.Context) error {
|
|||
|
||||
// Once again check size in case none was provided previously.
|
||||
if size := bytesize.Size(sz); size > maxSize {
|
||||
|
||||
if err := p.mgr.state.Storage.Delete(ctx, p.emoji.ImagePath); err != nil {
|
||||
log.Errorf("error removing too-large-emoji from storage: %v", err)
|
||||
log.Errorf(ctx, "error removing too-large-emoji from storage: %v", err)
|
||||
}
|
||||
return fmt.Errorf("calculated emoji size %s greater than max allowed %s", size, maxSize)
|
||||
}
|
||||
|
|
@ -308,8 +309,7 @@ func (p *ProcessingEmoji) finish(ctx context.Context) error {
|
|||
|
||||
// This shouldn't already exist, but we do a check as it's worth logging.
|
||||
if have, _ := p.mgr.state.Storage.Has(ctx, p.emoji.ImageStaticPath); have {
|
||||
log.Warnf("static emoji already exists at storage path: %s", p.emoji.ImagePath)
|
||||
|
||||
log.Warnf(ctx, "static emoji already exists at storage path: %s", p.emoji.ImagePath)
|
||||
// Attempt to remove static existing emoji at storage path (might be broken / out-of-date)
|
||||
if err := p.mgr.state.Storage.Delete(ctx, p.emoji.ImageStaticPath); err != nil {
|
||||
return fmt.Errorf("error removing static emoji from storage: %v", err)
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ func (p *ProcessingMedia) LoadAttachment(ctx context.Context) (*gtsmodel.MediaAt
|
|||
if !done {
|
||||
// Provided context was cancelled, e.g. request cancelled
|
||||
// early. Queue this item for asynchronous processing.
|
||||
log.Warnf("reprocessing media %s after canceled ctx", p.media.ID)
|
||||
log.Warnf(ctx, "reprocessing media %s after canceled ctx", p.media.ID)
|
||||
go p.mgr.state.Workers.Media.Enqueue(p.Process)
|
||||
}
|
||||
|
||||
|
|
@ -77,7 +77,7 @@ func (p *ProcessingMedia) LoadAttachment(ctx context.Context) (*gtsmodel.MediaAt
|
|||
// Process allows the receiving object to fit the runners.WorkerFunc signature. It performs a (blocking) load and logs on error.
|
||||
func (p *ProcessingMedia) Process(ctx context.Context) {
|
||||
if _, _, err := p.load(ctx); err != nil {
|
||||
log.Errorf("error processing media: %v", err)
|
||||
log.Errorf(ctx, "error processing media: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -151,7 +151,7 @@ func (p *ProcessingMedia) store(ctx context.Context) error {
|
|||
|
||||
// ensure post callback gets called.
|
||||
if err := p.postFn(ctx); err != nil {
|
||||
log.Errorf("error executing postdata function: %v", err)
|
||||
log.Errorf(ctx, "error executing postdata function: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
|
|
@ -164,7 +164,7 @@ func (p *ProcessingMedia) store(ctx context.Context) error {
|
|||
defer func() {
|
||||
// Ensure data reader gets closed on return.
|
||||
if err := rc.Close(); err != nil {
|
||||
log.Errorf("error closing data reader: %v", err)
|
||||
log.Errorf(ctx, "error closing data reader: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
|
|
@ -220,7 +220,7 @@ func (p *ProcessingMedia) store(ctx context.Context) error {
|
|||
|
||||
// This shouldn't already exist, but we do a check as it's worth logging.
|
||||
if have, _ := p.mgr.state.Storage.Has(ctx, p.media.File.Path); have {
|
||||
log.Warnf("media already exists at storage path: %s", p.media.File.Path)
|
||||
log.Warnf(ctx, "media already exists at storage path: %s", p.media.File.Path)
|
||||
|
||||
// Attempt to remove existing media at storage path (might be broken / out-of-date)
|
||||
if err := p.mgr.state.Storage.Delete(ctx, p.media.File.Path); err != nil {
|
||||
|
|
@ -333,7 +333,7 @@ func (p *ProcessingMedia) finish(ctx context.Context) error {
|
|||
|
||||
// This shouldn't already exist, but we do a check as it's worth logging.
|
||||
if have, _ := p.mgr.state.Storage.Has(ctx, p.media.Thumbnail.Path); have {
|
||||
log.Warnf("thumbnail already exists at storage path: %s", p.media.Thumbnail.Path)
|
||||
log.Warnf(ctx, "thumbnail already exists at storage path: %s", p.media.Thumbnail.Path)
|
||||
|
||||
// Attempt to remove existing thumbnail at storage path (might be broken / out-of-date)
|
||||
if err := p.mgr.state.Storage.Delete(ctx, p.media.Thumbnail.Path); err != nil {
|
||||
|
|
|
|||
|
|
@ -48,34 +48,34 @@ func (m *manager) PruneAll(ctx context.Context, mediaCacheRemoteDays int, blocki
|
|||
if err != nil {
|
||||
errs = append(errs, fmt.Sprintf("error pruning unused local media (%s)", err))
|
||||
} else {
|
||||
log.Infof("pruned %d unused local media", pruned)
|
||||
log.Infof(ctx, "pruned %d unused local media", pruned)
|
||||
}
|
||||
|
||||
pruned, err = m.PruneUnusedRemote(innerCtx, dry)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Sprintf("error pruning unused remote media: (%s)", err))
|
||||
} else {
|
||||
log.Infof("pruned %d unused remote media", pruned)
|
||||
log.Infof(ctx, "pruned %d unused remote media", pruned)
|
||||
}
|
||||
|
||||
pruned, err = m.UncacheRemote(innerCtx, mediaCacheRemoteDays, dry)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Sprintf("error uncacheing remote media older than %d day(s): (%s)", mediaCacheRemoteDays, err))
|
||||
} else {
|
||||
log.Infof("uncached %d remote media older than %d day(s)", pruned, mediaCacheRemoteDays)
|
||||
log.Infof(ctx, "uncached %d remote media older than %d day(s)", pruned, mediaCacheRemoteDays)
|
||||
}
|
||||
|
||||
pruned, err = m.PruneOrphaned(innerCtx, dry)
|
||||
if err != nil {
|
||||
errs = append(errs, fmt.Sprintf("error pruning orphaned media: (%s)", err))
|
||||
} else {
|
||||
log.Infof("pruned %d orphaned media", pruned)
|
||||
log.Infof(ctx, "pruned %d orphaned media", pruned)
|
||||
}
|
||||
|
||||
if err := m.state.Storage.Storage.Clean(innerCtx); err != nil {
|
||||
errs = append(errs, fmt.Sprintf("error cleaning storage: (%s)", err))
|
||||
} else {
|
||||
log.Info("cleaned storage")
|
||||
log.Info(ctx, "cleaned storage")
|
||||
}
|
||||
|
||||
return errs.Combine()
|
||||
|
|
@ -87,7 +87,7 @@ func (m *manager) PruneAll(ctx context.Context, mediaCacheRemoteDays int, blocki
|
|||
|
||||
go func() {
|
||||
if err := f(context.Background()); err != nil {
|
||||
log.Error(err)
|
||||
log.Error(ctx, err)
|
||||
}
|
||||
}()
|
||||
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ func (m *manager) RefetchEmojis(ctx context.Context, domain string, dereferenceM
|
|||
if err != nil {
|
||||
if !errors.Is(err, db.ErrNoEntries) {
|
||||
// an actual error has occurred
|
||||
log.Errorf("error fetching emojis from database: %s", err)
|
||||
log.Errorf(ctx, "error fetching emojis from database: %s", err)
|
||||
}
|
||||
break
|
||||
}
|
||||
|
|
@ -79,10 +79,10 @@ func (m *manager) RefetchEmojis(ctx context.Context, domain string, dereferenceM
|
|||
// bail early if we've got nothing to do
|
||||
toRefetchCount := len(refetchIDs)
|
||||
if toRefetchCount == 0 {
|
||||
log.Debug("no remote emojis require a refetch")
|
||||
log.Debug(ctx, "no remote emojis require a refetch")
|
||||
return 0, nil
|
||||
}
|
||||
log.Debugf("%d remote emoji(s) require a refetch, doing that now...", toRefetchCount)
|
||||
log.Debugf(ctx, "%d remote emoji(s) require a refetch, doing that now...", toRefetchCount)
|
||||
|
||||
var totalRefetched int
|
||||
for _, emojiID := range refetchIDs {
|
||||
|
|
@ -94,13 +94,13 @@ func (m *manager) RefetchEmojis(ctx context.Context, domain string, dereferenceM
|
|||
shortcodeDomain := util.ShortcodeDomain(emoji)
|
||||
|
||||
if emoji.ImageRemoteURL == "" {
|
||||
log.Errorf("remote emoji %s could not be refreshed because it has no ImageRemoteURL set", shortcodeDomain)
|
||||
log.Errorf(ctx, "remote emoji %s could not be refreshed because it has no ImageRemoteURL set", shortcodeDomain)
|
||||
continue
|
||||
}
|
||||
|
||||
emojiImageIRI, err := url.Parse(emoji.ImageRemoteURL)
|
||||
if err != nil {
|
||||
log.Errorf("remote emoji %s could not be refreshed because its ImageRemoteURL (%s) is not a valid uri: %s", shortcodeDomain, emoji.ImageRemoteURL, err)
|
||||
log.Errorf(ctx, "remote emoji %s could not be refreshed because its ImageRemoteURL (%s) is not a valid uri: %s", shortcodeDomain, emoji.ImageRemoteURL, err)
|
||||
continue
|
||||
}
|
||||
|
||||
|
|
@ -116,16 +116,16 @@ func (m *manager) RefetchEmojis(ctx context.Context, domain string, dereferenceM
|
|||
VisibleInPicker: emoji.VisibleInPicker,
|
||||
}, true)
|
||||
if err != nil {
|
||||
log.Errorf("emoji %s could not be refreshed because of an error during processing: %s", shortcodeDomain, err)
|
||||
log.Errorf(ctx, "emoji %s could not be refreshed because of an error during processing: %s", shortcodeDomain, err)
|
||||
continue
|
||||
}
|
||||
|
||||
if _, err := processingEmoji.LoadEmoji(ctx); err != nil {
|
||||
log.Errorf("emoji %s could not be refreshed because of an error during loading: %s", shortcodeDomain, err)
|
||||
log.Errorf(ctx, "emoji %s could not be refreshed because of an error during loading: %s", shortcodeDomain, err)
|
||||
continue
|
||||
}
|
||||
|
||||
log.Tracef("refetched emoji %s successfully from remote", shortcodeDomain)
|
||||
log.Tracef(ctx, "refetched emoji %s successfully from remote", shortcodeDomain)
|
||||
totalRefetched++
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ func decodeVideoFrame(r io.Reader) (*gtsVideo, error) {
|
|||
}
|
||||
defer func() {
|
||||
if err := tfs.Close(); err != nil {
|
||||
log.Errorf("error closing temp file seeker: %s", err)
|
||||
log.Errorf(nil, "error closing temp file seeker: %s", err)
|
||||
}
|
||||
}()
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue