Skip to content

Commit

Permalink
Add error recording and status code setting
Browse files Browse the repository at this point in the history
  • Loading branch information
dennis-tra committed Sep 1, 2023
1 parent 12ac85a commit 57fb4d9
Showing 1 changed file with 156 additions and 28 deletions.
184 changes: 156 additions & 28 deletions trace/trace.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
ds "github.com/ipfs/go-datastore"
dsq "github.com/ipfs/go-datastore/query"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
otel "go.opentelemetry.io/otel/trace"
)

Expand All @@ -36,61 +37,115 @@ var (
)

// Put implements the ds.Datastore interface.
func (t *Datastore) Put(ctx context.Context, key ds.Key, value []byte) (err error) {
func (t *Datastore) Put(ctx context.Context, key ds.Key, value []byte) error {
ctx, span := t.tracer.Start(ctx, "Put", otel.WithAttributes(attribute.String("key", key.String())))
defer span.End()
return t.ds.Put(ctx, key, value)

err := t.ds.Put(ctx, key, value)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

Check warning on line 48 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L46-L48

Added lines #L46 - L48 were not covered by tests

return err
}

// Sync implements Datastore.Sync
func (t *Datastore) Sync(ctx context.Context, key ds.Key) error {
ctx, span := t.tracer.Start(ctx, "Sync", otel.WithAttributes(attribute.String("key", key.String())))
defer span.End()
return t.ds.Sync(ctx, key)

err := t.ds.Sync(ctx, key)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

Check warning on line 62 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L60-L62

Added lines #L60 - L62 were not covered by tests

return err
}

// Get implements the ds.Datastore interface.
func (t *Datastore) Get(ctx context.Context, key ds.Key) (value []byte, err error) {
ctx, span := t.tracer.Start(ctx, "Get", otel.WithAttributes(attribute.String("key", key.String())))
defer span.End()
return t.ds.Get(ctx, key)

val, err := t.ds.Get(ctx, key)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

return val, err
}

// Has implements the ds.Datastore interface.
func (t *Datastore) Has(ctx context.Context, key ds.Key) (exists bool, err error) {
func (t *Datastore) Has(ctx context.Context, key ds.Key) (bool, error) {
ctx, span := t.tracer.Start(ctx, "Has", otel.WithAttributes(attribute.String("key", key.String())))
defer span.End()
return t.ds.Has(ctx, key)

exists, err := t.ds.Has(ctx, key)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

Check warning on line 90 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L88-L90

Added lines #L88 - L90 were not covered by tests

return exists, err
}

// GetSize implements the ds.Datastore interface.
func (t *Datastore) GetSize(ctx context.Context, key ds.Key) (size int, err error) {
func (t *Datastore) GetSize(ctx context.Context, key ds.Key) (int, error) {
ctx, span := t.tracer.Start(ctx, "GetSize", otel.WithAttributes(attribute.String("key", key.String())))
defer span.End()
return t.ds.GetSize(ctx, key)

size, err := t.ds.GetSize(ctx, key)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

return size, err
}

// Delete implements the ds.Datastore interface.
func (t *Datastore) Delete(ctx context.Context, key ds.Key) (err error) {
func (t *Datastore) Delete(ctx context.Context, key ds.Key) error {
ctx, span := t.tracer.Start(ctx, "Delete", otel.WithAttributes(attribute.String("key", key.String())))
defer span.End()
return t.ds.Delete(ctx, key)

err := t.ds.Delete(ctx, key)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

Check warning on line 118 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L116-L118

Added lines #L116 - L118 were not covered by tests

return err
}

// Query implements the ds.Datastore interface.
func (t *Datastore) Query(ctx context.Context, q dsq.Query) (dsq.Results, error) {
ctx, span := t.tracer.Start(ctx, "Query", otel.WithAttributes(attribute.String("query", q.String())))
defer span.End()
return t.ds.Query(ctx, q)

res, err := t.ds.Query(ctx, q)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

Check warning on line 132 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L130-L132

Added lines #L130 - L132 were not covered by tests

return res, err
}

// Batch implements the ds.Batching interface.
func (t *Datastore) Batch(ctx context.Context) (ds.Batch, error) {
ctx, span := t.tracer.Start(ctx, "Batch")
defer span.End()

if batch, ok := t.ds.(ds.Batching); ok {
return batch.Batch(ctx)
if dstore, ok := t.ds.(ds.Batching); ok {
batch, err := dstore.Batch(ctx)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

Check warning on line 147 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L145-L147

Added lines #L145 - L147 were not covered by tests
return batch, err
}

return ds.NewBasicBatch(t), nil

Check warning on line 151 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L151

Added line #L151 was not covered by tests
Expand All @@ -100,7 +155,14 @@ func (t *Datastore) Batch(ctx context.Context) (ds.Batch, error) {
func (t *Datastore) DiskUsage(ctx context.Context) (uint64, error) {
ctx, span := t.tracer.Start(ctx, "DiskUsage")
defer span.End()
return ds.DiskUsage(ctx, t.ds)

usage, err := ds.DiskUsage(ctx, t.ds)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

Check warning on line 163 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L155-L163

Added lines #L155 - L163 were not covered by tests

return usage, err

Check warning on line 165 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L165

Added line #L165 was not covered by tests
}

// Scrub implements the ds.ScrubbedDatastore interface.
Expand All @@ -109,7 +171,12 @@ func (t *Datastore) Scrub(ctx context.Context) error {
defer span.End()

if dstore, ok := t.tracer.(ds.ScrubbedDatastore); ok {
return dstore.Scrub(ctx)
err := dstore.Scrub(ctx)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}
return err

Check warning on line 179 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L169-L179

Added lines #L169 - L179 were not covered by tests
}

return nil

Check warning on line 182 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L182

Added line #L182 was not covered by tests
Expand All @@ -121,7 +188,12 @@ func (t *Datastore) CollectGarbage(ctx context.Context) error {
defer span.End()

if dstore, ok := t.tracer.(ds.GCDatastore); ok {
return dstore.CollectGarbage(ctx)
err := dstore.CollectGarbage(ctx)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}
return err

Check warning on line 196 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L186-L196

Added lines #L186 - L196 were not covered by tests
}

return nil

Check warning on line 199 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L199

Added line #L199 was not covered by tests
Expand All @@ -133,7 +205,12 @@ func (t *Datastore) Check(ctx context.Context) error {
defer span.End()

if dstore, ok := t.tracer.(ds.CheckedDatastore); ok {
return dstore.Check(ctx)
err := dstore.Check(ctx)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}
return err

Check warning on line 213 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L203-L213

Added lines #L203 - L213 were not covered by tests
}

return nil

Check warning on line 216 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L216

Added line #L216 was not covered by tests
Expand All @@ -147,6 +224,8 @@ func (t *Datastore) NewTransaction(ctx context.Context, readOnly bool) (ds.Txn,
if txnDs, ok := t.ds.(ds.TxnDatastore); ok {
txn, err := txnDs.NewTransaction(ctx, readOnly)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return nil, err
}
return &Txn{txn: txn, tracer: t.tracer}, nil

Check warning on line 231 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L220-L231

Added lines #L220 - L231 were not covered by tests
Expand All @@ -172,52 +251,101 @@ type Txn struct {
var _ ds.Txn = (*Txn)(nil)

// Put implements the ds.Txn interface.
func (t *Txn) Put(ctx context.Context, key ds.Key, value []byte) (err error) {
func (t *Txn) Put(ctx context.Context, key ds.Key, value []byte) error {
ctx, span := t.tracer.Start(ctx, "Put", otel.WithAttributes(attribute.String("key", key.String())))
defer span.End()
return t.txn.Put(ctx, key, value)

err := t.txn.Put(ctx, key, value)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

Check warning on line 262 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L254-L262

Added lines #L254 - L262 were not covered by tests

return err

Check warning on line 264 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L264

Added line #L264 was not covered by tests
}

// Get implements the ds.Txn interface.
func (t *Txn) Get(ctx context.Context, key ds.Key) (value []byte, err error) {
ctx, span := t.tracer.Start(ctx, "Get", otel.WithAttributes(attribute.String("key", key.String())))
defer span.End()
return t.txn.Get(ctx, key)

val, err := t.txn.Get(ctx, key)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

Check warning on line 276 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L268-L276

Added lines #L268 - L276 were not covered by tests

return val, err

Check warning on line 278 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L278

Added line #L278 was not covered by tests
}

// Has implements the ds.Txn interface.
func (t *Txn) Has(ctx context.Context, key ds.Key) (exists bool, err error) {
func (t *Txn) Has(ctx context.Context, key ds.Key) (bool, error) {
ctx, span := t.tracer.Start(ctx, "Has", otel.WithAttributes(attribute.String("key", key.String())))
defer span.End()
return t.txn.Has(ctx, key)

exists, err := t.txn.Has(ctx, key)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

Check warning on line 290 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L282-L290

Added lines #L282 - L290 were not covered by tests

return exists, err

Check warning on line 292 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L292

Added line #L292 was not covered by tests
}

// GetSize implements the ds.Txn interface.
func (t *Txn) GetSize(ctx context.Context, key ds.Key) (size int, err error) {
func (t *Txn) GetSize(ctx context.Context, key ds.Key) (int, error) {
ctx, span := t.tracer.Start(ctx, "GetSize", otel.WithAttributes(attribute.String("key", key.String())))
defer span.End()
return t.txn.GetSize(ctx, key)

size, err := t.txn.GetSize(ctx, key)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

Check warning on line 304 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L296-L304

Added lines #L296 - L304 were not covered by tests

return size, err

Check warning on line 306 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L306

Added line #L306 was not covered by tests
}

// Delete implements the ds.Txn interface.
func (t *Txn) Delete(ctx context.Context, key ds.Key) (err error) {
func (t *Txn) Delete(ctx context.Context, key ds.Key) error {
ctx, span := t.tracer.Start(ctx, "Delete", otel.WithAttributes(attribute.String("key", key.String())))
defer span.End()
return t.txn.Delete(ctx, key)

err := t.txn.Delete(ctx, key)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

Check warning on line 318 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L310-L318

Added lines #L310 - L318 were not covered by tests

return err

Check warning on line 320 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L320

Added line #L320 was not covered by tests
}

// Query implements the ds.Txn interface.
func (t *Txn) Query(ctx context.Context, q dsq.Query) (dsq.Results, error) {
ctx, span := t.tracer.Start(ctx, "Query", otel.WithAttributes(attribute.String("query", q.String())))
defer span.End()
return t.txn.Query(ctx, q)

res, err := t.txn.Query(ctx, q)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

Check warning on line 332 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L324-L332

Added lines #L324 - L332 were not covered by tests

return res, err

Check warning on line 334 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L334

Added line #L334 was not covered by tests
}

// Commit implements the ds.Txn interface.
func (t *Txn) Commit(ctx context.Context) error {
ctx, span := t.tracer.Start(ctx, "Commit")
defer span.End()
return t.txn.Commit(ctx)

err := t.txn.Commit(ctx)
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}

Check warning on line 346 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L338-L346

Added lines #L338 - L346 were not covered by tests

return err

Check warning on line 348 in trace/trace.go

View check run for this annotation

Codecov / codecov/patch

trace/trace.go#L348

Added line #L348 was not covered by tests
}

// Discard implements the ds.Txn interface.
Expand Down

0 comments on commit 57fb4d9

Please sign in to comment.