go编写的netflow _exporter,本地测试代码_go语言netflow-exporter

23 阅读2分钟
	// Name: "flowSend",
	// Help: "Current flowSend of the Host.",
	//}),
	//flowReceive: prometheus.NewGauge(prometheus.GaugeOpts{
	// Name: "flowReceive",
	// Help: "Current flowReceive of the Host.",
	//}),
	flowSend: prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Name: "flowSend",
			Help: "Current flowSend of the Host.",
		},
		[]string{"host"},
	),
	flowReceive: prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Name: "flowReceive",
			Help: "Current flowReceive of the Host.",
		},
		[]string{"host"},
	),
}
reg.MustRegister(m.flowSend)
reg.MustRegister(m.flowReceive)
return m

}

func main() { // Create a non-global registry. reg := prometheus.NewRegistry()

// Create new metrics and register them using the custom registry.
m := NewMetrics(reg)

// 打开文件
file, err := os.Open("D:\\zjh\\github\\node\_exporter-master\\node\_exporter-master\\test\\test.txt")
if err != nil {
	fmt.Println(err)
	return
}
defer func(file \*os.File) {
	err := file.Close()
	if err != nil {

	}
}(file)
// 创建一个新的扫描器
scanner := bufio.NewScanner(file)
//fmt.Println(scanner.Scan())
//fmt.Println("---------------")
// 遍历文件中的每一行
var count = 1
var groupnum = 0
//all\_netflow := make(map[string]string)
//send\_rece\_arr := make([]float64, 6)
var send_flow = ""
for scanner.Scan() {
	// 获取当前行
	line := scanner.Text()
	//line := strings.TrimSpace(line0)
	//fmt.Println(line)
	// 从当前行中获取切片
	slice0 := strings.Split(line, " ")
	// 打印切片
	//fmt.Println("----------------")
	if (count % 2) != 0 {
		groupnum++
		//发送
		send_arr := make([]string, 7)
		var scount = 0
		//fmt.Printf("%d 组发送流量:%s\n", groupnum, slice0)
		for \_, v := range slice0 {
			if v != "" {
				//fmt.Println(v)
				send_arr[scount] = v
				scount++
			}
		}
		//fmt.Println(send\_arr)
		//fmt.Println(send\_arr[1], send\_arr[len(send\_arr)-2])
		send_flow = send_arr[len(send_arr)-2]
	} else {
		//all\_netflow[send\_arr[0]+string("\_send")] = send\_arr[len(send\_arr)-2]
		//fmt.Printf("%d 组接收流量:%s\n", groupnum, slice0)
		//for i := 0; i < len(slice0); i++ {
		// if slice0[i] != "" {
		// fmt.Println(i, slice0[i], "--")
		// }
		//}
		//接收
		rece_arr := make([]string, 6)
		var rcount = 0
		for \_, v := range slice0 {
			if v != "" {
				//fmt.Println(v)
				rece_arr[rcount] = v
				rcount++
			}
		}
		rece_flow := rece_arr[len(rece_arr)-2]
		m.flowSend.With(prometheus.Labels{"host": rece_arr[0]}).Add(transformtokb(send_flow))
		m.flowReceive.With(prometheus.Labels{"host": rece_arr[0]}).Add(transformtokb(rece_flow))
		send_flow = strconv.FormatFloat(transformtokb(send_flow), 'f', 2, 64)
		rece_flow = strconv.FormatFloat(transformtokb(rece_flow), 'f', 2, 64)
		//all\_netflow[rece\_arr[0]] = send\_flow + "|" + rece\_flow
		send_flow = ""
	}
	count++
}
//fmt.Println(all\_netflow)
//m0 := make(map[string]float64)

// Set values for the new created metrics.
//m.flowSend.Set(65.3)
//m.flowReceive.Set(65.3)
//m.label.With(prometheus.Labels{"device": "/dev/sda"}).Add(4.1)
//m.label.With(prometheus.Labels{"device": "/dev/sdb"}).Add(4.1)
m.flowSend.With(prometheus.Labels{"host": "192.168.10.11"}).Add(4.6)
m.flowReceive.With(prometheus.Labels{"host": "192.168.10.11"}).Add(4.6)
// Expose metrics and custom registry via an HTTP server
// using the HandleFor function. "/metrics" is the usual endpoint for that.
http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{Registry: reg}))
log.Fatal(http.ListenAndServe(":8080", nil))

}

// 对b/Kb/Mb数据进行转换 func transformtokb(flow string) float64 { //if strings.Split(flow, "Kb")[0] != "" { // fmt.Println(strings.Split(flow, "Kb")[0]) //} else if strings.Split(flow, "b")[0] != "" { // fmt.Println(strings.Split(flow, "b")[0]) //} else if strings.Split(flow, "Mb")[0] != "" { // fmt.Println(strings.Split(flow, "Mb")[0]) //} //if strings.Contains(flow, "Kb") { // newstr := strings.ReplaceAll(flow, "Kb", "") // fmt.Println(newstr)

//} else if strings.Contains(flow, "b") {
// newstr := strings.ReplaceAll(flow, "b", "")
// fmt.Println(newstr)
//} else if strings.Contains(flow, "Mb") {
// newstr := strings.ReplaceAll(flow, "Mb", "")
// fmt.Println(newstr)
//}
// strconv.Itoa() 将 int 转换为 string
//• strconv.Atoi() 将 string 转换为 int
//• strconv.FormatFloat() 将 float64 转换为 string
//• strconv.ParseFloat() 将 string 转换为 float64

newstr := ""
for \_, v := range flow {
	if v == 'K' {
		//fmt.Println(newstr)
		strInt, err := strconv.ParseFloat(newstr, 2)
		if err != nil {
			fmt.Println("error")
		}
		finalResult := float64(strInt)
		return finalResult
		//break
	} else if v == 'b' {
		//fmt.Println(newstr)
		strInt, err := strconv.ParseFloat(newstr, 2)
		if err != nil {
			fmt.Println("error")
		}
		//fmt.Println(str\_int / 1024)
		//var final\_result=0.0
		//final\_result :=
		finalResult := math.Round(float64(strInt/1024)\*1000) / 1000
		return finalResult
		//break
	} else if v == 'M' {
		//fmt.Println(newstr)
		strInt, err := strconv.ParseFloat(newstr, 2)
		if err != nil {
			fmt.Println("error")
		}
		//fmt.Println(str\_int \* 1024)

img img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!