Comments (9)
@arugal May @soWill666 close the reporter before ending span. But I prefer we should replace the panic with a "warn" log. As a library, robust programming is a saner choice. Does it make sense?
from go2sky.
Hi @soWill666 Thank you for the report. I think we should add automatic reconnection.
from go2sky.
@soWill666 I have reviewed the error message you provided. The reason for the error seems to be that Reporter#Close
was executed.
from go2sky.
Why reporter closed? Could you find out why?
from go2sky.
go2sky
will not close sendCh
. It could be the wrong way to use it, for example:
// Use gRPC reporter for production
r, err := reporter.NewGRPCReporter()
if err != nil {
log.Fatalf("new reporter error %v \n", err)
}
tracer, err := go2sky.NewTracer("example", go2sky.WithReporter(r))
if err != nil {
log.Fatalf("create tracer error %v \n", err)
}
// This for test
tracer.WaitUntilRegister()
span, ctx, err := tracer.CreateLocalSpan(context.Background())
if err != nil {
log.Fatalf("create new local span error %v \n", err)
}
r.Close()
subSpan.End()
Hi @soWill666 can you provide code to reproduce this error :)
from go2sky.
@arugal May @soWill666 close the reporter before ending span. But I prefer we should replace the panic with a "warn" log. As a library, robust programming is a saner choice. Does it make sense?
Agreed
from go2sky.
Here is my code:
package apm
import (
"fmt"
"github.com/SkyAPM/go2sky"
"github.com/SkyAPM/go2sky/reporter"
)
func GetSkyTracer() *go2sky.Tracer{
// Use gRPC reporter for production
re, err := reporter.NewGRPCReporter("10.206.36.156:11800")
if err != nil {
fmt.Println("new reporter error %v \n", err)
return nil
}
defer re.Close()
tracer, err := go2sky.NewTracer("libra", go2sky.WithReporter(re))
if err != nil {
fmt.Println("create tracer error %v \n", err)
return nil
}
tracer.WaitUntilRegister()
return tracer
}
package apm
import (
"fmt"
"strconv"
"sync"
"time"
"github.com/SkyAPM/go2sky"
"github.com/SkyAPM/go2sky/propagation"
"github.com/SkyAPM/go2sky/reporter/grpc/common"
"github.com/gin-gonic/gin"
)
const (
httpServerComponentID int32 = 49
)
type routeInfo struct {
operationName string
}
type middleware struct {
routeMap map[string]map[string]routeInfo
routeMapOnce sync.Once
}
//Middleware gin middleware return HandlerFunc with tracing.
func Middleware(engine *gin.Engine, tracer *go2sky.Tracer) gin.HandlerFunc {
if engine == nil || tracer == nil {
return func(c *gin.Context) {
c.Next()
}
}
m := new(middleware)
return func(c *gin.Context) {
if c.Request.Method == "OPTIONS" {
return
}
m.routeMapOnce.Do(func() {
routes := engine.Routes()
rm := make(map[string]map[string]routeInfo)
for _, r := range routes {
mm := rm[r.Method]
if mm == nil {
mm = make(map[string]routeInfo)
rm[r.Method] = mm
}
mm[r.Handler] = routeInfo{
operationName: c.Request.Host + c.Request.URL.Path,
}
m.routeMap = rm
}
})
var operationName string
handlerName := c.HandlerName()
if routeInfo, ok := m.routeMap[c.Request.Method][handlerName]; ok {
operationName = routeInfo.operationName
}
if operationName == "" {
operationName = c.Request.Method
}
span, ctx, err := tracer.CreateEntrySpan(c.Request.Context(), operationName, func() (string, error) {
return c.Request.Header.Get(propagation.Header), nil
})
if err != nil {
c.Next()
return
}
span.SetComponent(httpServerComponentID)
span.Tag(go2sky.TagHTTPMethod, c.Request.Method)
span.Tag(go2sky.TagURL, c.Request.Host+c.Request.URL.Path)
span.SetSpanLayer(common.SpanLayer_Http)
c.Request = c.Request.WithContext(ctx)
c.Next()
if len(c.Errors) > 0 {
span.Error(time.Now(), c.Errors.String())
}
span.Tag(go2sky.TagStatusCode, strconv.Itoa(c.Writer.Status()))
span.End()
}
}
func main() {
r := gin.New()
gin.SetMode("release")
tracer := apm.GetSkyTracer()
r.Use(apm.Middleware(r, tracer))
}
from go2sky.
@soWill666 Thank you for your reply. sendCh
is closed by defer re.Close()
func GetSkyTracer() *go2sky.Tracer{
// Use gRPC reporter for production
re, err := reporter.NewGRPCReporter("10.206.36.156:11800")
if err != nil {
fmt.Println("new reporter error %v \n", err)
return nil
}
defer re.Close()
tracer, err := go2sky.NewTracer("libra", go2sky.WithReporter(re))
if err != nil {
fmt.Println("create tracer error %v \n", err)
return nil
}
tracer.WaitUntilRegister()
return tracer
}
from go2sky.
Thanks. @arugal
from go2sky.
Related Issues (20)
- close gRPCReporter error HOT 2
- go get error HOT 5
- Tracing event source and sink in knative eventing HOT 6
- How to send log to the log page? HOT 1
- Grpc Reporter's logger cannot use custom logger.
- To create a exit span with one statement, not two statement HOT 3
- It has small probability will be panic HOT 5
- [Broken] CROSS_PROCESS HOT 1
- Can go2sky support output to kafka/pulsar HOT 4
- go2sky.SetGlobalTracer is undefined in v1.3.0 HOT 1
- fetch dynamic configuration error rpc error: code = PermissionDenied desc = HOT 6
- send keep alive signal error rpc error HOT 3
- unexpected EOF HOT 2
- panic on google.golang.org/protobuf/encoding/protowire.AppendString
- Unexcepted parentSpanID when parent span is ended HOT 1
- fetch dynamic configuration error rpc error: code = Unimplemented desc = Method not found: skywalking.v3.ConfigurationDiscoveryService/fetchConfigurations HOT 6
- gRPCReporter can use nanosecond instead of millisecond HOT 1
- Make sampling decision with span tags. HOT 5
- reach max send buffer
- memory leak
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from go2sky.