17、Hyperf 3 微服务系列 - 使用 Prometheus+Grafana 监控服务
hi,我是温新,一名 PHPer
Hyperf 3 微服务代码已上传至 Github:https://github.com/ziruchu/hyperf3-microservice-code
服务上线后,需要知道服务的健康状态、服务资源使用情况、慢查询、业务埋点等情况,通过监控就可以掌握这些情况,以便进行后续优化操作。
本篇文章将使用 Prometheus 和 Grafana 对服务进行监控。
Prometheus 与 Grafana 简单了解
Prometheus (中文名:普罗米修斯)是由 SoundCloud 开发的开源监控报警系统和时序列数据库(TSDB)。它是一个监控采集与数据存储框架(监控服务器端),具体采集什么数据依赖于Exporter(监控客户端)。
Grafana 是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。一般是和一些时间序列数据库进行配合来展示数据的。
一句话了解:Prometheus 是时间序列数据库,它负责提供数据,Grafana 负责对这些数据指标进行可视化展示。
安装 Prometheus
我这里使用 root 用户安装
第一步:安装
使用 docker 进行安装
docker pull prom/prometheus
第二步:添加配置文件
cd /usr/local/src
新建一个 prometheus.yml
文件并添加如下内容:
# 全局配置
global:
# 每15秒向目标采样点拉取数据
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
# 告警管理器(Alertmanager)的配置
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
# 告警规则有哪些
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
# 抓取监控信息的目标,一个 job_name 就是一个目标
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['192.168.31.90:9091']
- job_name: 'hyperf'
# 默认路由是 /metrics
static_configs:
- targets: ['192.168.31.90:9503']
- job_name: 'grafana'
static_configs:
- targets: ['192.168.31.90:3000']
注意点:
1、job_name 监控的目录名称,后续要用到;
2、targets 目标地址和端口,启动容器会指定该地址与端口,进行映射,后续访问就是通过该地址访问;
3、
192.168.31.90:9503
和3000
提前预留给可视化工具使用;
第三步:启动容器
# 9091 端口映射到容器的 9091
docker run -d --name prometheus -p 9091:9090 -v ${PWD}/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
容器启动后,可以通过 http://192.168.31.90:9091/targets
进行访问,如下图:
Hyperf 中使用 Prometheus
当前所在位置:192.168.31.90 中的 note_consumer_user_9502
第一步:安装组件
composer require hyperf/metric
第二步:生成配置文件并修改
1、生成配置文件
php bin/hyperf.php vendor:publish hyperf/metric
2、修改配置文件
<?php
// config\autoload\metric.php
declare(strict_types=1);
use Hyperf\Metric\Adapter\Prometheus\Constants;
return [
'default' => env('METRIC_DRIVER', 'prometheus'),
'use_standalone_process' => env('METRIC_USE_STANDALONE_PROCESS', true),
'enable_default_metric' => env('METRIC_ENABLE_DEFAULT_METRIC', true),
'default_metric_interval' => env('DEFAULT_METRIC_INTERVAL', 5),
'metric' => [
'prometheus' => [
'driver' => Hyperf\Metric\Adapter\Prometheus\MetricFactory::class,
'mode' => Constants::SCRAPE_MODE,
'namespace' => env('APP_NAME', 'skeleton'),
'scrape_host' => env('PROMETHEUS_SCRAPE_HOST', '0.0.0.0'),
// 注意:这里的端口使用前面预留的 9503 端口
'scrape_port' => env('PROMETHEUS_SCRAPE_PORT', '9503'),
'scrape_path' => env('PROMETHEUS_SCRAPE_PATH', '/metrics'),
'push_host' => env('PROMETHEUS_PUSH_HOST', '0.0.0.0'),
'push_port' => env('PROMETHEUS_PUSH_PORT', '9091'),
'push_interval' => env('PROMETHEUS_PUSH_INTERVAL', 5),
],
],
];
2 个注意点:
1、METRIC_DRIVER 的值与和 prometheus.yml 文件中的 job_name 一致;
2、PROMETHEUS_SCRAPE_PORT 是 prometheus.yml 文件中预留的 9503 端口。
第三步:配置中间件
<?php
// config\autoload\middlewares.php
declare(strict_types=1);
return [
'http' => [
\Hyperf\Metric\Middleware\MetricMiddleware::class,
],
];
第四步:添加 metrics 路由
<?php
// config\routes.php
Router::get('/metrics', function () {
$registry = \Hyperf\Utils\ApplicationContext::getContainer()->get(\Prometheus\CollectorRegistry::class);
$render = new \Prometheus\RenderTextFormat();
return $render->render($registry->getMetricFamilySamples());
});
第五步:启动服务并测试
1、服务启动后,查看一下 Prometheus 的情况,发现 Endpoint
已启动,如下图:
2、浏览器中访问一个接口,如 http://192.168.31.90:9502/users/test
接口访问后,访问 http://192.168.31.90:9503/metrics
,搜索 note_consumer_user_9502_http_requests_count
,可以发现刚刚我请求已经被统计,如下:
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="0.005"} 0
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="0.01"} 0
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="0.025"} 0
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="0.05"} 0
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="0.075"} 0
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="0.1"} 0
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="0.25"} 1
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="0.5"} 1
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="0.75"} 1
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="1"} 1
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="2.5"} 1
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="5"} 1
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="7.5"} 1
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="10"} 1
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/test",request_method="GET",le="+Inf"} 1
note_consumer_user_9502_http_requests_count{request_status="200",request_path="/users/test",request_method="GET"} 1
3、http://192.168.31.90:9091/targets 打开 Prometheus 查看情况
可以进行搜索我们的服务,找到请求统计,然后进行查询。
还可以点击 Graph
以图表形式进行查看。
安装 Grafana
第一步:docker 安装 grafana
docker pull grafana/grafana
第二步:启动
mkdir -p /usr/local/software/grafana/data
docker run -d -it --user root -p 3000:3000 --name grafana \
-v /usr/local/software/grafana/data:/var/lib/grafana \
-e "GF_SECURITY_ADMIN_PASSWORD=admin" \
grafana/grafana
容器启动后,可以通过 http://192.168.31.90:3000
进行访问。默认账号密码都是 admin
,输入密码后会要求重置密码。
第三步:Grafana 配置 Prometheus 数据源
我们的目的是要把 Prometheus
中统计的 Hyperf 数据使用 Grafana 给渲染出来。需要 2 个操作来设置:
1、Grafana 配置 Prometheus 数据源;
2、导入 Hyperf 官方提供的默认指标。
导入 Prometheus 数据源
浏览器访问 http://192.168.31.90:3000/
选择面板中 DATA SOURCES
,然后选择 Prometheus
进入,
URL 填写完成后往下拉,选择点击 Save & test
,完成后可以看到如下图提示已经工作:
第四步:导入官方提供的 grafana 指标
Hyperf 官方准备好了一份完整的 Grafana 配置文件,只需要在 grafana 后台中导入即可。
下载 grafana.json
文件:
/usr/local/software/grafana
wget https://cdn.jsdelivr.net/gh/hyperf/hyperf/src/metric/grafana.json
导入步骤如下图,填写完成后,点击 Import
。
导入完成后就可以看到监控画面了,如下图:
第五步:启动 mysql、redis、async queue 监控
Mysql 连接数、Redis 连接数和 Async Queue 默认没有开启,根据需要进行开启。下面以开启 DB 和 Redis 为例:
1、添加监听器进行监控
<?php
// 192.168.31.90
// config\autoload\listeners.php
declare(strict_types=1);
return [
// 需要监控哪一个就注入监听者
\Hyperf\Metric\Listener\DBPoolWatcher::class,
\Hyperf\Metric\Listener\RedisPoolWatcher::class,
];
2、重启消费者
重启就再来看看监控面板:
自定义统计指标
Prometheus 定义了 4 种不同的指标类型 (metric type):Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要),4 种指标类型含义如下:
- 1、Counter:单调递增的计数器,比如请求数;
- 2、Gauge:可增可减的仪表盘,比如可用内存大小,它是波动的;
- 3、histogrm:直方图,它主要用于统计和分析样本的分布情况,比如 95 值;
我们还要了解的有:PromQL。关于它的学习参考 Prometheus 官网。
第一步:添加用于测试的方法
<?php
// note_consumer_user_9502\app\Controller\UserController.php
use Hyperf\Metric\Annotation\Counter;
#[Counter(name:"counter_test")]
#[GetMapping('/users/conutTest')]
public function conutTest()
{
$result['data'] = ['message'=>'this is a test'];
return ResponseTool::success($result['data']);
}
第二步:测试
1、访问 conutTest 方法:
$ curl http://192.168.31.90:9502/users/conutTest
{"code":200,"message":"success","data":{"message":"this is a test"}}
2、浏览器访问 http://192.168.31.90:9503/metrics
并查找该请求
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/conutTest",request_method="GET",le="10"} 2
note_consumer_user_9502_http_requests_bucket{request_status="200",request_path="/users/conutTest",request_method="GET",le="+Inf"} 2
note_consumer_user_9502_http_requests_count{request_status="200",request_path="/users/conutTest",request_method="GET"} 2
note_consumer_user_9502_http_requests_sum{request_status="200",request_path="/users/conutTest",request_method="GET"} 0.089375019073486
第三步:Grafana 平台添加自定义指标的渲染
1、创建一个空面板
2、按照自己的需求进行统计。我这里统计接口请求数据
3、保存配置
点击右上角的 Save
按钮保存。
使用 ab
压力测试,然后观察该面板的变化
ab -n 10000 -c 10 http://192.168.31.90:9502/users/conutTest
再来看看监控的变化,如下图:
到这里,本篇文章结束了,Hyperf 微服务学习篇也结束。
我是温新。