<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Lorenzo Soligo - Elastic Observability Labs]]></title>
    <description><![CDATA[Trusted security news & research from the team at Elastic.]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Lorenzo Soligo - Elastic Observability Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltad972c1c27dbefc6/6a88d9782904ea5e8511d473/observability-labs-thumbnail.png</url>
      <link>https://www.elastic.co/observability-labs/author/lorenzo-soligo</link>
    </image>
    <link>https://www.elastic.co/observability-labs/author/lorenzo-soligo</link>
    <atom:link href="https://www.elastic.co/observability-labs/rss/author/lorenzo-soligo.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[en]]></language>
    <lastBuildDate>Mon, 14 Sep 2026 20:03:52 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Collecting rootless Podman logs with Elastic Agent: the CRI parser, user-scoped paths, and the Podman socket]]></title>
    <description><![CDATA[Rootless Podman containers write their logs in CRI format. This Fleet policy reads them and attaches container.* fields, with the match_source_index value that rootless paths need.]]></description>
    <content:encoded><![CDATA[<p>Rootless Podman exposes a Docker-compatible API, but its logs are a different matter. They use CRI format, they live under the user's home directory, and the API socket is per-user. The Elastic Docker integration is built for Docker's JSON logs and its <code>/var/lib</code> paths, so a Custom Logs integration is the right input here. Collecting rootless Podman logs with Elastic Agent needs three settings: <code>format: cri</code> on the container parser, a file path into the user's <code>overlay-containers</code> storage, and <code>add_docker_metadata</code> pointed at the rootless Podman socket with <code>match_source_index: 7</code>. The default of <code>4</code> is correct for Docker's shorter path.</p><p>This post builds that pipeline from a real debugging session and ends with Agent Builder diagnosing a Jellyfin playback failure from the enriched logs. It also covers the alternatives, <code>journald</code> and the OpenTelemetry Collector, and when to prefer them.</p><h2>How rootless Podman logs differ from Docker logs</h2><p>The Docker integration reads Docker's format, paths and socket, and rootless Podman uses different ones for all three. Each produced a distinct symptom during our debugging session.</p><h3>The log format is CRI, not Docker JSON</h3><p>Podman's default file-based log driver is <code>k8s-file</code>, and even <code>--log-driver=json-file</code> is just an alias for it.</p><p>Instead of Docker's one-JSON-object-per-line format, Podman writes the format used by Kubernetes container runtimes (CRI): a timestamp, the stream name, a partial/full flag, and then the message.</p><p>An example follows:</p>2026-08-31T09:15:04.518084921+02:00 stdout F 10.89.0.2 - - [31/Aug/2026:07:15:04 +0000] "GET / HTTP/1.1" 200 615<p>A parser expecting Docker JSON breaks on this immediately.</p><h3>Where rootless Podman stores container logs</h3><p>Rootful Docker writes logs under <code>/var/lib/docker/containers/&lt;container-id&gt;/</code>. Rootless Podman stores everything under the user's home instead:</p>/home/&lt;user&gt;/.local/share/containers/storage/overlay-containers/&lt;container-id&gt;/userdata/ctr.log<p>Any integration with a hardcoded <code>/var/lib/...</code> path finds nothing.</p><h3>The Podman API socket is per-user</h3><p>In rootless Podman there is no <code>/var/run/docker.sock</code>. Instead, it exposes a Docker-compatible API on a user-scoped socket, typically <code>/run/user/&lt;uid&gt;/podman/podman.sock</code>.</p><h2>Where Elastic Agent runs: host install vs containerized</h2><p>This walkthrough assumes Elastic Agent is installed directly on the host, not in a container. In our case, the Agent is Fleet-managed and installed directly on a Ubuntu host. It is <em>not</em> running in a container. That matters because the paths in the Agent Policy are resolved by the Agent process itself: a containerized Agent only sees its own mount namespace, so the host directories above would have to be volume-mounted into the Agent container and referenced by their in-container paths. Running as root with default privileges is also what lets the Agent read files under another user's home directory.</p><h2>How the rootless Podman log pipeline fits together</h2><p>The setup we ended up with is simple once all the pieces are known:</p><ol><li>Elastic Agent tails the raw CRI log files from the rootless user's container storage.</li><li>A <code>container</code> parser with <code>format: cri</code> strips the timestamp, stream, and flag prefix from each line.</li><li>A processor extracts the container ID from a fixed position in the log file path.</li><li>The <code>add_docker_metadata</code> processor resolves that ID against the rootless Podman socket and attaches container name, image, and labels.</li><li>Enriched events are shipped to Elasticsearch.</li></ol><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt417ffefa1a64204c/6aa4376bf548681006812d7e/architecture.png" alt="Diagram showing Elastic Agent on the host reading CRI log files from the rootless user's container storage, enriching events with metadata from the Podman user socket, and shipping them to Elasticsearch" /><p>Let's now build the log ingestion pipeline step by step.</p><h2>Step 1: Confirm the Podman log driver</h2><p>First, check which log driver Podman uses on your host, because the default varies by distribution and <code>containers.conf</code>:</p>podman info --format '{{ .Host.LogDriver }}'<p>If it prints <code>journald</code>, either switch to the file-based driver or jump to the journald alternative at the end of this post. To make <code>k8s-file</code> the default for all containers of this user, set it in <code>~/.config/containers/containers.conf</code>:</p>[containers]
log_driver = "k8s-file"<p>You can also set it per container with <code>podman run --log-driver=k8s-file</code>. Remember that <code>json-file</code> is accepted but silently behaves as <code>k8s-file</code>: do not expect Docker-formatted JSON from it. Containers pick up the driver at creation time, so you will need to recreate any containers that were started with a different driver.</p><h2>Step 2: Enable the rootless Podman API socket</h2><p>The metadata enrichment in step 4 needs the Podman API. Enable the user-scoped socket as the user that runs the containers:</p>systemctl --user enable --now podman.socket  # without sudo!
loginctl enable-linger $USER<p>The <code>enable-linger</code> call keeps the user's systemd instance, and with it the socket, alive when the user is not logged in. Verify the socket answers Docker-compatible API calls:</p>curl --unix-socket /run/user/$(id -u)/podman/podman.sock \
  http://d/v1.41/containers/json<p>You should get a JSON array describing the running containers. This compatibility layer is exactly why a processor named <code>add_docker_metadata</code> will work against Podman later.</p><h2>Step 3: Collect rootless Podman logs with a Custom Logs integration</h2><p>In Fleet, add the <strong>Custom Logs (Filestream)</strong> integration to your agent policy instead of the Docker integration.</p><p>Set the file path pattern to the rootless storage location:</p>/home/&lt;user&gt;/.local/share/containers/storage/overlay-containers/*/userdata/ctr.log<p>Then, in the advanced options, configure the parser so the agent understands the CRI format:</p>- container:
    format: cri<p>The <code>container</code> parser removes the <code>&lt;timestamp&gt; &lt;stream&gt; &lt;flag&gt;</code> prefix, reassembles partial lines (the <code>P</code> flag marks a message that was split), and stores the original timestamp and stream in the event.</p><p>For standalone agents, the equivalent input configuration looks like this:</p>- type: filestream
  id: rootless-podman-logs
  data_stream:
    dataset: podman.container_logs
  paths:
    - /home/&lt;user&gt;/.local/share/containers/storage/overlay-containers/*/userdata/ctr.log
  parsers:
    - container:
        format: cri<p>At this point you should see clean log messages in Discover, but without any container context: no name, no image, no labels. A raw container ID buried in <code>log.file.path</code> is all you have, which makes the data hard to filter and nearly impossible to correlate.</p><h2>Step 4: Enrich with container metadata using add_docker_metadata</h2><p>The <code>add_docker_metadata</code> processor enriches our logs with information such as the container name. It extracts a container ID from the log file path, queries the Docker-compatible API for that container, and attaches the container's metadata to each event.</p><p>Add it to the integration's processors field (or under <code>processors:</code> in a standalone input):</p>- add_docker_metadata:
    # Replace `1000` with the UID of the user running the containers (`id -u &lt;user&gt;`).
    host: "unix:///run/user/1000/podman/podman.sock"
    match_source: true
    match_source_index: 7<p>The <code>match_source_index</code> value deserves an explanation, as it is not a commonly used one. The processor splits the log file path on <code>/,</code> discards the empty leading element, and picks the component at the given index as the container ID.</p><p>For the rootless Podman path, the indices work out like this:</p><p>Index</p><p>Component</p><p>0</p><p><code>home</code></p><p>1</p><p><code>&lt;user-id&gt;</code></p><p>2</p><p><code>.local</code></p><p>3</p><p><code>share</code></p><p>4</p><p><code>containers</code></p><p>5</p><p><code>storage</code></p><p>6</p><p><code>overlay-containers</code></p><p>7</p><p><code>&lt;container-id&gt;</code></p><p>8</p><p><code>userdata</code></p><p></p><p>The default value of <code>4</code> exists because Docker's path is <code>/var/lib/docker/containers/&lt;container-id&gt;/...</code>, where index 4 lands on the ID. However, as you can see from the table above, in our case the proper value is <code>7</code>.</p><p>Note that the correct index depends on the depth of the home directory. <code>/home/&lt;user-id&gt;/...</code> puts the ID at index 7, but a nonstandard home location shifts it. Count the components of your actual path to verify whether <code>7</code> is the right value for you.</p><p>Once the ID resolves correctly, the processor calls the Podman socket and each event gains the familiar <code>container.*</code> fields. Here is a real document from a Jellyfin container managed with podman-compose:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1eeffc8b04e32828/6aa43d0048a68a62da1d8e1d/discover-enriched.png" alt="Kibana Discover document flyout showing a rootless Podman log event enriched with container.id, container.image.name and container labels, including podman-compose and OCI image labels" /><p>The metadata is more complete than it first appears: alongside <code>container.id</code> and <code>container.image.name</code>, every label on the container arrives too, including the <code>com_docker_compose_*</code> and <code>io_podman_compose_*</code> labels set by <code>podman-compose</code> and the standard <code>org_opencontainers_image_*</code> labels baked into the image. Filtering all logs of a compose project is now one query on <code>container.labels.com_docker_compose_project</code>.</p><h2>Step 5: Validate the rootless Podman log pipeline</h2><p>Generate some traffic and check Discover:</p>podman run -d --name nginx-demo -p 8080:80 nginx
curl localhost:8080<p>A healthy pipeline produces events where:</p><ul><li><code>message</code> contains only the application log line, with no CRI prefix.</li><li><code>@timestamp</code> matches the timestamp Podman wrote.</li><li><code>log.file.path</code> points into <code>overlay-containers</code>.</li><li><code>container.id</code> is the full 64-character ID, and <code>container.name</code> and <code>container.image.name</code> are populated.</li></ul><p>If metadata is missing but messages parse fine, test the socket with the <code>curl</code> command from step 2 and re-check <code>match_source_index</code>. If messages still carry a timestamp prefix, the CRI parser is not applied; verify the parser YAML made it into the integration policy.</p><h2>Alternatives for collecting rootless Podman logs</h2><p>The file-based approach above yields the same ECS <code>container.*</code> fields as the Docker integration, but three alternatives are worth weighing first.</p><p></p><p>Approach</p><p>Metadata</p><p>ECS <code>container.*</code></p><p>Throughput</p><p>Best when</p><p>Custom Logs + <code>add_docker_metadata</code></p><p>Name, image, and all labels from the Podman socket</p><p>Native</p><p>High, plain file tailing</p><p>You want the same fields the Docker integration produces</p><p><code>journald</code> log driver</p><p>Container ID, name, and image as journal fields</p><p>Needs a rename step</p><p>Lower, rate limited by <code>RateLimitBurst</code></p><p>Containers run as systemd services via Quadlet</p><p>Docker integration on the compat socket</p><p>None for logs</p><p>Metrics datasets only</p><p>Not applicable to logs</p><p>You only need metrics, validated per dataset</p><p>OpenTelemetry Collector (<code>filelog</code>)</p><p><code>container.id</code> via a regex operator, names and images need custom work</p><p>Partial</p><p>High, plain file tailing</p><p>You are standardizing on EDOT</p><h3>
Collect Podman logs with the journald log driver</h3><p>Podman integrates with systemd natively, and on many distributions <code>journald</code> is already the default log driver. With <code>--log-driver=journald</code>, Podman writes each log line to the journal and attaches <code>CONTAINER_ID_FULL</code>, <code>CONTAINER_NAME</code>, and the image name as structured journal fields.</p><p>You can collect these with the <a href="https://www.elastic.co/docs/current/integrations/journald"><strong>Custom Journald logs</strong></a> integration. The metadata comes for free, with no socket, no path counting, and no <code>match_source_index</code>.</p><p>However, journald applies rate limiting that can drop bursts from chatty containers unless you raise <code>RateLimitBurst</code>. Throughput is lower than plain file tailing. The container fields also arrive with journald's naming, so you need a rename step (an ingest pipeline or processors) to get ECS-style <code>container.*</code> fields. Rootless containers also write to the per-user journal rather than the system one. An agent running as root still sees those entries, because reading the default journal as root includes user journals, but enable journald persistence (<code>Storage=persistent</code> in <code>journald.conf</code>) if you want container logs to survive a reboot.</p><p>If your containers are managed as systemd services via Quadlet, this is a natural fit.</p><h3>Point the Docker integration at the Podman compat socket (metrics only)</h3><p>Since Podman exposes a Docker-compatible API, it is tempting to point the Docker integration's <code>host</code> at <code>unix:///run/user/&lt;uid&gt;/podman/podman.sock</code>.</p><ul><li>Metrics datasets can work, because they only talk to the API.</li><li>Logs do not, because the integration reads Docker's JSON log files from Docker's paths, and rootless Podman uses neither. Treat this as a partial option for metrics, and validate each dataset you enable.</li></ul><h3>Collect Podman logs with the OpenTelemetry Collector</h3><p>If you are standardizing on OpenTelemetry, for instance by using EDOT (Elastic Distributions of OpenTelemetry) the Collector's <code>filelog</code> receiver reads the same files with its <code>container</code> operator, which auto-detects CRI-style formats:</p>receivers:
  filelog:
    include:
      - /home/&lt;user&gt;/.local/share/containers/storage/overlay-containers/*/userdata/ctr.log
    operators:
      - type: container
        add_metadata_from_filepath: false<p>Set <code>add_metadata_from_filepath: false</code> because that option expects Kubernetes pod log paths, which don't match Podman's layout.</p><p>Here you will miss out on some data enrichment: there is no Podman equivalent of the <code>k8sattributes</code> processor, so container names and labels are not attached automatically.. You can extract <code>container.id</code> from the file path with a regex operator, but resolving it to names and images requires custom work. The contrib Collector does include a <code>podman_stats</code> receiver for container metrics over the same socket, so a Collector-based setup covers metrics well and logs with reduced metadata.</p><h2>Parsing application logs from Podman containers</h2><p>The Custom Logs pipeline above ships raw log lines without application-level parsing. For instance, Nginx logs will end up in your cluster plainly, without proper processing. If you'd like to enable proper processing, you can use Ingest Pipelines to "redirect" specific containers (e.g. <code>nginx</code>) to the Ingest Pipeline defined by the Elastic Integration, and get full parsing of that data "for free".</p><h2>Root cause analysis on Podman logs with Agent Builder</h2><p>Was it worth the effort? Absolutely! Getting clean, metadata-rich container logs into Elasticsearch lets an LLM investigate issues against the data directly, and <a href="https://www.elastic.co/docs/solutions/observability/ai/agent-builder-observability">Elastic Agent Builder</a> is the quickest way to see that in action.</p><p>Agent Builder, available on Elastic Cloud Serverless and the Enterprise tier for Elastic Cloud Hosted and self-managed, provides a chat interface in Kibana, backed by an LLM, with built-in tools to explore your indices and run ES|QL queries against them.</p><p>Here is a real example from the host we just configured. Among other containers, it runs Jellyfin, a media server, as a rootless Podman container. One day, playback of a title fails instantly on an Android TV client: the screen goes black and drops back to the menu, with no error apart from a cryptic "Playback error".</p><p>In Discover, filtering on <code>container.name: "jellyfin"</code> narrows the view to a few hundred verbose .NET log lines around the playback attempts. The histogram shows a burst of activity at each failed attempt, but the actual cause is buried somewhere in the noise.</p><p>Instead of scanning the messages manually, open the Agent Builder panel directly from Discover and ask it to investigate the issue. The agent queries the log data stream on its own, reconstructs the timeline, and returns a diagnosis:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbc2f9f7746f35d25/6aa45ce1afd9a87b6b120b81/agent-builder-jellyfin-podman.jpg" alt="AI Agent panel in Kibana Discover diagnosing a Jellyfin playback failure from rootless Podman container logs, identifying a failing FFmpeg hardware-transcoding pipeline and suggesting verification steps" /><p>In this run it worked out that the client requested playback six times. Jellyfin tried to convert a 4K Dolby Vision/HEVC video to H.264 through VA-API hardware transcoding while burning in a subtitle stream, and FFmpeg exited with code 187 each time before producing the first HLS segment. That is why playback stopped at zero milliseconds. It also stated its uncertainty honestly: the available logs don't contain FFmpeg's stderr, so it proposed concrete steps to discriminate between a broken transcoding combination and missing GPU access, including checking whether the container can reach the render device <code>/dev/dri/renderD128</code>.</p><p>The pipeline we just built made each step of this investigation possible. The agent can slice by <code>container.name</code> only because <code>add_docker_metadata</code> resolved it from the Podman socket, the <code>message</code> field is queryable because the CRI parser stripped the prefixes, and the timeline is trustworthy because <code>@timestamp</code> comes from Podman, not from ingestion time. Without that work, the LLM would face a pile of prefixed raw lines, likely resulting in worse performance and higher token usage.</p><h2>Conclusion: three settings for rootless Podman logs</h2><p>Rootless Podman is Docker-compatible where it matters the most: the API. For log collection it uses its own format, file paths, and socket location, which is what the Elastic Docker integration reads.</p><p>Once you know that, the fix is three configuration decisions: parse <code>cri</code> instead of Docker JSON, tail the user's <code>overlay-containers</code> storage, and point <code>add_docker_metadata</code> at the per-user Podman socket with a corrected <code>match_source_index</code>.</p><p>The same recipe applies to any rootless user on the host; only the home path and UID in the socket change.</p><p>If you want to try this workflow end to end to collect your Podman logs, spin up an <a href="https://cloud.elastic.co/registration">Elastic Cloud trial</a>, install the Elastic Agent on your host, and you can go from raw CRI files to fully enriched container logs in one integration policy. If you want to push this further, from a one-off chat to automated investigations that open cases with evidence attached, see <a href="https://www.elastic.co/observability-labs/blog/automated-root-cause-analysis-agent-builder">automated root cause analysis with Elastic Agent Builder</a>.</p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p><p></p>]]></content:encoded>
    <link>https://www.elastic.co/observability-labs/blog/rootless-podman-logs-elastic-agent</link>
    <guid isPermaLink="false">rootless-podman-logs-elastic-agent</guid>
    <category><![CDATA[Logs Analytics]]></category>
    <category><![CDATA[Infrastructure Monitoring]]></category>
    <category><![CDATA[Agentic Observability]]></category>
    <dc:creator><![CDATA[Lorenzo Soligo]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt087aeec3734bc804/6aa42c849936f588158b85c8/header_(2).jpg" length="0" type="image/jpeg"/>
    <pubDate>Mon, 14 Sep 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Monitoring Proxmox VE deployments with Elastic Observability]]></title>
    <description><![CDATA[Monitoring Proxmox VE deployments, VMs, and Linux Containers with Elastic Observability.]]></description>
    <content:encoded><![CDATA[<p>In this blog post, you will learn how to leverage Elastic Observability to monitor Proxmox VE and the software running on top of it, both in the form of Linux Containers (LXCs) and Virtual Machines (VMs).</p>
<h2 id="whyuseelasticobservabilitywithproxmox">Why use Elastic Observability with Proxmox?</h2>
<p>Here at Elastic, we are passionate about efficiently managing and monitoring infrastructure and applications. Many of us have fun playing with home labs, oftentimes running Proxmox VE, a powerful open-source virtualization platform used to run virtual machines and Linux Containers (LXCs) with ease. While Proxmox provides robust tools for managing virtualized resources, gaining deep insights into the performance and health of your LXCs, VMs, and hosts requires a comprehensive monitoring solution. This blog post will guide you through leveraging the power of Elastic Observability, in conjunction with Elastic Agent, to effectively monitor your Proxmox VE deployment, ensuring optimal performance and proactive issue resolution thanks to Kibana Alerts.</p>
<h2 id="thehomelabsetup">The homelab setup</h2>
<p>Our homelab setup centers around an Intel N100 mini PC, serving as the host for Proxmox VE. This setup is simple and minimal, yet effective for showcasing a few interesting capabilities. On top of this mini PC, we run several Linux Containers (LXCs) for various services, along with a dedicated virtual machine for Home Assistant.</p>
<h2 id="elasticagentinstallationandconfiguration">Elastic Agent installation and configuration</h2>
<p>Before beginning, it is worth noting that there are numerous ways to install and configure the Elastic Agent. For the sake of simplicity, we will showcase a setup in which only one instance of the Elastic Agent is running on the host machine. The Elastic Agent reports to an Elastic Cloud Observability deployment and is managed via Fleet, which makes it tremendously easy to upgrade and re-configure it whenever needed. </p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdf2e1eefd8bfde8b/6a7f0e483cab1ccb770e48f2/fleet-prox.jpg" alt="The Elastic Integrations enabled for our Proxmox host" /></p>
<h2 id="divingintothehost">Diving into the host</h2>
<p>Kibana offers various panes that make it nice and easy to learn about a system's health at a quick glance.</p>
<p>As a first step, let's take a look at the <code>Infrastructure &gt; Hosts</code> page in Kibana:</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2a92221410d29fdd/6a7f0e4bbdcff021c4c42ed7/kibana-infrastructure-hosts-proxmox.jpg" alt="The Infrastructure &gt; Hosts Kibana page for our Proxmox host" />
</p><p>Here we can see various information about our Proxmox VE host (i.e. the mini PC). The top processes running on it are presented, including processes running in LXCs such as <code>pia-daemon</code>. We can also see a <code>kvm</code> process, specifically running a Home Assistant virtual machine, and a Proxmox <code>pve-firewall</code> process.</p>
<p>Let's now take a look at <code>Universal Profiling &gt; Flamegraph</code>. This graph shows how much CPU time is consumed by different stack traces from processes running on the host system. You can drill down into specific processes using the search bar at the top. For instance, you can filter by <code>kvm</code> to only see information regarding this specific process.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltc0059556a6f3f1af/6a7f0e4f5967e579905dd35f/universal-profiling-flamegraph-kvm.jpg" alt="The Universal Profiling &gt; Flamegraph Kibana page for our Proxmox host" />
</p><h2 id="theobservabilityaiassistant">The Observability AI Assistant</h2>
<p>All the Kibana panes we visited so far have proved to be highly interesting, but they struggle to answer urgent questions such as: </p>
<ul>
<li>did anything happen in our mini PC recently?</li>
<li>was there any significant change in functionality? </li>
<li>is there any precious information hidden among the thousands of data points collected?</li>
</ul>
<p>The Elastic Observability AI Assistant helps us by answering these questions in natural language. By default, on Elastic Cloud, it uses the Elastic-managed LLM connector, which means users do not need to configure anything to get started with it. It just works!</p>
<p>Let's go to the <code>Observability &gt; AI Assistant</code> pane in Kibana and let's try to ask a generic prompt such as: "please give me an overview of the health of my <code>prox</code> host".</p>
<p>Let's then wait a minute so that it can dig into the data… et voilà, here comes lots of relevant information in the form of graphs and natural language explanations. The Observability AI Assistant understood our question, went through all the data for our Proxmox host, ran data analytics on it, and reported back in a matter of seconds!</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta9d0d2e422f7c15a/6a7f0e52ead8ec2c5ebaa928/observability-ai-assistant-1.jpg" alt="The Observability AI Assistant's first reply" /></p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltd7d14c0ef96c4ca2/6a7f0e559090b025c384ea75/observability-ai-assistant-2.jpg" alt="The Observability AI Assistant's second reply" /></p>
<h2 id="alertingupondisruptionwithkibanaalerts">Alerting upon disruption with Kibana Alerts</h2>
<p>As a final step, let's try to define a Kibana Alert to help us understand whether our host is overloaded. Let's head to <code>Observability &gt; Alerts &gt; Rules</code> and create a new rule. We will create a Custom Threshold rule that will fire if CPU usage for the host is higher than 80% on average for the last 15 minutes. Kibana will send us an email in case the rule fires. The rule is also configured to fire if no data appears for the last 15 minutes, which is extremely helpful as it would imply the presence of some issues to be debugged: broken network or no electricity in the house, a faulty Agent deployment, or even a hardware issue with the mini PC.</p>
<p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt8f7bfae9927ebb99/6a7f0e58448e4e96265c07ad/rule-cpu-over-80.jpg" alt="The Kibana Alerting Rule for CPU being over 80 percent" /></p>
<h2 id="conclusion">Conclusion</h2>
<p>In this blog post we showcased how to effectively use the Elastic Stack to monitor Proxmox VE deployments. If you would like to try out such a setup first-hand, you are more than welcome to enjoy <a href="https://www.elastic.co/cloud/cloud-trial-overview">Elastic Cloud's 14-days free trial</a>.</p>
<p>In future blog posts, we will investigate how to dig deeper into LXCs and VMs to gather even more information from our home lab and create more tailored alerts. Stay tuned!</p>]]></content:encoded>
    <link>https://www.elastic.co/observability-labs/blog/monitoring-proxmox-ve-with-elastic</link>
    <guid isPermaLink="false">monitoring-proxmox-ve-with-elastic</guid>
    <category><![CDATA[Infrastructure Monitoring]]></category>
    <dc:creator><![CDATA[Lorenzo Soligo]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1bd76b0ca91fa500/6a7f0e5bb437704d0f4d6d17/article-image.jpg" length="0" type="image/jpeg"/>
    <pubDate>Wed, 23 Jul 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>