golang程序的监控神器----expvar

本文介绍了Go语言标准库expvar如何用于监控服务,它提供了以JSON格式公开监控变量的接口,并通过/debug/vars接口以HTTP方式展示。通过expvar结合metricBeat、ES和Kibana可以方便地对服务进行监控。文中详细解释了expvar中默认返回的内存统计信息,并给出了使用示例。
摘要由CSDN通过智能技术生成

大家都知道,go自带的runtime包拥有各种功能,包括goroutine数量,设置逻辑线程数量,当前go版本,当前系统类型等等。前两天发现了go标准库还有一个更好用的可以监控服务运行各项指标和状态的包—-expvar。

expvar包为监控变量提供了一个标准化的接口,它以 JSON 格式通过 /debug/vars 接口以 HTTP 的方式公开这些监控变量以及我自定义的变量。通过它,再加上metricBeat,ES和Kibana,可以很轻松的对服务进行监控。我这里是用gin把接口暴露出来,其实用别的web框架也都可以。下面我们来看一下如何使用它:

router := gin.Default()  //初始化一个gin实例

router.GET("/debug/vars", monitor.GetCurrentRunningStats) //接口路由,如果url不是/debug/vars,则用metricBeat去获取会出问题
s := &http.Server{
   Addr:           ":" + config.GetConfig().Listen.Port,
   Handler:        router,
   ReadTimeout:    5 * time.Second,
   WriteTimeout:   5 * time.Second,
   MaxHeaderBytes: 1 << 20,
}

s.ListenAndServe()  //开始监听



对应的handler函数

package monitor

import (
   "encoding/json"
   "expvar"
   "fmt"
   "github.com/gin-gonic/gin"
   "math"
   "net/http"
   "quotedata/models"
   "runtime"
   "sort"
   "time"
)

var CuMemoryPtr *map[string]models.Kline
var BTCMemoryPtr *map[string]models.Kline


// 开始时间
var start = time.Now()

// calculateUptime 计算运行时间
func calculateUptime() interface{} {
   return time.Since(start).String()
}

// currentGoVersion 当前 Golang 版本
func currentGoVersion() interface{} {
   return runtime.Version()
}

// getNumCPUs 获取 CPU 核心数量
func getNumCPUs() interface{} {
   return runtime.NumCPU()
}

// getGoOS 当前系统类型
func getGoOS() interface{} {
   return runtime.GOOS
}

// getNumGoroutins 当前 goroutine 数量
func getNumGoroutins() interface{} {
   return runtime.NumGoroutine()
}

// getNumCgoCall CGo 调用次数
func getNumCgoCall() interface{} {
   return runtime.NumCgoCall()
}

// 业务特定的内存数据
func getCuMemoryMap() interface{} {
   if CuMemoryPtr == nil {
      return 0
   } else {
      return len(*CuMemoryPtr)
   }
}
// 业务特定的内存数据
func getBTCMemoryMap() interface{} {
   if BTCMemoryPtr == nil {
      return 0
   } else {
      return len(*BTCMemoryPtr)
   }
}

var lastPause uint32

// getLastGCPauseTime 获取上次 GC 的暂停时间
func getLastGCPauseTime() interface{} {
   var gcPause uint64
   ms := new(runtime.MemStats)

   statString := expvar.Get("memstats").String()
   if statString != "" {
      json.Unmarshal([]byte(statString), ms)

      if lastPause == 0 || lastPause != ms.NumGC {
         gcPause = ms.PauseNs[(ms.NumGC+255)%256]
         lastPause = ms.NumGC
      }
   }

   
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值