forked from TrueCloudLab/frostfs-node
[#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:
parent
200fc8b882
commit
d62c6e4ce6
122 changed files with 863 additions and 417 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue