func swIfMetrics() (L []*model.MetricValue) { initVariable() allIp := AllSwitchIp() chs := make([]chan ChIfStat, len(allIp)) limitCh := make(chan bool, g.Config().Switch.LimitConcur) startTime := time.Now() log.Printf("UpdateIfStats start. The number of concurrent limited to %d. IP addresses number is %d", g.Config().Switch.LimitConcur, len(allIp)) for i, ip := range allIp { chs[i] = make(chan ChIfStat) limitCh <- true go coreSwIfMetrics(ip, chs[i], limitCh) time.Sleep(5 * time.Millisecond) } for _, ch := range chs { chIfStat := <-ch if chIfStat.PingResult == true && !slice.ContainsString(AliveIp, chIfStat.Ip) { AliveIp = append(AliveIp, chIfStat.Ip) } if chIfStat.IfStatsList != nil { if g.Config().Debug { log.Println(chIfStat.Ip, chIfStat.PingResult, len(*chIfStat.IfStatsList), chIfStat.UseTime) } for _, ifStat := range *chIfStat.IfStatsList { ifNameTag := "ifName=" + ifStat.IfName ifIndexTag := "ifIndex=" + strconv.Itoa(ifStat.IfIndex) ip := chIfStat.Ip L = append(L, CounterValueIp(ifStat.TS, ip, "switch.if.In", ifStat.IfHCInOctets, ifNameTag, ifIndexTag)) L = append(L, CounterValueIp(ifStat.TS, ip, "switch.if.Out", ifStat.IfHCOutOctets, ifNameTag, ifIndexTag)) //如果IgnorePkt为false,采集Pkt if g.Config().Switch.IgnorePkt == false { L = append(L, CounterValueIp(ifStat.TS, ip, "switch.if.InPkts", ifStat.IfHCInUcastPkts, ifNameTag, ifIndexTag)) L = append(L, CounterValueIp(ifStat.TS, ip, "switch.if.OutPkts", ifStat.IfHCOutUcastPkts, ifNameTag, ifIndexTag)) } } } } endTime := time.Now() log.Printf("UpdateIfStats complete. Process time %s. Number of active ip is %d", endTime.Sub(startTime), len(AliveIp)) if g.Config().Debug { for i, v := range AliveIp { log.Println("AliveIp:", i, v) } } return }
func swSystemInfo(ip string, ch chan SwSystem) { var swSystem SwSystem swSystem.Ip = ip //ping timeout.Millisecond timeout := 1000 pingCount := 1 ping, err := sw.PingStatSummary(ip, pingCount, timeout) if err != nil { log.Println(err) ch <- swSystem return } else { swSystem.Ping = ping["max"] uptime, err := sw.SysUpTime(ip, g.Config().Switch.Community, timeout) if err != nil { log.Println(err) ch <- swSystem return } else { swSystem.Uptime = uptime cpuUtili, err := sw.CpuUtilization(ip, g.Config().Switch.Community, timeout, 1) if err != nil { log.Println(err) } else { swSystem.Cpu = cpuUtili } memUtili, err := sw.MemUtilization(ip, g.Config().Switch.Community, timeout, 1) if err != nil { log.Println(err) } else { swSystem.Mem = memUtili } swModel, err := sw.SysModel(ip, g.Config().Switch.Community, timeout) if err != nil { log.Println(err) } else { swSystem.Model = swModel } swName, err := sw.SysName(ip, g.Config().Switch.Community, timeout) if err != nil { log.Println(err) } else { swSystem.Hostname = swName } } } ch <- swSystem return }
func Collect() { if !g.Config().Transfer.Enabled { return } if g.Config().Transfer.Addr == "" { return } for _, v := range funcs.Mappers { go collect(int64(v.Interval), v.Fs) } }
func cpuMetrics(ip string, ch chan SwCpu) { var swCpu SwCpu cpuUtili, err := sw.CpuUtilization(ip, g.Config().Switch.Community, g.Config().Switch.SnmpTimeout, g.Config().Switch.SnmpRetry) if err != nil { log.Println(err) } swCpu.Ip = ip swCpu.CpuUtil = cpuUtili ch <- swCpu return }
func memMetrics(ip string, ch chan SwMem) { var swMem SwMem memUtili, err := sw.MemUtilization(ip, g.Config().Switch.Community, g.Config().Switch.SnmpTimeout, g.Config().Switch.SnmpRetry) if err != nil { log.Println(err) } swMem.Ip = ip swMem.MemUtili = memUtili ch <- swMem return }
func configAdminRoutes() { http.HandleFunc("/exit", func(w http.ResponseWriter, r *http.Request) { if g.IsTrustable(r.RemoteAddr) { w.Write([]byte("exiting...")) go func() { time.Sleep(time.Second) os.Exit(0) }() } else { w.Write([]byte("no privilege")) } }) http.HandleFunc("/config/reload", func(w http.ResponseWriter, r *http.Request) { if g.IsTrustable(r.RemoteAddr) { g.ParseConfig(g.ConfigFile) RenderDataJson(w, g.Config()) } else { w.Write([]byte("no privilege")) } }) http.HandleFunc("/workdir", func(w http.ResponseWriter, r *http.Request) { RenderDataJson(w, file.SelfDir()) }) http.HandleFunc("/ips", func(w http.ResponseWriter, r *http.Request) { RenderDataJson(w, g.TrustableIps()) }) }
func configSwRoutes() { http.HandleFunc("/page/sw/time", func(w http.ResponseWriter, req *http.Request) { RenderDataJson(w, time.Now().Format("2006-01-02 15:04:05")) }) http.HandleFunc("/page/sw/iprange", func(w http.ResponseWriter, req *http.Request) { RenderDataJson(w, strings.Join(g.Config().Switch.IpRange, "\n")) }) http.HandleFunc("/page/sw/live", func(w http.ResponseWriter, req *http.Request) { RenderDataJson(w, len(funcs.AliveIp)) }) http.HandleFunc("/page/sw/list", func(w http.ResponseWriter, r *http.Request) { var ret [][]interface{} = make([][]interface{}, 0) for _, swSystem := range funcs.SwSystemInfo() { ret = append(ret, []interface{}{ swSystem.Ip, swSystem.Hostname, swSystem.Model, swSystem.Uptime, fmt.Sprintf("%d%%", swSystem.Cpu), fmt.Sprintf("%d%%", swSystem.Mem), fmt.Sprintf("%sms", swSystem.Ping), }) } RenderDataJson(w, ret) }) }
func connMetrics(ip string, ch chan SwConn) { var swConn SwConn vendor, _ := sw.SysVendor(ip, community, snmpTimeout) if !strings.Contains(vendor, "Cisco_ASA") { ch <- swConn return } ConnectionStat, err := sw.ConnectionStat(ip, g.Config().Switch.Community, g.Config().Switch.SnmpTimeout, g.Config().Switch.SnmpRetry) if err != nil { log.Println(err) } swConn.Ip = ip swConn.ConnectionStat = ConnectionStat ch <- swConn return }
func Start() { if !g.Config().Http.Enabled { return } addr := g.Config().Http.Listen if addr == "" { return } s := &http.Server{ Addr: addr, MaxHeaderBytes: 1 << 30, } log.Println("listening", addr) log.Fatalln(s.ListenAndServe()) }
func pingMetrics(ip string, ch chan SwPing) { var swPing SwPing timeout := g.Config().Switch.PingTimeout * g.Config().Switch.PingRetry fastPingMode := g.Config().Switch.FastPingMode rtt, err := sw.PingRtt(ip, timeout, fastPingMode) if err != nil { log.Println(ip, err) swPing.Ip = ip swPing.Ping = -1 ch <- swPing return } if g.Config().Debug { log.Println(ip, rtt) } swPing.Ip = ip swPing.Ping = rtt ch <- swPing return }
func initVariable() { pingTimeout = g.Config().Switch.PingTimeout pingRetry = g.Config().Switch.PingRetry community = g.Config().Switch.Community snmpTimeout = g.Config().Switch.SnmpTimeout snmpRetry = g.Config().Switch.SnmpRetry ignoreIface = g.Config().Switch.IgnoreIface ignorePkt = g.Config().Switch.IgnorePkt }
func AllSwitchIp() (allIp []string) { switchIp := g.Config().Switch.IpRange if len(switchIp) > 0 { for _, sip := range switchIp { aip := sw.ParseIp(sip) for _, ip := range aip { allIp = append(allIp, ip) } } } return allIp }
func BuildMappers() { interval := g.Config().Transfer.Interval Mappers = []FuncsAndInterval{ FuncsAndInterval{ Fs: []func() []*model.MetricValue{ SwIfMetrics, AgentMetrics, CpuMetrics, MemMetrics, PingMetrics, }, Interval: interval, }, } }
func pingMetrics(ip string, ch chan SwPing) { var swPing SwPing timeout := g.Config().Switch.PingTimeout * 4 rtt, err := sw.PingRtt(ip, timeout) if err != nil { log.Println(ip, err) swPing.Ping = 0 } swPing.Ip = ip swPing.Ping = rtt ch <- swPing return }
func syncTrustableIps() { duration := time.Duration(g.Config().Heartbeat.Interval) * time.Second for { REST: time.Sleep(duration) var ips string err := g.HbsClient.Call("Agent.TrustableIps", model.NullRpcRequest{}, &ips) if err != nil { log.Println("ERROR: call Agent.TrustableIps fail", err) goto REST } g.SetTrustableIps(ips) } }
func NewMetricValueIp(TS int64, ip, metric string, val interface{}, dataType string, tags ...string) *model.MetricValue { sec := int64(g.Config().Transfer.Interval) mv := model.MetricValue{ Metric: metric, Value: val, Type: dataType, Endpoint: ip, Step: sec, Timestamp: TS, } size := len(tags) if size > 0 { mv.Tags = strings.Join(tags, ",") } return &mv }
func SyncTrustableIps() { if g.Config().Heartbeat.Enabled && g.Config().Heartbeat.Addr != "" { go syncTrustableIps() } }
func syncBuiltinMetrics() { var timestamp int64 = -1 var checksum string = "nil" duration := time.Duration(g.Config().Heartbeat.Interval) * time.Second for { REST: time.Sleep(duration) var ports = []int64{} var procs = make(map[string]map[int]string) hostname, err := g.Hostname() if err != nil { goto REST } req := model.AgentHeartbeatRequest{ Hostname: hostname, Checksum: checksum, } var resp model.BuiltinMetricResponse err = g.HbsClient.Call("Agent.BuiltinMetrics", req, &resp) if err != nil { log.Println("ERROR:", err) goto REST } if resp.Timestamp <= timestamp { goto REST } if resp.Checksum == checksum { goto REST } timestamp = resp.Timestamp checksum = resp.Checksum for _, metric := range resp.Metrics { if metric.Metric == "net.port.listen" { if !strings.Contains(metric.Tags, "=") { // illegal continue } if port, err := strconv.ParseInt(metric.Tags[5:], 10, 64); err == nil { ports = append(ports, port) } continue } if metric.Metric == "proc.num" { arr := strings.Split(metric.Tags, ",") tmpMap := make(map[int]string) for i := 0; i < len(arr); i++ { if strings.HasPrefix(arr[i], "name=") { tmpMap[1] = arr[i][5:] } else if strings.HasPrefix(arr[i], "cmdline=") { tmpMap[2] = arr[i][8:] } } procs[metric.Tags] = tmpMap } } g.SetReportPorts(ports) g.SetReportProcs(procs) } }
func SyncBuiltinMetrics() { if g.Config().Heartbeat.Enabled && g.Config().Heartbeat.Addr != "" { go syncBuiltinMetrics() } }
func SwIfMetrics() (L []*model.MetricValue) { if g.Config().Switch.Enabled && len(g.Config().Switch.IpRange) > 0 { return swIfMetrics() } return }
func initVariable() { pingTimeout = g.Config().Switch.PingTimeout fastPingMode = g.Config().Switch.FastPingMode pingRetry = g.Config().Switch.PingRetry community = g.Config().Switch.Community snmpTimeout = g.Config().Switch.SnmpTimeout snmpRetry = g.Config().Switch.SnmpRetry displayByBit = g.Config().Switch.DisplayByBit ignoreIface = g.Config().Switch.IgnoreIface ignorePkt = g.Config().Switch.IgnorePkt ignoreOperStatus = g.Config().Switch.IgnoreOperStatus ignoreBroadcastPkt = g.Config().Switch.IgnoreBroadcastPkt ignoreMulticastPkt = g.Config().Switch.IgnoreMulticastPkt }