猿问

对普罗米修斯的理解

我想尝试使用Prometheus的简单示例。

  1. 我已经下载了服务器二进制文件

  2. 我已经开始简单的代码,但几乎没有修改

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 应用程序中进行监控?


九州编程
浏览 74回答 1
1回答

SMILET

默认处理程序promhttp.Handler用于报告指标。(从所有注册的处理程序中收集并根据要求报告)。不幸的是,它不是一个通用的 http 中间件,可以为您提供开箱即用的任何指标。我已经看到许多 go 的 web 框架都有某种社区 prometheus 中间件 ( gin's ),它们提供开箱即用的指标(延迟、响应代码、请求计数等)。go prometheus 客户端库包含如何向应用程序添加指标的示例。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 个黄金信号:这些都是流量 - 吞吐量 - 计数/时间延迟 - 分布/直方图错误 - HTTP 响应代码/显式错误计数饱和 - 资源队列,即如果有一个 goroutine 池,则在给定时间有多少 goroutines 处于活动状态在我的经验中,了解应用程序和数据库之间的所有交互(即应用于数据库的 4 个黄金信号)也很有帮助:从应用程序调用数据库的次数通话延迟为确定可用性(成功/总计)而进行的调用的结果(错误/成功)数据库驱动程序可用的饱和度 
随时随地看视频慕课网APP

相关分类

Go
我要回答