github.com/MetalBlockchain/metalgo@v1.11.9/snow/engine/common/traced_engine.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package common
     5  
     6  import (
     7  	"context"
     8  	"time"
     9  
    10  	"go.opentelemetry.io/otel/attribute"
    11  
    12  	"github.com/MetalBlockchain/metalgo/ids"
    13  	"github.com/MetalBlockchain/metalgo/snow"
    14  	"github.com/MetalBlockchain/metalgo/trace"
    15  	"github.com/MetalBlockchain/metalgo/utils/set"
    16  	"github.com/MetalBlockchain/metalgo/version"
    17  
    18  	oteltrace "go.opentelemetry.io/otel/trace"
    19  )
    20  
    21  var _ Engine = (*tracedEngine)(nil)
    22  
    23  type tracedEngine struct {
    24  	engine Engine
    25  	tracer trace.Tracer
    26  }
    27  
    28  func TraceEngine(engine Engine, tracer trace.Tracer) Engine {
    29  	return &tracedEngine{
    30  		engine: engine,
    31  		tracer: tracer,
    32  	}
    33  }
    34  
    35  func (e *tracedEngine) GetStateSummaryFrontier(ctx context.Context, nodeID ids.NodeID, requestID uint32) error {
    36  	ctx, span := e.tracer.Start(ctx, "tracedEngine.GetStateSummaryFrontier", oteltrace.WithAttributes(
    37  		attribute.Stringer("nodeID", nodeID),
    38  		attribute.Int64("requestID", int64(requestID)),
    39  	))
    40  	defer span.End()
    41  
    42  	return e.engine.GetStateSummaryFrontier(ctx, nodeID, requestID)
    43  }
    44  
    45  func (e *tracedEngine) StateSummaryFrontier(ctx context.Context, nodeID ids.NodeID, requestID uint32, summary []byte) error {
    46  	ctx, span := e.tracer.Start(ctx, "tracedEngine.StateSummaryFrontier", oteltrace.WithAttributes(
    47  		attribute.Stringer("nodeID", nodeID),
    48  		attribute.Int64("requestID", int64(requestID)),
    49  		attribute.Int("summaryLen", len(summary)),
    50  	))
    51  	defer span.End()
    52  
    53  	return e.engine.StateSummaryFrontier(ctx, nodeID, requestID, summary)
    54  }
    55  
    56  func (e *tracedEngine) GetStateSummaryFrontierFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32) error {
    57  	ctx, span := e.tracer.Start(ctx, "tracedEngine.GetStateSummaryFrontierFailed", oteltrace.WithAttributes(
    58  		attribute.Stringer("nodeID", nodeID),
    59  		attribute.Int64("requestID", int64(requestID)),
    60  	))
    61  	defer span.End()
    62  
    63  	return e.engine.GetStateSummaryFrontierFailed(ctx, nodeID, requestID)
    64  }
    65  
    66  func (e *tracedEngine) GetAcceptedStateSummary(ctx context.Context, nodeID ids.NodeID, requestID uint32, heights set.Set[uint64]) error {
    67  	ctx, span := e.tracer.Start(ctx, "tracedEngine.GetAcceptedStateSummary", oteltrace.WithAttributes(
    68  		attribute.Stringer("nodeID", nodeID),
    69  		attribute.Int64("requestID", int64(requestID)),
    70  		attribute.Int("numHeights", heights.Len()),
    71  	))
    72  	defer span.End()
    73  
    74  	return e.engine.GetAcceptedStateSummary(ctx, nodeID, requestID, heights)
    75  }
    76  
    77  func (e *tracedEngine) AcceptedStateSummary(ctx context.Context, nodeID ids.NodeID, requestID uint32, summaryIDs set.Set[ids.ID]) error {
    78  	ctx, span := e.tracer.Start(ctx, "tracedEngine.AcceptedStateSummary", oteltrace.WithAttributes(
    79  		attribute.Stringer("nodeID", nodeID),
    80  		attribute.Int64("requestID", int64(requestID)),
    81  		attribute.Int("numSummaryIDs", summaryIDs.Len()),
    82  	))
    83  	defer span.End()
    84  
    85  	return e.engine.AcceptedStateSummary(ctx, nodeID, requestID, summaryIDs)
    86  }
    87  
    88  func (e *tracedEngine) GetAcceptedStateSummaryFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32) error {
    89  	ctx, span := e.tracer.Start(ctx, "tracedEngine.GetAcceptedStateSummaryFailed", oteltrace.WithAttributes(
    90  		attribute.Stringer("nodeID", nodeID),
    91  		attribute.Int64("requestID", int64(requestID)),
    92  	))
    93  	defer span.End()
    94  
    95  	return e.engine.GetAcceptedStateSummaryFailed(ctx, nodeID, requestID)
    96  }
    97  
    98  func (e *tracedEngine) GetAcceptedFrontier(ctx context.Context, nodeID ids.NodeID, requestID uint32) error {
    99  	ctx, span := e.tracer.Start(ctx, "tracedEngine.GetAcceptedFrontier", oteltrace.WithAttributes(
   100  		attribute.Stringer("nodeID", nodeID),
   101  		attribute.Int64("requestID", int64(requestID)),
   102  	))
   103  	defer span.End()
   104  
   105  	return e.engine.GetAcceptedFrontier(ctx, nodeID, requestID)
   106  }
   107  
   108  func (e *tracedEngine) AcceptedFrontier(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerID ids.ID) error {
   109  	ctx, span := e.tracer.Start(ctx, "tracedEngine.AcceptedFrontier", oteltrace.WithAttributes(
   110  		attribute.Stringer("nodeID", nodeID),
   111  		attribute.Int64("requestID", int64(requestID)),
   112  		attribute.Stringer("containerID", containerID),
   113  	))
   114  	defer span.End()
   115  
   116  	return e.engine.AcceptedFrontier(ctx, nodeID, requestID, containerID)
   117  }
   118  
   119  func (e *tracedEngine) GetAcceptedFrontierFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32) error {
   120  	ctx, span := e.tracer.Start(ctx, "tracedEngine.GetAcceptedFrontierFailed", oteltrace.WithAttributes(
   121  		attribute.Stringer("nodeID", nodeID),
   122  		attribute.Int64("requestID", int64(requestID)),
   123  	))
   124  	defer span.End()
   125  
   126  	return e.engine.GetAcceptedFrontierFailed(ctx, nodeID, requestID)
   127  }
   128  
   129  func (e *tracedEngine) GetAccepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs set.Set[ids.ID]) error {
   130  	ctx, span := e.tracer.Start(ctx, "tracedEngine.GetAccepted", oteltrace.WithAttributes(
   131  		attribute.Stringer("nodeID", nodeID),
   132  		attribute.Int64("requestID", int64(requestID)),
   133  		attribute.Int("numContainerIDs", containerIDs.Len()),
   134  	))
   135  	defer span.End()
   136  
   137  	return e.engine.GetAccepted(ctx, nodeID, requestID, containerIDs)
   138  }
   139  
   140  func (e *tracedEngine) Accepted(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerIDs set.Set[ids.ID]) error {
   141  	ctx, span := e.tracer.Start(ctx, "tracedEngine.Accepted", oteltrace.WithAttributes(
   142  		attribute.Stringer("nodeID", nodeID),
   143  		attribute.Int64("requestID", int64(requestID)),
   144  		attribute.Int("numContainerIDs", containerIDs.Len()),
   145  	))
   146  	defer span.End()
   147  
   148  	return e.engine.Accepted(ctx, nodeID, requestID, containerIDs)
   149  }
   150  
   151  func (e *tracedEngine) GetAcceptedFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32) error {
   152  	ctx, span := e.tracer.Start(ctx, "tracedEngine.GetAcceptedFailed", oteltrace.WithAttributes(
   153  		attribute.Stringer("nodeID", nodeID),
   154  		attribute.Int64("requestID", int64(requestID)),
   155  	))
   156  	defer span.End()
   157  
   158  	return e.engine.GetAcceptedFailed(ctx, nodeID, requestID)
   159  }
   160  
   161  func (e *tracedEngine) GetAncestors(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerID ids.ID) error {
   162  	ctx, span := e.tracer.Start(ctx, "tracedEngine.GetAncestors", oteltrace.WithAttributes(
   163  		attribute.Stringer("nodeID", nodeID),
   164  		attribute.Int64("requestID", int64(requestID)),
   165  		attribute.Stringer("containerID", containerID),
   166  	))
   167  	defer span.End()
   168  
   169  	return e.engine.GetAncestors(ctx, nodeID, requestID, containerID)
   170  }
   171  
   172  func (e *tracedEngine) Ancestors(ctx context.Context, nodeID ids.NodeID, requestID uint32, containers [][]byte) error {
   173  	ctx, span := e.tracer.Start(ctx, "tracedEngine.Ancestors", oteltrace.WithAttributes(
   174  		attribute.Stringer("nodeID", nodeID),
   175  		attribute.Int64("requestID", int64(requestID)),
   176  		attribute.Int("numContainers", len(containers)),
   177  	))
   178  	defer span.End()
   179  
   180  	return e.engine.Ancestors(ctx, nodeID, requestID, containers)
   181  }
   182  
   183  func (e *tracedEngine) GetAncestorsFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32) error {
   184  	ctx, span := e.tracer.Start(ctx, "tracedEngine.GetAncestorsFailed", oteltrace.WithAttributes(
   185  		attribute.Stringer("nodeID", nodeID),
   186  		attribute.Int64("requestID", int64(requestID)),
   187  	))
   188  	defer span.End()
   189  
   190  	return e.engine.GetAncestorsFailed(ctx, nodeID, requestID)
   191  }
   192  
   193  func (e *tracedEngine) Get(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerID ids.ID) error {
   194  	ctx, span := e.tracer.Start(ctx, "tracedEngine.Get", oteltrace.WithAttributes(
   195  		attribute.Stringer("nodeID", nodeID),
   196  		attribute.Int64("requestID", int64(requestID)),
   197  		attribute.Stringer("containerID", containerID),
   198  	))
   199  	defer span.End()
   200  
   201  	return e.engine.Get(ctx, nodeID, requestID, containerID)
   202  }
   203  
   204  func (e *tracedEngine) Put(ctx context.Context, nodeID ids.NodeID, requestID uint32, container []byte) error {
   205  	ctx, span := e.tracer.Start(ctx, "tracedEngine.Put", oteltrace.WithAttributes(
   206  		attribute.Stringer("nodeID", nodeID),
   207  		attribute.Int64("requestID", int64(requestID)),
   208  		attribute.Int("containerLen", len(container)),
   209  	))
   210  	defer span.End()
   211  
   212  	return e.engine.Put(ctx, nodeID, requestID, container)
   213  }
   214  
   215  func (e *tracedEngine) GetFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32) error {
   216  	ctx, span := e.tracer.Start(ctx, "tracedEngine.GetFailed", oteltrace.WithAttributes(
   217  		attribute.Stringer("nodeID", nodeID),
   218  		attribute.Int64("requestID", int64(requestID)),
   219  	))
   220  	defer span.End()
   221  
   222  	return e.engine.GetFailed(ctx, nodeID, requestID)
   223  }
   224  
   225  func (e *tracedEngine) PullQuery(ctx context.Context, nodeID ids.NodeID, requestID uint32, containerID ids.ID, requestedHeight uint64) error {
   226  	ctx, span := e.tracer.Start(ctx, "tracedEngine.PullQuery", oteltrace.WithAttributes(
   227  		attribute.Stringer("nodeID", nodeID),
   228  		attribute.Int64("requestID", int64(requestID)),
   229  		attribute.Stringer("containerID", containerID),
   230  		attribute.Int64("requestedHeight", int64(requestedHeight)),
   231  	))
   232  	defer span.End()
   233  
   234  	return e.engine.PullQuery(ctx, nodeID, requestID, containerID, requestedHeight)
   235  }
   236  
   237  func (e *tracedEngine) PushQuery(ctx context.Context, nodeID ids.NodeID, requestID uint32, container []byte, requestedHeight uint64) error {
   238  	ctx, span := e.tracer.Start(ctx, "tracedEngine.PushQuery", oteltrace.WithAttributes(
   239  		attribute.Stringer("nodeID", nodeID),
   240  		attribute.Int64("requestID", int64(requestID)),
   241  		attribute.Int("containerLen", len(container)),
   242  		attribute.Int64("requestedHeight", int64(requestedHeight)),
   243  	))
   244  	defer span.End()
   245  
   246  	return e.engine.PushQuery(ctx, nodeID, requestID, container, requestedHeight)
   247  }
   248  
   249  func (e *tracedEngine) Chits(ctx context.Context, nodeID ids.NodeID, requestID uint32, preferredID ids.ID, preferredIDAtHeight ids.ID, acceptedID ids.ID) error {
   250  	ctx, span := e.tracer.Start(ctx, "tracedEngine.Chits", oteltrace.WithAttributes(
   251  		attribute.Stringer("nodeID", nodeID),
   252  		attribute.Int64("requestID", int64(requestID)),
   253  		attribute.Stringer("preferredID", preferredID),
   254  		attribute.Stringer("preferredIDAtHeight", preferredIDAtHeight),
   255  		attribute.Stringer("acceptedID", acceptedID),
   256  	))
   257  	defer span.End()
   258  
   259  	return e.engine.Chits(ctx, nodeID, requestID, preferredID, preferredIDAtHeight, acceptedID)
   260  }
   261  
   262  func (e *tracedEngine) QueryFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32) error {
   263  	ctx, span := e.tracer.Start(ctx, "tracedEngine.QueryFailed", oteltrace.WithAttributes(
   264  		attribute.Stringer("nodeID", nodeID),
   265  		attribute.Int64("requestID", int64(requestID)),
   266  	))
   267  	defer span.End()
   268  
   269  	return e.engine.QueryFailed(ctx, nodeID, requestID)
   270  }
   271  
   272  func (e *tracedEngine) AppRequest(ctx context.Context, nodeID ids.NodeID, requestID uint32, deadline time.Time, request []byte) error {
   273  	ctx, span := e.tracer.Start(ctx, "tracedEngine.AppRequest", oteltrace.WithAttributes(
   274  		attribute.Stringer("nodeID", nodeID),
   275  		attribute.Int64("requestID", int64(requestID)),
   276  		attribute.Int("requestLen", len(request)),
   277  	))
   278  	defer span.End()
   279  
   280  	return e.engine.AppRequest(ctx, nodeID, requestID, deadline, request)
   281  }
   282  
   283  func (e *tracedEngine) AppResponse(ctx context.Context, nodeID ids.NodeID, requestID uint32, response []byte) error {
   284  	ctx, span := e.tracer.Start(ctx, "tracedEngine.AppResponse", oteltrace.WithAttributes(
   285  		attribute.Stringer("nodeID", nodeID),
   286  		attribute.Int64("requestID", int64(requestID)),
   287  		attribute.Int("responseLen", len(response)),
   288  	))
   289  	defer span.End()
   290  
   291  	return e.engine.AppResponse(ctx, nodeID, requestID, response)
   292  }
   293  
   294  func (e *tracedEngine) AppRequestFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32, appErr *AppError) error {
   295  	ctx, span := e.tracer.Start(ctx, "tracedEngine.AppRequestFailed", oteltrace.WithAttributes(
   296  		attribute.Stringer("nodeID", nodeID),
   297  		attribute.Int64("requestID", int64(requestID)),
   298  	))
   299  	defer span.End()
   300  
   301  	return e.engine.AppRequestFailed(ctx, nodeID, requestID, appErr)
   302  }
   303  
   304  func (e *tracedEngine) AppGossip(ctx context.Context, nodeID ids.NodeID, msg []byte) error {
   305  	ctx, span := e.tracer.Start(ctx, "tracedEngine.AppGossip", oteltrace.WithAttributes(
   306  		attribute.Stringer("nodeID", nodeID),
   307  		attribute.Int("gossipLen", len(msg)),
   308  	))
   309  	defer span.End()
   310  
   311  	return e.engine.AppGossip(ctx, nodeID, msg)
   312  }
   313  
   314  func (e *tracedEngine) CrossChainAppRequest(ctx context.Context, chainID ids.ID, requestID uint32, deadline time.Time, request []byte) error {
   315  	ctx, span := e.tracer.Start(ctx, "tracedEngine.CrossChainAppRequest", oteltrace.WithAttributes(
   316  		attribute.Stringer("chainID", chainID),
   317  		attribute.Int64("requestID", int64(requestID)),
   318  		attribute.Int("requestLen", len(request)),
   319  	))
   320  	defer span.End()
   321  
   322  	return e.engine.CrossChainAppRequest(ctx, chainID, requestID, deadline, request)
   323  }
   324  
   325  func (e *tracedEngine) CrossChainAppResponse(ctx context.Context, chainID ids.ID, requestID uint32, response []byte) error {
   326  	ctx, span := e.tracer.Start(ctx, "tracedEngine.CrossChainAppResponse", oteltrace.WithAttributes(
   327  		attribute.Stringer("chainID", chainID),
   328  		attribute.Int64("requestID", int64(requestID)),
   329  		attribute.Int("responseLen", len(response)),
   330  	))
   331  	defer span.End()
   332  
   333  	return e.engine.CrossChainAppResponse(ctx, chainID, requestID, response)
   334  }
   335  
   336  func (e *tracedEngine) CrossChainAppRequestFailed(ctx context.Context, chainID ids.ID, requestID uint32, appErr *AppError) error {
   337  	ctx, span := e.tracer.Start(ctx, "tracedEngine.CrossChainAppRequestFailed", oteltrace.WithAttributes(
   338  		attribute.Stringer("chainID", chainID),
   339  		attribute.Int64("requestID", int64(requestID)),
   340  	))
   341  	defer span.End()
   342  
   343  	return e.engine.CrossChainAppRequestFailed(ctx, chainID, requestID, appErr)
   344  }
   345  
   346  func (e *tracedEngine) Connected(ctx context.Context, nodeID ids.NodeID, nodeVersion *version.Application) error {
   347  	ctx, span := e.tracer.Start(ctx, "tracedEngine.Connected", oteltrace.WithAttributes(
   348  		attribute.Stringer("nodeID", nodeID),
   349  		attribute.Stringer("version", nodeVersion),
   350  	))
   351  	defer span.End()
   352  
   353  	return e.engine.Connected(ctx, nodeID, nodeVersion)
   354  }
   355  
   356  func (e *tracedEngine) Disconnected(ctx context.Context, nodeID ids.NodeID) error {
   357  	ctx, span := e.tracer.Start(ctx, "tracedEngine.Disconnected", oteltrace.WithAttributes(
   358  		attribute.Stringer("nodeID", nodeID),
   359  	))
   360  	defer span.End()
   361  
   362  	return e.engine.Disconnected(ctx, nodeID)
   363  }
   364  
   365  func (e *tracedEngine) Timeout(ctx context.Context) error {
   366  	ctx, span := e.tracer.Start(ctx, "tracedEngine.Timeout")
   367  	defer span.End()
   368  
   369  	return e.engine.Timeout(ctx)
   370  }
   371  
   372  func (e *tracedEngine) Gossip(ctx context.Context) error {
   373  	ctx, span := e.tracer.Start(ctx, "tracedEngine.Gossip")
   374  	defer span.End()
   375  
   376  	return e.engine.Gossip(ctx)
   377  }
   378  
   379  func (e *tracedEngine) Halt(ctx context.Context) {
   380  	ctx, span := e.tracer.Start(ctx, "tracedEngine.Halt")
   381  	defer span.End()
   382  
   383  	e.engine.Halt(ctx)
   384  }
   385  
   386  func (e *tracedEngine) Shutdown(ctx context.Context) error {
   387  	ctx, span := e.tracer.Start(ctx, "tracedEngine.Shutdown")
   388  	defer span.End()
   389  
   390  	return e.engine.Shutdown(ctx)
   391  }
   392  
   393  func (e *tracedEngine) Notify(ctx context.Context, msg Message) error {
   394  	ctx, span := e.tracer.Start(ctx, "tracedEngine.Notify", oteltrace.WithAttributes(
   395  		attribute.Stringer("message", msg),
   396  	))
   397  	defer span.End()
   398  
   399  	return e.engine.Notify(ctx, msg)
   400  }
   401  
   402  func (e *tracedEngine) Context() *snow.ConsensusContext {
   403  	return e.engine.Context()
   404  }
   405  
   406  func (e *tracedEngine) Start(ctx context.Context, startReqID uint32) error {
   407  	ctx, span := e.tracer.Start(ctx, "tracedEngine.Start", oteltrace.WithAttributes(
   408  		attribute.Int64("requestID", int64(startReqID)),
   409  	))
   410  	defer span.End()
   411  
   412  	return e.engine.Start(ctx, startReqID)
   413  }
   414  
   415  func (e *tracedEngine) HealthCheck(ctx context.Context) (interface{}, error) {
   416  	ctx, span := e.tracer.Start(ctx, "tracedEngine.HealthCheck")
   417  	defer span.End()
   418  
   419  	return e.engine.HealthCheck(ctx)
   420  }