func configPushRoutes() { http.HandleFunc("/v1/push", func(w http.ResponseWriter, req *http.Request) { if req.ContentLength == 0 { http.Error(w, "body is blank", http.StatusBadRequest) return } decoder := json.NewDecoder(req.Body) var metrics []*model.MetricValue err := decoder.Decode(&metrics) if err != nil { http.Error(w, "connot decode body", http.StatusBadRequest) return } hostname, herr := g.Hostname() if herr != nil { http.Error(w, "can not get hostname", http.StatusBadRequest) return } for i, _ := range metrics { metrics[i].Endpoint = hostname } g.SendToTransfer(metrics) w.Write([]byte("success")) }) }
func syncMinePlugins() { var ( timestamp int64 = -1 pluginDirs []string ) duration := time.Duration(g.Config().Heartbeat.Interval) * time.Second for { REST: time.Sleep(duration) hostname, err := g.Hostname() if err != nil { goto REST } req := model.AgentHeartbeatRequest{ Hostname: hostname, } var resp model.AgentPluginsResponse err = g.HbsClient.Call("Agent.MinePlugins", req, &resp) if err != nil { log.Println("ERROR:", err) goto REST } if resp.Timestamp <= timestamp { goto REST } pluginDirs = resp.Plugins timestamp = resp.Timestamp if g.Config().Debug { log.Println(&resp) } if len(pluginDirs) == 0 { plugins.ClearAllPlugins() } desiredAll := make(map[string]*plugins.Plugin) for _, p := range pluginDirs { underOneDir := plugins.ListPlugins(strings.Trim(p, "/")) for k, v := range underOneDir { desiredAll[k] = v } } plugins.DelNoUsePlugins(desiredAll) plugins.AddNewPlugins(desiredAll) } }
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 UrlMetrics() (L []*model.MetricValue) { reportUrls := g.ReportUrls() sz := len(reportUrls) if sz == 0 { return } hostname, err := g.Hostname() if err != nil { hostname = "None" } for furl, timeout := range reportUrls { tags := fmt.Sprintf("url=%v,timeout=%v,src=%v", furl, timeout, hostname) if ok, _ := probeUrl(furl, timeout); !ok { L = append(L, GaugeValue(g.URL_CHECK_HEALTH, 0, tags)) continue } L = append(L, GaugeValue(g.URL_CHECK_HEALTH, 1, tags)) } return }
func configKernelRoutes() { http.HandleFunc("/proc/kernel/hostname", func(w http.ResponseWriter, r *http.Request) { data, err := g.Hostname() AutoRender(w, data, err) }) http.HandleFunc("/proc/kernel/maxproc", func(w http.ResponseWriter, r *http.Request) { data, err := nux.KernelMaxProc() AutoRender(w, data, err) }) http.HandleFunc("/proc/kernel/maxfiles", func(w http.ResponseWriter, r *http.Request) { data, err := nux.KernelMaxFiles() AutoRender(w, data, err) }) http.HandleFunc("/proc/kernel/version", func(w http.ResponseWriter, r *http.Request) { data, err := sys.CmdOutNoLn("uname", "-r") AutoRender(w, data, err) }) }
func reportAgentStatus(interval time.Duration) { for { hostname, err := g.Hostname() if err != nil { hostname = fmt.Sprintf("error:%s", err.Error()) } req := model.AgentReportRequest{ Hostname: hostname, IP: g.IP(), AgentVersion: g.VERSION, PluginVersion: g.GetCurrPluginVersion(), } var resp model.SimpleRpcResponse err = g.HbsClient.Call("Agent.ReportStatus", req, &resp) if err != nil || resp.Code != 0 { log.Println("call Agent.ReportStatus fail:", err, "Request:", req, "Response:", resp) } time.Sleep(interval) } }
func syncBuiltinMetrics() { var timestamp int64 = -1 var checksum string = "nil" duration := time.Duration(g.Config().Heartbeat.Interval) * time.Second for { time.Sleep(duration) var ports = []int64{} var paths = []string{} var procs = make(map[string]map[int]string) var urls = make(map[string]string) hostname, err := g.Hostname() if err != nil { continue } 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) continue } if resp.Timestamp <= timestamp { continue } if resp.Checksum == checksum { continue } timestamp = resp.Timestamp checksum = resp.Checksum for _, metric := range resp.Metrics { if metric.Metric == g.URL_CHECK_HEALTH { arr := strings.Split(metric.Tags, ",") if len(arr) != 2 { continue } url := strings.Split(arr[0], "=") if len(url) != 2 { continue } stime := strings.Split(arr[1], "=") if len(stime) != 2 { continue } if _, err := strconv.ParseInt(stime[1], 10, 64); err == nil { urls[url[1]] = stime[1] } else { log.Println("metric ParseInt timeout failed:", err) } } if metric.Metric == g.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 == g.DU_BS { arr := strings.Split(metric.Tags, "=") if len(arr) != 2 { continue } paths = append(paths, strings.TrimSpace(arr[1])) continue } if metric.Metric == g.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.SetReportUrls(urls) g.SetReportPorts(ports) g.SetReportProcs(procs) g.SetDuPaths(paths) } }
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) } }