{"id":2248,"date":"2024-11-13T16:59:38","date_gmt":"2024-11-13T08:59:38","guid":{"rendered":"https:\/\/www.ruianding.com\/blog\/?p=2248"},"modified":"2026-01-09T10:36:44","modified_gmt":"2026-01-09T02:36:44","slug":"monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards","status":"publish","type":"post","link":"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/","title":{"rendered":"Monitoring Stack \u2013 Part 3: Visualizing Server Metrics with Grafana Dashboards"},"content":{"rendered":"\n<p>In Part 2, we set up Node Exporter and Prometheus to gather and store metrics from our Linux server. In this post, we\u2019ll focus on using Grafana to create meaningful, real-time dashboards from those metrics, allowing you to monitor your server\u2019s performance at a glance.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-cyan-bluish-gray-color has-alpha-channel-opacity has-cyan-bluish-gray-background-color has-background is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Understanding Key Node Exporter Metrics<\/h2>\n\n\n\n<p>Node Exporter collects a wide range of system metrics. Here are some important ones you\u2019ll likely want to include in your dashboards, along with an explanation of what they represent:<\/p>\n\n\n\n<p><strong>CPU Metrics<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Metric<\/strong>: <code>node_cpu_seconds_total<\/code><\/li>\n\n\n\n<li><strong>Description<\/strong>: Tracks CPU usage by mode (e.g., user, system, idle) and CPU core. This metric is cumulative, so PromQL functions are used to calculate usage rates.<\/li>\n\n\n\n<li><strong>Useful Dashboard Panels<\/strong>: CPU usage over time (percentage), per-core breakdown.<\/li>\n<\/ul>\n\n\n\n<p><strong>Memory Metrics<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Metric<\/strong>: <code>node_memory_MemAvailable_bytes<\/code>, <code>node_memory_MemTotal_bytes<\/code><\/li>\n\n\n\n<li><strong>Description<\/strong>: Reports available and total memory. These metrics can help visualize used memory, available memory, and usage trends.<\/li>\n\n\n\n<li><strong>Useful Dashboard Panels<\/strong>: Memory usage as a percentage, memory breakdown (used, available, cached, buffers).<\/li>\n<\/ul>\n\n\n\n<p><strong>Disk Usage Metrics<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Metric<\/strong>: <code>node_filesystem_avail_bytes<\/code>, <code>node_filesystem_size_bytes<\/code><\/li>\n\n\n\n<li><strong>Description<\/strong>: Shows available and total disk space for each mounted filesystem. You can monitor how much space is used and which filesystems are nearing capacity.<\/li>\n\n\n\n<li><strong>Useful Dashboard Panels<\/strong>: Disk usage per filesystem, alerts for low space.<\/li>\n<\/ul>\n\n\n\n<p><strong>Disk I\/O Metrics<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Metric<\/strong>: <code>node_disk_io_time_seconds_total<\/code>, <code>node_disk_reads_completed_total<\/code>, <code>node_disk_writes_completed_total<\/code><\/li>\n\n\n\n<li><strong>Description<\/strong>: Monitors I\/O activity, showing the read\/write operations completed and the time spent performing I\/O operations.<\/li>\n\n\n\n<li><strong>Useful Dashboard Panels<\/strong>: IOPS (Input\/Output Operations per Second), read\/write throughput, disk latency.<\/li>\n<\/ul>\n\n\n\n<p><strong>Network Metrics<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Metric<\/strong>: <code>node_network_receive_bytes_total<\/code>, <code>node_network_transmit_bytes_total<\/code><\/li>\n\n\n\n<li><strong>Description<\/strong>: Measures total bytes received and transmitted over network interfaces, helping track network throughput and usage.<\/li>\n\n\n\n<li><strong>Useful Dashboard Panels<\/strong>: Network throughput over time, alerts for high bandwidth usage, packet drops.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-cyan-bluish-gray-color has-alpha-channel-opacity has-cyan-bluish-gray-background-color has-background is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step-by-Step: Building a Server Monitoring Dashboard in Grafana<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1. <strong>Panels for CPU Usage<\/strong><\/h3>\n\n\n\n<p>Add a panel with the following PromQL query to show total CPU usage over time:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"asm\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">100 - (avg by (instance) (irate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)<\/pre>\n\n\n\n<p>This query calculates the percentage of CPU used by subtracting the idle time from 100%.<\/p>\n\n\n\n<p>Set the panel title to \u201cCPU Usage (%)\u201d and configure the display as a line graph or gauge.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"453\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12-1024x453.png\" alt=\"\" class=\"wp-image-2250\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12-1024x453.png 1024w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12-300x133.png 300w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12-768x340.png 768w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12-1536x680.png 1536w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12-2048x907.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>*<\/strong> Graph visualization could be selected like below.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"210\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-14-1024x210.png\" alt=\"\" class=\"wp-image-2253\" style=\"width:673px;height:auto\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-14-1024x210.png 1024w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-14-300x61.png 300w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-14-768x157.png 768w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-14-1536x314.png 1536w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-14.png 1856w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>By setting up a gauge view, we can visualize the data on a scale out of 100, allowing for a clear, intuitive representation of the current value relative to the maximum.<\/p>\n\n\n\n<p class=\"has-pale-cyan-blue-background-color has-background\">Setting up <strong>thresholds<\/strong> also provides a powerful way to visually track metrics against critical limits, making it easy to identify and respond to data trends at a glance.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"443\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-15-1024x443.png\" alt=\"\" class=\"wp-image-2257\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-15-1024x443.png 1024w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-15-300x130.png 300w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-15-768x333.png 768w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-15-1536x665.png 1536w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-15-2048x887.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">2. <strong>Panels for Memory Usage<\/strong><\/h3>\n\n\n\n<p>You can calculate memory usage as a percentage with:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"asm\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">100 * (1 - node_memory_MemAvailable_bytes \/ node_memory_MemTotal_bytes)<\/pre>\n\n\n\n<p>Just like in the CPU Usage panels, use a gauge or bar panel to display memory usage and set thresholds for critical levels (e.g., above 90% usage). By combining these panels, our dashboard becomes much clearer and more informative.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"583\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-16-1024x583.png\" alt=\"\" class=\"wp-image-2263\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-16-1024x583.png 1024w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-16-300x171.png 300w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-16-768x437.png 768w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-16-1536x875.png 1536w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-16.png 1644w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">3. <strong>Panel for Disk Usage<\/strong><\/h3>\n\n\n\n<p><strong>Add the Query for the Root Partition (<code>\/<\/code>)<\/strong>:<\/p>\n\n\n\n<p>In the Prometheus query editor, use the following query to calculate the disk usage percentage for the root partition.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">(node_filesystem_size_bytes{mountpoint=\"\/\"} - node_filesystem_avail_bytes{mountpoint=\"\/\"}) \n\/ node_filesystem_size_bytes{mountpoint=\"\/\"} * 100<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"494\" height=\"454\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-17.png\" alt=\"\" class=\"wp-image-2270\" style=\"width:207px;height:auto\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-17.png 494w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-17-300x276.png 300w\" sizes=\"auto, (max-width: 494px) 100vw, 494px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">4. <strong>Panels for Disk I\/O<\/strong><\/h3>\n\n\n\n<p>Use <code>lsblk<\/code> command to idenfity your disk device name(s) first:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"844\" height=\"200\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-18.png\" alt=\"\" class=\"wp-image-2275\" style=\"width:449px;height:auto\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-18.png 844w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-18-300x71.png 300w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-18-768x182.png 768w\" sizes=\"auto, (max-width: 844px) 100vw, 844px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Disk I\/O Time (in milliseconds)<\/h4>\n\n\n\n<p>This metric reflects how long each read or write operation takes, helping identify latency issues with the disk. In Prometheus, the metric <code>node_disk_io_time_seconds_total<\/code> is typically used.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"asm\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">rate(node_disk_io_time_seconds_total{device=\"&lt;device_name>\"}[5m]) * 1000<\/pre>\n\n\n\n<p class=\"has-pale-cyan-blue-background-color has-background\">Remeber to replace the <strong>&lt;device_name&gt;<\/strong> with the disk device name you&#8217;ve quried in previous step. <\/p>\n\n\n\n<p>Set the unit to <strong>milliseconds (ms)<\/strong> in Grafana to represent latency. Use a title like \u201cDisk I\/O Time (ms)\u201d. Lastly, <strong>Time Series<\/strong> is best for viewing how latency changes over time.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized is-style-default\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"635\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-22-1024x635.png\" alt=\"\" class=\"wp-image-2286\" style=\"width:769px;height:auto\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-22-1024x635.png 1024w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-22-300x186.png 300w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-22-768x477.png 768w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-22-1536x953.png 1536w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-22-2048x1271.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Disk I\/O Throughput (in KB\/s)<\/h4>\n\n\n\n<p>This metric measures the amount of data read or written over time, useful for monitoring data transfer rates. You can use <code>node_disk_read_bytes_total<\/code> and <code>node_disk_written_bytes_total<\/code> to track read and write volumes.<\/p>\n\n\n\n<p><strong>Query A (Read Throughput)<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"asm\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">rate(node_disk_read_bytes_total{device=\"&lt;device_name>\"}[5m]) \/ 1024<\/pre>\n\n\n\n<p><strong>Query B (Write Throughput)<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"asm\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">rate(node_disk_written_bytes_total{device=\"&lt;device_name>\"}[5m]) \/ 1024<\/pre>\n\n\n\n<p>Ensure that each query is labeled distinctly in the <strong>Legend<\/strong> field (e.g., <code>Read Throughput<\/code> and <code>Write Throughput<\/code>). This will help Grafana differentiate between the two metrics.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"446\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-20-1024x446.png\" alt=\"\" class=\"wp-image-2283\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-20-1024x446.png 1024w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-20-300x131.png 300w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-20-768x335.png 768w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-20-1536x669.png 1536w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-20-2048x892.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">5. <strong>Panel<\/strong> for <strong>System Uptime<\/strong><\/h3>\n\n\n\n<p>This metric <code>node_boot_time_seconds<\/code> represents the system boot time in <strong>seconds since the epoch<\/strong> (i.e., Unix timestamp). By subtracting this value from the current time, you can calculate the system uptime.<\/p>\n\n\n\n<p>To get the system\u2019s uptime in seconds (or convert it to hours, days, etc.), use the following PromQL query:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">(time() - node_boot_time_seconds) \/ 3600 \/ 24<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"678\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-23-1024x678.png\" alt=\"\" class=\"wp-image-2293\" style=\"width:669px;height:auto\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-23-1024x678.png 1024w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-23-300x199.png 300w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-23-768x508.png 768w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-23-1536x1017.png 1536w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-23.png 1822w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>In the Panel Settings, set the <strong>Unit<\/strong> for the value. Select <code>days (d)<\/code> and as we&#8217;ve already converted the uptime unit to day in previous PromQL query.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">6. Panel for <strong>Network Traffic<\/strong><\/h3>\n\n\n\n<p>To monitor network throughput, use the following queries:<\/p>\n\n\n\n<p><strong style=\"font-size: revert; color: initial;\">Bytes Received<\/strong>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"asm\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">rate(node_network_receive_bytes_total{device=\"&lt;device_name>\"}[5m])<\/pre>\n\n\n\n<p><strong style=\"font-size: revert; color: initial;\">Bytes Transmitted<\/strong>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"asm\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">rate(node_network_transmit_bytes_total{device=\"&lt;device_name>\"}[5m])<\/pre>\n\n\n\n<p class=\"has-pale-cyan-blue-background-color has-background\">Since I only want to monitor external network traffic, so in my query I explicitly selects the <code>eth0<\/code> interface, excluding the loopback (<code>lo<\/code>) or any other interfaces.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"451\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-24-1024x451.png\" alt=\"\" class=\"wp-image-2296\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-24-1024x451.png 1024w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-24-300x132.png 300w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-24-768x338.png 768w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-24-1536x677.png 1536w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-24-2048x903.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-cyan-bluish-gray-color has-alpha-channel-opacity has-cyan-bluish-gray-background-color has-background is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Final Dashboard Configuration Tips<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Use Variables<\/strong>: Add variables in Grafana (e.g., for <code>instance<\/code> or <code>mountpoint<\/code>) to make your dashboard flexible and allow you to switch between instances or filesystems.<\/li>\n\n\n\n<li><strong>Choose Suitable Visualization Types<\/strong>: Use gauges for real-time metrics, bar charts for usage breakdowns, and line graphs for tracking changes over time.<\/li>\n\n\n\n<li><strong>Optimize for Readability<\/strong>: Group similar metrics, add descriptive titles, and configure tooltips to make the dashboard intuitive and easy to read.<\/li>\n\n\n\n<li><strong>Save and Reuse<\/strong>: Once your dashboard is configured, save it as a template for use on other servers or applications.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"398\" src=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-25-1024x398.png\" alt=\"\" class=\"wp-image-2300\" srcset=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-25-1024x398.png 1024w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-25-300x117.png 300w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-25-768x298.png 768w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-25-1536x597.png 1536w, https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-25-2048x796.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-cyan-bluish-gray-color has-alpha-channel-opacity has-cyan-bluish-gray-background-color has-background is-style-wide\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>In this post, we explored key Node Exporter metrics and how to use them to build an effective server monitoring dashboard in Grafana. By visualizing metrics like CPU, memory, disk usage, and network traffic, you gain powerful insights into your server\u2019s health and performance. This setup not only provides real-time visibility but also helps you proactively manage resources by setting up alerts.<\/p>\n\n\n\n<p>In future posts, you could expand by adding custom application metrics or integrating additional services, such as MySQL or Apache, to monitor every part of your stack.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"json\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n  \"annotations\": {\n    \"list\": [\n      {\n        \"builtIn\": 1,\n        \"datasource\": {\n          \"type\": \"grafana\",\n          \"uid\": \"-- Grafana --\"\n        },\n        \"enable\": true,\n        \"hide\": true,\n        \"iconColor\": \"rgba(0, 211, 255, 1)\",\n        \"name\": \"Annotations &amp; Alerts\",\n        \"type\": \"dashboard\"\n      }\n    ]\n  },\n  \"editable\": true,\n  \"fiscalYearStartMonth\": 0,\n  \"graphTooltip\": 0,\n  \"id\": 2,\n  \"links\": [],\n  \"panels\": [\n    {\n      \"datasource\": {\n        \"uid\": \"be3saso1d6874f\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              }\n            ]\n          },\n          \"unit\": \"d\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 3,\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"id\": 8,\n      \"options\": {\n        \"colorMode\": \"value\",\n        \"graphMode\": \"area\",\n        \"justifyMode\": \"auto\",\n        \"orientation\": \"auto\",\n        \"percentChangeColorMode\": \"standard\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showPercentChange\": false,\n        \"textMode\": \"auto\",\n        \"wideLayout\": true\n      },\n      \"pluginVersion\": \"11.3.0\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"(time() - node_boot_time_seconds) \/ 3600 \/ 24\",\n          \"legendFormat\": \"__auto\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"System Uptime\",\n      \"type\": \"stat\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"be3saso1d6874f\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"orange\",\n                \"value\": 50\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 3,\n        \"x\": 3,\n        \"y\": 0\n      },\n      \"id\": 3,\n      \"options\": {\n        \"minVizHeight\": 75,\n        \"minVizWidth\": 75,\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"sizing\": \"auto\"\n      },\n      \"pluginVersion\": \"11.3.0\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"100 - (avg by (instance) (irate(node_cpu_seconds_total{mode=\\\"idle\\\"}[5m])) * 100)\",\n          \"legendFormat\": \"__auto\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"CPU Usage Rate (5m)\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"be3saso1d6874f\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"orange\",\n                \"value\": 70\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 3,\n        \"x\": 6,\n        \"y\": 0\n      },\n      \"id\": 4,\n      \"options\": {\n        \"minVizHeight\": 75,\n        \"minVizWidth\": 75,\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"sizing\": \"auto\"\n      },\n      \"pluginVersion\": \"11.3.0\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"100 * (1 - node_memory_MemAvailable_bytes \/ node_memory_MemTotal_bytes)\",\n          \"legendFormat\": \"__auto\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Memory Usage Rate\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"be3saso1d6874f\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\"\n          },\n          \"mappings\": [],\n          \"max\": 100,\n          \"min\": 0,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"orange\",\n                \"value\": 70\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 90\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 3,\n        \"x\": 9,\n        \"y\": 0\n      },\n      \"id\": 5,\n      \"options\": {\n        \"minVizHeight\": 75,\n        \"minVizWidth\": 75,\n        \"orientation\": \"auto\",\n        \"reduceOptions\": {\n          \"calcs\": [\n            \"lastNotNull\"\n          ],\n          \"fields\": \"\",\n          \"values\": false\n        },\n        \"showThresholdLabels\": false,\n        \"showThresholdMarkers\": true,\n        \"sizing\": \"auto\"\n      },\n      \"pluginVersion\": \"11.3.0\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"(node_filesystem_size_bytes{mountpoint=\\\"\/\\\"} - node_filesystem_avail_bytes{mountpoint=\\\"\/\\\"}) \\n\/ node_filesystem_size_bytes{mountpoint=\\\"\/\\\"} * 100\",\n          \"legendFormat\": \"__auto\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Disk Usage - Root (\/)\",\n      \"type\": \"gauge\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"be3saso1d6874f\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": true,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"fillOpacity\": 80,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineWidth\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"min\": -50000,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"Bps\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Bytes Received\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.transform\",\n                \"value\": \"negative-Y\"\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 8,\n        \"w\": 12,\n        \"x\": 12,\n        \"y\": 0\n      },\n      \"id\": 9,\n      \"options\": {\n        \"barRadius\": 0,\n        \"barWidth\": 0.97,\n        \"fullHighlight\": false,\n        \"groupWidth\": 0.7,\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"orientation\": \"auto\",\n        \"showValue\": \"auto\",\n        \"stacking\": \"none\",\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        },\n        \"xTickLabelRotation\": 0,\n        \"xTickLabelSpacing\": 100\n      },\n      \"pluginVersion\": \"11.3.0\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"rate(node_network_transmit_bytes_total{device=\\\"eth0\\\"}[5m])\",\n          \"format\": \"time_series\",\n          \"instant\": false,\n          \"legendFormat\": \"Bytes Transmitted\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"be3saso1d6874f\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"rate(node_network_receive_bytes_total{device=\\\"eth0\\\"}[5m])\",\n          \"hide\": false,\n          \"instant\": false,\n          \"legendFormat\": \"Bytes Received\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Network Traffic (kB\/s)\",\n      \"type\": \"barchart\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"be3saso1d6874f\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"thresholds\",\n            \"seriesBy\": \"last\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"hue\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineStyle\": {\n              \"fill\": \"solid\"\n            },\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"displayName\": \"MemoryUsage%\",\n          \"fieldMinMax\": false,\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 5\n      },\n      \"id\": 1,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"timezone\": [\n          \"browser\"\n        ],\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.0\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"be3saso1d6874f\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"100 * (1 - node_memory_MemAvailable_bytes \/ node_memory_MemTotal_bytes)\",\n          \"hide\": false,\n          \"instant\": false,\n          \"legendFormat\": \"__auto\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Memory Usage History (%)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"be3saso1d6874f\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": true,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"fillOpacity\": 80,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"lineWidth\": 1,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"min\": -5,\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"KBs\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Read Throughput\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"custom.transform\",\n                \"value\": \"negative-Y\"\n              },\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"light-blue\",\n                  \"mode\": \"fixed\"\n                }\n              },\n              {\n                \"id\": \"displayName\",\n                \"value\": \"Read Throughput\"\n              }\n            ]\n          },\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"Write Throughput\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"purple\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 12,\n        \"y\": 8\n      },\n      \"id\": 7,\n      \"options\": {\n        \"barRadius\": 0,\n        \"barWidth\": 0.97,\n        \"fullHighlight\": false,\n        \"groupWidth\": 0.7,\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"orientation\": \"auto\",\n        \"showValue\": \"auto\",\n        \"stacking\": \"normal\",\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        },\n        \"xTickLabelRotation\": 0,\n        \"xTickLabelSpacing\": 100\n      },\n      \"pluginVersion\": \"11.3.0\",\n      \"targets\": [\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"be3saso1d6874f\"\n          },\n          \"editorMode\": \"code\",\n          \"exemplar\": false,\n          \"expr\": \"rate(node_disk_read_bytes_total{device=\\\"vda\\\"}[5m]) \/ 1024\",\n          \"hide\": false,\n          \"instant\": false,\n          \"interval\": \"\",\n          \"legendFormat\": \"Read Throughput\",\n          \"range\": true,\n          \"refId\": \"A\"\n        },\n        {\n          \"datasource\": {\n            \"type\": \"prometheus\",\n            \"uid\": \"be3saso1d6874f\"\n          },\n          \"editorMode\": \"code\",\n          \"expr\": \"rate(node_disk_written_bytes_total{device=\\\"vda\\\"}[5m]) \/ 1024\",\n          \"hide\": false,\n          \"instant\": false,\n          \"legendFormat\": \"Write Throughput\",\n          \"range\": true,\n          \"refId\": \"B\"\n        }\n      ],\n      \"title\": \"Disk I\/O Throughput (kB\/s)\",\n      \"type\": \"barchart\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"be3saso1d6874f\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 0,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"auto\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"ms\"\n        },\n        \"overrides\": [\n          {\n            \"matcher\": {\n              \"id\": \"byName\",\n              \"options\": \"vda I\/O Time (ms)\"\n            },\n            \"properties\": [\n              {\n                \"id\": \"color\",\n                \"value\": {\n                  \"fixedColor\": \"orange\",\n                  \"mode\": \"fixed\"\n                }\n              }\n            ]\n          }\n        ]\n      },\n      \"gridPos\": {\n        \"h\": 7,\n        \"w\": 6,\n        \"x\": 18,\n        \"y\": 8\n      },\n      \"id\": 6,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.0\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"rate(node_disk_io_time_seconds_total{device=\\\"vda\\\"}[5m]) * 1000\",\n          \"legendFormat\": \"vda I\/O Time (ms)\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"Disk I\/O Time (ms)\",\n      \"type\": \"timeseries\"\n    },\n    {\n      \"datasource\": {\n        \"type\": \"prometheus\",\n        \"uid\": \"be3saso1d6874f\"\n      },\n      \"fieldConfig\": {\n        \"defaults\": {\n          \"color\": {\n            \"mode\": \"palette-classic\"\n          },\n          \"custom\": {\n            \"axisBorderShow\": false,\n            \"axisCenteredZero\": false,\n            \"axisColorMode\": \"text\",\n            \"axisLabel\": \"\",\n            \"axisPlacement\": \"auto\",\n            \"barAlignment\": 0,\n            \"barWidthFactor\": 0.6,\n            \"drawStyle\": \"line\",\n            \"fillOpacity\": 10,\n            \"gradientMode\": \"none\",\n            \"hideFrom\": {\n              \"legend\": false,\n              \"tooltip\": false,\n              \"viz\": false\n            },\n            \"insertNulls\": false,\n            \"lineInterpolation\": \"linear\",\n            \"lineWidth\": 1,\n            \"pointSize\": 5,\n            \"scaleDistribution\": {\n              \"type\": \"linear\"\n            },\n            \"showPoints\": \"never\",\n            \"spanNulls\": false,\n            \"stacking\": {\n              \"group\": \"A\",\n              \"mode\": \"none\"\n            },\n            \"thresholdsStyle\": {\n              \"mode\": \"off\"\n            }\n          },\n          \"displayName\": \"CpuUsage%\",\n          \"mappings\": [],\n          \"thresholds\": {\n            \"mode\": \"absolute\",\n            \"steps\": [\n              {\n                \"color\": \"green\",\n                \"value\": null\n              },\n              {\n                \"color\": \"red\",\n                \"value\": 80\n              }\n            ]\n          },\n          \"unit\": \"percent\"\n        },\n        \"overrides\": []\n      },\n      \"gridPos\": {\n        \"h\": 5,\n        \"w\": 12,\n        \"x\": 0,\n        \"y\": 10\n      },\n      \"id\": 2,\n      \"options\": {\n        \"legend\": {\n          \"calcs\": [],\n          \"displayMode\": \"list\",\n          \"placement\": \"bottom\",\n          \"showLegend\": true\n        },\n        \"tooltip\": {\n          \"mode\": \"single\",\n          \"sort\": \"none\"\n        }\n      },\n      \"pluginVersion\": \"11.3.0\",\n      \"targets\": [\n        {\n          \"editorMode\": \"code\",\n          \"expr\": \"100 - (avg by (instance) (irate(node_cpu_seconds_total{mode=\\\"idle\\\"}[5m])) * 100)\",\n          \"legendFormat\": \"__auto\",\n          \"range\": true,\n          \"refId\": \"A\"\n        }\n      ],\n      \"title\": \"CPU Usage History(%)\",\n      \"type\": \"timeseries\"\n    }\n  ],\n  \"preload\": false,\n  \"schemaVersion\": 40,\n  \"tags\": [],\n  \"templating\": {\n    \"list\": []\n  },\n  \"time\": {\n    \"from\": \"now-6h\",\n    \"to\": \"now\"\n  },\n  \"timepicker\": {},\n  \"timezone\": \"browser\",\n  \"title\": \"Linux-01 Monitor\",\n  \"uid\": \"ce3stlaydciyof\",\n  \"version\": 29,\n  \"weekStart\": \"\"\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>In Part 2, we set up Node Exporter and Prometheus to gather and store metrics from our Linux server. In this post, we\u2019ll focus on using Grafana to create meaningful, real-time dashboards from those metrics, allowing you to monitor your server\u2019s performance at a glance. Understanding Key Node Exporter Metrics Node Exporter collects a wide [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[63],"tags":[65,64],"class_list":["post-2248","post","type-post","status-publish","format-standard","hentry","category-monitoringstack","tag-grafana","tag-prometheus"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Monitoring Stack \u2013 Part 3: Visualizing Server Metrics with Grafana Dashboards - \u6781\u7b80IT\uff5cSimpleIT<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Monitoring Stack \u2013 Part 3: Visualizing Server Metrics with Grafana Dashboards - \u6781\u7b80IT\uff5cSimpleIT\" \/>\n<meta property=\"og:description\" content=\"In Part 2, we set up Node Exporter and Prometheus to gather and store metrics from our Linux server. In this post, we\u2019ll focus on using Grafana to create meaningful, real-time dashboards from those metrics, allowing you to monitor your server\u2019s performance at a glance. Understanding Key Node Exporter Metrics Node Exporter collects a wide [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/\" \/>\n<meta property=\"og:site_name\" content=\"\u6781\u7b80IT\uff5cSimpleIT\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-13T08:59:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-09T02:36:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2964\" \/>\n\t<meta property=\"og:image:height\" content=\"1312\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ruian Ding\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ruian Ding\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/\"},\"author\":{\"name\":\"Ruian Ding\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b\"},\"headline\":\"Monitoring Stack \u2013 Part 3: Visualizing Server Metrics with Grafana Dashboards\",\"datePublished\":\"2024-11-13T08:59:38+00:00\",\"dateModified\":\"2026-01-09T02:36:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/\"},\"wordCount\":948,\"publisher\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b\"},\"image\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12-1024x453.png\",\"keywords\":[\"Grafana\",\"Prometheus\"],\"articleSection\":[\"MonitoringStack\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/\",\"url\":\"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/\",\"name\":\"Monitoring Stack \u2013 Part 3: Visualizing Server Metrics with Grafana Dashboards - \u6781\u7b80IT\uff5cSimpleIT\",\"isPartOf\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12-1024x453.png\",\"datePublished\":\"2024-11-13T08:59:38+00:00\",\"dateModified\":\"2026-01-09T02:36:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/#primaryimage\",\"url\":\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12.png\",\"contentUrl\":\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12.png\",\"width\":2964,\"height\":1312},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.ruianding.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Monitoring Stack \u2013 Part 3: Visualizing Server Metrics with Grafana Dashboards\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/#website\",\"url\":\"https:\/\/www.ruianding.com\/blog\/\",\"name\":\"Ruian's Tech Troubleshooting Toolbox\",\"description\":\"Debug the World.\",\"publisher\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b\"},\"alternateName\":\"\u4e01\u777f\u5b89\u7684\u6280\u672f\u5206\u4eab\u535a\u5ba2\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.ruianding.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b\",\"name\":\"Ruian Ding\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2023\/05\/logo.png\",\"contentUrl\":\"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2023\/05\/logo.png\",\"width\":284,\"height\":284,\"caption\":\"Ruian Ding\"},\"logo\":{\"@id\":\"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"I am currently a Support Specialist at NIO, focusing on cloud-related issues for NIO Power. Previously, at Microsoft Entra ID, I specialized in identity and access management (IAM), including device registration, Windows Hello for Business (WHfB), multi-factor authentication (MFA), and single sign-on (SSO). In addition to my core expertise, I have a strong foundation in Active Directory, Servers, Cloud Computing, Network Administration, and Front-end Web Development. This diverse technical skill set enables me to effectively handle a wide range of challenges in a fast-paced IT environment.\",\"sameAs\":[\"https:\/\/www.ruianding.com\"],\"url\":\"https:\/\/www.ruianding.com\/blog\/author\/ruiand\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Monitoring Stack \u2013 Part 3: Visualizing Server Metrics with Grafana Dashboards - \u6781\u7b80IT\uff5cSimpleIT","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/","og_locale":"en_US","og_type":"article","og_title":"Monitoring Stack \u2013 Part 3: Visualizing Server Metrics with Grafana Dashboards - \u6781\u7b80IT\uff5cSimpleIT","og_description":"In Part 2, we set up Node Exporter and Prometheus to gather and store metrics from our Linux server. In this post, we\u2019ll focus on using Grafana to create meaningful, real-time dashboards from those metrics, allowing you to monitor your server\u2019s performance at a glance. Understanding Key Node Exporter Metrics Node Exporter collects a wide [&hellip;]","og_url":"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/","og_site_name":"\u6781\u7b80IT\uff5cSimpleIT","article_published_time":"2024-11-13T08:59:38+00:00","article_modified_time":"2026-01-09T02:36:44+00:00","og_image":[{"width":2964,"height":1312,"url":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12.png","type":"image\/png"}],"author":"Ruian Ding","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Ruian Ding","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/#article","isPartOf":{"@id":"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/"},"author":{"name":"Ruian Ding","@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b"},"headline":"Monitoring Stack \u2013 Part 3: Visualizing Server Metrics with Grafana Dashboards","datePublished":"2024-11-13T08:59:38+00:00","dateModified":"2026-01-09T02:36:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/"},"wordCount":948,"publisher":{"@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b"},"image":{"@id":"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12-1024x453.png","keywords":["Grafana","Prometheus"],"articleSection":["MonitoringStack"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/","url":"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/","name":"Monitoring Stack \u2013 Part 3: Visualizing Server Metrics with Grafana Dashboards - \u6781\u7b80IT\uff5cSimpleIT","isPartOf":{"@id":"https:\/\/www.ruianding.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/#primaryimage"},"image":{"@id":"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12-1024x453.png","datePublished":"2024-11-13T08:59:38+00:00","dateModified":"2026-01-09T02:36:44+00:00","breadcrumb":{"@id":"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/#primaryimage","url":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12.png","contentUrl":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2024\/11\/image-12.png","width":2964,"height":1312},{"@type":"BreadcrumbList","@id":"https:\/\/www.ruianding.com\/blog\/monitoring-stack-part-3-visualizing-server-metrics-with-grafana-dashboards\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.ruianding.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Monitoring Stack \u2013 Part 3: Visualizing Server Metrics with Grafana Dashboards"}]},{"@type":"WebSite","@id":"https:\/\/www.ruianding.com\/blog\/#website","url":"https:\/\/www.ruianding.com\/blog\/","name":"Ruian's Tech Troubleshooting Toolbox","description":"Debug the World.","publisher":{"@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b"},"alternateName":"\u4e01\u777f\u5b89\u7684\u6280\u672f\u5206\u4eab\u535a\u5ba2","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.ruianding.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/440d88575b7dc819a4cefc8c4199db3b","name":"Ruian Ding","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2023\/05\/logo.png","contentUrl":"https:\/\/www.ruianding.com\/blog\/wp-content\/uploads\/2023\/05\/logo.png","width":284,"height":284,"caption":"Ruian Ding"},"logo":{"@id":"https:\/\/www.ruianding.com\/blog\/#\/schema\/person\/image\/"},"description":"I am currently a Support Specialist at NIO, focusing on cloud-related issues for NIO Power. Previously, at Microsoft Entra ID, I specialized in identity and access management (IAM), including device registration, Windows Hello for Business (WHfB), multi-factor authentication (MFA), and single sign-on (SSO). In addition to my core expertise, I have a strong foundation in Active Directory, Servers, Cloud Computing, Network Administration, and Front-end Web Development. This diverse technical skill set enables me to effectively handle a wide range of challenges in a fast-paced IT environment.","sameAs":["https:\/\/www.ruianding.com"],"url":"https:\/\/www.ruianding.com\/blog\/author\/ruiand\/"}]}},"_links":{"self":[{"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/posts\/2248","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/comments?post=2248"}],"version-history":[{"count":24,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/posts\/2248\/revisions"}],"predecessor-version":[{"id":2991,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/posts\/2248\/revisions\/2991"}],"wp:attachment":[{"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/media?parent=2248"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/categories?post=2248"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ruianding.com\/blog\/wp-json\/wp\/v2\/tags?post=2248"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}