Git Product home page Git Product logo

Comments (9)

hanahmily avatar hanahmily commented on August 22, 2024 2

@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.

arugal avatar arugal commented on August 22, 2024

Hi @soWill666 Thank you for the report. I think we should add automatic reconnection.

from go2sky.

arugal avatar arugal commented on August 22, 2024

@soWill666 I have reviewed the error message you provided. The reason for the error seems to be that Reporter#Close was executed.

from go2sky.

wu-sheng avatar wu-sheng commented on August 22, 2024

Why reporter closed? Could you find out why?

from go2sky.

arugal avatar arugal commented on August 22, 2024

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 avatar arugal commented on August 22, 2024

@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.

heiyhia avatar heiyhia commented on August 22, 2024

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.

arugal avatar arugal commented on August 22, 2024

@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.

heiyhia avatar heiyhia commented on August 22, 2024

Thanks. @arugal

from go2sky.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.