内容简介:目前,几乎所有的研发人员每天都在跟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 获取,如果有任何疑问欢迎留言讨论。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Iterative Methods for Sparse Linear Systems, Second Edition
Yousef Saad / Society for Industrial and Applied Mathematics / 2003-04-30 / USD 102.00
Tremendous progress has been made in the scientific and engineering disciplines regarding the use of iterative methods for linear systems. The size and complexity of linear and nonlinear systems arisi......一起来看看 《Iterative Methods for Sparse Linear Systems, Second Edition》 这本书的介绍吧!
Base64 编码/解码
Base64 编码/解码
Markdown 在线编辑器
Markdown 在线编辑器