社区 FreedomBox/监控服务器
外观
每个社区的 FreedomBox 服务器上的监控客户端需要将收集到的指标发送到一个中央位置。这个中央位置,即监控服务器,需要存储发送的数据,将数据可视化以供管理员查看,并在出现异常情况时向他们发出警报。本节介绍服务器上的设置。假设服务器也运行着 FreedomBox。但是,对说明进行一些小的修改,任何运行 Debian GNU/Linux Buster 或更高版本的服务器都可以用作服务器。
Graphite Carbon 服务器负责从各个 FreedomBox 服务器收集数据,并将它们存储在一个名为 Whisper 的时间序列数据库中。运行以下命令来设置 Graphite Carbon。
- 安装 Graphite Carbon。
apt install graphite-carbon
- 打开防火墙中用于接收来自 FreedomBox 服务器数据的端口。
firewall-cmd --zone=external --add-port=2003/tcp firewall-cmd --zone=external --add-port=2003/tcp --permanent
- 之后,graphite-carbon 服务器将运行并监听端口 2003。可以使用以下命令检查这一点
systemctl status carbon-cache ss -nlpt | grep carbon-cache
Graphite Web 服务负责将 Graphite Carbon 存储的数据提供给能够可视化数据的消费者,例如 Grafana。运行以下命令来设置 Graphite Web。
- 安装 Graphite Web
apt install graphite-web libapache2-mode-wsgi-py3
- 为 Graphite Web 使用的 Django 框架生成一个密钥。
python3 -c 'import random; result = "".join([random.choice("abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)") for i in range(64)]); print(result)'
- 注意从先前命令中生成的密钥,并将其设置为文件 /etc/graphite/local_settings.py 中的密钥。
SECRET_KEY="<output from the key generation command>"
- 为 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
- 为 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 从 Graphite Web 获取数据并生成漂亮的可视化效果。它还可以配置为在数据中发生特定事件时发出警报。运行以下命令来设置 Grafana。
- 从其项目的 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
- 配置 Grafana 以从现有域的子路径提供服务。编辑文件 /etc/grafana/grafana.ini,并确保以下两个指令按如下所示进行配置。
root_url = https://<domain_name>/monitor/ serve_from_sub_path = true
- 配置 Grafana 在每次机器启动时启动,并启动 Grafana。
systemctl daemon-reload systemctl enable grafana-server.service systemctl start grafana-server.service
- 创建 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
- 设置 Grafana 访问凭据。访问 https://<domain_name>/monitor/,并使用以下凭据登录。系统将提示您更改密码。设置一个强密码。
- 用户名: admin
- 密码: admin
- 为每个将使用监控设置的用户创建用户帐户。在左侧菜单中,转到 服务器管理员,用户。单击 新建用户按钮并提供姓名、电子邮件、用户名和密码等详细信息以创建新的用户帐户。
- 通过 Graphite Web 将 Grafana 连接到 Graphite Carbon 数据库,我们在之前的部分中配置了它。转到 配置,数据源,并选择 Carbon 数据源。在显示的配置对话框中,提供以下详细信息
- 名称: Carbon(或您选择的任何名称)
- URL: https://127.0.0.1:8080
- 访问: 服务器
- 版本: 1.1
在 Grafana 界面中,您需要为每个您管理的社区创建仪表板。以下说明概述了如何执行此操作
- 登录 Grafana 界面。
- 在菜单中,选择 创建,仪表板。将创建仪表板,并显示提示以添加新的面板。选择 图表。
- 将创建新的仪表板,其中包含一个简单的图表。
- 单击保存图标保存仪表板。在保存对话框中,根据创建仪表板的社区提供仪表板的名称。单击 保存。
- 要开始在面板中显示正确的数据,请单击 面板标题并选择 编辑。在 指标选项卡中,单击 选择指标下拉菜单。您应该会看到在 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(队列长度)