Golang expvar原理

huiwq1990 · · 500 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

前言

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


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:huiwq1990

查看原文:Golang expvar原理

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

500 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传