普罗米修斯的理解

时间:2018-09-06 11:34:31

标签: go monitoring prometheus

我想尝试使用simplePrometheus示例。

  1. 我已经下载了服务器二进制文件
  2. 我已经开始simple code,但修改很少

    var addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.")
    func main() {
        flag.Parse()
        http.Handle("/metrics", promhttp.Handler())
        http.Handle("/test/{id}", myHandler(promhttp.Handler()))
    
        log.Fatal(http.ListenAndServe(*addr, nil))
    }
    
    func myHandler(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            fmt.Fprintf(w, "hello, you've hit %s\n", r.URL.Path)
            next.ServeHTTP(w, r)
        })
    }
    

    问题:

    1. 我假设Prometheus是监视工具,并且我想分别监视端点metrics/test/{id}。通过创建多个处理程序并使用promhttp.Handler()作为中间件,我是否正确地理解了这个想法?
    2. 例如,可以监控请求的数量和等待时间之外的其他内容。具有数据库的简单Web应用程序?

1 个答案:

答案 0 :(得分:2)

要跟踪@David Maze的答案,默认处理程序promhttp.Handler用于报告指标。 (从所有注册的处理程序收集并根据要求进行报告)。

不幸的是,它不是一个通用的http中间件,可以为您提供任何现成的指标。

我已经看到Go的许多Web框架都具有某种社区Prometheus中间件(gin's),这些中间件可以提供现成的指标(等待时间,响应代码,请求计数等)。

go prometheus client library包含如何向您的应用程序添加指标的示例。

var (

    httpRequests = prometheus.NewCounter(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Number of http requests.",
        },
    )
)

func init() {
    // Metrics have to be registered to be exposed:
    prometheus.MustRegister(httpRequests)
}

func myHandler(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        httpRequests.Inc()
        fmt.Fprintf(w, "hello, you've hit %s\n", r.URL.Path)
        next.ServeHTTP(w, r)
    })
}

关于第二个问题:) Google倡导监视4个黄金信号:

https://landing.google.com/sre/book/chapters/monitoring-distributed-systems.html#xref_monitoring_golden-signals

这些是

  • 流量-吞吐量-计数/时间
  • 延迟-分布/直方图
  • 错误-HTTP响应代码/显式错误计数
  • 饱和度-资源队列,即如果有goroutine池,则在给定时间有多少goroutine是活动的

在我的experie8inces中,了解应用程序和数据库之间的所有交互(即应用于数据库的四个黄金信号)也很有帮助: