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 }