zoukankan      html  css  js  c++  java
  • healthcheck 用于Go应用易于使用可扩展的健康检查库

    仓库:

    https://github.com/heptiolabs/healthcheck.git

    https://pkg.go.dev/github.com/heptiolabs/healthcheck#section-readme

    healthcheck 实现了一个开箱即用的Kubernetes liveness&& readiness prob 实现,我们可以直接拿来使用。已经包含了tcp,dns,http,Goroutine prob,同时也支持prometheus。

    demo 示例:

    package main
    
    import (
        "fmt"
        "github.com/heptiolabs/healthcheck"
        "github.com/prometheus/client_golang/prometheus"
        "github.com/prometheus/client_golang/prometheus/promhttp"
        "log"
        "net/http"
        "net/http/httptest"
        "net/http/httputil"
        "os"
        "os/signal"
        "strings"
        "syscall"
        "time"
    )
    
    func main() {
        registry := prometheus.NewRegistry()
        // Create a metrics-exposing Handler for the Prometheus registry
        // The healthcheck related metrics will be prefixed with the provided namespace
        health := healthcheck.NewMetricsHandler(registry, "example")
    
        // Add a readiness check against the health of an upstream HTTP dependency
        upstreamURL := "https://www.cnblogs.com/wangjq19920210"
    
        health.AddReadinessCheck("upstream-dep-http", healthcheck.HTTPGetCheck(upstreamURL, 500*time.Millisecond))
        // Implement a custom check with a 50 millisecond timeout.
        health.AddLivenessCheck("custom-check-with-timeout", healthcheck.Timeout(func() error {
            // Simulate some work that could take a long time
            time.Sleep(time.Millisecond * 100)
            return nil
        }, 500*time.Millisecond))
    
        // Expose the readiness endpoints on a custom path /healthz mixed into
        // our main application mux.
        mux := http.NewServeMux()
        mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
            w.Write([]byte("Hello, world!"))
        })
        mux.HandleFunc("/healthz", health.LiveEndpoint)
        mux.Handle("/metrics", promhttp.HandlerFor(registry, promhttp.HandlerOpts{}))
    
        // Sleep for just a moment to make sure our Async handler had a chance to run
        //time.Sleep(500 * time.Millisecond)
        go http.ListenAndServe("0.0.0.0:9402", mux)
    
        // Make a sample request to the /healthz endpoint and print the response.
        fmt.Println(dumpRequest(mux, "GET", "/healthz"))
        sigChan := make(chan os.Signal, 1)
        signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
        sig := <-sigChan
        log.Printf("shutting down %v signal received", sig)
    }
    
    func dumpRequest(handler http.Handler, method string, path string) string {
        req, err := http.NewRequest(method, path, nil)
        if err != nil {
            panic(err)
        }
        rr := httptest.NewRecorder()
        handler.ServeHTTP(rr, req)
        dump, err := httputil.DumpResponse(rr.Result(), true)
        if err != nil {
            panic(err)
        }
        return strings.Replace(string(dump), "
    ", "
    ", -1)
    }

    测试结果:

    #curl http://0.0.0.0:9402/metrics
    # HELP example_healthcheck_status Current check status (0 indicates success, 1 indicates failure)
    # TYPE example_healthcheck_status gauge
    example_healthcheck_status{check="custom-check-with-timeout"} 0
    example_healthcheck_status{check="upstream-dep-http"} 0
     
  • 相关阅读:
    ios 数据类型转换 UIImage转换为NSData NSData转换为NSString
    iOS UI 12 block传值
    iOS UI 11 单例
    iOS UI 08 uitableview 自定义cell
    iOS UI 07 uitableviewi3
    iOS UI 07 uitableviewi2
    iOS UI 07 uitableview
    iOS UI 05 传值
    iOS UI 04 轨道和动画
    iOS UI 03 事件和手势
  • 原文地址:https://www.cnblogs.com/wangjq19920210/p/15423824.html
Copyright © 2011-2022 走看看