0.2.79 - Slow api fixes
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/jackc/pgx/v5"
|
||||
|
||||
"github.com/ponzischeme89/memby/server/internal/timing"
|
||||
)
|
||||
|
||||
// queryTracer attributes Postgres time to the request that asked for it.
|
||||
//
|
||||
// pgx's tracer interface is the only place every query in the gateway passes through —
|
||||
// there are several hundred call sites across internal/store and instrumenting them by
|
||||
// hand would guarantee the one that matters is the one nobody wrapped. The SQL itself
|
||||
// is deliberately not recorded: a breakdown is read beside a request line in the admin
|
||||
// console, and a query text there would put table and column names in front of anybody
|
||||
// who can open the log.
|
||||
type queryTracer struct{}
|
||||
|
||||
type queryStartKey struct{}
|
||||
|
||||
func (queryTracer) TraceQueryStart(
|
||||
ctx context.Context, _ *pgx.Conn, _ pgx.TraceQueryStartData,
|
||||
) context.Context {
|
||||
if timing.From(ctx) == nil {
|
||||
return ctx
|
||||
}
|
||||
return context.WithValue(ctx, queryStartKey{}, time.Now())
|
||||
}
|
||||
|
||||
func (queryTracer) TraceQueryEnd(ctx context.Context, _ *pgx.Conn, _ pgx.TraceQueryEndData) {
|
||||
began, ok := ctx.Value(queryStartKey{}).(time.Time)
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
timing.Record(ctx, timing.StageDB, time.Since(began))
|
||||
}
|
||||
Reference in New Issue
Block a user