我尝试创建了一个可在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。关于性能检查方面,我对知识还比较匮乏,如果有更好的方法或者了解好工具的朋友,请留下评论等待指导。

广告
将在 10 秒后关闭
bannerAds