# easy-exporter
**Repository Path**: yunsilicon/easy-exporter
## Basic Information
- **Project Name**: easy-exporter
- **Description**: 支持云脉芯联全系列网卡的监控exporter,可对接Prometheus,支持秒级采集。
- **Primary Language**: C
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2025-11-18
- **Last Updated**: 2026-02-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Easy-Exporter
# 介绍
Easy-Exporter可以以极低的系统资源开销实现最高秒级的监控数据采集,可用于采集云脉芯联或Nvidia网卡的网络监控统计信息,包括以太类(例如各个优先级的发送、接收字节数、报文数等)和RDMA类(例如丢包、乱序、QP个数等)等的统计数据,并支持将数据输出到Prometheus系统,可灵活指定采集项列表、数据更新周期,并可以捕获采集对象的动态变化(例如由于卸载、安装驱动引起的设备删除和创建)。
# 软件架构
## 目录结构说明
1. config:配置文件目录
- easy-exporter.ini:配置文件,指定监听端口,计数器白名单等,各配置子项定义如后文描述;
- easy-exporter_logrotate:logrotate配置文件,配合Linux的logrotate服务,用于自动定期归档、删除log文件;
- easy-exporter.service:服务描述文件,本Exporter在Linux系统下是以后台服务进程形态运行的。
2. deb:将代码编译打包成deb安装包的必要配置描述文件。
3. grafana_config:Granfana前端配置文件,包括数据列表和展示面板的配置。
4. k8s:
- make_yaml.sh:生成K8S交付件的脚本。
5. project:工程目录,包括代码和编译脚本等。
- build.sh:编译脚本。
- src:源代码目录。
- app:主要逻辑代码。
- include:内部共用头文件。
- lib:内部共用数据结构和接口。
- third_party:第三方源代码。
6. rpm:将代码编译打包成rpm安装包的必要配置描述文件。
7. version.ini:版本号描述。
## 主要模块及关系
Object:所有的采集对象,例如以太设备eth0、ens1,以及IB设备xscale_0、mlx5_0等,都被抽象为object。由于本项目支持采集对象的动态变化,因此会对object进行周期性扫描,以及时发现object的销毁和创建。
Probe:即采集器,由一组回调函数组成,可在其关注的object创建、销毁时做出相应动作。同一个object可能存在多个probe(例如以太设备同时被采集收发报文的信息和温度信息,IB设备也会同时被采集RDMA的数据和QP个数信息)。可以认为object是被采集的对象,其产生的多种各类数据被对应的probe收集。
Object与Probe的关系如上图所示,系统中同时存在多个object与probe,当probe作用在object上时,产生实例instance,监控数据来自instance。
多线程:收集数据和上报数据都是比较耗时的过程,尤其是当数据需要上报给Prometheus系统时,因此本项目采用多线程模型设计。Easy-Exporter内部有两个线程:收集线程和上报线程。收集线程用于定期收集数据,并将数据以特定的个数写在一个buffer中,上报线程负责监听和接收Prometheus的pull请求,当需要向Prometheus上报数据时,上报线程从buffer中取出数据,对数据做快速压缩后发送给Prometheus。压缩过程需要持有数据buffer的锁,在压缩结束前buffer是不能被用来写入收集数据的。因此此处存在短暂的数据竞争,但经过我们长时间测试,认为并没有对采集的实时性造成影响。
## 配置文件说明
配置文件位于目录config/easy-exporter.ini,使用ini格式组织,文件中包含多个section(main、ys和mlx),每个section下包含多个key。所有key的作用如下表:
| **段名** | **键名** | **说明** |
| :------: | :-------------------------: | :----------------------------------------------------------: |
| main | report_diff | 是否上报差值,配置为1时计算差值并上报,为0时上报原始值。 |
| main | scan_period | 监视对象扫描周期,单位为秒。用于实时发现支持动态创建、删除的采集对象。 |
| main | update_period | 采集数据的间隔时间,以秒为单位。 |
| main | output_mode | 配置为0时,将数据打印在屏幕终端上;配置为1时,通过socket被Prometheus采集。 |
| main | prometheus_listen_port | Prometheus采集数据的监听端口号,用于IPv4. |
| main | prometheus_listen_port_ipv6 | Prometheus采集数据的监听端口号,用于IPv6. |
| main | prometheus_compress_output | 配置为‘Y’时,监控数据压缩后再上报给被Prometheus,配置为‘N’时不压缩。 |
| main | prometheus_listen_on_ipv6 | 配置为‘Y’时开启IPv6监听,配置为‘N’时不开启IPv6监听。 |
| ys | eth_cntr_list | 在**Yunsilicon**网卡上需要采集的ethtool监控项列表。 |
| ys | ib_cntr_list | 在**Yunsilicon**网卡上需要采集的infiniband设备监控项列表,来自文件:/sys/class/infiniband/xxx/counters/counters。 |
| ys | ib_global_cntr_list | 在**Yunsilicon**网卡上需要采集的网卡级全局监控项列表,来自文件:/sys/class/infiniband/xxx/global_counters/counters。 |
| mlx | eth_cntr_list | 在**Nvidia**网卡上需要采集的ethtool监控项列表,来自ethtool -S xxx。 |
| mlx | ib_cntr_list | 在**Nvidia**网卡上需要采集的infiniband设备监控项列表,来自目录:/sys/class/infiniband/mlx5_0/ports/1/counters/。 |
| mlx | ib_hw_cntr_list | 在**Nvidia**网卡上需要采集的infiniband设备硬件监控项列表,来自目录:/sys/class/infiniband/xxx/ports/1/hw_counters/。 |
## 使用说明
### 编译依赖
```
$sudo apt install cmake build-essential
```
cmake需要**2.8**或更高版本。
### 编译
切换到project目录下,执行build.sh脚本开始编译:
```
$ cd project
$ ./build.sh
```
编译将很快完成,生成的文件位于project/build/output目录下。
### 打包
在工程根目录下执行pack.sh以进行打包操作,打包后将生成rpm文件(用于redhat系列Linux发行版)和deb文件(用于debian系列Linux发行版)。
### 安装
成功打包后生成rpm文件或deb包,使用对应的包管理程序进行安装:
rpm包安装:
```
$ sudo yum install easy-exporter_1.0-1_x86-64.rpm
```
deb包安装:
```
$ sudo dpkg -i easy-exporter_1.0-1_amd64.deb
```
### 运行时文件
软件被安装后,将自动创建一些文件,各文件的用途说明见下表:
| 说明 | 文件路径 |
| --------------------------------------------- | ----------------- |
| /bin/easy-exporter | 主可执行文件 |
| /etc/easy-exporter.ini | 配置文件 |
| /etc/logrotate.d/easy-exporter_logrotate | logrotate配置文件 |
| /usr/lib/systemd/system/easy-exporter.service | 系统服务描述文件 |
| /var/log/easy-exporter.log* | 运行时log文件 |
| /var/run/easy-exporter.pid | 保存主进程PID |
结束。