Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FVM] let cadence runtime record generic traces #1189

Merged
merged 10 commits into from
Sep 16, 2021
61 changes: 17 additions & 44 deletions fvm/scriptEnv.go
Original file line number Diff line number Diff line change
Expand Up @@ -660,70 +660,43 @@ func (e *ScriptEnv) ImplementationDebugLog(message string) error {
return nil
}

func (e *ScriptEnv) ProgramParsed(location common.Location, duration time.Duration) {
func (e *ScriptEnv) RecordTrace(operation string, location common.Location, duration time.Duration, logs []opentracing.LogRecord) {
if e.isTraceable() {
ramtinms marked this conversation as resolved.
Show resolved Hide resolved
locStr := ""
if location != nil {
locStr = location.String()
if logs == nil {
logs = make([]opentracing.LogRecord, 0)
}
logs = append(logs, opentracing.LogRecord{Timestamp: time.Now(),
Fields: []traceLog.Field{traceLog.String("location", location.String())},
})
}
e.ctx.Tracer.RecordSpanFromParent(e.traceSpan, trace.FVMCadenceParseProgram, duration,
[]opentracing.LogRecord{
{Timestamp: time.Now(),
Fields: []traceLog.Field{traceLog.String("location", locStr)},
},
},
)
spanName := trace.FVMCadenceTrace.Child(operation)
e.ctx.Tracer.RecordSpanFromParent(e.traceSpan, spanName, duration, logs)
}
}

func (e *ScriptEnv) ProgramParsed(location common.Location, duration time.Duration) {
e.RecordTrace("parseProgram", location, duration, nil)
e.metrics.ProgramParsed(location, duration)
}

func (e *ScriptEnv) ProgramChecked(location common.Location, duration time.Duration) {
if e.isTraceable() {
locStr := ""
if location != nil {
locStr = location.String()
}
e.ctx.Tracer.RecordSpanFromParent(e.traceSpan, trace.FVMCadenceCheckProgram, duration,
[]opentracing.LogRecord{{Timestamp: time.Now(),
Fields: []traceLog.Field{traceLog.String("location", locStr)},
},
},
)
}
ramtinms marked this conversation as resolved.
Show resolved Hide resolved
e.RecordTrace("checkProgram", location, duration, nil)
e.metrics.ProgramChecked(location, duration)
}

func (e *ScriptEnv) ProgramInterpreted(location common.Location, duration time.Duration) {
if e.isTraceable() {
locStr := ""
if location != nil {
locStr = location.String()
}
e.ctx.Tracer.RecordSpanFromParent(e.traceSpan, trace.FVMCadenceInterpretProgram, duration,
[]opentracing.LogRecord{{Timestamp: time.Now(),
Fields: []traceLog.Field{traceLog.String("location", locStr)},
},
},
)
}
e.RecordTrace("interpretProgram", location, duration, nil)
e.metrics.ProgramInterpreted(location, duration)
}

func (e *ScriptEnv) ValueEncoded(duration time.Duration) {
if e.isTraceable() {
e.ctx.Tracer.RecordSpanFromParent(e.traceSpan, trace.FVMCadenceEncodeValue, duration,
[]opentracing.LogRecord{},
)
}
e.RecordTrace("encodeValue", nil, duration, nil)
e.metrics.ValueEncoded(duration)
}

func (e *ScriptEnv) ValueDecoded(duration time.Duration) {
if e.isTraceable() {
e.ctx.Tracer.RecordSpanFromParent(e.traceSpan, trace.FVMCadenceDecodeValue, duration,
[]opentracing.LogRecord{},
)
}
e.RecordTrace("decodeValue", nil, duration, nil)
e.metrics.ValueDecoded(duration)
}

Expand Down
62 changes: 18 additions & 44 deletions fvm/transactionEnv.go
Original file line number Diff line number Diff line change
Expand Up @@ -933,70 +933,44 @@ func (e *TransactionEnv) ImplementationDebugLog(message string) error {
return nil
}

func (e *TransactionEnv) ProgramParsed(location common.Location, duration time.Duration) {
func (e *TransactionEnv) RecordTrace(operation string, location common.Location, duration time.Duration, logs []opentracing.LogRecord) {
if e.isTraceable() {
ramtinms marked this conversation as resolved.
Show resolved Hide resolved
locStr := ""
if location != nil {
locStr = location.String()
if logs == nil {
logs = make([]opentracing.LogRecord, 0)
}
logs = append(logs, opentracing.LogRecord{Timestamp: time.Now(),
Fields: []traceLog.Field{traceLog.String("location", location.String())},
})
}
e.ctx.Tracer.RecordSpanFromParent(e.traceSpan, trace.FVMCadenceParseProgram, duration,
[]opentracing.LogRecord{
{Timestamp: time.Now(),
Fields: []traceLog.Field{traceLog.String("location", locStr)},
},
},
)

spanName := trace.FVMCadenceTrace.Child(operation)
e.ctx.Tracer.RecordSpanFromParent(e.traceSpan, spanName, duration, logs)
}
}

func (e *TransactionEnv) ProgramParsed(location common.Location, duration time.Duration) {
e.RecordTrace("parseProgram", location, duration, nil)
e.metrics.ProgramParsed(location, duration)
}

func (e *TransactionEnv) ProgramChecked(location common.Location, duration time.Duration) {
if e.isTraceable() {
locStr := ""
if location != nil {
locStr = location.String()
}
e.ctx.Tracer.RecordSpanFromParent(e.traceSpan, trace.FVMCadenceCheckProgram, duration,
[]opentracing.LogRecord{{Timestamp: time.Now(),
Fields: []traceLog.Field{traceLog.String("location", locStr)},
},
},
)
}
e.RecordTrace("checkProgram", location, duration, nil)
e.metrics.ProgramChecked(location, duration)
}

func (e *TransactionEnv) ProgramInterpreted(location common.Location, duration time.Duration) {
if e.isTraceable() {
locStr := ""
if location != nil {
locStr = location.String()
}
e.ctx.Tracer.RecordSpanFromParent(e.traceSpan, trace.FVMCadenceInterpretProgram, duration,
[]opentracing.LogRecord{{Timestamp: time.Now(),
Fields: []traceLog.Field{traceLog.String("location", locStr)},
},
},
)
}
e.RecordTrace("interpretProgram", location, duration, nil)
e.metrics.ProgramInterpreted(location, duration)
}

func (e *TransactionEnv) ValueEncoded(duration time.Duration) {
if e.isTraceable() {
e.ctx.Tracer.RecordSpanFromParent(e.traceSpan, trace.FVMCadenceEncodeValue, duration,
[]opentracing.LogRecord{},
)
}
e.RecordTrace("encodeValue", nil, duration, nil)
e.metrics.ValueEncoded(duration)
}

func (e *TransactionEnv) ValueDecoded(duration time.Duration) {
if e.isTraceable() {
e.ctx.Tracer.RecordSpanFromParent(e.traceSpan, trace.FVMCadenceDecodeValue, duration,
[]opentracing.LogRecord{},
)
}
e.RecordTrace("decodeValue", nil, duration, nil)
e.metrics.ValueDecoded(duration)
}

Expand Down
6 changes: 1 addition & 5 deletions module/trace/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -200,11 +200,7 @@ const (
FVMEnvRemoveAccountContractCode SpanName = "fvm.env.removeAccountContractCode"
FVMEnvGetSigningAccounts SpanName = "fvm.env.getSigningAccounts"

FVMCadenceParseProgram SpanName = "fvm.cadence.parseProgram"
FVMCadenceCheckProgram SpanName = "fvm.cadence.checkProgram"
FVMCadenceInterpretProgram SpanName = "fvm.cadence.interpretProgram"
FVMCadenceEncodeValue SpanName = "fvm.cadence.encodeValue"
FVMCadenceDecodeValue SpanName = "fvm.cadence.decodeValue"
janezpodhostnik marked this conversation as resolved.
Show resolved Hide resolved
FVMCadenceTrace SpanName = "fvm.cadence.trace"
)

// Tag names
Expand Down
4 changes: 4 additions & 0 deletions module/trace/trace.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ import (

type SpanName string

func (s SpanName) Child(subOp string) SpanName {
return SpanName(string(s) + "." + subOp)
}

// OpenTracer is the implementation of the Tracer interface
type OpenTracer struct {
opentracing.Tracer
Expand Down