我尝试创建了一个可在golang Echo中使用的状态处理程序
我正在寻找一个可以查看 Golang 性能的库,我找到了一个名为 golang-stats-api-handler 的包。
尝试使用golang-stats-api-handler
首先,从安装开始。
$ go get -u github.com/fukata/golang-stats-api-handler
这是使用net/http库编写的代码。
package main
import (
"github.com/fukata/golang-stats-api-handler"
"net/http"
)
func main() {
http.HandleFunc("/stats", stats_api.Handler)
http.ListenAndServe(":8000", nil)
}
当您访问localhost:8000/stats,将会显示如下内容。
$ curl -i localhost:8000/stats
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Date: Thu, 14 Dec 2017 13:43:20 GMT
Content-Length: 520
{
"time": 1513259000865514903,
"go_version": "go1.8.3",
"go_os": "darwin",
"go_arch": "amd64",
"cpu_num": 4,
"goroutine_num": 4,
"gomaxprocs": 4,
"cgo_call_num": 1,
"memory_alloc": 383784,
"memory_total_alloc": 383784,
"memory_sys": 3084288,
"memory_lookups": 15,
"memory_mallocs": 5071,
"memory_frees": 140,
"memory_stack": 327680,
"heap_alloc": 383784,
"heap_sys": 1769472,
"heap_idle": 950272,
"heap_inuse": 819200,
"heap_released": 917504,
"heap_objects": 4931,
"gc_next": 4473924,
"gc_last": 0,
"gc_num": 0,
"gc_per_second": 0,
"gc_pause_per_second": 0,
"gc_pause": []
}
我能够获取内存等信息。只需添加API即可轻松使用。虽然这个库已经足够易用,但如果要将其集成到echo等框架中,由于Handler是框架专用的,所以不能直接使用。
实现一个用来查询统计信息的API,以便通过echo来确认。
那么,我们尝试为echo添加用于统计检查的API。
package main
import (
"net/http"
"github.com/fukata/golang-stats-api-handler"
"github.com/labstack/echo"
)
func main() {
e := echo.New()
e.GET("/hello", hello)
e.GET("/stats", stats_api.Handler)
e.Start(":8000")
}
func hello() echo.HandlerFunc {
return func(c echo.Context) error {
return c.String(http.StatusOK, "Hello World!")
}
}
如果按照现在的方式进行执行的话
$ go run main.go
# command-line-arguments
./main.go:12: cannot use stats_api.Handler (type func(http.ResponseWriter, *http.Request)) as type echo.HandlerFunc in argument to e.GET
由于对于该操作不能执行,因此我将按照以下方式进行改写。
package main
import (
"log"
"net/http"
"github.com/fukata/golang-stats-api-handler"
"github.com/labstack/echo"
)
func main() {
go func() {
http.HandlerFunc("/stats", stats_api.Handler)
log.Fatal(http.ListenAndServe(":8080", nil))
}()
e := echo.New()
e.GET("/hello", hello)
e.Start(":8000")
}
func hello() echo.HandlerFunc {
return func(c echo.Context) error {
return c.String(http.StatusOK, "Hello World!")
}
}
只要运行这个代码,您就能够获得以下结果。
$ go run main.go
$ curl -i localhost:8080/stats
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Date: Thu, 14 Dec 2017 13:43:20 GMT
Content-Length: 520
{
"time": 1513259000865514903,
"go_version": "go1.8.3",
"go_os": "darwin",
"go_arch": "amd64",
"cpu_num": 4,
"goroutine_num": 4,
"gomaxprocs": 4,
"cgo_call_num": 1,
"memory_alloc": 383784,
"memory_total_alloc": 383784,
"memory_sys": 3084288,
"memory_lookups": 15,
"memory_mallocs": 5071,
"memory_frees": 140,
"memory_stack": 327680,
"heap_alloc": 383784,
"heap_sys": 1769472,
"heap_idle": 950272,
"heap_inuse": 819200,
"heap_released": 917504,
"heap_objects": 4931,
"gc_next": 4473924,
"gc_last": 0,
"gc_num": 0,
"gc_per_second": 0,
"gc_pause_per_second": 0,
"gc_pause": []
}
在这里,我已经成功地通过使用框架提供的API获取了有关内存等信息。然而,考虑到使用goroutine可能会有些麻烦,所以我尝试将适用于echo的处理程序封装成了一个库。
实现了适用于echo的Handler的库。
我在Github上创建了一个用于处理程序的包。
首先,安装。
go get -u github.com/y-ogura/stats-handler
将其写入代码后,会变成以下形式。
package main
import (
"net/http"
"github.com/labstack/echo"
"github.com/y-ogura/stats-handler"
)
func main() {
e := echo.New()
e.GET("/hello", hello())
e.GET("/stats", stats_handler.EchoStatsHandler)
e.Start(":8000")
}
func hello() echo.HandlerFunc {
return func(c echo.Context) error {
return c.String(http.StatusOK, "Hello World!")
}
}
代码的外观也稍微简洁了一些。
也不需要额外使用端口。
可以顺利获取执行结果。
$ go run main.go
$ curl -i localhost:8000/stats
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Date: Thu, 14 Dec 2017 13:43:20 GMT
Content-Length: 520
{
"time": 1513259000865514903,
"go_version": "go1.8.3",
"go_os": "darwin",
"go_arch": "amd64",
"cpu_num": 4,
"goroutine_num": 4,
"gomaxprocs": 4,
"cgo_call_num": 1,
"memory_alloc": 383784,
"memory_total_alloc": 383784,
"memory_sys": 3084288,
"memory_lookups": 15,
"memory_mallocs": 5071,
"memory_frees": 140,
"memory_stack": 327680,
"heap_alloc": 383784,
"heap_sys": 1769472,
"heap_idle": 950272,
"heap_inuse": 819200,
"heap_released": 917504,
"heap_objects": 4931,
"gc_next": 4473924,
"gc_last": 0,
"gc_num": 0,
"gc_per_second": 0,
"gc_pause_per_second": 0,
"gc_pause": []
}
最后
通过使用这种框架,我们成功地使用了golang-stats-api-handler。由于我们经常需要在一些小的场合下进行确认,所以我们一直都在使用golang-stats-api-handler,它可以很方便地提供额外的API进行确认。平时我们使用goa开发,所以计划也会制作goa专用的Handler。关于性能检查方面,我对知识还比较匮乏,如果有更好的方法或者了解好工具的朋友,请留下评论等待指导。