我是靠谱客的博主 大意天空,最近开发中收集的这篇文章主要介绍golang程序的监控神器----expvar,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

大家都知道,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
      }
   }

   

最后

以上就是大意天空为你收集整理的golang程序的监控神器----expvar的全部内容,希望文章能够帮你解决golang程序的监控神器----expvar所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部