{"id":4723,"date":"2025-12-13T11:36:14","date_gmt":"2025-12-13T11:36:14","guid":{"rendered":"https:\/\/www.it-react.com\/?p=4723"},"modified":"2025-12-13T16:16:14","modified_gmt":"2025-12-13T16:16:14","slug":"building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1","status":"publish","type":"post","link":"https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/","title":{"rendered":"Building a Scalable Monitoring Stack with Prometheus &amp; Grafana"},"content":{"rendered":"\n<p>I used to have a very simple monitoring strategy for my home lab: if the fans were spinning and the LEDs were blinking, everything was fine. If the room was quiet, I had a problem.<\/p>\n\n\n\n<p>While that approach has a certain rustic charm, it is terrible for uptime and even worse for troubleshooting. You can&#8217;t fix a performance bottleneck if you don&#8217;t have the data to prove it exists. &#8220;It feels slow&#8221; is not a metric.<\/p>\n\n\n\n<p>Today, we are going to fix that. We are going to build a professional-grade monitoring stack from scratch. We will use&nbsp;<strong>Prometheus<\/strong>&nbsp;(to store data),&nbsp;<strong>Grafana<\/strong>&nbsp;(to visualize it), and&nbsp;<strong>Exporters<\/strong>&nbsp;(to collect it).<\/p>\n\n\n\n<p>And because I like to keep my host OS clean, we are going to run the whole stack in Docker.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Architecture: Hub and Spoke<\/h3>\n\n\n\n<p>Before we touch the terminal, let\u2019s understand what we are building. We are designing this to be scalable from day one.<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>The Hub:<\/strong> This is our central VM running Prometheus and Grafana.<\/li>\n\n\n\n<li><strong>The Spokes:<\/strong> These are the agents (Node Exporters) running on every server we want to monitor.<\/li>\n<\/ol>\n\n\n\n<p>For this tutorial, we will set up the Hub and monitor the Hub itself, plus an external Windows server to prove that this setup is hybrid-ready.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Section 1: The Environment<\/h3>\n\n\n\n<p>I am starting with a clean installation of <strong>Ubuntu Server<\/strong>. First, let&#8217;s get our tools installed. While there is a newer &#8220;Docker Compose V2&#8221;, on standard Ubuntu repositories, the classic <strong>Docker Compose V1<\/strong> is incredibly stable and robust.<\/p>\n\n\n\n<p>Let&#8217;s install Docker and the Compose tool:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install docker.io docker-compose<\/code><\/pre>\n\n\n\n<p>We also need to make sure our current user can run Docker commands without typing <code>sudo<\/code> every time.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo usermod -aG docker $USER\nnewgrp docker<\/code><\/pre>\n\n\n\n<p>To verify we are ready, let&#8217;s check the version:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker-compose version\n# Output: docker-compose version 1.29.2, build unknown<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Section 2: Structure is Everything<\/h3>\n\n\n\n<p>If there is one thing I\u2019ve learned after years of managing servers, it\u2019s that &#8220;temporary&#8221; setups tend to become permanent. Dumping config files in your home folder is a nightmare waiting to happen when you need to debug this six months from now.<\/p>\n\n\n\n<p>Let\u2019s create a proper, dedicated workspace.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p ~\/ops\/monitoring\/prometheus\nmkdir -p ~\/ops\/monitoring\/grafana_data\ncd ~\/ops\/monitoring<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Section 3: The &#8220;Brain&#8221; Configuration (Prometheus)<\/h3>\n\n\n\n<p>Prometheus works on a &#8220;pull&#8221; model. It wakes up every few seconds and reaches out to specific targets to grab data. We need to tell it where to look.<\/p>\n\n\n\n<p>Create the configuration file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nano prometheus\/prometheus.yml<\/code><\/pre>\n\n\n\n<p>Paste the following. We are defining two jobs: one to monitor the Linux Hub itself, and one for a future Windows machine.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>global:\n  scrape_interval: 15s\n\nscrape_configs:\n  # Job 1: Monitor Prometheus itself\n  - job_name: 'prometheus'\n    static_configs:\n      - targets: &#91;'localhost:9090']\n\n  # Job 2: Monitor our Linux Host (The Hub)\n  - job_name: 'node_exporter'\n    static_configs:\n      - targets: &#91;'node_exporter:9100']\n\n  # Job 3: Monitor an external Windows Server\n  - job_name: 'windows-exporter'\n    static_configs:\n      - targets: &#91;'192.168.1.15:9182'] # &lt;--- Replace with your Windows IP<\/code><\/pre>\n\n\n\n<p><strong>Note:<\/strong> For the Linux job, we use the hostname <code>node_exporter<\/code>. Since we are running inside Docker, Prometheus resolves the container name automatically.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Section 4: The Stack Definition<\/h3>\n\n\n\n<p>Now, let\u2019s define our infrastructure as code. Create the <code>docker-compose.yml<\/code> file in your root folder (<code>~\/ops\/monitoring<\/code>).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nano docker-compose.yml<\/code><\/pre>\n\n\n\n<p>Here is the full stack definition:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>version: '3.8'\n\nservices:\n  prometheus:\n    image: prom\/prometheus:latest\n    container_name: prometheus\n    volumes:\n      - .\/prometheus\/prometheus.yml:\/etc\/prometheus\/prometheus.yml\n    ports:\n      - \"9090:9090\"\n    command:\n      - '--config.file=\/etc\/prometheus\/prometheus.yml'\n    networks:\n      - monitoring_net\n\n  node_exporter:\n    image: prom\/node-exporter:latest\n    container_name: node_exporter\n    # We mount the HOST paths so the container can see the VM's metrics\n    volumes:\n      - \/proc:\/host\/proc:ro\n      - \/sys:\/host\/sys:ro\n      - \/:\/rootfs:ro\n    command:\n      - '--path.procfs=\/host\/proc'\n      - '--path.sysfs=\/host\/sys'\n      - '--collector.filesystem.mount-points-exclude=^\/(sys|proc|dev|host|etc)($$|\/)'\n    networks:\n      - monitoring_net\n\n  grafana:\n    image: grafana\/grafana:latest\n    container_name: grafana\n    ports:\n      - \"3000:3000\"\n    volumes:\n      - .\/grafana_data:\/var\/lib\/grafana\n    environment:\n      - GF_SECURITY_ADMIN_PASSWORD=admin\n    networks:\n      - monitoring_net\n\nnetworks:\n  monitoring_net:\n    driver: bridge<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Section 5: The &#8220;Oops&#8221; Moment (Troubleshooting)<\/h3>\n\n\n\n<p>Time to fire it up.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker-compose up -d<\/code><\/pre>\n\n\n\n<p>When I first ran this, I checked the status (<code>docker-compose ps<\/code>) and saw that Grafana had crashed with an <code>Exit 1<\/code> status.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker-compose ps\n# grafana    \/run.sh     Exit 1<\/code><\/pre>\n\n\n\n<p>When a container dies instantly, it\u2019s usually trying to tell us something. I checked the logs:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker-compose logs grafana<\/code><\/pre>\n\n\n\n<p>The error was clear: <code>GF_PATHS_DATA='\/var\/lib\/grafana' is not writable<\/code>. The Grafana container runs as user ID 472, but the folder I created was owned by my user. It didn&#8217;t have permission to write.<\/p>\n\n\n\n<p><strong>The Fix:<\/strong> We need to change the ownership of that folder to match the ID that Grafana expects.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chown -R 472:472 grafana_data\ndocker-compose restart grafana<\/code><\/pre>\n\n\n\n<p>Now, <code>docker-compose ps<\/code> shows everything as <strong>Up<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Section 6: Adding the Windows Agent<\/h3>\n\n\n\n<p>We added a Windows IP to our config in Section 3, but we need to actually set up the agent on that machine.<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Log into your Windows Server.<\/li>\n\n\n\n<li>Download the <strong><code>windows_exporter<\/code><\/strong> from <a href=\"https:\/\/github.com\/prometheus-community\/windows_exporter\/releases\" target=\"_blank\" rel=\"noreferrer noopener\">prometheus-community\/windows_exporter releases page<\/a>.<\/li>\n\n\n\n<li>Run it. It installs as a service and opens port <strong>9182<\/strong>. <em>(Check your Windows Firewall if connections fail).<\/em><\/li>\n\n\n\n<li>To verify it\u2019s working, open a browser on that Windows machine and go to <code>http:\/\/localhost:9182\/metrics<\/code>. If you see a wall of text describing your system, the agent is live.<\/li>\n<\/ol>\n\n\n\n<p>Now Prometheus is collecting data from both Linux and Windows. But we can&#8217;t see it yet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Section 7: Visualization (The Payoff)<\/h3>\n\n\n\n<p>This is where it all comes together. Open your browser and go to <code>http:\/\/&lt;YOUR-HUB-IP&gt;:3000<\/code>. Log in with <code>admin<\/code> \/ <code>admin<\/code>.<\/p>\n\n\n\n<p><strong>1. Connect the Data Source<\/strong> Go to <strong>Connections -> Add new connection -> Prometheus<\/strong>.<\/p>\n\n\n\n<p>In the URL field, type: <code>http:\/\/prometheus:9090<\/code><\/p>\n\n\n\n<p><strong>Do not use localhost.<\/strong> Grafana needs to talk to the Prometheus container name. Click <strong>Save &amp; Test<\/strong>.<\/p>\n\n\n\n<p><strong>2. Import the Linux Dashboard<\/strong> We don&#8217;t need to build graphs manually.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go to <strong>Dashboards -> New <strong>-><\/strong><\/strong> <strong>Import<\/strong>.<\/li>\n\n\n\n<li>Enter ID <strong>1860<\/strong> (Node Exporter Full).<\/li>\n\n\n\n<li>Click <strong>Load<\/strong>, select your Prometheus source, and <strong>Import<\/strong>.<\/li>\n\n\n\n<li><em>Result:<\/em> You now have a full view of your Linux Hub&#8217;s performance.<\/li>\n<\/ul>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69f29ae97cb0a&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"380\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/image-1-1024x380.png\" alt=\"\" class=\"wp-image-4740\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/image-1-1024x380.png 1024w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/image-1-300x111.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/image-1-768x285.png 768w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/image-1-1536x571.png 1536w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/image-1-2048x761.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<p><strong>3. Import the Windows Dashboard<\/strong> If you look for your Windows server in the previous dashboard, you won&#8217;t find it. Windows uses different metric names.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go to <strong>Import<\/strong> again.<\/li>\n\n\n\n<li>Enter ID 23942 (Windows Exporter Dashboard).<\/li>\n\n\n\n<li>Click <strong>Load<\/strong>, select your Prometheus source and <strong>Import<\/strong>.<\/li>\n<\/ul>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;69f29ae97cf02&quot;}\" data-wp-interactive=\"core\/image\" class=\"wp-block-image size-large wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"518\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on-async--click=\"actions.showLightbox\" data-wp-on-async--load=\"callbacks.setButtonStyles\" data-wp-on-async-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/image-2-1024x518.png\" alt=\"\" class=\"wp-image-4741\" srcset=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/image-2-1024x518.png 1024w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/image-2-300x152.png 300w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/image-2-768x388.png 768w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/image-2-1536x776.png 1536w, https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/image-2-2048x1035.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Enlarge\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on-async--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p>You have successfully gone from a blank terminal to a fully monitored hybrid infrastructure. You have a central Hub collecting data, and you have professional dashboards for both Linux and Windows.<\/p>\n\n\n\n<p>This setup is the foundation. From here, you can add alerts to Slack when disk space runs low, or add exporters for your Docker containers, databases, and websites. But for now, take a moment to enjoy the graphs. It beats staring at <code>htop<\/code>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I used to have a very simple monitoring strategy for my home lab: if the fans were spinning and the LEDs were blinking, everything was fine. If the room was quiet, I had a problem. While that approach has a certain rustic charm, it is terrible for uptime and even worse for troubleshooting. You can&#8217;t [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4726,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_FSMCFIC_featured_image_caption":"","_FSMCFIC_featured_image_nocaption":"","_FSMCFIC_featured_image_hide":"","footnotes":""},"categories":[7,62,1,8],"tags":[3,95,96],"class_list":["post-4723","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","category-network","category-uncategorized","category-windows","tag-linux","tag-monitoring","tag-prometheus"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Building a Scalable Monitoring Stack with Prometheus &amp; Grafana - IT-REACT<\/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.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building a Scalable Monitoring Stack with Prometheus &amp; Grafana - IT-REACT\" \/>\n<meta property=\"og:description\" content=\"I used to have a very simple monitoring strategy for my home lab: if the fans were spinning and the LEDs were blinking, everything was fine. If the room was quiet, I had a problem. While that approach has a certain rustic charm, it is terrible for uptime and even worse for troubleshooting. You can&#8217;t [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/\" \/>\n<meta property=\"og:site_name\" content=\"IT-REACT\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-13T11:36:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-13T16:16:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/ibrahim-boran-iYkqHp5cGQ4-unsplash-e1765479569619.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1080\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ioan Penu\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ioan Penu\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/12\\\/13\\\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/12\\\/13\\\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\\\/\"},\"author\":{\"name\":\"Ioan Penu\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#\\\/schema\\\/person\\\/bf08cffeb4b02ee6baff5d56ab17c8f0\"},\"headline\":\"Building a Scalable Monitoring Stack with Prometheus &amp; Grafana\",\"datePublished\":\"2025-12-13T11:36:14+00:00\",\"dateModified\":\"2025-12-13T16:16:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/12\\\/13\\\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\\\/\"},\"wordCount\":871,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#\\\/schema\\\/person\\\/bf08cffeb4b02ee6baff5d56ab17c8f0\"},\"image\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/12\\\/13\\\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.it-react.com\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/ibrahim-boran-iYkqHp5cGQ4-unsplash-e1765479569619.jpg\",\"keywords\":[\"Linux\",\"monitoring\",\"prometheus\"],\"articleSection\":{\"0\":\"Linux\",\"1\":\"Network\",\"3\":\"Windows\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/12\\\/13\\\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/12\\\/13\\\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\\\/\",\"url\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/12\\\/13\\\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\\\/\",\"name\":\"Building a Scalable Monitoring Stack with Prometheus &amp; Grafana - IT-REACT\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/12\\\/13\\\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/12\\\/13\\\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.it-react.com\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/ibrahim-boran-iYkqHp5cGQ4-unsplash-e1765479569619.jpg\",\"datePublished\":\"2025-12-13T11:36:14+00:00\",\"dateModified\":\"2025-12-13T16:16:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/12\\\/13\\\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/12\\\/13\\\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/12\\\/13\\\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.it-react.com\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/ibrahim-boran-iYkqHp5cGQ4-unsplash-e1765479569619.jpg\",\"contentUrl\":\"https:\\\/\\\/www.it-react.com\\\/wp-content\\\/uploads\\\/2025\\\/12\\\/ibrahim-boran-iYkqHp5cGQ4-unsplash-e1765479569619.jpg\",\"width\":1080,\"height\":540,\"caption\":\"Photo by Ibrahim Boran on Unsplash\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/index.php\\\/2025\\\/12\\\/13\\\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.it-react.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building a Scalable Monitoring Stack with Prometheus &amp; Grafana\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#website\",\"url\":\"https:\\\/\\\/www.it-react.com\\\/\",\"name\":\"it-react\",\"description\":\"Ctrl\u2022Alt\u2022Automate\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#\\\/schema\\\/person\\\/bf08cffeb4b02ee6baff5d56ab17c8f0\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.it-react.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.it-react.com\\\/#\\\/schema\\\/person\\\/bf08cffeb4b02ee6baff5d56ab17c8f0\",\"name\":\"Ioan Penu\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g\",\"caption\":\"Ioan Penu\"},\"logo\":{\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building a Scalable Monitoring Stack with Prometheus &amp; Grafana - IT-REACT","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.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/","og_locale":"en_US","og_type":"article","og_title":"Building a Scalable Monitoring Stack with Prometheus &amp; Grafana - IT-REACT","og_description":"I used to have a very simple monitoring strategy for my home lab: if the fans were spinning and the LEDs were blinking, everything was fine. If the room was quiet, I had a problem. While that approach has a certain rustic charm, it is terrible for uptime and even worse for troubleshooting. You can&#8217;t [&hellip;]","og_url":"https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/","og_site_name":"IT-REACT","article_published_time":"2025-12-13T11:36:14+00:00","article_modified_time":"2025-12-13T16:16:14+00:00","og_image":[{"width":1080,"height":540,"url":"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/ibrahim-boran-iYkqHp5cGQ4-unsplash-e1765479569619.jpg","type":"image\/jpeg"}],"author":"Ioan Penu","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Ioan Penu","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/#article","isPartOf":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/"},"author":{"name":"Ioan Penu","@id":"https:\/\/www.it-react.com\/#\/schema\/person\/bf08cffeb4b02ee6baff5d56ab17c8f0"},"headline":"Building a Scalable Monitoring Stack with Prometheus &amp; Grafana","datePublished":"2025-12-13T11:36:14+00:00","dateModified":"2025-12-13T16:16:14+00:00","mainEntityOfPage":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/"},"wordCount":871,"commentCount":0,"publisher":{"@id":"https:\/\/www.it-react.com\/#\/schema\/person\/bf08cffeb4b02ee6baff5d56ab17c8f0"},"image":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/ibrahim-boran-iYkqHp5cGQ4-unsplash-e1765479569619.jpg","keywords":["Linux","monitoring","prometheus"],"articleSection":{"0":"Linux","1":"Network","3":"Windows"},"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/","url":"https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/","name":"Building a Scalable Monitoring Stack with Prometheus &amp; Grafana - IT-REACT","isPartOf":{"@id":"https:\/\/www.it-react.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/#primaryimage"},"image":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/ibrahim-boran-iYkqHp5cGQ4-unsplash-e1765479569619.jpg","datePublished":"2025-12-13T11:36:14+00:00","dateModified":"2025-12-13T16:16:14+00:00","breadcrumb":{"@id":"https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/#primaryimage","url":"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/ibrahim-boran-iYkqHp5cGQ4-unsplash-e1765479569619.jpg","contentUrl":"https:\/\/www.it-react.com\/wp-content\/uploads\/2025\/12\/ibrahim-boran-iYkqHp5cGQ4-unsplash-e1765479569619.jpg","width":1080,"height":540,"caption":"Photo by Ibrahim Boran on Unsplash"},{"@type":"BreadcrumbList","@id":"https:\/\/www.it-react.com\/index.php\/2025\/12\/13\/building-a-scalable-monitoring-stack-with-prometheus-grafana-part-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.it-react.com\/"},{"@type":"ListItem","position":2,"name":"Building a Scalable Monitoring Stack with Prometheus &amp; Grafana"}]},{"@type":"WebSite","@id":"https:\/\/www.it-react.com\/#website","url":"https:\/\/www.it-react.com\/","name":"it-react","description":"Ctrl\u2022Alt\u2022Automate","publisher":{"@id":"https:\/\/www.it-react.com\/#\/schema\/person\/bf08cffeb4b02ee6baff5d56ab17c8f0"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.it-react.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.it-react.com\/#\/schema\/person\/bf08cffeb4b02ee6baff5d56ab17c8f0","name":"Ioan Penu","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g","caption":"Ioan Penu"},"logo":{"@id":"https:\/\/secure.gravatar.com\/avatar\/2a2a1b6be0f322a113eea11669895227e284c6091424d65be6c3c706c2822975?s=96&d=mm&r=g"}}]}},"_links":{"self":[{"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/posts\/4723","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/comments?post=4723"}],"version-history":[{"count":14,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/posts\/4723\/revisions"}],"predecessor-version":[{"id":4747,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/posts\/4723\/revisions\/4747"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/media\/4726"}],"wp:attachment":[{"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/media?parent=4723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/categories?post=4723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.it-react.com\/index.php\/wp-json\/wp\/v2\/tags?post=4723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}