设为首页 收藏本站
查看: 775|回复: 0

[经验分享] 小花狸监控之Redis

[复制链接]

尚未签到

发表于 2015-12-23 10:31:16 | 显示全部楼层 |阅读模式
小花狸监控Redis和主机的状态  
  监控主机状态的代码
  $GOPATH/src/probe/module/Host.go
  
  package module
  
  import (
  "io/ioutil"
  "net"
  "os/exec"
  "strconv"
  "strings"
  "syscall"
  "time"
  )
  
  type Disk struct {
  Name string `json:name`
  All  uint64 `json:all`
  Used uint64 `json:used`
  Free uint64 `json:free`
  }
  
  func (this *Disk) DiskUsage() {
  fs := syscall.Statfs_t{}
  err := syscall.Statfs(this.Name, &fs)
  if err != nil {
  this.All = 0
  this.Free = 0
  this.Used = 0
  }
  this.All = fs.Blocks * uint64(fs.Bsize)
  this.Free = fs.Bavail * uint64(fs.Bsize)
  this.Used = this.All - fs.Bfree*uint64(fs.Bsize)
  }
  
  type Memory struct {
  AllMemory  uint64 `json:allmemory`
  UsedMemory uint64 `json:usedmemory`
  FreeMemory uint64 `json:freememory`
  }
  
  func (this *Memory) MemoryUsage() {
  cmd := exec.Command("/bin/bash", "-c", `free -m | awk 'NR==3 {print $3"TAB"$4}'`)
  stdout, _ := cmd.StdoutPipe()
  cmd.Start()
  bytes, _ := ioutil.ReadAll(stdout)
  data := strings.Split(string(bytes), "TAB")
  this.UsedMemory, _ = strconv.ParseUint(data[0], 10, 64)
  this.FreeMemory, _ = strconv.ParseUint(strings.Trim(data[1], "\n"), 10, 64)
  this.AllMemory = this.UsedMemory + this.FreeMemory
  }
  
  type Host struct {
  Ip     string
  Root   Disk `json:root`
  Data   Disk `json:data`
  Dbdata Disk `json:dbdata`
  Memory
  Cpu
  Ts time.Time `json:ts`
  }
  
  func getHostAddr() (hostAddr string) {
  addrs, _ := net.InterfaceAddrs()
  for _, addr := range addrs {
  ip := addr.String()
  if !strings.HasPrefix(ip, "127") && !strings.HasPrefix(ip, "192") && !strings.HasSuffix(ip, "128") && !strings.HasSuffix(ip, "64") {
  return ip[0:strings.LastIndex(ip, "/")]
  }
  }
  return "127.0.0.1"
  }
  
  func (this *Host) HostUsage() {
  this.Ip = getHostAddr()
  this.MemoryUsage()
  this.Root.DiskUsage()
  this.Data.DiskUsage()
  this.Dbdata.DiskUsage()
  this.Cpu.CpuUsage()
  }
  
  
  type Cpu struct {
  CpuIdle float64
  }
  
  func (this *Cpu) CpuUsage() {
  cmd := exec.Command("/bin/bash", "-c", `top -b -n 1 | grep Cpu | awk -F"," '{print $4}' | sed 's/%id//g;s/^ //g'`)
  stdout, _ := cmd.StdoutPipe()
  cmd.Start()
  bytes, _ := ioutil.ReadAll(stdout)
  cpuidle, _ := strconv.ParseFloat(strings.Trim(string(bytes), "\n"), 64)
  this.CpuIdle = cpuidle
  }
  
  func NewHost(host *Host) {
  host.Root = Disk{Name: "/"}
  host.Data = Disk{Name: "/data"}
  host.Dbdata = Disk{Name: "/dbdata"}
  host.Ts = time.Now()
  host.HostUsage()
  }
  
  监控Redis的代码
  $GOLANG/src/probe/module/Redis.go
  
  通过反射的方式,监控Redis信息
  
  package module
  
  import (
  "github.com/garyburd/redigo/redis"
  "io/ioutil"
  "os/exec"
  "reflect"
  "strconv"
  "strings"
  "time"
  )
  
  type RedisInfo struct {
  Port                       string
  Connected_clients          int64
  Blocked_clients            int64
  Used_memory                int64
  Role                       string
  Instantaneous_ops_per_sec  int64
  Rejected_connections       int64
  Master_host                string
  Master_port                int64
  Master_link_status         string
  Master_last_io_seconds_ago int64
  Connected_slaves           int64
  Cpu_ratio                  float64
  Master0                    string
  Host                       Host
  }
  
  func GetRedisInfo(port string, password string) (redisinfo *RedisInfo) {
  r := &RedisInfo{}
  NewHost(&r.Host)
  r.Port = port
  ref := reflect.ValueOf(r)
  conn, _ := redis.DialTimeout("tcp", ":"+port, 0, 1*time.Second, 1*time.Second)
  conn.Do("AUTH", password)
  defer conn.Close()
  info, _ := redis.String(conn.Do("info"))
  data := strings.Split(info, "\n")
  for _, v := range data {
  if !strings.HasPrefix(v, "#") && !strings.HasPrefix(v, "\r") && strings.Contains(v, ":") {
  result := strings.Split(v, ":")
  field := ref.Elem().FieldByName(strings.Title(result[0]))
  if field.IsValid() {
  switch field.Kind() {
  case reflect.Int64:
  val, _ := strconv.ParseInt(strings.Trim(result[1], "\r"), 10, 64)
  field.SetInt(val)
  case reflect.String:
  field.SetString(strings.Trim(result[1], "\r"))
  }
  }
  }
  }
  r.Cpu_ratio = getCpuInfo(port)
  return r
  }
  
  
  func getCpuInfo(port string) float64 {
  cmd := exec.Command("/bin/bash", "-c", `top -b -n 1 -p $(ps -ef | grep  -w "redis-server\ \*:`+port+`" | awk '{print $2}') | awk '/redis-server/{print $9}' | sed 's/\r//g'`)
  stdout, _ := cmd.StdoutPipe()
  cmd.Start()
  bytes, _ := ioutil.ReadAll(stdout)
  cpuinfo, _ := strconv.ParseFloat(strings.Trim(string(bytes), "\n"), 64)
  return cpuinfo
  }
  
  
  调用$GOPATH/src/main.go
  package main
  
  import (
  "encoding/json"
  "log"
  "probe/module"
  )
  
  func main() {
  r := module.GetRedisInfo("30000", "")
  result, _ := json.Marshal(*r)
  log.Println(string(result))
  }
  
  结果
  {
  "Port": "30000", 
  "Connected_clients": 3, 
  "Blocked_clients": 0, 
  "Used_memory": 852208, 
  "Role": "master", 
  "Instantaneous_ops_per_sec": 0, 
  "Rejected_connections": 0, 
  "Master_host": "", 
  "Master_port": 0, 
  "Master_link_status": "", 
  "Master_last_io_seconds_ago": 0, 
  "Connected_slaves": 0, 
  "Cpu_ratio": 0, 
  "Master0": "", 
  "Host": {
  "Ip": "172.16.1.78", 
  "Root": {
  "Name": "/", 
  "All": 50519138304, 
  "Used": 6745673728, 
  "Free": 41207181312
  }, 
  "Data": {
  "Name": "/data", 
  "All": 50519138304, 
  "Used": 6745673728, 
  "Free": 41207181312
  }, 
  "Dbdata": {
  "Name": "/dbdata", 
  "All": 0, 
  "Used": 0, 
  "Free": 0
  }, 
  "AllMemory": 7872, 
  "UsedMemory": 947, 
  "FreeMemory": 6925, 
  "CpuIdle": 99.9, 
  "Ts": "2015-03-19T19:08:23.780288023+08:00"
  }
  }
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-155148-1-1.html 上篇帖子: redis重启脚本 下篇帖子: redis续16
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表