mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-27 23:26:44 +00:00
* base setup for miner opentel * version change * modify ctx passing * add attributes * update fill txs span attributes * fix: use common attributes for remote and local txs * pass context in seal * fix * fix * add traces to finalize and assemble * fix * use task ctx in result loop * only start parent span if no error * send nil tracer from Finalize * clean up * add sub function timings in span attribute * modify span attributes * set time attribute to milliseconds * linters fix * fix linters for consensus * add nolint to worker * fix testcase * Added fillTransactions subTraces * add traces in intermediate root hash function * add traces in WriteBlockAndSetHead function, fix linters * fix: linting errors * fix: test cases * fix: go.mod * fix: testcase * extract tracing package * linters fix * debug * Revert "debug" This reverts commit 2d68b7c7b1105080563a4e1a6949dabc10acaff8. * fix: panic in NewTransactionsByPriceAndNonce iteration * change heimdall version to develop * miner/worker: fix duplicate call to tx ordering * miner/worker: refactor tracing * consensus/bor: use tracing package * tracing: add more abstraction for spans * tracing: set all attributes at once * remove nested tracing from blockchain.WriteBlockAndSetHead function * remove nested tracing from statedb.IntermediateRoot function * handle end span in bor.Seal function * fix: typo * minor fixes * fix: linters * fix: remove nolint * go mod tidy Co-authored-by: Manav Darji <manavdarji.india@gmail.com> Co-authored-by: Shivam Sharma <shivam691999@gmail.com> Co-authored-by: Evgeny Danienko <6655321@bk.ru>
96 lines
1.7 KiB
Go
96 lines
1.7 KiB
Go
package tracing
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"go.opentelemetry.io/otel/attribute"
|
|
"go.opentelemetry.io/otel/trace"
|
|
)
|
|
|
|
type tracerKey struct{}
|
|
|
|
type Option func(context.Context, trace.Span)
|
|
|
|
func WithTracer(ctx context.Context, tr trace.Tracer) context.Context {
|
|
return context.WithValue(ctx, tracerKey{}, tr)
|
|
}
|
|
|
|
func FromContext(ctx context.Context) trace.Tracer {
|
|
tr, _ := ctx.Value(tracerKey{}).(trace.Tracer)
|
|
|
|
return tr
|
|
}
|
|
|
|
func StartSpan(ctx context.Context, snapName string) (context.Context, trace.Span) {
|
|
tr := FromContext(ctx)
|
|
|
|
if tr == nil {
|
|
return ctx, nil
|
|
}
|
|
|
|
ctx, span := tr.Start(ctx, snapName)
|
|
ctx = WithTracer(ctx, tr)
|
|
|
|
return ctx, span
|
|
}
|
|
|
|
func EndSpan(span trace.Span) {
|
|
if span != nil {
|
|
span.End()
|
|
}
|
|
}
|
|
|
|
func Trace(ctx context.Context, spanName string) (context.Context, trace.Span) {
|
|
tr := FromContext(ctx)
|
|
|
|
if tr == nil {
|
|
return ctx, nil
|
|
}
|
|
|
|
return tr.Start(ctx, spanName)
|
|
}
|
|
|
|
func Exec(ctx context.Context, spanName string, opts ...Option) {
|
|
var span trace.Span
|
|
|
|
tr := FromContext(ctx)
|
|
|
|
if tr != nil {
|
|
ctx, span = tr.Start(ctx, spanName)
|
|
}
|
|
|
|
for _, optFn := range opts {
|
|
optFn(ctx, span)
|
|
}
|
|
|
|
if tr != nil {
|
|
span.End()
|
|
}
|
|
}
|
|
|
|
func WithTime(fn func(context.Context, trace.Span)) Option {
|
|
return func(ctx context.Context, span trace.Span) {
|
|
ElapsedTime(ctx, span, "elapsed", fn)
|
|
}
|
|
}
|
|
|
|
func ElapsedTime(ctx context.Context, span trace.Span, msg string, fn func(context.Context, trace.Span)) {
|
|
var now time.Time
|
|
|
|
if span != nil {
|
|
now = time.Now()
|
|
}
|
|
|
|
fn(ctx, span)
|
|
|
|
if span != nil {
|
|
span.SetAttributes(attribute.Int(msg, int(time.Since(now).Milliseconds())))
|
|
}
|
|
}
|
|
|
|
func SetAttributes(span trace.Span, kvs ...attribute.KeyValue) {
|
|
if span != nil {
|
|
span.SetAttributes(kvs...)
|
|
}
|
|
}
|