How to Build a Second-Level Full-Stack Monitoring System in 10 Minutes with Netdata
Say goodbye to delayed alerts. This tutorial shows you how to one-click deploy Netdata on a Linux server for zero-configuration automatic metric discovery. Learn to setup production-grade real-time dashboards, custom alerting rules, and DingTalk integration in minutes.

Server Alerts Always Too Slow? Build a Second-Level Monitoring System in 10 Minutes with Netdata
Last week at 3 AM, the CPU usage of our online server suddenly spiked to 90%. By the time I received the DingTalk alert, woke up, and started investigating, the incident had been going on for 40 minutes, causing widespread timeouts on core API endpoints. The root cause was a slow SQL query leading to a cascade failure—but what I really lacked wasn't troubleshooting skills; it was a monitoring system capable of second-level anomaly detection.
Prometheus + Grafana is powerful, but the setup cost is non-trivial: you have to write custom scraping rules and build Dashboards from scratch. For small to medium teams, this overhead is often too heavy. This is why I want to share Netdata with you today: Install it with a single command, achieve zero-configuration auto-discovery of metrics, get built-in AI anomaly detection, and start using it right out of the box.
This guide doesn't require you to be a DevOps expert. Follow along, and you'll have a production-grade monitoring system running on your server in no time, covering:
- Real-time visualization of system metrics (CPU, memory, disk, network).
- Automatic collection for components like Docker, Nginx, MySQL, etc.
- Built-in alert rules with notifications via DingTalk, Email, or Slack.
- Custom Dashboards to keep an eye on key business indicators.
Prerequisites
- A Linux server (Ubuntu / CentOS / Debian recommended), minimum 1 Core 1G RAM.
rootorsudoaccess.- Internet access (required to download packages).
- Basic familiarity with Linux command line.
Performance Note: The Netdata Agent consumes very few resources. With ML and alerting enabled by default, it uses only about 5% CPU and 150MB memory. If you disable these features, it drops to ~1% CPU and 100MB RAM, making it virtually unobtrusive in a production environment.
Quick Start
Step 1: One-Click Installation
Netdata provides a kickstart script that automatically detects your OS environment and handles all dependencies:
bash
wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh && sh /tmp/netdata-kickstart.sh
Why use the script?
It handles everything for you: OS detection, installing compilation dependencies (gcc, make), fetching the binary, creating a dedicated netdata user, and registering it as a systemd service. This saves you at least an hour compared to a manual Prometheus setup.
Once installed, verify the service status:
bash
sudo systemctl status netdata
If you see active (running), you're good to go. Netdata listens on port 19999 by default. Open http://<your_server_ip>:19999 in your browser to access the Dashboard.
Step 2: Open Dashboard and Understand Default Metrics
When you first open the dashboard, you'll be amazed by the amount of data—Netdata automatically discovers everything available to monitor: CPU usage in detail, per-process status, network interface traffic, disk I/O, and even hardware sensor temperatures. These aren't preset templates; the Agent scans your system upon startup.
How it works: Netdata comes with over 800+ integrated plugins (Collectors) covering system monitoring and major middleware (Nginx, MySQL, Redis, Docker, K8s, etc.). If it detects Nginx, it attempts to read the stub_status endpoint. If it finds MySQL, it tries connecting via the default port. Zero configuration is possible because of this powerful auto-discovery mechanism.
Step 3: Firewall Configuration
If you're using cloud providers (AWS, Aliyun, Tencent Cloud), ensure port 19999 is open in your security group. In internal networks, access is usually direct.
Real-World Practice: Monitoring Nginx + Configuring Alerts
System metrics are great, but let's do a practical scenario: monitoring a business-level Nginx web service and setting up a useful alert rule.
Scenario Assumption
You have a backend API service running behind Nginx and need to monitor:
- Nginx request rate and active connections.
- Trigger an alert if active connections exceed 500.
- Send the alert to your DingTalk.
Practical Steps
1. Enable Nginx stub_status
Update your Nginx configuration:
nginx
server {
listen 80;
server_name _;
location /nginx_status {
stub_status on;
allow 127.0.0.1; # Restrict access to localhost for security
deny all;
}
}
Reload the configuration:
bash
sudo nginx -t && sudo systemctl reload nginx
Verify the endpoint:
bash
curl http://127.0.0.1/nginx_status
Output should look like this:
text
Active connections: 291
server accepts handled requests
16630948 16630948 31071184
Reading: 4 Writing: 97 Waiting: 190
2. Confirm Netdata Auto-Captures the Metrics
Go back to your Netdata Dashboard and search for nginx. You will see Nginx metrics pop up immediately. Netdata detected the local stub_status interface and automatically activated the Nginx Collector.
3. Configure Alert Rules
Netdata includes numerous default alert configurations in /etc/netdata/health.d/. You can modify specific files or create custom ones. Let's look at the nginx_local.connections_active example:
bash
sudo cd /etc/netdata/health.d/
ls | grep nginx
You can edit nginx.conf (usually via sudo nano /etc/netdata/health.d/nginx.conf) to adjust thresholds. A typical configuration block looks like this:
yaml
alarm: nginx_connections_active_high
on: nginx_local.connections_active
every: 30s
lookup: last 5m
warn: $this > 300
crit: $this > 500
to: "sysadmin@yourdomain"
info: Nginx active connections is $this
Key parameters explained:
every: 30s: Check every 30 seconds.lookup: last 5m: Evaluate based on data from the last 5 minutes.warn/crit: Thresholds for Warning and Critical states.to: Target for notification routing.
4. Configure DingTalk Integration
Netdata supports multiple notification channels. Edit the notification configuration file:
bash
sudo nano /etc/netdata/health_alarm_notify.conf
Find the DingTalk section and input your Webhook URL:
bash
## -----------------------------------------------------------------------------
## DingTalk (Webhook)
SEND_DINGTALK="YES"
DINGTALK_WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN_HERE"
Test the notification setup:
bash
sudo bash /usr/libexec/netdata/plugins.d/alarm-notify.sh test
5. Verification
Use ab (Apache Bench) or wrk to stress test your Nginx instance, generating massive concurrent connections. Within 30-60 seconds, you should receive an alert on DingTalk. From anomaly occurrence to phone notification: less than a minute. This is the value of second-level monitoring.
Common Issues & Troubleshooting
Q1: Dashboard is blank or won't load
Check if port 19999 is blocked.
bash
netstat -tlnp | grep 19999
If it's listening, verify your cloud provider's Security Groups and local iptables/firewalld.
Q2: Collectors aren't working
Some components require specific permissions. For MySQL, ensure netdata can query status; for Redis, check config bind addresses. Check the logs:
bash
sudo cat /var/log/netdata/collector.log | grep -i error
Q3: Data retention is too short
Netdata uses tiered storage: Tier 0 (seconds), Tier 1 (minutes), Tier 2 (hours). You can adjust retention in /etc/netdata/netdata.conf using the history parameter, but be aware of increased disk usage. For long-term storage, consider exporting data to InfluxDB or Prometheus.
Q4: Disable Anonymous Statistics
If you don't want Netdata to track usage:
bash
sudo touch /etc/netdata/.opt-out-from-anonymous-statistics
sudo systemctl restart netdata
Summary
Today we completed a full deployment from zero to hero:
- Installed Agent with one command, auto-registering as a service.
- Opened Dashboard to view 800+ auto-discovered metrics.
- Real-world Nginx monitoring: Enabled stub_status → Verified auto-collection → Configured alert thresholds → Setup DingTalk notifications.
For a single server, this setup is robust enough for production. As a next step, I recommend:
- Exploring Parent-Child Architecture to aggregate metrics from multiple nodes.
- Exporting metrics to InfluxDB + Grafana if you need highly customized reporting.
- Trying Netdata Cloud (free tier available) for remote access and unified views.
Monitoring isn't an afterthought when things break; it's the capability to see issues before they impact users. Hope this guide lowers the barrier for you.
See you in the next guide where we'll cover monitoring containerized environments (Docker + K8s) with Netdata!