golang高效收集Web应用统计信息的中间件插件库stats的使用
Golang高效收集Web应用统计信息的中间件插件库stats的使用
stats是一个用于Golang的net/http
处理程序,可以报告关于Web应用程序的各种指标。
兼容性
该中间件目前支持以下框架:
- negroni
- martini
- gocraft/web
- Gin
- Goji
- Beego
- HTTPRouter
如果你的框架不在列表中,可以提交PR或创建issue请求实现。
安装
- 确保已安装Go语言编译器(>=1.3)和git
- 确保系统PATH中有以下依赖:bzr、svn、hg、git
- 确保GOPATH设置正确
- 下载安装:
go get github.com/thoas/stats
使用示例
基本net/http使用
package main
import (
"net/http"
"github.com/thoas/stats"
)
func main() {
h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte("{\"hello\": \"world\"}"))
})
handler := stats.New().Handler(h)
http.ListenAndServe(":8080", handler)
}
Negroni框架使用
package main
import (
"net/http"
"github.com/codegangsta/negroni"
"github.com/thoas/stats"
"encoding/json"
)
func main() {
middleware := stats.New()
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte("{\"hello\": \"world\"}"))
})
mux.HandleFunc("/stats", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
stats := middleware.Data()
b, _ := json.Marshal(stats)
w.Write(b)
})
n := negroni.Classic()
n.Use(middleware)
n.UseHandler(mux)
n.Run(":3000")
}
HTTPRouter框架使用
package main
import (
"encoding/json"
"github.com/julienschmidt/httprouter"
"github.com/thoas/stats"
"net/http"
)
func main() {
router := httprouter.New()
s := stats.New()
router.GET("/stats", func(w http.ResponseWriter, _ *http.Request, _ httprouter.Params) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
s, err := json.Marshal(s.Data())
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
w.Write(s)
})
http.ListenAndServe(":8080", s.Handler(router))
}
Martini框架使用
package main
import (
"encoding/json"
"github.com/go-martini/martini"
"github.com/thoas/stats"
"net/http"
)
func main() {
middleware := stats.New()
m := martini.Classic()
m.Get("/", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte("{\"hello\": \"world\"}"))
})
m.Get("/stats", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
stats := middleware.Data()
b, _ := json.Marshal(stats)
w.Write(b)
})
m.Use(func(c martini.Context, w http.ResponseWriter, r *http.Request) {
beginning, recorder := middleware.Begin(w)
c.Next()
middleware.End(beginning, stats.WithRecorder(recorder))
})
m.Run()
}
输出示例
运行服务后,访问/stats
端点会返回如下JSON格式的统计信息:
{
"total_response_time": "1.907382ms",
"average_response_time": "86.699µs",
"average_response_time_sec": 8.6699e-05,
"count": 1,
"pid": 99894,
"status_code_count": {
"200": 1
},
"time": "2015-03-06 17:23:27.000677896 +0100 CET",
"total_count": 22,
"total_response_time_sec": 0.0019073820000000002,
"total_status_code_count": {
"200": 22
},
"unixtime": 1425659007,
"uptime": "4m14.502271612s",
"uptime_sec": 254.502271612
}
实现原理
该中间件实现了每秒重置请求数的计时器,未来还将添加更多功能。它最初由Antoine Imbert开发用于go-json-rest,后被Florent Messa移植为一个简单的Golang处理程序,以便在各种框架中使用。
更多关于golang高效收集Web应用统计信息的中间件插件库stats的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang高效收集Web应用统计信息的中间件插件库stats的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang高效收集Web应用统计信息的stats库使用指南
stats是一个轻量级的Go语言中间件库,专门用于收集Web应用的统计信息。下面我将详细介绍如何使用这个库来高效地收集你的Web应用统计信息。
安装stats库
首先,使用go get命令安装stats库:
go get github.com/thoas/stats
基本使用方法
1. 初始化stats中间件
package main
import (
"github.com/thoas/stats"
"net/http"
)
func main() {
// 初始化stats中间件
middleware := stats.New()
// 创建一个简单的HTTP处理程序
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, World!"))
})
// 使用中间件包装处理程序
app := middleware.Handler(handler)
// 添加一个路由来查看统计信息
http.Handle("/", app)
http.Handle("/stats", middleware)
// 启动服务器
http.ListenAndServe(":8080", nil)
}
2. 访问统计信息
启动服务器后,你可以通过访问/stats
端点来查看统计信息:
curl http://localhost:8080/stats
返回的JSON数据格式如下:
{
"total_count": 10,
"total_response_time": "1.2345ms",
"average_response_time": "0.1234ms",
"status_code_count": {
"200": 8,
"404": 1,
"500": 1
}
}
高级用法
1. 自定义统计信息收集
package main
import (
"github.com/thoas/stats"
"log"
"net/http"
"time"
)
func main() {
middleware := stats.New()
// 自定义处理程序
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
// 模拟处理时间
time.Sleep(100 * time.Millisecond)
w.WriteHeader(http.StatusOK)
w.Write([]byte("Custom handler"))
// 记录自定义指标
duration := time.Since(start)
log.Printf("Request to %s took %v", r.URL.Path, duration)
})
app := middleware.Handler(handler)
// 添加统计端点
http.Handle("/", app)
http.Handle("/stats", middleware)
http.ListenAndServe(":8080", nil)
}
2. 集成到现有框架
stats库可以与任何兼容net/http
的框架一起使用,例如Gin:
package main
import (
"github.com/gin-gonic/gin"
"github.com/thoas/stats"
)
func main() {
r := gin.Default()
// 初始化stats
middleware := stats.New()
// 添加中间件
r.Use(func(c *gin.Context) {
ginHandler := middleware.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
c.Next()
})
ginHandler(c.Writer, c.Request)
})
// 添加统计端点
r.GET("/stats", func(c *gin.Context) {
c.JSON(http.StatusOK, middleware.Data())
})
// 普通路由
r.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello, World!")
})
r.Run(":8080")
}
3. 定期记录统计信息
package main
import (
"github.com/thoas/stats"
"log"
"net/http"
"time"
)
func main() {
middleware := stats.New()
// 启动一个goroutine定期记录统计信息
go func() {
ticker := time.NewTicker(1 * time.Minute)
for range ticker.C {
data := middleware.Data()
log.Printf("Requests in last minute: %d, Avg response time: %s",
data.TotalCount,
data.AverageResponseTime)
}
}()
http.Handle("/", middleware.Handler(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, World!"))
}),
))
http.Handle("/stats", middleware)
http.ListenAndServe(":8080", nil)
}
统计数据结构
stats库收集的统计信息包含以下字段:
type Data struct {
// 总请求数
TotalCount uint64 `json:"total_count"`
// 总响应时间
TotalResponseTime time.Duration `json:"total_response_time"`
// 平均响应时间
AverageResponseTime time.Duration `json:"average_response_time"`
// 按状态码统计的请求数
StatusCodeCount map[int]int `json:"status_code_count"`
}
性能考虑
stats库在设计时就考虑了性能因素:
- 使用原子操作来更新计数器,避免锁竞争
- 内存占用极小,只保留必要的统计信息
- 计算平均响应时间等指标是在请求时进行的,不影响请求处理性能
总结
stats库是一个简单但功能强大的Go语言中间件,可以轻松集成到任何Web应用中,帮助你收集基本的性能指标和请求统计信息。它的轻量级设计确保了不会对应用性能产生显著影响,同时提供了足够的信息来监控应用的健康状况。
通过上述示例,你可以快速将stats集成到你的Go Web应用中,并根据需要扩展其功能。