构建监控系统:Prometheus和Grafana监控SimpleBank
在当今的软件开发和运维中,监控系统起着至关重要的作用。它可以帮助我们实时了解服务和基础设施的运行状况,及时发现并解决潜在的问题。本文将介绍如何使用Prometheus和Grafana构建一个监控系统,对SimpleBank进行监控。
1. 直方图的使用
直方图是一种用于对观测值进行采样,并根据类型、时间等可配置的区间进行分类的工具。以下是一些可以用直方图表示的指标示例:
- 请求延迟
- I/O延迟
- 每个响应的字节数
2. 监控指标的推荐实践
- 数据收集 :尽可能多地对服务和基础设施进行检测,以收集更多的数据。因为数据一旦错过就无法再回溯收集,但可以利用之前收集的数据。
- 数据展示 :在展示数据、创建仪表盘和设置警报时,要循序渐进,避免一次性展示过多信息,导致难以分析。可以为每个服务创建多个详细的仪表盘,但保留一个包含最重要信息的顶级仪表盘,以便快速判断服务是否正常运行。
- 关注关键指标 :在表示指标时,应关注最重要的指标,如响应时间、错误率和流量。这些指标是可观测性能力的基础。同时,要根据不同的用例关注合适的百分位数,如99%、95%、75%等,具体取决于业务需求。
- 使用标签 :尽可能使用标签为指标提供上下文信息,例如环境(生产、预发布、QA)和用户ID。通过对指标进行标签化,可以对其进行分组,从而获得更多的洞察。
- 指标命名规范 :在命名指标时,要遵循一定的标准,保持跨服务的命名方案一致。一种可行的命名方式是使用服务名称、方法和要收集的指标类型,例如:
- orders_service.sell_shares.count
- orders_service.sell_shares.success
- fees_service.charge_fee.failure
- account_transactions_service.request_reservation.max
- gateway.sell_shares.avg
- market_service.place_order.95percentile
3. 使用Prometheus和Grafana监控SimpleBank
为了对SimpleBank进行监控,我们需要将从服务和基础设施收集的指标发送到一个能够聚合和展示这些指标的系统中,并利用这些指标提供警报功能。这里我们将使用Prometheus进行指标收集,使用Grafana进行指标展示。
-
Prometheus
:是一个开源的系统监控和警报工具包,最初由SoundCloud开发,现在是一个独立的开源项目,不依赖于任何公司进行维护。
-
Grafana
:是一个可以在多个指标数据源(如Graphite、InfluxDB和Prometheus)之上构建仪表盘的工具。
我们将使用Docker进行所有的设置。之前已经为服务添加了通过StatsD发出指标的能力,现在我们将保持这些服务不变,添加一些组件将StatsD格式的指标转换为Prometheus使用的格式,并添加一个已经配置好向Prometheus发送指标的RabbitMQ容器。
以下是构建监控系统所需的容器:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(Service):::process -->|Metrics| B(StatsD server):::process
B -->|Metrics| C(StatsD exporter):::process
C -->|Metrics| D(Prometheus):::process
D -->|Metrics| E(Grafana):::process
F(RabbitMQ):::process -->|Metrics| D
4. 搭建指标收集基础设施
4.1 添加组件到Docker Compose文件
以下是
docker-compose.yml
文件的部分内容,其中包含了与监控相关的容器配置:
rabbitmq:
container_name: simplebank-rabbitmq
image: deadtrickster/rabbitmq_prometheus
ports:
- "5673:5672"
- "15673:15672"
redis:
container_name: simplebank-redis
image: redis
ports:
- "6380:6379"
statsd_exporter:
image: prom/statsd-exporter
command: "-statsd.mapping-config=/tmp/statsd_mapping.conf"
ports:
- "9102:9102"
- "9125:9125/udp"
volumes:
- "./metrics/statsd_mapping.conf:/tmp/statsd_mapping.conf"
prometheus:
image: prom/prometheus
command: "--config.file=/tmp/prometheus.yml --web.listen-address '0.0.0.0:9090'"
ports:
- "9090:9090"
volumes:
- "./metrics/prometheus.yml:/tmp/prometheus.yml"
statsd:
image: dockerana/statsd
ports:
- "8125:8125/udp"
- "8126:8126"
volumes:
- "./metrics/statsd_config.js:/src/statsd/config.js"
grafana:
image: grafana/grafana
ports:
- "3900:3000"
- RabbitMQ :作为事件队列,使用的镜像已经以Prometheus格式发出指标,可以直接连接。
- StatsD Exporter :获取发送到StatsD服务器的指标,并将其转换为Prometheus格式,以便Prometheus后续获取。
- Prometheus :使用官方镜像,通过自定义配置文件进行启动。
- StatsD :设置StatsD服务器,收集服务发送的指标。
- Grafana :使用官方镜像,提供收集指标的UI界面。
4.2 配置StatsD Exporter
参与下单功能的服务会以StatsD格式发出指标,以下是这些服务及其发出的指标:
| 服务 | 指标 |
| — | — |
| 账户交易 | request_reservation |
| 费用 | charge_fee |
| 网关 | health, sell_shares |
| 市场 | request_reservation, place_order_stock_exchange |
| 订单 | sell_shares, request_reservation, place_order |
为了将StatsD指标映射到Prometheus,需要创建一个配置文件
statsd_mapping.conf
,示例如下:
simplebank-demo.account-transactions.request_reservation
name="request_reservation"
app="account-transactions"
job="simplebank-demo"
simplebank-demo.fees.charge_fee
name="charge_fee"
app="fees"
job="simplebank-demo"
simplebank-demo.gateway.health
name="health"
app="gateway"
job="simplebank-demo"
simplebank-demo.gateway.sell_shares
name="sell_shares"
app="gateway"
job="simplebank-demo"
simplebank-demo.market.request_reservation
name="request_reservation"
app="market"
job="simplebank-demo"
simplebank-demo.market.place_order_stock_exchange
name="place_order_stock_exchange"
app="market"
job="simplebank-demo"
simplebank-demo.orders.sell_shares
name="sell_shares"
app="orders"
job="simplebank-demo"
simplebank-demo.orders.request_reservation
name="request_reservation"
app="orders"
job="simplebank-demo"
simplebank-demo.orders.place_order
name="place_order"
app="orders"
job="simplebank-demo"
如果不进行映射,指标仍然可以被收集,但收集方式会不太方便。
4.3 配置Prometheus
配置Prometheus以从StatsD Exporter和RabbitMQ获取数据,以下是
prometheus.yml
文件的示例:
global:
scrape_interval: 5s
evaluation_interval: 10s
external_labels:
monitor: 'simplebank-demo'
alerting:
alertmanagers:
- static_configs:
- targets:
scrape_configs:
- job_name: 'statsd_exporter'
static_configs:
- targets: ['statsd-exporter:9102']
labels:
exporter: 'statsd'
metrics_path: '/metrics'
- job_name: 'rabbitmq'
static_configs:
- targets: ['rabbitmq:15672']
labels:
exporter: 'rabbitmq'
metrics_path: '/api/metrics'
4.4 设置Grafana
为了在Grafana中接收指标,需要设置一个数据源。首先,使用Docker Compose启动应用程序和基础设施:
chapter-11$ docker stop $(docker ps | grep simplebank | awk '{print $1}')
chapter-11$ docker rm $(docker ps -a | grep simplebank | awk '{print $1}')
chapter-11$ docker-compose up --build --remove-orphans
启动后,可以通过端口3900访问Grafana的登录界面,使用默认的用户名和密码(均为admin)登录。登录后,选择“Add Data Source”,选择Prometheus作为类型,并插入运行中的Prometheus实例的URL(如
http://prometheus:9090
),点击“Save & Test”按钮测试数据源状态。
通过以上步骤,我们就完成了使用Prometheus和Grafana对SimpleBank进行监控的基础设施搭建。后续我们将进一步介绍如何收集RabbitMQ的基础设施指标以及对SimpleBank下单功能相关服务的指标进行监控。
构建监控系统:Prometheus和Grafana监控SimpleBank
5. 收集基础设施指标 —— RabbitMQ
为了设置监控RabbitMQ的仪表盘,我们可以使用一个JSON配置文件,这是一种方便且易于共享仪表盘的方式。在源代码仓库的
grafana
文件夹中,有一个
RabbitMQ Metrics.json
文件,其中包含了仪表盘布局和要收集的指标的配置。
以下是在Grafana中导入该仪表盘的步骤:
1. 启动Grafana后,点击Grafana的logo,会弹出一个菜单。
2. 将鼠标悬停在“Dashboards”上,会出现“Import”选项,点击该选项。
3. 此时会弹出一个对话框,你可以选择在文本框中粘贴JSON内容,或者上传
RabbitMQ Metrics.json
文件。
4. 在使用导入的仪表盘之前,需要配置为其提供数据的数据源。这里我们使用之前配置好的SimpleBank数据源。
导入并配置好数据源后,RabbitMQ仪表盘就可以正常运行了。该仪表盘会显示服务器状态的监控信息,表明服务器是处于运行还是停止状态,同时还会展示交换机、通道、消费者、连接、队列、每个主机的消息数以及每个队列的消息数等相关图表。你可以将鼠标悬停在任何图表上,查看某个时间点的指标详细信息。点击图表的标题,会弹出一个上下文菜单,你可以通过该菜单对图表进行编辑、查看、复制或删除等操作。
6. 对SimpleBank下单功能进行指标监测
现在服务和监控基础设施(Prometheus和Grafana)都已正常运行,接下来我们要收集表1中描述的指标。
| 服务 | 指标 |
|---|---|
| 账户交易 | request_reservation |
| 费用 | charge_fee |
| 网关 | health, sell_shares |
| 市场 | request_reservation, place_order_stock_exchange |
| 订单 | sell_shares, request_reservation, place_order |
我们可以通过加载一个以JSON格式导出的仪表盘来实现,该文件可以在源代码目录的
grafana
文件夹中找到(
Place Order.json
)。加载步骤与之前导入RabbitMQ仪表盘的步骤相同。
加载后的仪表盘会收集时间指标,并显示每个指标的0.5、0.9和0.99分位数。在仪表盘的右上角,有手动刷新按钮以及显示指标的时间段选择区域。点击“Last 5 Minutes”标签,你可以选择其他时间段来显示指标,你可以从预设的快速范围值中选择,也可以自定义时间段,从而在任何你需要的范围内显示存储的指标。
下面我们以“Market | Place Order Stock Exchange”面板为例,详细介绍如何配置特定指标的显示:
1. 点击面板标题,然后选择“Edit”选项,会打开编辑界面。
2. 编辑界面有一组标签页,其中高亮显示的是“Metrics”标签页,你可以在该标签页中添加和编辑要显示的指标。在这个例子中,我们只收集了一个指标
place_order_stock_exchange_timer
,该指标表示市场服务向证券交易所下单所花费的时间。
3. 指标的默认显示包含应用名称、导出作业和分位数等元数据。为了改变图例的显示方式,你可以设置“Legend Format”。例如,你可以设置名称并使用
{{quantile}}
块,这样在图表图例和垂直红线旁边的悬浮窗口中都会显示分位数(当你将鼠标在收集的指标上移动时,红线就像一个光标)。
4. 在你的仪表盘中,会显示每个分位数的最小值、最大值、平均值和当前值。
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(Load Place Order.json):::process --> B(Configure Data Source):::process
B --> C(Display Metrics):::process
C --> D(Edit Panel):::process
D --> E(Set Legend Format):::process
D --> F(Show Min, Max, Avg, Current):::process
通过以上步骤,我们可以全面地监控SimpleBank的下单功能,及时发现潜在问题并进行处理。利用Prometheus和Grafana构建的监控系统,能够为我们提供详细的指标信息,帮助我们更好地管理和优化SimpleBank的服务和基础设施。
超级会员免费看
24

被折叠的 条评论
为什么被折叠?



