fnOS Prometheus Exporter 是一个基于 Python 的导出器,用于将 fnOS 系统的指标暴露给 Prometheus。
重要提示:用于获取指标的用户必须是飞牛fnOS的系统管理员,否则将会出现无法获取磁盘等指标的问题。
- 源代码仓库: https://github.com/Timandes/fnos-prometheus-exporter
- 问题追踪: https://github.com/Timandes/fnos-prometheus-exporter/issues
- 将 fnOS 系统指标暴露给 Prometheus
- 支持 Docker 以便于部署
- 可通过环境变量进行配置
- 支持通过 PyPI 使用 uvx 安装
运行 fnOS Prometheus Exporter 的最简单方法是使用 Docker 镜像:
docker run -d \
-e FNOS_HOST=127.0.0.1:5666 \
-e FNOS_USER=your-username \
-e FNOS_PASSWORD=your-password \
-e FNOS_LOG_LEVEL=INFO \
-p 9100:9100 \
ghcr.io/timandes/fnos-prometheus-exporter:latest本项目提供了预配置的Grafana Dashboard,用于可视化fnOS系统指标。
- 在Grafana中,导航到 "Dashboards" → "Import"
- 选择
/dashboards目录下的JSON文件,或复制JSON内容粘贴到导入框 - 配置数据源为你的Prometheus实例
- 点击 "Import" 完成导入
generic-public.json- fnOS系统总览仪表盘
在线查看大盘快照:
https://snapshots.raintank.io/dashboard/snapshot/riPpjTkDQ4KvZAWDaVlBXnHXcRdqzdD9
或者参考以下预览截图:
您也可以使用 Docker Compose 来运行 fnOS Prometheus Exporter。创建一个 docker-compose.yml 文件:
version: '3.8'
services:
fnos-exporter:
image: ghcr.io/timandes/fnos-prometheus-exporter:latest
environment:
- FNOS_HOST=127.0.0.1:5666
- FNOS_USER=your-username
- FNOS_PASSWORD=your-password
- FNOS_LOG_LEVEL=INFO
ports:
- "9100:9100"
restart: unless-stopped然后运行以下命令启动服务:
docker-compose up -d或者,您可以使用 uvx 直接从 PyPI 运行导出器:
uvx fnos-exporter您可以使用命令行参数配置与 fnOS 系统的连接:
uvx fnos-exporter --host your-fnos-host --user your-username --password your-password --port 9100或者使用默认的本地主机地址:
uvx fnos-exporter --user your-username --password your-password| 指标名称 | 类型 | 描述 |
|---|---|---|
| fnos_uptime | Gauge | fnOS 系统的正常运行时间信息(具体子指标取决于系统返回的内容) |
| fnos_disk_* | Gauge/Info | 从Store.list_disks()、ResourceMonitor.disk()和Store.get_disk_smart()方法获取的磁盘相关信息 |
| fnos_store_* | Gauge/Info | 从Store.general()方法获取的存储系统相关信息 |
| fnos_network_* | Gauge/Info | 从Network.list()和ResourceMonitor.network()方法获取的网络接口相关信息 |
这些指标来源于两个不同的fnOS API端点:
Store.list_disks()- 提供磁盘的基本信息(如型号、序列号、大小等)ResourceMonitor.disk()- 提供磁盘的性能信息(如温度、读写状态等)Store.get_disk_smart()- 提供磁盘的SMART状态信息
所有fnos_disk_*指标都使用device_name标签来区分不同的磁盘设备(如"sda"、"nvme0n1"等),这与Linux系统中/dev目录的含义一致。
| 指标名称 | 类型 | 来源API | 描述 |
|---|---|---|---|
| fnos_disk_name | Info | Store.list_disks() | 磁盘设备名称 |
| fnos_disk_size | Gauge | Store.list_disks() | 磁盘总大小(字节) |
| fnos_disk_model_name | Info | Store.list_disks() | 磁盘型号 |
| fnos_disk_serial_number | Info | Store.list_disks() | 磁盘序列号 |
| fnos_disk_type | Info | Store.list_disks() | 磁盘类型(如SSD、HDD) |
| fnos_disk_protocol | Info | Store.list_disks() | 磁盘接口协议(如NVMe、SATA) |
| fnos_disk_temp | Gauge | ResourceMonitor.disk() | 磁盘温度(摄氏度) |
| fnos_disk_standby | Gauge | ResourceMonitor.disk() | 磁盘是否处于待机状态(0=否,1=是) |
| fnos_disk_busy | Gauge | ResourceMonitor.disk() | 磁盘是否处于忙碌状态(0=否,1=是) |
| fnos_disk_read | Gauge | ResourceMonitor.disk() | 磁盘读取操作计数 |
| fnos_disk_write | Gauge | ResourceMonitor.disk() | 磁盘写入操作计数 |
| fnos_disk_smart_status_passed | Gauge | Store.get_disk_smart() | 磁盘SMART状态是否通过检测(1=通过,0=未通过) |
这些指标来源于fnOS的ResourceMonitor.cpu() API端点,用于获取CPU的使用情况、温度等性能指标。
所有fnos_cpu_*指标都使用cpu_name标签来区分不同的CPU实例(如"Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz"等),值来自于CPU的名称信息。
对于多核CPU温度指标,使用core标签来区分不同核心的温度:
cpu_name标签表示CPU的名称core标签表示CPU核心的索引号(如core0、core1等)
| 指标名称 | 类型 | 来源API | 描述 |
|---|---|---|---|
| fnos_cpu_name | Info | ResourceMonitor.cpu() | CPU的名称 |
| fnos_cpu_usage | Gauge | ResourceMonitor.cpu() | CPU使用率百分比 |
| fnos_cpu_temp | Gauge | ResourceMonitor.cpu() | CPU温度(摄氏度),按cpu_name和core拆分 |
这些指标来源于fnOS的Store.general() API端点,用于获取存储系统的通用信息。该API返回包含存储阵列(array)和块设备(block)的详细信息,包括RAID配置、存储池状态、卷信息等。
对于不同类型的存储实体,指标使用不同的标签:
- 对于
array类型实体(如fnos_store_array_*),使用array_name标签来区分不同的存储阵列,值来自于阵列的名称 - 对于其他类型实体(如block、array_md等),使用
entity和type标签来区分:entity标签表示存储实体的索引号(如array0、block0等)type标签表示存储实体的类型(如"array"、"block"、"array_md"、"block_md"、"block_partition"、"block_arr_device"等)
这些指标来源于Store.general()响应中的array数据结构,主要包含RAID阵列信息。
所有fnos_store_array_*指标都使用array_name标签来区分不同的存储阵列,值来自于阵列的名称。
| 指标名称 | 类型 | 来源API | 描述 |
|---|---|---|---|
| fnos_store_array_name | Info | Store.general() | 存储阵列的名称 |
| fnos_store_array_type | Info | Store.general() | 存储阵列的类型(如RAID0、RAID1、RAID5等) |
| fnos_store_array_status | Info | Store.general() | 存储阵列的当前状态 |
| fnos_store_array_size | Gauge | Store.general() | 存储阵列的总大小(字节) |
| fnos_store_array_used | Gauge | Store.general() | 存储阵列已使用的空间(字节) |
| fnos_store_array_free | Gauge | Store.general() | 存储阵列可用的空间(字节) |
| fnos_store_array_fssize | Gauge | Store.general() | 存储阵列的文件系统块大小(字节) |
| fnos_store_array_frsize | Gauge | Store.general() | 存储阵列的文件系统可用块大小(字节) |
| fnos_store_array_health | Info | Store.general() | 存储阵列的健康状态 |
这些指标来源于Store.general()响应中的block数据结构,主要包含块设备信息。
所有fnos_store_block_*指标都使用block_name标签来区分不同的块设备,值来自于块设备的名称。
| 指标名称 | 类型 | 来源API | 描述 |
|---|---|---|---|
| fnos_store_block_name | Info | Store.general() | 块设备的名称 |
| fnos_store_block_size | Gauge | Store.general() | 块设备的总大小(字节) |
| fnos_store_block_type | Info | Store.general() | 块设备的类型(如HDD、SSD等) |
| fnos_store_block_status | Info | Store.general() | 块设备的当前状态 |
| fnos_store_block_model | Info | Store.general() | 块设备的型号 |
| fnos_store_block_serial | Info | Store.general() | 块设备的序列号 |
| fnos_store_block_health | Info | Store.general() | 块设备的健康状态 |
| fnos_store_block_temp | Gauge | Store.general() | 块设备的温度(摄氏度) |
这些指标来源于Store.general()响应中array实体下的md数据结构,主要包含RAID阵列中成员磁盘的详细信息。
所有fnos_store_array_md_*指标都使用array_name和entity标签来区分不同的存储阵列和成员磁盘:
array_name标签表示存储阵列的名称entity标签表示成员磁盘在阵列中的索引号
| 指标名称 | 类型 | 来源API | 描述 |
|---|---|---|---|
| fnos_store_array_md_name | Info | Store.general() | 阵列中成员磁盘的名称 |
| fnos_store_array_md_status | Info | Store.general() | 阵列中成员磁盘的状态 |
| fnos_store_array_md_size | Gauge | Store.general() | 阵列中成员磁盘的大小(字节) |
这些指标来源于Store.general()响应中block实体下的md数据结构,主要包含块设备中MD设备的详细信息。
所有fnos_store_block_md_*指标都使用block_name和entity标签来区分不同的块设备和MD设备:
block_name标签表示块设备的名称entity标签表示MD设备在块设备中的索引号
| 指标名称 | 类型 | 来源API | 描述 |
|---|---|---|---|
| fnos_store_block_md_name | Info | Store.general() | 块设备中MD设备的名称 |
| fnos_store_block_md_status | Info | Store.general() | 块设备中MD设备的状态 |
| fnos_store_block_md_level | Info | Store.general() | MD设备的RAID级别 |
这些指标来源于Store.general()响应中block实体下的partitions数据结构,主要包含块设备分区信息。
所有fnos_store_block_partition_*指标都使用block_name和entity标签来区分不同的块设备和分区:
block_name标签表示块设备的名称entity标签表示分区在块设备中的索引号
| 指标名称 | 类型 | 来源API | 描述 |
|---|---|---|---|
| fnos_store_block_partition_name | Info | Store.general() | 分区的名称 |
| fnos_store_block_partition_size | Gauge | Store.general() | 分区的总大小(字节) |
| fnos_store_block_partition_filesystem | Info | Store.general() | 分区的文件系统类型 |
| fnos_store_block_partition_mount_point | Info | Store.general() | 分区的挂载点 |
| fnos_store_block_partition_status | Info | Store.general() | 分区的当前状态 |
这些指标来源于Store.general()响应中block实体下的arr-devices数据结构,主要包含块设备关联的阵列设备信息。
所有fnos_store_block_arr_device_*指标都使用block_name和entity标签来区分不同的块设备和关联阵列设备:
block_name标签表示块设备的名称entity标签表示关联阵列设备在块设备中的索引号
| 指标名称 | 类型 | 来源API | 描述 |
|---|---|---|---|
| fnos_store_block_arr_device_name | Info | Store.general() | 关联阵列设备的名称 |
| fnos_store_block_arr_device_size | Gauge | Store.general() | 关联阵列设备的大小(字节) |
| fnos_store_block_arr_device_status | Info | Store.general() | 关联阵列设备的状态 |
这些指标来源于fnOS的Network.list()和ResourceMonitor.net() API端点,用于获取网络接口的配置和性能信息。
Network.list() API提供网络接口的配置信息(如名称、类型、速度、IP地址等),而ResourceMonitor.net() API提供网络接口的性能信息(如接收和传输的数据量)。
所有网络指标都使用interface_name标签来区分不同的网络接口(如"bond1"、"eth0"等)。
| 指标名称 | 类型 | 来源API | 描述 |
|---|---|---|---|
| fnos_network_name | Info | Network.list() | 网络接口的名称 |
| fnos_network_speed | Gauge | Network.list() | 网络接口的速度(Mbps) |
| fnos_network_mtu | Gauge | Network.list() | 网络接口的最大传输单元 |
| fnos_network_running | Gauge | Network.list() | 网络接口是否运行(0=否,1=是) |
| fnos_network_enable | Gauge | Network.list() | 网络接口是否启用(0=否,1=是) |
| fnos_network_hw_addr | Info | Network.list() | 网络接口的硬件地址(MAC地址) |
| fnos_network_receive | Gauge | ResourceMonitor.net() | 网络接口接收的数据量 |
| fnos_network_transmit | Gauge | ResourceMonitor.net() | 网络接口传输的数据量 |
| fnos_network_bond | Gauge | ResourceMonitor.net() | 网络接口是否为bond接口(0=否,1=是) |
--host: fnOS 系统的主机名或 IP 地址(默认值:127.0.0.1:5666)--user: 连接到 fnOS 系统的用户名(必填)--password: 连接到 fnOS 系统的密码(必填)--port: 暴露 Prometheus 指标的端口(默认值:9100)--interval: 指标收集间隔(秒)(默认值:5)--log-level: 设置日志级别(可选:DEBUG, INFO, WARNING, ERROR, CRITICAL,默认值:INFO)
直接使用 uv 运行导出器:
uv run python main.py使用命令行参数运行:
uv run python main.py --host your-fnos-host --user your-username --password your-password --port 9100或者使用默认的本地主机地址:
uv run python main.py --user your-username --password your-password运行测试(如果有的话):
uv run pytest本项目根据 Apache 许可证 2.0 版获得许可 - 详情请参见 LICENSE 文件。
在飞牛fnOS环境下部署fnOS Prometheus Exporter时,可能需要特别注意网络配置:
1)使用Host网络模式:可以通过在Docker Compose中设置 network_mode: host 来直接使用宿主机网络,这样容器可以直接访问fnOS系统的5666端口而无需额外的网络配置。
2)配置FNOS_HOST环境变量:通过 FNOS_HOST 环境变量直接配置飞牛fnOS的IP地址和端口号组合,例如 192.168.31.118:5666。需要将 192.168.31.118 替换为你的fnOS系统的实际IP地址。
在Docker Compose中示例配置:
version: '3.8'
services:
fnos-exporter:
image: ghcr.io/timandes/fnos-prometheus-exporter:latest
network_mode: host # 使用宿主机网络模式
environment:
- FNOS_HOST=192.168.31.118:5666 # 替换为你的fnOS实际IP地址
- FNOS_USER=your-username
- FNOS_PASSWORD=your-password
- FNOS_LOG_LEVEL=INFO
restart: unless-stopped或者不使用host网络模式时:
version: '3.8'
services:
fnos-exporter:
image: ghcr.io/timandes/fnos-prometheus-exporter:latest
environment:
- FNOS_HOST=192.168.31.118:5666 # 替换为你的fnOS实际IP地址
- FNOS_USER=your-username
- FNOS_PASSWORD=your-password
- FNOS_LOG_LEVEL=INFO
ports:
- "9100:9100"
restart: unless-stopped