跳转至

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 UnavailableNetdata 服务未启动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 missingDocker 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   (唯一值计数)

同类工具对比

特性NetdataPrometheus+GrafanaZabbixDatadog
安装难度极简(1条命令)较复杂复杂中等
零配置
实时性毫秒级秒级分钟级秒级
历史存储天(默认)可配置可配置云端
自定义指标StatsD完整有限完整
告警内置AlertManager内置内置
可视化内置(基础)Grafana(强大)内置内置
扩展性中等非常强
成本免费免费免费付费
适合场景快速上手、实时监控长期存储、复杂分析传统IT运维企业云监控

选型建议: - 快速看服务器状态:Netdata(5分钟搞定) - 需要长期分析和告警策略:Prometheus + Grafana - 已有企业预算:Datadog 或 New Relic - 大规模传统IT:Zabbix


参考:Netdata 官方文档 | 告警配置参考 | StatsD 采集器 | 更新于 2026 年