内容简介:目前,几乎所有的研发人员每天都在跟API打交道:后端为实现业务不停的生产API,前端为实现产品功能不停的调用API。API已经成为前端与后端、产品与产品、公司与公司之间技术沟通、业务合作的桥梁。微服务中,API几乎是服务与外界的唯一交互渠道,API服务的稳定性、可靠性越来越成为不可忽略的部分。我们需要实时了解API的运行状况(请求次数、延时、失败等),需要通过对历史数据的分析了解哪些API存在瓶颈以便后期优化。所以,为了确保系统良好的提供服务,绝大多数的微服务框架也都集成了API监控组件。本文将为算术运算服
目前,几乎所有的研发人员每天都在跟API打交道:后端为实现业务不停的生产API,前端为实现产品功能不停的调用API。API已经成为前端与后端、产品与产品、公司与公司之间技术沟通、业务合作的桥梁。
微服务中,API几乎是服务与外界的唯一交互渠道,API服务的稳定性、可靠性越来越成为不可忽略的部分。我们需要实时了解API的运行状况(请求次数、延时、失败等),需要通过对历史数据的分析了解哪些API存在瓶颈以便后期优化。所以,为了确保系统良好的提供服务,绝大多数的微服务框架也都集成了API监控组件。
本文将为算术运算服务增加API监控功能: Prometheus
作为监控组件, Grafana
作为可视化工具,两者均通过 docker-compose
部署运行。go-kit已经提供 prometheus
组件( metric/prometheus
),因此集成工作变得非常容易。在开始之前我们需要先了解一下所需的知识点。
Prometheus
Prometheus (中文名称:普罗米修斯)是一套开源的系统监控报警框架。作为新一代的监控框架,Prometheus 具有以下特点:
- 提供强大的多维度数据模型,如Counter、Gauge、Histogram、Summary;
- 强大而灵活的查询语句(PromQL),可方便的实现对时间序列数据的查询、聚合操作;
- 易于管理与高效;
- 提供pull模式、push gateway方式实现时间序列数据的采集;
- 支持多种可视化图形界面:Grafana、Web UI、API clients;
- 报警规则管理、报警检测和报警推送功能。
Grafana
Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。它主要有以下六大特点:
- 展示方式:快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式;
- 数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等;
- 通知提醒:以可视方式定义最重要指标的警报规则,Grafana将不断计算并发送通知,在数据达到阈值时通过Slack、PagerDuty等获得通知;
- 混合展示:在同一图表中混合使用不同的数据源,可以基于每个查询指定数据源,甚至自定义数据源;
- 注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记;
- 过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。
在该示例中,通过配置文件为Prometheus添加作业(job),尤其定时向本示例服务发起HTTP请求监控指标数据(即pull模式)。
实战演练
Step-1:环境准备
由于我的电脑windows安装 docker 一直不成功,我把运行环境切换到ubuntu 18.04下,还是使用Goland开发。
如果已经配置过docker和docker-compose可跳过步骤1、2;
- 按照官方指南安装
docker-ce
。另外,为了提高镜像下载速度,可选择国内镜像修改方式如下:
# 打开(没有会新建)文件 sudo vim /etc/docker/daemon.json # 设置以下内容 { "registry-mirrors": [ "https://registry.docker-cn.com" ] } # 重启服务 sudo service docker restart 复制代码
- 安装docker-compose。官方将安装包放在aws,使用其推荐的curl方式特别慢。我是先到Release页面下载最新版本,复制到
usr/local/bin/docker-compose
;然后设置权限安装成功的。步骤如下:
# 移动或复制文件到指定目录 sudo mv [your download file] /usr/local/bin/docker-compose # 设置权限 sudo chmod +x /usr/local/bin/docker-compose # 检查是否安装成功 docker-compose --version 复制代码
- 下载最新版本Prometheus客户端
go get github.com/prometheus/client_golang/prometheus 复制代码
- 复制目录
arithmetic_rate_limit_demo
,重新命名为arithmetic_monitor_dmeo
;
Step-2:添加指标采集中间件
本示例将基于《go-kit微服务:限流》的代码进行改进,使用go-kit中间件机制为 Service
添加Prometheus监控指标采集功能。在 instrument.go
下增加新的结构类型:
// metricMiddleware 定义监控中间件,嵌入Service // 新增监控指标项:requestCount和requestLatency type metricMiddleware struct { Service requestCount metrics.Counter requestLatency metrics.Histogram } 复制代码
接下来创建为Service封装指标采集的方法 Metric
,采集请求次数和请求延迟两个指标项:
// Metrics 指标采集方法 func Metrics(requestCount metrics.Counter, requestLatency metrics.Histogram) ServiceMiddleware { return func(next Service) Service { return metricMiddleware{ next, requestCount, requestLatency} } } 复制代码
然后跟限流、日志中间件的方式一致,由于嵌入了Service接口,需要依次实现该接口的方法,以Add为例进行说明,其他方法与之类似。
- 每接收一次请求,请求次数每次加1;
- 通过请求结束时间减去请求开始的差值(单位秒)作为请求延时;
func (mw metricMiddleware) Add(a, b int) (ret int) { defer func(beign time.Time) { lvs := []string{"method", "Add"} mw.requestCount.With(lvs...).Add(1) mw.requestLatency.With(lvs...).Observe(time.Since(beign).Seconds()) }(time.Now()) ret = mw.Service.Add(a, b) return ret } 复制代码
Step-3:开放Prometheus指标采集接口
在 transport.go
中新增用于Prometheus轮循拉取监控指标的代码,开放API接口 /metrics
。
r.Path("/metrics").Handler(promhttp.Handler()) 复制代码
Step-4:修改main.go
首先创建指标采集对象:请求次数采集和请求延时采集对象。
fieldKeys := []string{"method"} requestCount := kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{ Namespace: "raysonxin", Subsystem: "arithmetic_service", Name: "request_count", Help: "Number of requests received.", }, fieldKeys) requestLatency := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{ Namespace: "raysonxin", Subsystem: "arithemetic_service", Name: "request_latency", Help: "Total duration of requests in microseconds.", }, fieldKeys) 复制代码
使用 Metrics
方法对Service对象进行封装:
svc = Metrics(requestCount, requestLatency)(svc) 复制代码
由于最后需要使用Postman进行接口测试,这里我将限流器的容量改为了100。
//add ratelimit,refill every second,set capacity 3 ratebucket := rate.NewLimiter(rate.Every(time.Second*1), 100) endpoint = NewTokenBucketLimitterWithBuildIn(ratebucket)(endpoint) 复制代码
至此,代码修改完成,可通过 go build
进行编译,确保没有问题。
Step-5:配置docker镜像
本示例使用Prometheus和Gafana的官方docker镜像(prom/prometheus和grafana/grafana),通过docker-compose搭建环境。
首先为Prometheus创建配置文件(docker/prometheus.yml),创建每隔5秒定时从我们的微服务抓取监控指标数据的Job,命名为raysonxin。该配置文件需要在运行时加载到镜像中。 注意targets设置为算术运算服务的访问地址;yml文件配置信息的缩进。
global: scrape_interval: 15s external_labels: monitor: 'raysonxin-monitor' scrape_configs: - job_name: 'prometheus' scrape_interval: 5s static_configs: - targets: ['localhost:9090'] labels: group: 'local' - job_name: 'raysonxin' scrape_interval: 5s static_configs: - targets: ['192.168.10.113:9000'] labels: group: 'arithmetic' 复制代码
对于Gafana镜像有两项配置需要在yml文件中设置:
GF_SECURITY_ADMIN_PASSWORD
接下来创建docker-compose运行所需的配置文件:docker/docker-compose.yml,内容如下:
version: '2' services: prometheus: image: prom/prometheus ports: - 9090:9090 volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml grafana: image: grafana/grafana ports: - 3000:3000 environment: - GF_SECURITY_ADMIN_PASSWORD=password volumes: - $PWD/extra/grafana_db:/var/lib/grafana grafana/grafana 复制代码
现在就可以使用命令启动docker了。
Step-6:运行
万事俱备只欠东风了。接下来就是依次启动我们的服务、Prometheus和Grafana镜像,然后使用Postman进行测试。
- 启动算术运算服务。
./arithmetic_monitor_demo Http Server start at port:9000 复制代码
- 启动docker。
# 启动docker docker-compose -f docker/docker-compose.yml up -d # 查看运行状态 sudo docker-compose -f docker/docker-compose.yml ps # 停止docker sudo docker-compose -f docker/docker-compose.yml stop 复制代码
通过“查看运行状态”指令看到以下界面,说明Prometheus和Grafana已经开始运行了。
- 使用Postman调用算术运算服务。这里使用Postman的
Runner
功能(界面左上角),首先将算术运算服务的四个请求添加到一个Collection
中;然后创建一个Environment
(界面右上角)命名为env-gokit-article
;然后依次进入Runner
-选择Collection
,按照下图进行设置后,点击按钮Run demo1
开始执行测试。
Step-7:查看监控数据
初次通过浏览器访问 Grafana
需要进行若干配置,才可查看监控数据,比较简单,步骤如下:
- 登录Grafana:通过浏览器访问
localhost:3000
,使用用户名admin
和yml配置的密码password
登录; - 创建数据源:点击
create your first datasource
,选择Prometheus
,配置HTTP.URL
(建议设置为http://[IP]:[port]
,不要使用localhost),最后保存成功。 - 创建Dashboard:点击
create your first dashboard
,选择Graph
,点击Title
下拉菜单中的Edit
,即可进入如下界面(选择Metric选项):
如图所示,在查询输入框输入 raysonxin
即可看到我们采集的四个监控指标项,选择其中一项即可在图表中查看细节(请自行查阅资料进行分析,本文不展开,因为还不懂)。
- raysonxin_arithmetic_service_request_count;
- raysonxin_arithmetic_service_request_latency;
- raysonxin_arithmetic_service_request_latency_count;
- raysonxin_arithmetic_service_request_latency_sum;
总结
今天的示例为运算服务增加基于Prometheus的API监控功能,通过Prometheus(官方docker镜像)采集运算服务的监控指标数据,通过Grafana(官方docker镜像)的Dashboard查看监控指标数据。
由于go-kit本身已经对Prometheus监控组件进行了封装,所以代码编写工作比较省时间,更多的时间在于环境的搭建与测试,当然由于使用docker技术效率已经大大提高。
本文只是流水账似的把我的学习过程记录下来,并没有对其中使用的技术和原理进行深入分析。
本文示例代码可通过我的 github 获取,如果有任何疑问欢迎留言讨论。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
浪潮之巅(下册)
吴军 / 人民邮电出版社 / 2013-6 / 45.00元
《浪潮之巅(第2版)(下册)》不是一本科技产业发展历史集,而是在这个数字时代,一本IT人非读不可,而非IT人也应该阅读的作品。一个企业的发展与崛起,绝非只是空有领导强人即可达成。任何的决策、同期的商业环境,都在都影响着企业的兴衰。《浪潮之巅》不只是一本历史书,除了讲述科技顶尖企业的发展规律,对于华尔街如何左右科技公司,以及金融风暴对科技产业的冲击,也多有着墨。此外,《浪潮之巅》也着力讲述很多尚在普......一起来看看 《浪潮之巅(下册)》 这本书的介绍吧!