Gorse推荐系统指南:监控与报警

1,014 阅读4分钟

Github: Gorse推荐系统指南:监控与报警

对于一个在生产环境中的线上系统来说,“可观测性”极其重要。对在线系统的实时监控可以在大面积影响用户之前发现系统中存在的缺陷或者性能问题。本文将介绍如何对Gorse推荐系统进行日志和指标监控,日志监控主要捕捉系统中产生的异常事件,而指标监控主要观测系统的各项性能。本文只会介绍一些关键内容,完整的配置样例请参考官方演示项目GitRec(可以点击阅读原文跳转)。

日志监控

主流的日志监控方案有ELK和Loki,本文选择了Loki,因为相对ELK更加轻量级。日志的收集和监控流程如下:

  1. Gorse的节点将日志写入到文件中;
  2. Promtail从文件中读取日志推送给Loki;
  3. 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的配置文件localconfig.yamllocal-config.yaml内容如下:

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:

dockercompose.ymldocker-compose.yml部署之后,登录Grafana,添加Loki为数据源:

image.png

最后,导入演示项目GitRec中提供的日志仪表盘模板,即可实时监控推荐系统中的警告、错误和严重日志。

image.png

日志仪表盘会从日志中筛选出警告、错误和严重日志:

  • 警告日志: 此类事件发生影响系统运行结果,但是系统有应对策略。
  • 错误日志: 此类事件发生影响系统正常功能,但是系统依然能够运行。
  • 严重日志: 此类事件发生导致系统无法继续运行。

数据库暂时无法连接、网络暂时超时等日志出现为预期内的现象,如果产生了预期之外的错误日志,欢迎反馈到GitHub的Issues中。

image.png

指标监控

Gorse提供了导出Prometheus指标功能,Prometheus可以通过每个节点的HTTP获取实时监控信息。工作节点的默认HTTP端口为8089、服务节点的默认HTTP端口为8087、主节点的默认HTTP端口为8088。工作节点和服务节点的HTTP端口可以通过命令行选项httpport--http-port设置。

收集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实例,将上述配置文件映射到默认配置文件路径/etc/prometheus/prometheus.yml/etc/prometheus/prometheus.yml

 

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为数据源。

image.png

最后,导入演示项目GitRec中提供的仪表盘模板,即可实时监控数据库、缓存、工作节点、服务节点和主节点各个服务调用的次数和延迟。

image.png 仪表盘的左侧为每十分钟内调用次数,而右侧为99%内的调用延迟。

image.png

总结

本文介绍了用Docker Compose单机部署Gorse时的日志和指标监控方案,分布式部署下的监控搭建会复杂一些。