{"id":536,"date":"2026-10-08T10:30:00","date_gmt":"2026-10-08T08:30:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/?page_id=536"},"modified":"2026-09-25T15:07:52","modified_gmt":"2026-09-25T13:07:52","slug":"bare-metal-performance-diagnostics-prometheus-grafana-dashboard","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/","title":{"rendered":"Bare-Metal Performance Diagnostics: Prometheus &amp; Grafana Dashboard for Raspberry Pi"},"content":{"rendered":"<h2>Architectural Overview: Single-Board Hardware Vulnerabilities<\/h2>\n<p>Bare-metal ARM single-board computers such as the Raspberry Pi 4 and 5 operate under tight thermal and I\/O constraints. Sustained container workloads, frequent database write cycles, and intense network throughput frequently trigger silent hardware degradation. High SoC temperatures induce dynamic thermal throttling via the Broadcom firmware, reducing ARM clock frequencies without logging explicit errors to user application spaces. Similarly, continuous random write operations on MicroSD cards or USB-connected SSDs lead to flash block exhaustion, read\/write I\/O bottlenecks, and eventual kernel filesystem corruption.<\/p>\n<p>Implementing a <strong>Bare-Metal Performance Diagnostics Pipeline<\/strong> utilizing <strong>Prometheus<\/strong> and <strong>Grafana<\/strong> transforms opaque hardware states into observable, time-series metrics. By combining the standard <code>node_exporter<\/code> daemon with a specialized custom textfile collector script, critical Raspberry Pi bare-metal indicators can be scraped every 15 seconds, evaluated for threshold violations, and visualized in real-time dashboards. Those indicators include SoC core temperatures, under-voltage flags, clock frequencies, RAM saturation, and storage I\/O wait times; the values supplied by <code>vcgencmd<\/code> are refreshed once per minute by the scheduled collector script.<\/p>\n<figure class=\"lw-diagram\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/rpi-prometheus-grafana-pipeline-en.png\" width=\"1120\" height=\"470\" alt=\"Data flow from the vcgencmd readings through the textfile collector and Node Exporter to Prometheus and Grafana\"><figcaption>Data flow of the diagnostics pipeline: <code>vcgencmd<\/code> values reach Grafana via the textfile collector, Node Exporter and Prometheus \u2014 and trigger an alert above 75 \u00b0C or when the throttling bitmask is non-zero.<\/figcaption><\/figure>\n<h2>Step-by-Step Implementation Guide<\/h2>\n<h3>Step 1: Deploying Node Exporter and the Raspberry Pi Textfile Collector<\/h3>\n<p>To capture standard Linux kernel telemetry alongside proprietary Broadcom hardware statistics, install <code>node_exporter<\/code> and create a dedicated directory for custom metric textfiles:<\/p>\n<pre><code>apt update &amp;&amp; apt install -y prometheus-node-exporter\nmkdir -p \/var\/lib\/node_exporter\/textfile_collector\nchmod 755 \/var\/lib\/node_exporter\/textfile_collector<\/code><\/pre>\n<p>Create a custom bash script at <code>\/opt\/scripts\/rpi-hardware-metrics.sh<\/code> to extract SoC temperature, core voltage, and hardware throttling flags using <code>vcgencmd<\/code>:<\/p>\n<pre><code>#!\/usr\/bin\/env bash\n# \/opt\/scripts\/rpi-hardware-metrics.sh\n# Extracts bare-metal SoC metrics for Prometheus textfile collector\n\nTEXTFILE_DIR=\"\/var\/lib\/node_exporter\/textfile_collector\"\nTMP_FILE=\"$TEXTFILE_DIR\/rpi_metrics.prom.$$\"\nFINAL_FILE=\"$TEXTFILE_DIR\/rpi_metrics.prom\"\n\n# 1. Extract CPU Core Temperature (degrees Celsius)\nTEMP_C=$(vcgencmd measure_temp | grep -oE '[0-9]+([.][0-9]+)?')\necho \"# HELP rpi_soc_temperature_celsius Broadcom SoC Core Temperature\" &gt; \"$TMP_FILE\"\necho \"# TYPE rpi_soc_temperature_celsius gauge\" &gt;&gt; \"$TMP_FILE\"\necho \"rpi_soc_temperature_celsius $TEMP_C\" &gt;&gt; \"$TMP_FILE\"\n\n# 2. Extract SoC Core Voltage (Volts)\nVOLT_V=$(vcgencmd measure_volts core | grep -oE '[0-9]+([.][0-9]+)?')\necho \"# HELP rpi_soc_core_voltage_volts Broadcom SoC Core Voltage\" &gt;&gt; \"$TMP_FILE\"\necho \"# TYPE rpi_soc_core_voltage_volts gauge\" &gt;&gt; \"$TMP_FILE\"\necho \"rpi_soc_core_voltage_volts $VOLT_V\" &gt;&gt; \"$TMP_FILE\"\n\n# 3. Extract Throttling Hex Code as integer bitmask\nTHROTTLE_HEX=$(vcgencmd get_throttled | cut -d'=' -f2)\nTHROTTLE_DEC=$((THROTTLE_HEX))\necho \"# HELP rpi_soc_throttled_bitmask Bitmask representing under-voltage or thermal throttling flags\" &gt;&gt; \"$TMP_FILE\"\necho \"# TYPE rpi_soc_throttled_bitmask gauge\" &gt;&gt; \"$TMP_FILE\"\necho \"rpi_soc_throttled_bitmask $THROTTLE_DEC\" &gt;&gt; \"$TMP_FILE\"\n\nmv \"$TMP_FILE\" \"$FINAL_FILE\"<\/code><\/pre>\n<p>Make the script executable and schedule execution every minute via crontab:<\/p>\n<pre><code>chmod +x \/opt\/scripts\/rpi-hardware-metrics.sh\n(crontab -l 2&gt;\/dev\/null; echo \"* * * * * \/bin\/bash \/opt\/scripts\/rpi-hardware-metrics.sh &gt;\/dev\/null 2&gt;&amp;1\") | crontab -<\/code><\/pre>\n<h3>Step 2: Reconfiguring Node Exporter Systemd Service<\/h3>\n<p>Modify the systemd service file for <code>node_exporter<\/code> to instruct it to read metrics from the custom textfile directory:<\/p>\n<pre><code># \/etc\/default\/prometheus-node-exporter\nARGS=\"--collector.textfile.directory=\/var\/lib\/node_exporter\/textfile_collector --collector.filesystem.mount-points-exclude='^\/(dev|proc|sys|run)($|\/)'\"<\/code><\/pre>\n<p>Restart the service to apply the flags: <code>systemctl restart prometheus-node-exporter<\/code>.<\/p>\n<h3>Step 3: Configuring the Prometheus Time-Series Scraper<\/h3>\n<p>Deploy Prometheus using Docker Compose with <code>network_mode: host<\/code> and configure a 15-second scraping interval pointing to the local node exporter target:<\/p>\n<pre><code># \/opt\/containers\/prometheus\/prometheus.yml\nglobal:\n  scrape_interval: 15s\n  evaluation_interval: 15s\n\nscrape_configs:\n  - job_name: 'raspberry_pi_baremetal'\n    static_configs:\n      - targets: ['127.0.0.1:9100']\n        labels:\n          instance: 'rpi5-homelab'<\/code><\/pre>\n<h3>Step 4: Deploying Grafana and Importing Bare-Metal Panels<\/h3>\n<p>Launch Grafana via Docker Compose, also with <code>network_mode: host<\/code>, connect the Prometheus database (<code>http:\/\/127.0.0.1:9090<\/code>) as the default data source, and create dashboard panels utilizing the following PromQL queries:<\/p>\n<ul>\n<li><strong>SoC Core Temperature Panel:<\/strong> <code>rpi_soc_temperature_celsius<\/code> (Alert threshold configured at &gt; 75\u00b0C).<\/li>\n<li><strong>Under-Voltage &amp; Throttling Alert:<\/strong> <code>rpi_soc_throttled_bitmask &gt; 0<\/code> (Indicates inadequate power supplies or severe overheating, now or at any point since the last boot; stays active until the next reboot).<\/li>\n<li><strong>Storage I\/O Utilization:<\/strong> <code>rate(node_disk_io_time_seconds_total[1m]) * 100<\/code> (Detects flash controller bottlenecks and worn storage blocks).<\/li>\n<li><strong>RAM Availability Rate:<\/strong> <code>(node_memory_MemAvailable_bytes \/ node_memory_MemTotal_bytes) * 100<\/code>.<\/li>\n<\/ul>\n<h3>Step 5: Quality Assurance and Stress Testing<\/h3>\n<p>To confirm that the telemetry pipeline accurately captures hardware exhaustion, stress-testing validation must be performed:<\/p>\n<ol>\n<li><strong>Synthetic I\/O Stress Validation:<\/strong> Execute an intensive disk benchmark using <code>fio<\/code> (e.g., <code>fio --name=test --ioengine=libaio --rw=randwrite --bs=4k --size=1G<\/code>) and verify that the Grafana I\/O Wait panel shows real-time storage latency spikes.<\/li>\n<li><strong>Thermal Throttling Simulation:<\/strong> Stress all ARM CPU cores via <code>stress-ng --cpu 4 --timeout 120s<\/code> while monitoring <code>rpi_soc_temperature_celsius<\/code> in Prometheus to confirm accurate temperature tracking up to cooling fan activation thresholds.<\/li>\n<li><strong>Textfile Metric Parsing Audit:<\/strong> Execute <code>curl -s http:\/\/127.0.0.1:9100\/metrics | grep rpi_<\/code> in the terminal to verify that custom voltage and throttling metrics are cleanly exposed without formatting syntax errors.<\/li>\n<\/ol>\n<h2>Summary and Measurable Added Value<\/h2>\n<p><strong>What is achieved:<\/strong> Deployment of an autonomous bare-metal hardware diagnostic pipeline on Raspberry Pi hardware using Prometheus time-series scraping, custom SoC textfile collectors, and Grafana monitoring dashboards.<\/p>\n<p><strong>Resulting added value:<\/strong><\/p>\n<ul>\n<li><strong>Early Detection of Storage Failure:<\/strong> Continuous monitoring of disk I\/O wait times and flash wear allows preventative SD card or SSD replacement before catastrophic filesystem corruption occurs.<\/li>\n<li><strong>Prevention of Thermal Throttling:<\/strong> Real-time visibility into SoC temperatures and throttling bitmasks guarantees that containerized services run at maximum clock frequency without silent performance degradation.<\/li>\n<li><strong>Power Supply Quality Control:<\/strong> Immediate logging of under-voltage flags (bit 0, <code>bitmask 0x1<\/code>) identifies failing USB-C power adapters or excessive peripheral power draw before hardware crashes occur.<\/li>\n<\/ul>\n<div class=\"lw-faq\">\n<h2>Questions and answers<\/h2>\n<h3>Why does the throttling alert stay active until the next reboot after a single incident?<\/h3>\n<p>Because get_throttled returns two kinds of bits. The lower bits describe the current state, among them bit 0 for under-voltage and bit 2 for throttling. The bits from 16 upward record that the same thing has happened at some point since boot, and they stay set until the Raspberry Pi restarts. A brief voltage dip in the morning therefore yields something like 0x50000 (under-voltage and throttling have occurred), 327680 in decimal, and this value stays above zero for the rest of the day.<\/p>\n<p>For evaluation it pays to separate the two. PromQL supports the % operator, and <code>rpi_soc_throttled_bitmask % 16 &gt; 0<\/code> checks only the four lower bits, meaning the current state; <code>rpi_soc_throttled_bitmask &gt;= 65536<\/code> reports that something has happened since boot. Clearer still is to have the script write a separate metric for each bit.<\/p>\n<p>Then there is the script&#8217;s timing: it runs once a minute, and get_throttled only reports the state at that moment. Throttling lasting a few seconds between two runs does not show up in the lower bits, but it does in the bits from 16 upward. For brief under-voltage in particular, the recorded part is therefore the more reliable one.<\/p>\n<h3>Can Prometheus in a container reach the target 127.0.0.1:9100?<\/h3>\n<p>Only with network_mode: host. In a regular Docker network, 127.0.0.1 is the container itself, while node_exporter runs outside it directly on the host, so the target stays down permanently. The same applies to Grafana: if both containers share a Docker network, the data source address uses the name of the Prometheus service instead of 127.0.0.1.<\/p>\n<\/div>\n<div class=\"lw-quellen\">\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/prometheus.io\/docs\/introduction\/overview\/\" target=\"_blank\" rel=\"noopener noreferrer\">Prometheus documentation<\/a><\/li>\n<li><a href=\"https:\/\/grafana.com\/docs\/grafana\/latest\/\" target=\"_blank\" rel=\"noopener noreferrer\">Grafana documentation<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Technical tutorial on deploying a bare-metal performance diagnostic pipeline for Raspberry Pi using Prometheus, Grafana, and custom SoC textfile collectors.<\/p>\n","protected":false},"author":1,"featured_media":14088,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92630],"tags":[91144,91113,91294,91181,91219],"class_list":["post-536","post","type-post","status-publish","format-standard","hentry","category-tutorials-en-raspberry-pi","tag-devops","tag-homelab","tag-monitoring","tag-raspberry-pi","tag-tutorial"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Bare-Metal Performance Diagnostics: Prometheus &amp; Grafana Dashboard for Raspberry Pi | Lukas Wojcik<\/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.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bare-Metal Performance Diagnostics: Prometheus &amp; Grafana Dashboard for Raspberry Pi | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Technical tutorial on deploying a bare-metal performance diagnostic pipeline for Raspberry Pi using Prometheus, Grafana, and custom SoC textfile collectors.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-08T08:30:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-536-bare-metal-performance-diagnostics-p-g.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Bare-Metal Performance Diagnostics: Prometheus &amp; Grafana Dashboard for Raspberry Pi\",\"datePublished\":\"2026-10-08T08:30:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\\\/\"},\"wordCount\":886,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-536-bare-metal-performance-diagnostics-p-g.png\",\"keywords\":[\"DevOps\",\"Homelab\",\"Monitoring\",\"Raspberry Pi\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\\\/\",\"name\":\"Bare-Metal Performance Diagnostics: Prometheus &amp; Grafana Dashboard for Raspberry Pi | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-536-bare-metal-performance-diagnostics-p-g.png\",\"datePublished\":\"2026-10-08T08:30:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-536-bare-metal-performance-diagnostics-p-g.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/hero-536-bare-metal-performance-diagnostics-p-g.png\",\"width\":1200,\"height\":630,\"caption\":\"Bare-Metal Performance Diagnostics: Prometheus & Grafana Dashboard for Raspberry Pi\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/raspberry-pi\\\/tutorials-en-raspberry-pi\\\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bare-Metal Performance Diagnostics: Prometheus &amp; Grafana Dashboard for Raspberry Pi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.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.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Bare-Metal Performance Diagnostics: Prometheus &amp; Grafana Dashboard for Raspberry Pi | Lukas Wojcik","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.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/","og_locale":"en_US","og_type":"article","og_title":"Bare-Metal Performance Diagnostics: Prometheus &amp; Grafana Dashboard for Raspberry Pi | Lukas Wojcik","og_description":"Technical tutorial on deploying a bare-metal performance diagnostic pipeline for Raspberry Pi using Prometheus, Grafana, and custom SoC textfile collectors.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-10-08T08:30:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-536-bare-metal-performance-diagnostics-p-g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Bare-Metal Performance Diagnostics: Prometheus &amp; Grafana Dashboard for Raspberry Pi","datePublished":"2026-10-08T08:30:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/"},"wordCount":886,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-536-bare-metal-performance-diagnostics-p-g.png","keywords":["DevOps","Homelab","Monitoring","Raspberry Pi","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/","name":"Bare-Metal Performance Diagnostics: Prometheus &amp; Grafana Dashboard for Raspberry Pi | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-536-bare-metal-performance-diagnostics-p-g.png","datePublished":"2026-10-08T08:30:00+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-536-bare-metal-performance-diagnostics-p-g.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-536-bare-metal-performance-diagnostics-p-g.png","width":1200,"height":630,"caption":"Bare-Metal Performance Diagnostics: Prometheus & Grafana Dashboard for Raspberry Pi"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/raspberry-pi\/tutorials-en-raspberry-pi\/bare-metal-performance-diagnostics-prometheus-grafana-dashboard\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Bare-Metal Performance Diagnostics: Prometheus &amp; Grafana Dashboard for Raspberry Pi"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.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.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/536","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=536"}],"version-history":[{"count":6,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/536\/revisions"}],"predecessor-version":[{"id":21699,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/536\/revisions\/21699"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/14088"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=536"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=536"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=536"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}