[#242] node: Add tracing spans

Add tracing spans for PUT requests.
Add tracing spans for DELETE requests.
Add tracing spans for SELECT requests.

Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
This commit is contained in:
Dmitrii Stepanov 2023-04-12 17:01:29 +03:00 committed by fyrchik
parent 200fc8b882
commit d62c6e4ce6
122 changed files with 863 additions and 417 deletions

View file

@ -120,7 +120,7 @@ func (w *putSvcWrapper) put(ctx context.Context, exec *execCtx) (*oid.ID, error)
WithCommonPrm(exec.commonParameters()).
WithObject(exec.tombstoneObj.CutPayload())
err = streamer.Init(initPrm)
err = streamer.Init(ctx, initPrm)
if err != nil {
return nil, err
}

View file

@ -8,6 +8,7 @@ import (
"fmt"
"io"
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/pkg/tracing"
coreclient "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/core/client"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client"
@ -402,6 +403,9 @@ func (x PutObjectRes) ID() oid.ID {
//
// Returns any error which prevented the operation from completing correctly in error return.
func PutObject(ctx context.Context, prm PutObjectPrm) (*PutObjectRes, error) {
ctx, span := tracing.StartSpanFromContext(ctx, "client.PutObject")
defer span.End()
var prmCli client.PrmObjectPutInit
prmCli.MarkLocal()

View file

@ -117,7 +117,7 @@ func (x errIncompletePut) Error() string {
return commonMsg
}
func (t *distributedTarget) WriteHeader(obj *objectSDK.Object) error {
func (t *distributedTarget) WriteHeader(_ context.Context, obj *objectSDK.Object) error {
t.obj = obj
return nil

View file

@ -14,15 +14,15 @@ import (
type ObjectStorage interface {
// Put must save passed object
// and return any appeared error.
Put(*object.Object) error
Put(context.Context, *object.Object) error
// Delete must delete passed objects
// and return any appeared error.
Delete(ctx context.Context, tombstone oid.Address, toDelete []oid.ID) error
// Lock must lock passed objects
// and return any appeared error.
Lock(locker oid.Address, toLock []oid.ID) error
Lock(ctx context.Context, locker oid.Address, toLock []oid.ID) error
// IsLocked must clarify object's lock status.
IsLocked(oid.Address) (bool, error)
IsLocked(context.Context, oid.Address) (bool, error)
}
type localTarget struct {
@ -47,7 +47,7 @@ func (t *localTarget) Close(ctx context.Context) (*transformer.AccessIdentifiers
return nil, fmt.Errorf("could not delete objects from tombstone locally: %w", err)
}
case object.TypeLock:
err := t.storage.Lock(objectCore.AddressOf(t.obj), t.meta.Objects())
err := t.storage.Lock(ctx, objectCore.AddressOf(t.obj), t.meta.Objects())
if err != nil {
return nil, fmt.Errorf("could not lock object from lock objects locally: %w", err)
}
@ -55,7 +55,7 @@ func (t *localTarget) Close(ctx context.Context) (*transformer.AccessIdentifiers
// objects that do not change meta storage
}
if err := t.storage.Put(t.obj); err != nil {
if err := t.storage.Put(ctx, t.obj); err != nil { //TODO
return nil, fmt.Errorf("(%T) could not put object to local storage: %w", t, err)
}

View file

@ -32,13 +32,13 @@ var errNotInit = errors.New("stream not initialized")
var errInitRecall = errors.New("init recall")
func (p *Streamer) Init(prm *PutInitPrm) error {
func (p *Streamer) Init(ctx context.Context, prm *PutInitPrm) error {
// initialize destination target
if err := p.initTarget(prm); err != nil {
return fmt.Errorf("(%T) could not initialize object target: %w", p, err)
}
if err := p.target.WriteHeader(prm.hdr); err != nil {
if err := p.target.WriteHeader(ctx, prm.hdr); err != nil {
return fmt.Errorf("(%T) could not write header to target: %w", p, err)
}
return nil

View file

@ -5,6 +5,7 @@ import (
"fmt"
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object"
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/pkg/tracing"
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
rawclient "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
sessionV2 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
@ -15,6 +16,8 @@ import (
internalclient "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object/internal/client"
putsvc "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object/put"
"git.frostfs.info/TrueCloudLab/frostfs-node/pkg/services/object/util"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/trace"
)
type streamer struct {
@ -34,6 +37,9 @@ type sizes struct {
}
func (s *streamer) Send(ctx context.Context, req *object.PutRequest) (err error) {
ctx, span := tracing.StartSpanFromContext(ctx, "putv2.streamer.Send")
defer span.End()
switch v := req.GetBody().GetObjectPart().(type) {
case *object.PutObjectPartInit:
var initPrm *putsvc.PutInitPrm
@ -43,7 +49,7 @@ func (s *streamer) Send(ctx context.Context, req *object.PutRequest) (err error)
return err
}
if err = s.stream.Init(initPrm); err != nil {
if err = s.stream.Init(ctx, initPrm); err != nil {
err = fmt.Errorf("(%T) could not init object put stream: %w", s, err)
}
@ -105,6 +111,9 @@ func (s *streamer) Send(ctx context.Context, req *object.PutRequest) (err error)
}
func (s *streamer) CloseAndRecv(ctx context.Context) (*object.PutResponse, error) {
ctx, span := tracing.StartSpanFromContext(ctx, "putv2.streamer.CloseAndRecv")
defer span.End()
if s.saveChunks {
// check payload size correctness
if s.writtenPayload != s.payloadSz {
@ -121,6 +130,9 @@ func (s *streamer) CloseAndRecv(ctx context.Context) (*object.PutResponse, error
}
func (s *streamer) relayRequest(ctx context.Context, info client.NodeInfo, c client.MultiAddressClient) error {
ctx, span := tracing.StartSpanFromContext(ctx, "putv2.streamer.relayRequest")
defer span.End()
// open stream
resp := new(object.PutResponse)
@ -129,6 +141,12 @@ func (s *streamer) relayRequest(ctx context.Context, info client.NodeInfo, c cli
var firstErr error
info.AddressGroup().IterateAddresses(func(addr network.Address) (stop bool) {
ctx, span := tracing.StartSpanFromContext(ctx, "putv2.streamer.iterateAddress",
trace.WithAttributes(
attribute.String("address", addr.String()),
))
defer span.End()
var err error
defer func() {

View file

@ -41,7 +41,7 @@ var (
ErrWrongPayloadSize = errors.New("wrong payload size")
)
func (t *validatingTarget) WriteHeader(obj *objectSDK.Object) error {
func (t *validatingTarget) WriteHeader(ctx context.Context, obj *objectSDK.Object) error {
t.payloadSz = obj.PayloadSize()
chunkLn := uint64(len(obj.Payload()))
@ -73,11 +73,11 @@ func (t *validatingTarget) WriteHeader(obj *objectSDK.Object) error {
t.checksum = cs.Value()
}
if err := t.fmt.Validate(obj, t.unpreparedObject); err != nil {
if err := t.fmt.Validate(ctx, obj, t.unpreparedObject); err != nil {
return fmt.Errorf("(%T) coult not validate object format: %w", t, err)
}
err := t.nextTarget.WriteHeader(obj)
err := t.nextTarget.WriteHeader(ctx, obj)
if err != nil {
return err
}

View file

@ -1,12 +1,14 @@
package searchsvc
import (
"context"
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs"
"go.uber.org/zap"
)
func (exec *execCtx) executeLocal() {
ids, err := exec.svc.localStorage.search(exec)
func (exec *execCtx) executeLocal(ctx context.Context) {
ids, err := exec.svc.localStorage.search(ctx, exec)
if err != nil {
exec.status = statusUndefined

View file

@ -27,7 +27,7 @@ func (exec *execCtx) execute(ctx context.Context) {
exec.log.Debug(logs.ServingRequest)
// perform local operation
exec.executeLocal()
exec.executeLocal(ctx)
exec.analyzeStatus(ctx, true)
}

View file

@ -107,7 +107,7 @@ func (c *testClientCache) get(info clientcore.NodeInfo) (searchClient, error) {
return v, nil
}
func (s *testStorage) search(exec *execCtx) ([]oid.ID, error) {
func (s *testStorage) search(_ context.Context, exec *execCtx) ([]oid.ID, error) {
v, ok := s.items[exec.containerID().EncodeToString()]
if !ok {
return nil, nil

View file

@ -37,7 +37,7 @@ type cfg struct {
log *logger.Logger
localStorage interface {
search(*execCtx) ([]oid.ID, error)
search(context.Context, *execCtx) ([]oid.ID, error)
}
clientConstructor interface {

View file

@ -117,12 +117,12 @@ func (c *clientWrapper) searchObjects(ctx context.Context, exec *execCtx, info c
return res.IDList(), nil
}
func (e *storageEngineWrapper) search(exec *execCtx) ([]oid.ID, error) {
func (e *storageEngineWrapper) search(ctx context.Context, exec *execCtx) ([]oid.ID, error) {
var selectPrm engine.SelectPrm
selectPrm.WithFilters(exec.searchFilters())
selectPrm.WithContainerID(exec.containerID())
r, err := e.storage.Select(selectPrm)
r, err := e.storage.Select(ctx, selectPrm)
if err != nil {
return nil, err
}