【问题标题】:Golang: implements http server health checking. gocraft/healthGolang:实现 http 服务器健康检查。 gocraft/健康
【发布时间】:2015-06-02 11:47:50
【问题描述】:

我想检查我的服务的健康状况,拥有每个端点的指标。 我的服务调用其他一些服务并接收 Json 代码,我用它制作模板,然后将其发送到 http.ResponseWriter。

我搜索并找到了这个包“gocraft/health”,但我并不真正了解它是如何工作的。

有没有其他方法或包来生成指标,或者我应该只使用“gocraft/health”。

提前谢谢你

【问题讨论】:

    标签: go http-headers metrics endpoints endpointbehavior


    【解决方案1】:

    最后,我选择了“gocraft/health”,一个很棒的库。

    使用示例:

    package main
    
    import (
        "log"
        "net/http"
        "os"
        "time"
    
        "github.com/gocraft/health"
    )
    
    //should be global Var
    var stream = health.NewStream()
    
    func main() {
        // Log to stdout!
        stream.AddSink(&health.WriterSink{os.Stdout})
        // Make sink and add it to stream
        sink := health.NewJsonPollingSink(time.Minute*5, time.Minute*20)
        stream.AddSink(sink)
        // Start the HTTP server! This will expose metrics via a JSON API.
        adr := "127.0.0.1:5001"
        sink.StartServer(adr)
    
        http.HandleFunc("/api/getVastPlayer", vastPlayer)
        log.Println("Listening...")
        panic(http.ListenAndServe(":2001", nil))
    }
    

    根据上述初始化选项,您的指标以 5 分钟为单位汇总。我们将在内存中保留 20 分钟的数据。没有任何东西被持久化到磁盘上。

    您可以创建任意数量的工作

    func vastPlayer(w http.ResponseWriter, r *http.Request) {
      job_1 := stream.NewJob("/api/getVastPlayer")
    
      ...
      ...
    
      if bol {
        job_1.Complete(health.Success)
      } else {
        job_1.Complete(health.Error)
      }
    }
    

    启动应用后,这将通过 JSON API 公开指标。您可以浏览/health 端点(例如127.0.0.1:5001/health)来查看指标。你会得到类似的东西:

    {
      "instance_id": "sd-69536.29342",
      "interval_duration": 86400000000000,
      "aggregations": [
        {
          "interval_start": "2015-06-11T02:00:00+02:00",
          "serial_number": 1340,
          "jobs": {
            "/api/getVastPlayer": {
              "timers": {},
              "events": {},
              "event_errs": {},
              "count": 1328,
              "nanos_sum": 140160794784,
              "nanos_sum_squares": 9.033775178022173E+19,
              "nanos_min": 34507863,
              "nanos_max": 2736850494,
              "count_success": 62,
              "count_validation_error": 1266,
              "count_panic": 0,
              "count_error": 0,
              "count_junk": 0
            },
            "timers": {},
            "events": {},
            "event_errs": {}
          }
        }
      ]
    }
    

    有关更多信息和功能,请查看此链接:

    https://github.com/gocraft/health

    【讨论】:

    • 放完整的例子。
    【解决方案2】:

    如果您因为正在寻找暴露 /health 端点而遇到此问题,那么有一个即将发布的 RFC 用于健康检查:https://github.com/inadarei/rfc-healthcheck

    还有一个 Go 库 health-go 用于公开符合该 RFC 的健康端点:https://github.com/nelkinda/health-go

    例子:

    package main
    
    import (
        "github.com/nelkinda/health-go"
        "net/http"
    )
    
    func main() {
        // 1. Create the health Handler.
        h := health.New(health.Health{Version: "1", ReleaseID: "1.0.0-SNAPSHOT"}) 
    
        // 2. Add the handler to your mux/server.
        http.HandleFunc("/health", h.Handler)
    
        // 3. Start your server.
        http.ListenAndServe(":80", nil)
    }
    

    它是可扩展的,并支持许多内置检查,例如正常运行时间和系统信息。

    免责声明:我是health-go的作者。

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 2021-04-20
      • 2014-10-02
      • 2022-08-04
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      相关资源
      最近更新 更多