// Parse /proc/net/ip_vs_stats func ParseIPVSStats(file string) (metrics []*model.MetricValue, err error) { content, err := ioutil.ReadFile(file) if err != nil { return nil, err } strcon := string(content) lines := strings.Split(strcon, "\n") if len(lines) < 6 { return nil, fmt.Errorf("ip_vs_stats content invalid") } array := strings.Fields(lines[5]) var attachtags = g.Config().AttachTags var interval int64 = g.Config().Transfer.Interval now := time.Now().Unix() hostname, _ := g.Hostname() for i, v := range STATS { value, _ := strconv.ParseInt(array[i], 16, 0) metricName := fmt.Sprintf("lvs.%s", v) metric := &model.MetricValue{ Endpoint: hostname, Metric: metricName, Value: value, Timestamp: now, Step: interval, Type: "GAUGE", Tags: attachtags, } metrics = append(metrics, metric) } return metrics, nil }
func Collect() { if !g.Config().Transfer.Enable { glog.Warningf("Open falcon transfer is not enabled!!!") return } if g.Config().Transfer.Addr == "" { glog.Warningf("Open falcon transfer addr is null!!!") return } go collect() }
func collect() { // start collect data for lvs cluster. var interval int64 = g.Config().Transfer.Interval var ticker = time.NewTicker(time.Duration(interval) * time.Second) ipvs.Init() for { <-ticker.C mvs := []*model.MetricValue{} // Collect metrics from /proc/net/ip_vs vips, err := GetIPVSStats() if err != nil { glog.Errorf("%s", err.Error()) } mvs, _ = ConvertVIPs2Metrics(vips) g.SendMetrics(mvs) // Collect metrics from /proc/net/ip_vs_stats mvs, err = ParseIPVSStats(IPVSSTATSFILE) if os.IsNotExist(err) { glog.Fatalf("%s", err.Error()) } g.SendMetrics(mvs) } }
func startHttpServer() { if !g.Config().Http.Enable { return } addr := g.Config().Http.Listen if addr == "" { return } // init url mapping configRoutes() s := &http.Server{ Addr: addr, MaxHeaderBytes: 1 << 30, } glog.Infoln("http.startHttpServer ok, listening ", addr) glog.Fatalln(s.ListenAndServe()) }
func configCommonRoutes() { http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("ok\n")) }) http.HandleFunc("/version", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(fmt.Sprintf("%s\n", g.VERSION))) }) http.HandleFunc("/workdir", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte(fmt.Sprintf("%s\n", file.SelfDir()))) }) http.HandleFunc("/config", func(w http.ResponseWriter, r *http.Request) { RenderDataJson(w, g.Config()) }) }
func ConvertVIPs2Metrics(vips []*VirtualIPPoint) (metrics []*model.MetricValue, err error) { if len(vips) <= 0 { return nil, nil } var tags string var attachtags = g.Config().AttachTags var interval int64 = g.Config().Transfer.Interval if attachtags != "" { tags = attachtags } hostname, _ := g.Hostname() now := time.Now().Unix() var metric *model.MetricValue for _, vip := range vips { var tag string if tags != "" { tag = fmt.Sprintf("%s,vip=%s,port=%d", tags, vip.IP, vip.Port) } else { tag = fmt.Sprintf("vip=%s,port=%d", vip.IP, vip.Port) } metric = &model.MetricValue{ Endpoint: hostname, Metric: "lvs.vip.active_conn", Value: vip.ActiveConns, Timestamp: now, Step: interval, Type: "GAUGE", Tags: tag, } metrics = append(metrics, metric) metric = &model.MetricValue{ Endpoint: hostname, Metric: "lvs.vip.inact_conn", Value: vip.InactiveConns, Timestamp: now, Step: interval, Type: "GAUGE", Tags: tag, } metrics = append(metrics, metric) metric = &model.MetricValue{ Endpoint: hostname, Metric: "lvs.vip.rs_num", Value: vip.RealServerNum, Timestamp: now, Step: interval, Type: "GAUGE", Tags: tag, } metrics = append(metrics, metric) metric = &model.MetricValue{ Endpoint: hostname, Metric: "lvs.vip.conns", Value: vip.Connections, Timestamp: now, Step: interval, Type: "COUNTER", Tags: tag, } metrics = append(metrics, metric) metric = &model.MetricValue{ Endpoint: hostname, Metric: "lvs.vip.inpkts", Value: vip.PacketsIn, Timestamp: now, Step: interval, Type: "COUNTER", Tags: tag, } metrics = append(metrics, metric) metric = &model.MetricValue{ Endpoint: hostname, Metric: "lvs.vip.outpkts", Value: vip.PacketsOut, Timestamp: now, Step: interval, Type: "COUNTER", Tags: tag, } metrics = append(metrics, metric) metric = &model.MetricValue{ Endpoint: hostname, Metric: "lvs.vip.inbytes", Value: vip.BytesIn, Timestamp: now, Step: interval, Type: "COUNTER", Tags: tag, } metrics = append(metrics, metric) metric = &model.MetricValue{ Endpoint: hostname, Metric: "lvs.vip.outbytes", Value: vip.BytesOut, Timestamp: now, Step: interval, Type: "COUNTER", Tags: tag, } metrics = append(metrics, metric) } return metrics, nil }