美文网首页
Golang expvar原理

Golang expvar原理

作者: huiwq1990 | 来源:发表于2019-12-11 21:02 被阅读0次

    前言

    在学习go的metric的过程中,有些实现支持prometheus、expvar等,expvar是什么,竟然在sdk的库中?另外,发现jaeger(github.com/uber/jaeger-lib)也支持这种metric数据暴露方式。

    分析

    expvar提供将变量暴露出去的机制(暴露到http接口等),java中也有类似的机制。

    原理

    go默认创建一个全局并发安全的map,可以将key为string,val为实现Var的实例保存进去;同时,将所有的key保存到列表中。
    http暴露原理,注册http接口到默认的mutex中,返回数据是所有key,val的结果。

    实现

    expvar.Int实现接口Var,创建Int时,会将实例添加到map,并将key设置到list中。

    func NewInt(name string) *Int {
        v := new(Int)
        Publish(name, v)
        return v
    }
    func Publish(name string, v Var) {
        if _, dup := vars.LoadOrStore(name, v); dup {
            log.Panicln("Reuse of exported var name:", name)
        }
        varKeysMu.Lock()
        defer varKeysMu.Unlock()
        varKeys = append(varKeys, name)
        sort.Strings(varKeys)
    }
    

    测试demo

    package main
    
    import (
        "expvar"
        "fmt"
        "net/http"
        "time"
    )
    // curl localhost:8080/debug/vars
    func main()  {
        reqs := expvar.NewInt("requests")
        ticker:=time.NewTicker(time.Second)
        go func() {
            for _=range ticker.C {
                reqs.Add(1)
            }
        }()
        bingAddr := fmt.Sprintf("0.0.0.0:8080")
        http.ListenAndServe(bingAddr,http.DefaultServeMux)
    }
    
    

    相关文章

      网友评论

          本文标题:Golang expvar原理

          本文链接:https://www.haomeiwen.com/subject/lrmagctx.html