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 BuildMappers() { interval := g.Config().Transfer.Interval Mappers = []FuncsAndInterval{ FuncsAndInterval{ Fs: []func() []*model.MetricValue{ AgentMetrics, NetMetrics, CpuMetrics, DeviceMetrics, DiskIOMetrics, LoadMetrics, MemMetrics, }, Interval: interval, }, } }
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 collect(sec int64, fns []func() []*model.MetricValue) { for { REST: time.Sleep(time.Duration(sec) * time.Second) hostname, err := g.Hostname() if err != nil { goto REST } mvs := []*model.MetricValue{} ignoreMetrics := g.Config().IgnoreMetrics for _, fn := range fns { items := fn() if items == nil { continue } if len(items) == 0 { continue } for _, mv := range items { if b, ok := ignoreMetrics[mv.Metric]; ok && b { continue } else { mvs = append(mvs, mv) } } } now := time.Now().Unix() for j := 0; j < len(mvs); j++ { mvs[j].Step = sec mvs[j].Endpoint = hostname mvs[j].Timestamp = now } g.SendToTransfer(mvs) } }
func SyncTrustableIps() { if g.Config().Heartbeat.Enabled && g.Config().Heartbeat.Addr != "" { go syncTrustableIps() } }
func ReportAgentStatus() { if g.Config().Heartbeat.Enabled && g.Config().Heartbeat.Addr != "" { go reportAgentStatus(time.Duration(g.Config().Heartbeat.Interval) * time.Second) } }
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 paths = []string{} 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" { arr := strings.Split(metric.Tags, "=") if len(arr) != 2 { continue } if port, err := strconv.ParseInt(arr[1], 10, 64); err == nil { ports = append(ports, port) } else { log.Println("metrics ParseInt failed:", err) } continue } if metric.Metric == "du.bs" { arr := strings.Split(metric.Tags, "=") if len(arr) != 2 { continue } paths = append(paths, strings.TrimSpace(arr[1])) 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] = strings.TrimSpace(arr[i][5:]) } else if strings.HasPrefix(arr[i], "cmdline=") { tmpMap[2] = strings.TrimSpace(arr[i][8:]) } } procs[metric.Tags] = tmpMap } } g.SetReportPorts(ports) g.SetReportProcs(procs) g.SetDuPaths(paths) } }
func SyncBuiltinMetrics() { if g.Config().Heartbeat.Enabled && g.Config().Heartbeat.Addr != "" { go syncBuiltinMetrics() } }