为了账号安全,请及时绑定邮箱和手机立即绑定

对普罗米修斯的理解

对普罗米修斯的理解

Go
九州编程 2023-03-29 17:16:35
我想尝试使用Prometheus的简单示例。我已经下载了服务器二进制文件我已经开始简单的代码,但几乎没有修改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)    })}问题:我假设 Prometheus 是监控工具,我想单独监控metrics端点/test/{id}。promhttp.Handler()通过创建多个处理程序并用作中间件,我是否正确地理解了这个想法?除了请求的数量和延迟之外,还有什么可以在带有数据库的简单 Web 应用程序中进行监控?
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

默认处理程序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 个黄金信号)也很有帮助:

  • 从应用程序调用数据库的次数

  • 通话延迟

  • 为确定可用性(成功/总计)而进行的调用的结果(错误/成功)

  • 数据库驱动程序可用的饱和度 


查看完整回答
反对 回复 2023-03-29
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信