1 Star 0 Fork 0

李文建/protoactor-go

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
receivermiddleware.go 3.35 KB
一键复制 编辑 原始数据 按行查看 历史
yangdiangzb 提交于 2019-06-18 09:51 +08:00 . fix gofmt and goimports problem
package opentracing
import (
"fmt"
"github.com/AsynkronIT/protoactor-go/actor"
"github.com/AsynkronIT/protoactor-go/log"
"github.com/opentracing/opentracing-go"
)
func ReceiverMiddleware() actor.ReceiverMiddleware {
return func(next actor.ReceiverFunc) actor.ReceiverFunc {
return func(c actor.ReceiverContext, envelope *actor.MessageEnvelope) {
spanContext, err := opentracing.GlobalTracer().Extract(opentracing.TextMap, opentracing.TextMapReader(&messageHeaderReader{ReadOnlyMessageHeader: envelope.Header}))
if err == opentracing.ErrSpanContextNotFound {
logger.Debug("INBOUND No spanContext found", log.Stringer("PID", c.Self()), log.Error(err))
//next(c)
} else if err != nil {
logger.Debug("INBOUND Error", log.Stringer("PID", c.Self()), log.Error(err))
next(c, envelope)
return
}
var span opentracing.Span
switch envelope.Message.(type) {
case *actor.Started:
parentSpan := getAndClearParentSpan(c.Self())
if parentSpan != nil {
span = opentracing.StartSpan(fmt.Sprintf("%T/%T", c.Actor(), envelope.Message), opentracing.ChildOf(parentSpan.Context()))
logger.Debug("INBOUND Found parent span", log.Stringer("PID", c.Self()), log.TypeOf("ActorType", c.Actor()), log.TypeOf("MessageType", envelope.Message))
} else {
logger.Debug("INBOUND No parent span", log.Stringer("PID", c.Self()), log.TypeOf("ActorType", c.Actor()), log.TypeOf("MessageType", envelope.Message))
}
case *actor.Stopping:
var parentSpan opentracing.Span
if c.Parent() != nil {
parentSpan = getStoppingSpan(c.Parent())
}
if parentSpan != nil {
span = opentracing.StartSpan(fmt.Sprintf("%T/stopping", c.Actor()), opentracing.ChildOf(parentSpan.Context()))
} else {
span = opentracing.StartSpan(fmt.Sprintf("%T/stopping", c.Actor()))
}
setStoppingSpan(c.Self(), span)
span.SetTag("ActorPID", c.Self())
span.SetTag("ActorType", fmt.Sprintf("%T", c.Actor()))
span.SetTag("MessageType", fmt.Sprintf("%T", envelope.Message))
stoppingHandlingSpan := opentracing.StartSpan("stopping-handling", opentracing.ChildOf(span.Context()))
next(c, envelope)
stoppingHandlingSpan.Finish()
return
case *actor.Stopped:
span = getAndClearStoppingSpan(c.Self())
next(c, envelope)
if span != nil {
span.Finish()
}
return
}
if span == nil && spanContext == nil {
logger.Debug("INBOUND No spanContext. Starting new span", log.Stringer("PID", c.Self()), log.TypeOf("ActorType", c.Actor()), log.TypeOf("MessageType", envelope.Message))
span = opentracing.StartSpan(fmt.Sprintf("%T/%T", c.Actor(), envelope.Message))
}
if span == nil {
logger.Debug("INBOUND Starting span from parent", log.Stringer("PID", c.Self()), log.TypeOf("ActorType", c.Actor()), log.TypeOf("MessageType", envelope.Message))
span = opentracing.StartSpan(fmt.Sprintf("%T/%T", c.Actor(), envelope.Message), opentracing.ChildOf(spanContext))
}
setActiveSpan(c.Self(), span)
span.SetTag("ActorPID", c.Self())
span.SetTag("ActorType", fmt.Sprintf("%T", c.Actor()))
span.SetTag("MessageType", fmt.Sprintf("%T", envelope.Message))
defer func() {
logger.Debug("INBOUND Finishing span", log.Stringer("PID", c.Self()), log.TypeOf("ActorType", c.Actor()), log.TypeOf("MessageType", envelope.Message))
span.Finish()
clearActiveSpan(c.Self())
}()
next(c, envelope)
}
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/lwj8507/protoactor-go.git
git@gitee.com:lwj8507/protoactor-go.git
lwj8507
protoactor-go
protoactor-go
v0.0.1

搜索帮助