跳到内容

社区 FreedomBox/监控服务器

来自维基教科书,开放世界中的开放书籍

每个社区的 FreedomBox 服务器上的监控客户端需要将收集到的指标发送到一个中央位置。这个中央位置,即监控服务器,需要存储发送的数据,将数据可视化以供管理员查看,并在出现异常情况时向他们发出警报。本节介绍服务器上的设置。假设服务器也运行着 FreedomBox。但是,对说明进行一些小的修改,任何运行 Debian GNU/Linux Buster 或更高版本的服务器都可以用作服务器。

设置 Graphite Carbon

[编辑 | 编辑源代码]

Graphite Carbon 服务器负责从各个 FreedomBox 服务器收集数据,并将它们存储在一个名为 Whisper 的时间序列数据库中。运行以下命令来设置 Graphite Carbon。

  1. 安装 Graphite Carbon。
    apt install graphite-carbon
    
  2. 打开防火墙中用于接收来自 FreedomBox 服务器数据的端口。
    firewall-cmd --zone=external --add-port=2003/tcp
    firewall-cmd --zone=external --add-port=2003/tcp --permanent
    
  3. 之后,graphite-carbon 服务器将运行并监听端口 2003。可以使用以下命令检查这一点
    systemctl status carbon-cache
    ss -nlpt | grep carbon-cache
    

设置 Graphite Web

[编辑 | 编辑源代码]

Graphite Web 服务负责将 Graphite Carbon 存储的数据提供给能够可视化数据的消费者,例如 Grafana。运行以下命令来设置 Graphite Web。

  1. 安装 Graphite Web
    apt install graphite-web libapache2-mode-wsgi-py3
    
  2. 为 Graphite Web 使用的 Django 框架生成一个密钥。
    python3 -c 'import random; result = "".join([random.choice("abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)") for i in range(64)]); print(result)'
    
  3. 注意从先前命令中生成的密钥,并将其设置为文件 /etc/graphite/local_settings.py 中的密钥。
    SECRET_KEY="<output from the key generation command>"
    
  4. 为 Graphite Web 创建一个数据库以存储其自身数据。
    sudo --user _graphite graphite-manage migrate --run-syncdb
    chown _graphite:_graphite /var/lib/graphite/graphite.db
    chmod 0600 /var/lib/graphite/graphite.db
    
  5. 为 graphite-web 创建 Apache 配置,并开始提供服务。
    cat << EOF > /etc/apache2/sites-available/graphite-web.conf
    Listen 8080
    
    <VirtualHost *:8080>
            WSGIDaemonProcess _graphite processes=5 threads=5 display-name='%{GROUP}' inactivity-timeout=120 user=_graphite group=_graphite
            WSGIProcessGroup _graphite
            WSGIImportScript /usr/share/graphite-web/graphite.wsgi process-group=_graphite application-group=%{GLOBAL}
            WSGIScriptAlias / /usr/share/graphite-web/graphite.wsgi
    
            Alias /static/ /usr/share/graphite-web/static/
            <Location "/static/">
                    SetHandler None
            </Location>
    </VirtualHost>
    EOF
    a2ensite graphite-web
    systemctl restart apache2
    

设置 Grafana

[编辑 | 编辑源代码]

Grafana 从 Graphite Web 获取数据并生成漂亮的可视化效果。它还可以配置为在数据中发生特定事件时发出警报。运行以下命令来设置 Grafana。

  1. 从其项目的 Debian 存储库中安装 Grafana。
    apt-get install -y apt-transport-https
    wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
    cat << EOF > /etc/apt/sources.list.d/grafana.list
    deb https://packages.grafana.com/oss/deb stable main
    EOF
    apt update
    apt install grafana
    
  2. 配置 Grafana 以从现有域的子路径提供服务。编辑文件 /etc/grafana/grafana.ini,并确保以下两个指令按如下所示进行配置。
    root_url = https://<domain_name>/monitor/
    serve_from_sub_path = true
    
  3. 配置 Grafana 在每次机器启动时启动,并启动 Grafana。
    systemctl daemon-reload
    systemctl enable grafana-server.service
    systemctl start grafana-server.service
    
  4. 创建 Apache 配置以从子路径代理 Grafana,并开始提供服务。
    cat << EOF > /etc/apache2/conf-available/grafana.conf
    <Location /monitor/>
        ProxyPass https://127.0.0.1:3000/monitor/
    </Location>
    EOF
    a2enconf grafana
    systemctl reload apache2
    
  5. 设置 Grafana 访问凭据。访问 https://<domain_name>/monitor/,并使用以下凭据登录。系统将提示您更改密码。设置一个强密码。
    • 用户名: admin
    • 密码: admin
  6. 为每个将使用监控设置的用户创建用户帐户。在左侧菜单中,转到 服务器管理员用户。单击 新建用户按钮并提供姓名、电子邮件、用户名和密码等详细信息以创建新的用户帐户。
  7. 通过 Graphite Web 将 Grafana 连接到 Graphite Carbon 数据库,我们在之前的部分中配置了它。转到 配置数据源,并选择 Carbon 数据源。在显示的配置对话框中,提供以下详细信息按下 保存并测试。您应该会看到一条消息确认数据源可访问。

为每个社区创建仪表板

[编辑 | 编辑源代码]

在 Grafana 界面中,您需要为每个您管理的社区创建仪表板。以下说明概述了如何执行此操作

  1. 登录 Grafana 界面。
  2. 在菜单中,选择 创建仪表板。将创建仪表板,并显示提示以添加新的面板。选择 图表
  3. 将创建新的仪表板,其中包含一个简单的图表。
  4. 单击保存图标保存仪表板。在保存对话框中,根据创建仪表板的社区提供仪表板的名称。单击 保存
  5. 要开始在面板中显示正确的数据,请单击 面板标题并选择 编辑。在 指标选项卡中,单击 选择指标下拉菜单。您应该会看到在 collectd 中配置的社区分配的域的名称。然后选择一个指标,例如 cpu-0,然后选择 cpu-user。您应该开始在图表中看到指标的绘图。保存仪表板。

要监控的参数

[编辑 | 编辑源代码]

建议您根据自己的喜好创建仪表板,但至少监控每个社区的以下参数

  • CPU
    • 系列:<community> • * • cpu-user
    • 函数:averageSeries() • alias(用户)
    • 系列:<community> • * • cpu-nice
    • 函数:averageSeries() • alias(正常)
    • 系列:<community> • * • cpu-system
    • 函数:averageSeries() • alias(系统)
    • 系列:<community> • * • cpu-wait
    • 函数:averageSeries() • alias(等待)
  • 内存
    • 系列:<community> • memory • percent-used
    • 函数:alias(% 使用)
  • 负载
    • 系列:<community> • load • load • shorterm
    • 函数:alias(5 分钟)
    • 系列:<community> • load • load • midterm
    • 函数:alias(10 分钟)
    • 系列:<community> • load • load • longterm
    • 函数:alias(15 分钟)
  • 磁盘
    • 系列:<community> • <disk> • disk_ops • read
    • 函数:alias(读取操作)
    • 系列:<community> • <disk> • disk_ops • write
    • 函数:alias(写入操作)
    • 系列:<community> • <disk> • disk_octets • read
    • 函数:alias(读取字节)
    • 系列:<community> • <disk> • disk_octets • write
    • 函数:alias(写入字节)
  • 磁盘 I/O 时间
    • 系列:<community> • <disk> • pending_operations
    • 函数:alias(挂起操作)
    • 系列:<community> • <disk> • disk_io_time • io_time
    • 函数:alias(I/O 时间)
    • 系列:<community> • <disk> • disk_io_time • weighted_io_time
    • 函数:alias(加权 I/O 时间)
  • <mountpoint> 分区(对于每个分区)
    • 系列:<community> • df-<mountpoint> • percent_bytes-used
    • 函数:alias(使用)
    • 系列:<community> • df-<mountpoint> • percent_bytes-reserved
    • 函数:alias(保留)
  • <LAN/WAN> 网络带宽(对于每个接口)
    • 系列:<community> • interface-<interface> • if_octets • rx
    • 函数:alias(接收)
    • 系列:<community> • interface-<interface> • if_octets • tx
    • 函数:alias(传输)
  • 跟踪连接
    • 系列:<community> • conntrack • conntrack
    • 函数:alias(跟踪的连接)
  • Wi-Fi 接入点
    • alias(sumSeries(isNonNull(<community>.ping.ping-10_42_0_[1-9][0-9])), 'Wi-Fi 接入点')
  • 互联网上行链路
    • alias(isNonNull(<community>.ping.ping-10_42_0_4), '互联网路由器')
    • alias(isNonNull(<community>.ping.ping-10_42_0_5), 'PTP 链路 - 路由器 A')
    • alias(isNonNull(<community>.ping.ping-10_42_0_6), 'PTP 链路 - 路由器 B')
  • 互联网 Ping
    • 系列:<community> • ping • ping-1_1_1_1
    • 函数:alias(互联网 Ping)
  • 进程
    • 系列:<community> • processes • ps_state-running
    • 函数:alias(正在运行)
    • 系列:<community> • processes • ps_state-sleeping
    • 函数:alias(休眠)
    • 系列:<community> • processes • ps_state-paging
    • 函数:alias(分页)
    • 系列:<community> • processes • ps_state-blocked
    • 函数:alias(阻塞)
    • 系列:<community> • processes • ps_state-zombies
    • 函数:alias(僵尸进程)
    • 系列:<community> • processes • ps_state-stopped
    • 函数:alias(已停止)
  • 正常运行时间
    • 系列:<community> • uptime • uptime
    • 函数:alias(自重启以来的时间)
  • 用户
    • 系列:<community> • users • users
    • 函数:alias(已登录用户)
  • collectd 队列
    • 系列:<community> • collectd-cache • cache_size
    • 函数:alias(缓存大小)
    • 系列:<community> • collectd-write_queue • derive-dropped
    • 函数:alias(已放弃的指标)
    • 系列:<community> • collectd-write_queue • queue_length
    • 函数:alias(队列长度)
华夏公益教科书