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
     
  • 相关阅读:
    SpringTask中cron表达式整理记录
    解决idea启动弹窗
    windows上安装kafka
    两种方式实现横向滚动条
    浅谈新的布局方式-flex
    不忘初衷,方得始终 ---总结一年的前端生涯
    javascript深入理解js闭包(转载)
    es6学习笔记--Interator和Generator(以及for-of的用法)
    根据HTML5的新方法 drag & drop 方法实现表格拖拽实例
    HTML5 拖放(Drag 和 Drop)详解与实例(转)
  • 原文地址:https://www.cnblogs.com/wangjq19920210/p/15423824.html
Copyright © 2011-2022 走看看