前言
在学习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)
}
网友评论