Golang expvar原理

前言

在学习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)
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。