用 Golang 采集 Nginx 接口流量大小_golang集群流量统计,2024年最新作为Golang程序员应该怎样去规划自己的学习路线

79 阅读3分钟
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"strings"
)

func main() {
	resp, err := http.Get("http://localhost/nginx\_status")
	if err != nil {
		fmt.Println("获取 Nginx 统计数据失败:", err)
		return
	}
	defer resp.Body.Close()

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("读取 Nginx 统计数据失败:", err)
		return
	}

	stats := string(body)

	lines := strings.Split(stats, "\n")
	for \_, line := range lines {
		if strings.Contains(line, "Active connections") {
			fmt.Println(line)
		} else if strings.HasPrefix(line, "server accepts handled") {
			parts := strings.Fields(line)
			fmt.Println("接受的连接数:", parts[2])
			fmt.Println("处理的连接数:", parts[3])
			fmt.Println("已经完成的请求次数:", parts[4])
		} else if strings.HasPrefix(line, "Reading: ") {
			parts := strings.Fields(line)
			fmt.Println("正在读取的连接数:", parts[1])
		} else if strings.HasPrefix(line, "Writing: ") {
			parts := strings.Fields(line)
			fmt.Println("正在写入的连接数:", parts[1])
		} else if strings.HasPrefix(line, "Waiting: ") {
			parts := strings.Fields(line)
			fmt.Println("等待的连接数:", parts[1])
		}
	}
}

上述代码首先将响应数据按行拆分,并进行逐行解析。根据 Nginx 统计模块的文档,我们可以判断每一行的内容是哪些流量数据,并输出相应的信息。

3. 定时采集数据

为了实现实时监控和分析,我们可以使用 Golang 的 time 包定时采集数据,并将数据保存到文件或发送到服务器进行进一步分析。

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"strings"
	"time"
)

func main() {
	ticker := time.NewTicker(10 \* time.Second)
	defer ticker.Stop()

	for range ticker.C {
		resp, err := http.Get("http://localhost/nginx\_status")
		if err != nil {
			fmt.Println("获取 Nginx 统计数据失败:", err)
			continue
		}

		body, err := ioutil.ReadAll(resp.Body)
		resp.Body.Close()
		if err != nil {
			fmt.Println("读取 Nginx 统计数据失败:", err)
			continue
		}

		stats := string(body)

		lines := strings.Split(stats, "\n")
		for \_, line := range lines {
			// 解析流量数据...
		}
	}
}

上述代码使用 time.NewTicker 创建一个定时器,每隔 10 秒钟采集一次数据。在每次定时器触发时,发送 HTTP 请求获取数据,并进行解析和处理。您可以根据需要调整定时器的间隔。

步骤三:数据监控和分析

最后,我们可以将采集到的数据进行实时监控和分析。您可以使用各种工具和库来实现这一点,如 ECharts、Grafana 等。在此处,我们以 ECharts 为例,展示如何实时展示流量数据。

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"strings"
	"time"

	"github.com/go-echarts/go-echarts/charts"
	"github.com/go-echarts/go-echarts/opts"
	"github.com/go-echarts/go-echarts/templates"
)

var (
	activeConnections []opts.LineData
	accepts           []opts.LineData
	handled           []opts.LineData
	requests          []opts.LineData
	reading           []opts.LineData
	writing           []opts.LineData
	waiting           []opts.LineData
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, req \*http.Request) {
		page := charts.NewPage()

		line := charts.NewLine()
		line.SetGlobalOptions(
			charts.InitOpts{PageTitle: "接口流量监控"},
			charts.ToolboxOpts{Show: true},
			charts.YAxisOpts{Name: "数量"},
			charts.XAxisOpts{Name: "时间"},
		)

		line.AddXAxis(timeValues())
		line.AddYAxis("Active Connections", activeConnections)
		line.AddYAxis("Accepts", accepts)
		line.AddYAxis("Handled", handled)
		line.AddYAxis("Requests", requests)
		line.AddYAxis("Reading", reading)
		line.AddYAxis("Writing", writing)
		line.AddYAxis("Waiting", waiting)

		page.Add(line)

		w.Header().Set("Content-Type", "text/html; charset=utf-8")
		page.Render(w)
	})

	go func() {
		ticker := time.NewTicker(10 \* time.Second)
		defer ticker.Stop()

		for range ticker.C {
			resp, err := http.Get("http://localhost/nginx\_status")
			if err != nil {
				fmt.Println("获取 Nginx 统计数据失败:", err)
				continue
			}

			body, err := ioutil.ReadAll(resp.Body)
			resp.Body.Close()
			if err != nil {
				fmt.Println("读取 Nginx 统计数据失败:", err)
				continue
			}

			stats := string(body)

			lines := strings.Split(stats, "\n")
			for \_, line := range lines {
				// 解析流量数据...
			}

			line := charts.NewLine()
			line.SetGlobalOptions(
				charts.InitOpts{PageTitle: "接口流量监控"},
				charts.ToolboxOpts{Show: true},
				charts.YAxisOpts{Name: "数量"},
				charts.XAxisOpts{Name: "时间"},
			)

			line.AddXAxis(timeValues())
			line.AddYAxis("Active Connections", activeConnections)
			line.AddYAxis("Accepts", accepts)
			line.AddYAxis("Handled", handled)
			line.AddYAxis("Requests", requests)
			line.AddYAxis("Reading", reading)
			line.AddYAxis("Writing", writing)
			line.AddYAxis("Waiting", waiting)

			page := charts.NewPage()
			page.Add(line)

			s := templates.MustString(echartsTemplate, page)
			ioutil.WriteFile("index.html", []byte(s), 0644)
		}
	}()

	http.ListenAndServe(":8080", nil)
}

func timeValues() []string {
	t := time.Now().Format("2006-01-02 15:04:05")
	return []string{t}
}

const echartsTemplate = `
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">


![img](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/38e785859daf4c49a48a088b504acdb5~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252690&x-signature=CwjhBU7p6hq3z0HW%2BEKCdOJSGf4%3D)
![img](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/7dd90b792c67405cae4f8f8f2a9d0117~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252690&x-signature=bhzORvVF8Wues5OR%2BbbCfkwiplo%3D)
![img](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/029e084ae2fe49bb9b4508a82bcaa5be~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252690&x-signature=e3HPqa%2BLddW7k3Jj%2FStIsH9LNBw%3D)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**