对于一个在生产环境中的线上系统来说,“可观测性”极其重要。对在线系统的实时监控可以在大面积影响用户之前发现系统中存在的缺陷或者性能问题。本文将介绍如何对Gorse推荐系统进行日志和指标监控,日志监控主要捕捉系统中产生的异常事件,而指标监控主要观测系统的各项性能。本文只会介绍一些关键内容,完整的配置样例请参考官方演示项目GitRec(可以点击阅读原文跳转)。
日志监控
主流的日志监控方案有ELK和Loki,本文选择了Loki,因为相对ELK更加轻量级。日志的收集和监控流程如下:
- Gorse的节点将日志写入到文件中;
- Promtail从文件中读取日志推送给Loki;
- Grafana从Loki获取日志展示。
首先,需要在docker-compose.yml中设置各个节点将日志写入到文件中,以及添加Promtail、Loki和Grafana。
version: "3"
services:
worker:
image: zhenghaoz/gorse-worker
restart: unless-stopped
ports:
- 8089:8089
command: >
--master-host master --master-port 8086 --http-host 0.0.0.0 --http-port 8089
--log-path /var/log/gorse/worker.log --cache-path /var/lib/gorse/worker_cache.data
volumes:
- ./var/log/gorse:/var/log/gorse
- ./var/lib/gorse:/var/lib/gorse
server:
image: zhenghaoz/gorse-server
restart: unless-stopped
ports:
- 8087:8087
command: >
--master-host master --master-port 8086 --http-host 0.0.0.0 --http-port 8087
--log-path /var/log/gorse/server.log --cache-path /var/lib/gorse/server_cache.data
volumes:
- ./var/log/gorse:/var/log/gorse
- ./var/lib/gorse:/var/lib/gorse
master:
image: zhenghaoz/gorse-master
restart: unless-stopped
ports:
- 8086:8086
- 8088:8088
command: -c /etc/gorse/config.toml --log-path /var/log/gorse/master.log --cache-path /var/lib/gorse/master_cache.data
volumes:
- ./etc/gorse/config.toml:/etc/gorse/config.toml
- ./var/log/gorse:/var/log/gorse
- ./var/lib/gorse:/var/lib/gorse
grafana:
image: grafana/grafana
restart: unless-stopped
ports:
- 3000:3000
volumes:
- grafana-storage:/var/lib/grafana
loki:
image: grafana/loki
restart: unless-stopped
command: -config.file=/etc/loki/local-config.yaml
ports:
- 3100:3100
volumes:
- ./etc/loki/local-config.yaml:/etc/loki/local-config.yaml
promtail:
image: grafana/promtail
restart: unless-stopped
command: -config.file=/etc/promtail/config.yml
ports:
- 9080:9080
volumes:
- ./var/log/gorse:/var/log/gorse
- ./etc/promtail/config.yml:/etc/promtail/config.yml
# ...
volumes:
grafana-storage:
Loki的配置文件内容如下:
auth_enabled: false
server:
http_listen_port: 3100
ingester:
lifecycler:
address: 127.0.0.1
ring:
kvstore:
store: inmemory
replication_factor: 1
final_sleep: 0s
chunk_idle_period: 5m
chunk_retain_period: 30s
schema_config:
configs:
- from: 2020-05-15
store: boltdb
object_store: filesystem
schema: v11
index:
prefix: index_
period: 168h
storage_config:
boltdb:
directory: /tmp/loki/index
filesystem:
directory: /tmp/loki/chunks
limits_config:
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 168h
Promtail的配置文件如下:
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /var/log/positions.yaml # This location needs to be writeable by Promtail.
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: master
__path__: /var/log/gorse/master.log
- targets:
- localhost
labels:
job: worker
__path__: /var/log/gorse/worker.log
- targets:
- localhost
labels:
job: server
__path__: /var/log/gorse/server.log
pipeline_stages:
- json:
expressions:
level: level
- labels:
level:
将部署之后,登录Grafana,添加Loki为数据源:
最后,导入演示项目GitRec中提供的日志仪表盘模板,即可实时监控推荐系统中的警告、错误和严重日志。
日志仪表盘会从日志中筛选出警告、错误和严重日志:
- 警告日志: 此类事件发生影响系统运行结果,但是系统有应对策略。
- 错误日志: 此类事件发生影响系统正常功能,但是系统依然能够运行。
- 严重日志: 此类事件发生导致系统无法继续运行。
数据库暂时无法连接、网络暂时超时等日志出现为预期内的现象,如果产生了预期之外的错误日志,欢迎反馈到GitHub的Issues中。
指标监控
Gorse提供了导出Prometheus指标功能,Prometheus可以通过每个节点的HTTP获取实时监控信息。工作节点的默认HTTP端口为8089、服务节点的默认HTTP端口为8087、主节点的默认HTTP端口为8088。工作节点和服务节点的HTTP端口可以通过命令行选项设置。
收集Gorse监控指标的Prometheus配置文件如下:
scrape_configs:
- job_name: 'gorse'
scrape_interval: 10s
static_configs:
- targets: ['worker:8089', 'server:8087', 'master:8088']
scrape_interval是拉取频率,targets是获取指标的地址。由于上述配置文件用于Docker Compose部署的推荐系统中,因此使用了主机名而不是IP地址。接着在docker-compose.yml中添加一个Prometheus实例,将上述配置文件映射到默认配置文件路径。
version: "3"
services:
prometheus:
image: prom/prometheus
restart: unless-stopped
ports:
- 9090:9090
volumes:
- ./etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
启动Prometheus之后,在Grafana中添加Prometheus为数据源。
最后,导入演示项目GitRec中提供的仪表盘模板,即可实时监控数据库、缓存、工作节点、服务节点和主节点各个服务调用的次数和延迟。
仪表盘的左侧为每十分钟内调用次数,而右侧为99%内的调用延迟。
总结
本文介绍了用Docker Compose单机部署Gorse时的日志和指标监控方案,分布式部署下的监控搭建会复杂一些。