Netdata 实时监控¶
一句话概述:Netdata 是开源的实时性能监控工具,安装后自动监控 CPU/内存/磁盘/网络等 2000+ 个指标,毫秒级粒度刷新,零配置开箱即用,支持告警通知和 StatsD 自定义指标,非常适合开发和运维人员快速上手基础设施监控。
核心知识点¶
| 概念 | 白话解释 |
|---|---|
| Dashboard | 仪表盘 = 自动生成的实时监控页面,无需手动配置 |
| Chart | 图表 = 每个指标的可视化折线图/面积图 |
| Alarm | 告警 = 指标超出阈值时自动通知(邮件/Slack/PagerDuty等) |
| Collector | 采集器 = 自动发现并监控系统和应用的插件 |
| Health Watchdog | 健康看门狗 = 持续评估指标是否在正常范围 |
| Netdata Cloud | 云端控制台 = 多台机器统一管理界面(免费,可选) |
| StatsD | 统计协议 = 应用主动上报自定义指标的 UDP 协议 |
| Streaming | 流传输 = 一台 Netdata 实时转发数据到另一台(中心化收集) |
| NIDL | 指标格式 = Node.Instance.Dimension.Label(四级命名) |
白话解释¶
想象你有一台服务器在运行,你想随时知道它的状态。传统方案: 1. 安装 Prometheus + 各种 Exporter(CPU、内存、磁盘分别装) 2. 配置 Grafana,手动建图表 3. 配置 AlertManager 设置告警规则
Netdata 的方案:一条命令安装,5分钟后 CPU、内存、磁盘、网络、Docker 容器、MySQL、Nginx... 全部自动监控,实时图表开箱即有,不需要手动配置任何东西。
代价:数据默认只保留几天,不适合长期存储和复杂分析(那是 Prometheus 的强项)。
安装配置¶
方式一:一键安装脚本(推荐,Linux/macOS)¶
# 下载安装脚本
curl https://get.netdata.cloud/kickstart.sh > /tmp/netdata-kickstart.sh
# 查看脚本内容(养成好习惯,运行前检查)
# cat /tmp/netdata-kickstart.sh | head -50
# 执行安装(会自动检测系统并安装合适的版本)
sh /tmp/netdata-kickstart.sh
# 或者一步完成(直接从网络安装)
bash <(curl -Ss https://get.netdata.cloud/kickstart.sh)
# 安装完成后验证
systemctl status netdata # 检查服务状态
curl http://localhost:19999/api/v1/info # 检查 API
方式二:Docker 安装(容器环境推荐)¶
# 基础 Docker 安装(挂载系统目录以收集宿主机指标)
docker run -d \
--name netdata \
-p 19999:19999 \ # Web UI 端口
--cap-add SYS_PTRACE \ # 查看进程所需权限
--cap-add SYS_ADMIN \ # 系统管理权限
-v /proc:/host/proc:ro \ # 挂载 /proc 目录(CPU/内存指标来源)
-v /sys:/host/sys:ro \ # 挂载 /sys 目录(硬件信息)
-v /etc/os-release:/host/etc/os-release:ro \ # 系统版本信息
-v /var/run/docker.sock:/var/run/docker.sock:ro \ # Docker 容器监控
netdata/netdata:latest
# 验证
docker logs netdata | tail -20 # 查看启动日志
curl http://localhost:19999/api/v1/charts # 检查采集的图表
方式三:Docker Compose(完整配置)¶
# docker-compose.yml
version: '3.7'
services:
netdata:
image: netdata/netdata:latest
container_name: netdata
hostname: my-server # 主机名,显示在 Netdata Cloud
ports:
- "19999:19999" # Web UI
cap_add:
- SYS_PTRACE # 进程追踪
- SYS_ADMIN # 系统管理
security_opt:
- apparmor:unconfined # AppArmor(Ubuntu 系统)
volumes:
# 系统信息(只读挂载)
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /etc/os-release:/host/etc/os-release:ro
# Docker 监控
- /var/run/docker.sock:/var/run/docker.sock:ro
# Netdata 配置(持久化)
- netdata_config:/etc/netdata
# Netdata 数据(持久化)
- netdata_lib:/var/lib/netdata
- netdata_cache:/var/cache/netdata
environment:
- DOCKER_USG_ALARM_THRESHOLD=70 # Docker 内存使用率告警阈值
volumes:
netdata_config:
netdata_lib:
netdata_cache:
方式四:包管理器安装¶
# Ubuntu/Debian
sudo apt-get install netdata
# CentOS/RHEL
sudo yum install netdata
# macOS(Homebrew)
brew install netdata
基本使用¶
访问 Web UI¶
# 启动后访问
http://localhost:19999 # 本地访问 Netdata UI
# 远程访问(需要开放端口)
http://your-server-ip:19999 # 远程访问
# 默认监控内容(自动发现,无需配置):
# - System Overview:CPU、内存、磁盘 I/O、网络
# - Processes:各进程的资源使用
# - Disks:各磁盘分区使用情况
# - Network:各网卡流量
# - Docker:容器 CPU/内存/网络(如果有 Docker)
# - Nginx/Apache:Web 服务器指标(自动发现)
# - MySQL/PostgreSQL:数据库指标(自动发现,需配置账号)
配置告警¶
# 告警配置文件位置
# /etc/netdata/health.d/ 默认告警规则目录
# /usr/lib/netdata/conf.d/health.d/ 内置规则
# 查看现有告警规则
ls /etc/netdata/health.d/ # 列出配置文件
cat /etc/netdata/health.d/cpu.conf # 查看 CPU 告警规则
# 创建自定义告警规则
# 文件:/etc/netdata/health.d/custom_alerts.conf
# === 示例1:CPU 使用率高告警 ===
alarm: high_cpu_usage
on: system.cpu # 监控的图表(system.cpu = 总 CPU)
lookup: average -5m percentage # 取最近 5 分钟的平均 CPU 使用率(百分比)
every: 1m # 每 1 分钟检查一次
warn: $this > 80 # 超过 80% 发出警告
crit: $this > 95 # 超过 95% 发出严重告警
info: CPU 使用率过高,请检查进程
# === 示例2:内存使用率高告警 ===
alarm: high_memory_usage
on: system.ram
lookup: average -5m percentage of used # 已用内存百分比
every: 2m
warn: $this > 80
crit: $this > 90
info: 内存使用率超过阈值
# === 示例3:磁盘空间不足告警 ===
alarm: disk_space_low
on: disk.space
units: %
lookup: average -1m percentage of used # 磁盘使用率
every: 5m
warn: $this > 85
crit: $this > 95
info: 磁盘空间即将耗尽
# === 示例4:网络带宽过高告警 ===
alarm: high_network_outbound
on: net.eth0 # eth0 网卡(根据实际情况修改)
units: kilobytes/s
lookup: average -5m sum of sent # 5 分钟平均出站流量
every: 1m
warn: $this > 50000 # 超过 50MB/s 警告
crit: $this > 100000 # 超过 100MB/s 严重告警
info: 网络出站带宽异常
# 重新加载告警配置(无需重启 Netdata)
netdatacli reload-health # 重新加载告警规则
配置告警通知¶
# 配置文件:/etc/netdata/health_alarm_notify.conf
# === 配置 Slack 通知 ===
SEND_SLACK="YES"
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
DEFAULT_RECIPIENT_SLACK="#alerts" # 默认发送到哪个频道
# === 配置邮件通知 ===
SEND_EMAIL="YES"
EMAIL_SENDER="netdata@your-domain.com"
DEFAULT_RECIPIENT_EMAIL="admin@your-domain.com"
# === 配置 PagerDuty 通知 ===
SEND_PAGERDUTY="YES"
PAGERDUTY_SERVICE_KEY="your_pagerduty_routing_key"
# === 配置 Webhook(通用 HTTP 通知)=====
SEND_CUSTOM="YES"
# 编辑 /etc/netdata/custom-notification.conf 自定义通知脚本
# 测试告警通知
sudo su -s /bin/bash netdata
export NETDATA_ALARM_NOTIFY_DEBUG=1
/usr/libexec/netdata/plugins.d/alarm-notify.sh test slack # 测试 Slack 通知
高级用法¶
StatsD:应用主动上报自定义指标¶
# Netdata 内置 StatsD 服务,默认监听 UDP 8125 端口
# 无需额外安装,Netdata 启动后即可接收 StatsD 数据
# StatsD 数据格式:
# metric_name:value|type
# 类型:c(计数器)、g(仪表)、ms(计时)、s(集合)
# 测试:发送自定义指标(nc 命令)
echo "myapp.requests:1|c" | nc -u 127.0.0.1 8125 # 请求计数器 +1
echo "myapp.latency:150|ms" | nc -u 127.0.0.1 8125 # 延迟 150ms
echo "myapp.queue_size:42|g" | nc -u 127.0.0.1 8125 # 队列长度 = 42
echo "myapp.active_users:100|g" | nc -u 127.0.0.1 8125 # 活跃用户 = 100
# Python 应用上报自定义指标
import socket
import time
class StatsD:
"""简单的 StatsD 客户端"""
def __init__(self, host='localhost', port=8125):
self.host = host
self.port = port
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
def _send(self, metric: str):
"""发送指标数据(UDP,不阻塞)"""
self.sock.sendto(metric.encode(), (self.host, self.port))
def increment(self, name: str, value: int = 1):
"""计数器:每次加 value(如 API 请求次数)"""
self._send(f"{name}:{value}|c")
def gauge(self, name: str, value: float):
"""仪表:设置当前值(如队列长度、活跃连接数)"""
self._send(f"{name}:{value}|g")
def timing(self, name: str, milliseconds: float):
"""计时:记录耗时(如 API 响应时间)"""
self._send(f"{name}:{milliseconds}|ms")
def set(self, name: str, value: str):
"""集合:统计唯一值个数(如唯一用户数)"""
self._send(f"{name}:{value}|s")
# 使用示例
statsd = StatsD()
def process_sample(sample_id: str):
start_time = time.time()
statsd.increment('bioinfo.samples.started') # 计数器:任务启动
statsd.gauge('bioinfo.queue.size', get_queue_size()) # 仪表:当前队列大小
try:
result = run_pipeline(sample_id)
statsd.increment('bioinfo.samples.completed') # 计数器:成功完成
except Exception as e:
statsd.increment('bioinfo.samples.failed') # 计数器:失败
raise
finally:
elapsed_ms = (time.time() - start_time) * 1000
statsd.timing('bioinfo.pipeline.duration', elapsed_ms) # 计时:总耗时
return result
自定义采集器(Python)¶
# 创建自定义采集器:/etc/netdata/python.d/my_bioinfo.conf
# 文件:/usr/libexec/netdata/python.d/my_bioinfo.chart.py
from bases.FrameworkServices.SimpleService import SimpleService
# 定义图表
ORDER = ['pipeline_status', 'sample_queue']
CHARTS = {
'pipeline_status': {
'options': ['', '生信流水线状态', 'tasks/s', 'pipeline', 'bioinfo', 'line'],
'lines': [
['running', '运行中', 'absolute'],
['completed', '已完成', 'absolute'],
['failed', '失败', 'absolute'],
]
},
'sample_queue': {
'options': ['', '样本队列长度', 'samples', 'queue', 'bioinfo', 'area'],
'lines': [
['queue_size', '队列长度', 'absolute'],
]
}
}
class Service(SimpleService):
def __init__(self, configuration=None, name=None):
SimpleService.__init__(self, configuration=configuration, name=name)
self.order = ORDER
self.definitions = CHARTS
def get_data(self):
"""每隔 update_every 秒被 Netdata 调用一次"""
# 从你的应用获取数据
return {
'running': get_running_count(),
'completed': get_completed_count(),
'failed': get_failed_count(),
'queue_size': get_queue_size(),
}
多节点集中监控(Streaming)¶
# 父节点配置(接收数据)
# 文件:/etc/netdata/stream.conf 在父节点上
[API_KEY_FROM_CHILD] # 子节点的 API Key
enabled = yes
default history = 3600 # 保留 1 小时数据
# 子节点配置(发送数据到父节点)
# 文件:/etc/netdata/stream.conf 在子节点上
[stream]
enabled = yes
destination = parent-server:19999 # 父节点地址
api key = your_api_key # 认证密钥
# 效果:在父节点的 UI 中可以看到所有子节点的数据
# 适合:10 台以下服务器的集中监控
连接 Netdata Cloud(多节点管理)¶
# 注册 Netdata Cloud(免费):https://app.netdata.cloud
# 连接节点到 Cloud
# 方法一:通过 UI 连接
# http://localhost:19999 → Sign in to Netdata Cloud
# 方法二:命令行连接
sudo netdatacli claim-node -t YOUR_CLAIM_TOKEN \
-r "https://app.netdata.cloud" \
-id YOUR_ROOM_ID
# 连接后可以在 Cloud UI 中统一管理所有节点
常见报错¶
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
503 Service Unavailable | Netdata 服务未启动 | systemctl start netdata |
No data in charts | 数据采集失败 | 检查 /var/log/netdata/error.log |
Permission denied | 权限不足 | 检查 netdata 用户对目标目录的权限 |
Alarm not triggered | 告警规则写法错误 | 运行 netdatacli reload-health 并检查语法 |
StatsD data not appearing | 端口未监听 | 检查 netstat -un | grep 8125 |
Docker metrics missing | Docker socket 未挂载 | 添加 -v /var/run/docker.sock:/var/run/docker.sock:ro |
High CPU by Netdata | 采集频率过高 | 调整 update_every 从 1 秒改为 5 秒 |
Streaming connection failed | 网络或密钥问题 | 检查父节点 API Key 和防火墙规则 |
速查表¶
# ===== 服务管理 =====
systemctl start netdata # 启动
systemctl stop netdata # 停止
systemctl restart netdata # 重启
systemctl status netdata # 查看状态
systemctl enable netdata # 开机自启
# ===== 命令行工具 =====
netdatacli ping # 健康检查
netdatacli reload-health # 重新加载告警规则(无需重启)
netdatacli help # 查看所有命令
# ===== 端口说明 =====
# 19999 : Web UI 和 REST API
# 8125 : StatsD UDP 接收端口
# 8125 : StatsD TCP 接收端口
# ===== API 接口 =====
# GET /api/v1/info Netdata 信息
# GET /api/v1/charts 所有图表列表
# GET /api/v1/chart?chart=X 特定图表信息
# GET /api/v1/data?chart=X 图表数据
# GET /api/v1/alarms 当前告警状态
# ===== 配置文件位置 =====
# /etc/netdata/netdata.conf 主配置文件
# /etc/netdata/health.d/ 告警规则目录
# /etc/netdata/health_alarm_notify.conf 通知配置
# /etc/netdata/python.d/ Python 采集器配置
# /var/log/netdata/ 日志目录
# ===== StatsD 格式速查 =====
# 计数器: metric:1|c (自增)
# 仪表: metric:42|g (设置当前值)
# 计时: metric:150|ms (毫秒计时)
# 集合: metric:user1|s (唯一值计数)
同类工具对比¶
| 特性 | Netdata | Prometheus+Grafana | Zabbix | Datadog |
|---|---|---|---|---|
| 安装难度 | 极简(1条命令) | 较复杂 | 复杂 | 中等 |
| 零配置 | 是 | 否 | 否 | 否 |
| 实时性 | 毫秒级 | 秒级 | 分钟级 | 秒级 |
| 历史存储 | 天(默认) | 可配置 | 可配置 | 云端 |
| 自定义指标 | StatsD | 完整 | 有限 | 完整 |
| 告警 | 内置 | AlertManager | 内置 | 内置 |
| 可视化 | 内置(基础) | Grafana(强大) | 内置 | 内置 |
| 扩展性 | 中等 | 非常强 | 强 | 强 |
| 成本 | 免费 | 免费 | 免费 | 付费 |
| 适合场景 | 快速上手、实时监控 | 长期存储、复杂分析 | 传统IT运维 | 企业云监控 |
选型建议: - 快速看服务器状态:Netdata(5分钟搞定) - 需要长期分析和告警策略:Prometheus + Grafana - 已有企业预算:Datadog 或 New Relic - 大规模传统IT:Zabbix
参考:Netdata 官方文档 | 告警配置参考 | StatsD 采集器 | 更新于 2026 年