当前位置: 首页 > 科技观察

Gorilla-Mux框架(Rk-Boot):添加Prometheus监控中间件

时间:2023-03-13 12:36:36 科技观察

介绍通过一个完整的例子,基于gorilla/mux框架为微服务添加Prometheus监控中间件。什么是Prometheus监控拦截器/中间件?监控拦截器记录每个API请求的PrometheusMetrics。我们将使用rk-boot启动gorilla/mux微服务。完整教程请访问以下地址:github.com/rookie-ninj...安装gogetgithub.com/rookie-ninja/rk-boot/mux快速入门1.创建boot.yamlboot.yaml文件描述Mux框架启动信息的来源,rk-boot通过读取boot.yaml来启动GoFrame。为了验证,我们启用了以下选项:commonService:commonService包含一系列通用API。详情prom:普罗米修斯(Prometheus)客户端。普罗米修斯中间件:启动普罗米修斯中间件。---mux:-name:greeter#需要端口:8080#需要enabled:true#需要prom:enabled:true#可选,默认:falsecommonService:enabled:true#可选,默认:falseinterceptors:metricsProm:enabled:true#可选,默认:false2.创建main.go并添加/v1/greeterAPI。//版权所有(c)2021rookie-ninja////此源代码的使用受Apache样式//许可的约束,该许可可在LICENSE文件中找到。packagemainimport("context""fmt""github.com/rookie-ninja/rk-boot""github.com/rookie-ninja/rk-boot/mux""github.com/rookie-ninja/rk-mux/interceptor""net/http")funcmain(){//创建一个新的引导实例。boot:=rkboot.NewBoot()//注册处理程序入口:=rkbootmux.GetMuxEntry("greeter")entry.Router.NewRoute().Methods(http.MethodGet).Path("/v1/greeter").HandlerFunc(Greeter)//引导程序boot.Bootstrap(context.TODO())boot.WaitForShutdownSig(context.TODO())}funcGreeter(writerhttp.ResponseWriter,request*http.Request){rkmuxinter.WriteJson(writer,http.StatusOK,&GreeterResponse{Message:fmt.Sprintf("Hello%s!",request.URL.Query().Get("name")),})}//Response.typeGreeterResponsestruct{Messagestring}3.文件夹结构$tree.├──boot.yaml├──go.mod├──go.sum└──main.go0directories,4files4.启动main.go$gorunmain.go2022-02-09T15:35:02.181+0800INFOboot/mux_entry.go:643BootstrapmuxEntry{"eventId":"a35a0331-4311-4057-a399-526c76f79ca9","entryName":"greeter","entryType":"Mux"}----------------------------------------------------------------------endTime=2022-02-09T15:35:02.181722+08:00startTime=2022-02-09T15:35:02.181528+08:00elapsedNano=193785timezone=CSTids={"eventId":"a35a0331-4311-4057-a399-526c76f79ca9"}app={"appName":"rk","appVersion":"","entryName":"greeter","entryType":"Mux"}env={"arch":"amd64","az":"*","domain":"*","hostname":"lark.local","localIP":"192.168.1.102","os":"darwin","re??alm":"*","re??gion":"*"}payloads={"commonServiceEnabled":true,"commonServicePathPrefix":"/rk/v1/","muxPort":8080,"promEnabled":true,"promPath":"/metrics","promPort":8080}counters={}pairs={}timing={}remoteAddr=localhostoperation=BootstrapresCode=OKeventStatus=EndedEOE5.验证发送请求到CommonService里的/rk/v1/healthyAPI$curl-XGETlocalhost:8080/rk/v1/healthy{"healthy":true}向/v1/greeterAPI发送请求。$curl-XGET"localhost:8080/v1/greeter?name=rk-dev"{"Message":"Hellork-dev!"}访问Prometheus客户端:http://localhost:8080/metrics来监控我们visually在本地进程中已经启动了prometheus监控,剩下的就是如何在一个【漂亮】的网页中查看监控了。市面上的工具很多,我们选择【简单】、【流行】、【免费】,即Prometheus+Grafana。架构图先来看看整个流程是什么样子的。其实原理很简单,就是【劫持】API请求,并记录【时间】、【错误码】等信息。之后让Prometheus服务主动从[createdservice]中拉取数据。最后让Grafana服务从Prometheus拉取数据展示数据表。快速入门1.创建prometheus.yml我们首先创建prometheus.yml配置文件,这样prometheus服务就可以从localhost:8080/metrics拉取数据。在下面的配置中,我们没有指定/metrics,因为prometheus默认会使用/metrics来拉取数据。笔记!我们将目标设置为host.docker.internal:8080而不是localhost:8080,这是因为prometheus在容器中,而我们的服务在本地。这是从容器内访问本地计算机上的端口的便捷方式。解释global:scrape_interval:1s#将抓取间隔设置为1s以进行测试。#一个抓取配置只包含一个要抓取的端点:#这是Prometheus本身。scrape_configs:-job_name:'rk-demo'scrape_interval:1sstatic_configs:-targets:['host.docker.internal:8080']2.启动Prometheus我们使用docker启动。Prometheus默认使用端口9090。$dockerrun-p9090:9090-v//rk-demo/prometheus.yml:/etc/prometheus/prometheus.ymlprom/prometheus3.验证Prometheus,请按照上面的[Verify]启动main.go,并发送一个/rk/v1/healthy请求。然后,我们看一下prometheus服务中的数据。访问:localhost:9090,搜索rk_greeter_resCode,可以看到数据已经在prometheus中了。访问:localhost:9090/targets,我们可以看到prometheus每秒都有一次拉取数据。4.启动GrafanaGrafana默认使用3000端口。$dockerrun-p3000:3000--namegrafanagrafana/grafanaaccess:localhost:3000这时候grafana会让你登录,默认的用户名和密码如下。用户名:admin密码:admin5.在Grafana中添加Prometheus数据源Grafana只是一个WebUI工具。为了看到数据报告,我们告诉Grafana在哪里可以找到Prometheus。选择Prometheus作为数据源。填写Prometheus地址,同上,因为Grafana运行在Docker中,所以我们不用localhost:9090,而是host.docker.internal:9090。6.导入Dashboard我们可以自己编辑GrafanaDashboard,但是,这不是一件容易的事。对于使用rk-boot启动的服务,我们提供默认的[免费]GrafanaDashboard模板。注意这里导入的Dashboard只匹配【按上述逻辑创建的服务】。为什么?因为rk-boot默认会使用rk__xxx作为prometheus的metrics名称。进入Dashboard导入页面,导入15111号Dashboard,定义在:grafana.com/grafana/das...指定Prometheus数据源,就是我们上面配置的Prometheus。开始监控关注!如果请求数太少,会显示为0,请多发几个请求。概念我们已经可以从Grafana获取监控数据了,现在看一下rk-boot中的中间件,添加了什么类型的监控数据。监控拦截器默认会记录下面的监控。监控项数据类型详情elapsedNanoSummaryRPC耗时resCodeCounterRPC返回码计数器errorsCounterRPC错误计数器以上三个监控项分别有如下标签。标签详情entryNameMux条目名称entryTypeMux条目类型领域环境变量:REALM,eg:rkregion环境变量:REGION,eg:beijingaz环境变量:AZ,eg:beijing-1domain环境变量:DOMAIN,eg:prodinstancelocalHostnameappVersionfromAppInfoEntry获取appName从AppInfoEntry获取restMethodHttp方法。例如:GETrestPathHttp路径。例如:/rk/v1/healthytype服务类型。eg:MuxresCode返回码,eg:OK作者:殷东勋链接:https://juejin.cn/post/7062615278911225863来源:稀土掘金版权归作者所有。商业转载请联系作者授权,非商业转载请注明出处。