<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Profiling on Jon Seager</title><link>https://jnsgr.uk/tags/profiling/</link><description>Recent content in Profiling on Jon Seager</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Sun, 02 Nov 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://jnsgr.uk/tags/profiling/index.xml" rel="self" type="application/rss+xml"/><item><title>Ubuntu Summit 25.10: Personal Highlights</title><link>https://jnsgr.uk/2025/11/ubuntu-summit-25/</link><pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate><guid>https://jnsgr.uk/2025/11/ubuntu-summit-25/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This article was originally posted &lt;a href="https://discourse.ubuntu.com/t/ubuntu-summit-25-10-personal-highlights/71509" target="_blank" rel="noreferrer"&gt;on the Ubuntu Discourse&lt;/a&gt;, and is reposted here. I welcome comments and further discussion in that thread.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I recently had the privilege of attending the &lt;a href="https://ubuntu.com/summit" target="_blank" rel="noreferrer"&gt;Ubuntu Summit 25.10&lt;/a&gt;. Ubuntu Summits have a relatively long history. Some years ago Canonical ran the ‘Ubuntu Developer Summits (UDS)’, but recently the events were brought back and reimagined as the ‘Ubuntu Summit’.&lt;/p&gt;
&lt;p&gt;For the most recent Summit, we tried out a new format. We invited a select few folks to come and give talks at our London office, with a small in-person crowd. In addition, the event was livestreamed, and we encouraged people to host &amp;ldquo;watching parties&amp;rdquo; across the world as part of &lt;a href="https://ubuntu.com/community/docs/locos?next=%2Fg1m%2F" target="_blank" rel="noreferrer"&gt;Ubuntu Local Communities (LoCos)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While Ubuntu may feature in the name, the event does not require talks to be centred on Ubuntu, and in fact is aiming to draw contributions from our partners and from right across the open source community, whether or not the content is relevant to Ubuntu or Canonical - it&amp;rsquo;s designed to be a showcase for the very best of open source, and this year I felt that the talks were of a particularly high calibre.&lt;/p&gt;
&lt;p&gt;In this post I&amp;rsquo;ll highlight some of my favourite talks, in no particular order! If any of these catch your interest, you can see &lt;a href="https://discourse.ubuntu.com/t/ubuntu-summit-25-10-timetable/65271" target="_blank" rel="noreferrer"&gt;when they were aired&lt;/a&gt; and catch-up on the &lt;a href="https://www.youtube.com/live/bEEamxJ60aI" target="_blank" rel="noreferrer"&gt;Day 1&lt;/a&gt; and &lt;a href="https://www.youtube.com/live/WvNgMEumSoA" target="_blank" rel="noreferrer"&gt;Day 2&lt;/a&gt; streams.&lt;/p&gt;
&lt;h2 id="doom-in-space" class="relative group"&gt;DOOM in Space &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#doom-in-space" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="04.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2025/11/ubuntu-summit-25/04_hu_65dfe195c8d0716f.webp 330w,https://jnsgr.uk/2025/11/ubuntu-summit-25/04_hu_9322be6f635856bb.webp 660w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/04_hu_9172933e609edc31.webp 1024w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/04_hu_8b2cd4b205915e58.webp 1280w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1280"
height="720"
class="mx-auto my-0 rounded-md"
alt="opening slide for doom in space talk"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2025/11/ubuntu-summit-25/04_hu_2091739036a71cb.png" srcset="https://jnsgr.uk/2025/11/ubuntu-summit-25/04_hu_b9533f51793b46ca.png 330w,https://jnsgr.uk/2025/11/ubuntu-summit-25/04_hu_2091739036a71cb.png 660w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/04_hu_9ae56e6f039ce272.png 1024w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/04.png 1280w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What a way to kick off the Summit! &lt;a href="https://discourse.ubuntu.com/t/doom-in-space/67019" target="_blank" rel="noreferrer"&gt;DOOM in Space&lt;/a&gt; was a talk given by &lt;a href="https://olafurw.com/aboutme/" target="_blank" rel="noreferrer"&gt;Ólafur Waage&lt;/a&gt;, who introduced himself as a &amp;ldquo;professional keyboard typist&amp;rdquo;!&lt;/p&gt;
&lt;p&gt;The talk was immediately after Mark Shuttleworth&amp;rsquo;s opening remarks, and covered his journey in getting DOOM to run on the European Space Agency&amp;rsquo;s &lt;a href="https://en.wikipedia.org/wiki/OPS-SAT" target="_blank" rel="noreferrer"&gt;OPS-SAT&lt;/a&gt; satellite. DOOM has famously been ported to &lt;a href="https://en.wikipedia.org/wiki/List_of_Doom_ports" target="_blank" rel="noreferrer"&gt;many devices&lt;/a&gt;, though some were only questionably &amp;ldquo;running&amp;rdquo; the game.&lt;/p&gt;
&lt;p&gt;Ólafur covered how he became involved in the project, and the unique approach they needed to take to guarantee success, since they would only get a very limited amount of time in order to conduct their &amp;ldquo;experiment&amp;rdquo; on the satellite.&lt;/p&gt;
&lt;p&gt;Of particular note was the work done to integrate imagery from the OPS-SAT&amp;rsquo;s onboard camera into the game, which involved some clever reassigning of colors in the game&amp;rsquo;s original palette to more faithfully represent the imagery taken from the camera in-game.&lt;/p&gt;
&lt;h2 id="infrastructure-wide-profiling-of-nvidia-cuda" class="relative group"&gt;Infrastructure-Wide Profiling of Nvidia CUDA &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#infrastructure-wide-profiling-of-nvidia-cuda" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="03.jpeg"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2025/11/ubuntu-summit-25/03_hu_c19c7f7a82ce28ec.webp 330w,https://jnsgr.uk/2025/11/ubuntu-summit-25/03_hu_3289cc8a3c6ace68.webp 660w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/03_hu_63ea02edaca8b2f8.webp 1024w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/03_hu_47b446e14afc4dc7.webp 1320w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1600"
height="900"
class="mx-auto my-0 rounded-md"
alt="opening slide for profiling talk"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2025/11/ubuntu-summit-25/03_hu_a857ebebb22203c0.jpeg" srcset="https://jnsgr.uk/2025/11/ubuntu-summit-25/03_hu_ee47e997a3027b8c.jpeg 330w,https://jnsgr.uk/2025/11/ubuntu-summit-25/03_hu_a857ebebb22203c0.jpeg 660w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/03_hu_a29a7d039dd13cc1.jpeg 1024w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/03_hu_cb8dc774efe7bf9f.jpeg 1320w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://discourse.ubuntu.com/t/infrastructure-wide-profiling-of-nvidia-cuda/67248" target="_blank" rel="noreferrer"&gt;This talk&lt;/a&gt; was given by &lt;a href="https://github.com/brancz" target="_blank" rel="noreferrer"&gt;Frederic Branczyk&lt;/a&gt;, CEO and Founder of &lt;a href="https://polarsignals.com" target="_blank" rel="noreferrer"&gt;Polar Signals&lt;/a&gt;. Canonical has partnered with Polar Signals a couple of times in recent years. They were part of our journey to &lt;a href="https://ubuntu.com/blog/ubuntu-performance-engineering-with-frame-pointers-by-default" target="_blank" rel="noreferrer"&gt;enabling frame pointers by default&lt;/a&gt; on Ubuntu, and many of our teams have been using their zero-instrumentation &lt;a href="https://github.com/parca-dev/parca-agent" target="_blank" rel="noreferrer"&gt;eBPF profiler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While CPU profiling has been commonplace for developers for many years, giving the ability to analyse CPU and memory-bound workloads, profiling GPU workloads has been less prominent, and is particularly difficult in production.&lt;/p&gt;
&lt;p&gt;Polar Signals advocate for &amp;ldquo;continuous profiling&amp;rdquo;, which means running a profiler at all times, on all nodes, in production. The benefit of this is that when an issue occurs, you don&amp;rsquo;t have to set up a profiler and try to reproduce the issue - you already have the data. It also negates the uncertainty of the impact a profiler might have on the code during reproduction. This would have been difficult with traditional profiling tools, but with technologies like &lt;a href="https://ebpf.io/" target="_blank" rel="noreferrer"&gt;eBPF&lt;/a&gt;, the overhead of the profiler is incredibly low compared to the potential performance gains from acting on the data it produces.&lt;/p&gt;
&lt;p&gt;In this talk, Frederic outlined the work they have done bringing infrastructure-wide profiling of CUDA workloads into Polar Signals Cloud. Their approach combines the &lt;a href="https://docs.nvidia.com/cupti/" target="_blank" rel="noreferrer"&gt;CUPTI profiling API&lt;/a&gt; with &lt;a href="https://docs.ebpf.io/linux/concepts/usdt/" target="_blank" rel="noreferrer"&gt;USDT&lt;/a&gt; probes and eBPF into a pipeline, relying upon the ability to inject a small library into CUDA workloads using the &lt;code&gt;CUDA_INJECTION64_PATH&lt;/code&gt; without modification.&lt;/p&gt;
&lt;p&gt;You can see more details &lt;a href="https://www.polarsignals.com/blog/posts/2025/10/22/gpu-profiling" target="_blank" rel="noreferrer"&gt;on their website&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="inference-snaps" class="relative group"&gt;Inference Snaps &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#inference-snaps" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="02.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2025/11/ubuntu-summit-25/02_hu_1d018afaaf936f4c.webp 330w,https://jnsgr.uk/2025/11/ubuntu-summit-25/02_hu_633333fcdd4ed333.webp 660w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/02_hu_9d1bbcb6c1e5044a.webp 1024w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/02_hu_ca0ce363eac0f419.webp 1280w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1280"
height="720"
class="mx-auto my-0 rounded-md"
alt="opening slide for inference snaps talk"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2025/11/ubuntu-summit-25/02_hu_d3e5811b82e6933.png" srcset="https://jnsgr.uk/2025/11/ubuntu-summit-25/02_hu_ebbc2e9e26d4db3.png 330w,https://jnsgr.uk/2025/11/ubuntu-summit-25/02_hu_d3e5811b82e6933.png 660w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/02_hu_711ebc18bd1dda97.png 1024w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/02.png 1280w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This talk served as the first &lt;a href="https://canonical.com/blog/canonical-releases-inference-snaps" target="_blank" rel="noreferrer"&gt;public announcement&lt;/a&gt; of Inference Snaps from Canonical, which represents a few months of working combining many of the new technologies behind Snaps.&lt;/p&gt;
&lt;p&gt;As Large Language Models continue to gain pace along with the rest of the AI community, silicon manufacturers are increasingly including dedicated hardware in commodity CPUs and GPUs, as well as shipping dedicated accelerators for some workloads.&lt;/p&gt;
&lt;p&gt;AI models often need to be tuned in some way in order to work optimally - for example &lt;a href="https://huggingface.co/docs/optimum/en/concept_guides/quantization" target="_blank" rel="noreferrer"&gt;quantisation&lt;/a&gt; which aims to reduce the computational memory costs of running inference on a given model.&lt;/p&gt;
&lt;p&gt;Inference snaps provide a hassle-free mechanism for users to obtain the &amp;ldquo;famous model&amp;rdquo; they want to work with, but automatically receive a version of that model which is optimised for the silicon in their machine, removing the need to spend hours on HuggingFace trying to identify the correct model to download that matches with their hardware.&lt;/p&gt;
&lt;p&gt;Using our extensive partner network, we&amp;rsquo;ll continue to work with multiple silicon vendors to ensure that models are available for the latest hardware as it drops, and provide a consistent experience to Ubuntu users that wish to work with AI.&lt;/p&gt;
&lt;p&gt;Find out more in the &lt;a href="https://canonical.com/blog/canonical-releases-inference-snaps" target="_blank" rel="noreferrer"&gt;announcement&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="nøughty-linux-ubuntus-stability-meets-nixpkgs-freshness" class="relative group"&gt;Nøughty Linux: Ubuntu’s Stability Meets Nixpkgs’ Freshness &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#n%c3%b8ughty-linux-ubuntus-stability-meets-nixpkgs-freshness" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="05.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2025/11/ubuntu-summit-25/05_hu_a99f9dc0efe25bc0.webp 330w,https://jnsgr.uk/2025/11/ubuntu-summit-25/05_hu_dc0c16f39603b598.webp 660w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/05_hu_40086b0b15441a95.webp 1024w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/05_hu_d2c99ab7d8057151.webp 1280w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1280"
height="720"
class="mx-auto my-0 rounded-md"
alt="opening slide for noughty linux talk"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2025/11/ubuntu-summit-25/05_hu_61b22107d4c49f5e.png" srcset="https://jnsgr.uk/2025/11/ubuntu-summit-25/05_hu_448ff89cbcd9feba.png 330w,https://jnsgr.uk/2025/11/ubuntu-summit-25/05_hu_61b22107d4c49f5e.png 660w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/05_hu_fc9324d6dc71ff1c.png 1024w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/05.png 1280w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This &lt;a href="https://discourse.ubuntu.com/t/noughty-linux-ubuntus-stability-meets-nixpkgs-freshness/69962" target="_blank" rel="noreferrer"&gt;talk&lt;/a&gt; was a bit of a guilty pleasure for me! Delivered by &lt;a href="https://wimpysworld.com/" target="_blank" rel="noreferrer"&gt;Martin Wimpress (wimpy)&lt;/a&gt;, the audience were shown how they could take a stock Ubuntu Server deployment, and use a collection of scripts to layer a cutting-edge GUI stack on top using &lt;a href="https://github.com/NixOS/nixpkgs" target="_blank" rel="noreferrer"&gt;Nixpkgs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wimpy outlined his motivation as wanting to rely upon the stable kernel and hardware support offered by Ubuntu, but wanting to be more experimental with his desktop environment and utilities - preferring a tiling window management experience.&lt;/p&gt;
&lt;p&gt;Having spent some years on NixOS, Wimpy was recently required to run a security &amp;ldquo;agent&amp;rdquo; for work, which was very difficult to enable on NixOS, but worked out of the box on Ubuntu. Recognising the need to make the switch, he was reluctant to move away from the workflow he&amp;rsquo;d built so much muscle-memory around - and so &lt;a href="https://noughtylinux.org/" target="_blank" rel="noreferrer"&gt;Nøughty Linux&lt;/a&gt; was born!&lt;/p&gt;
&lt;p&gt;Nøughty Linux is not a Linux distribution, rather a set of configurations for an Ubuntu Server machine. It utilises &lt;a href="https://github.com/soupglasses/nix-system-graphics" target="_blank" rel="noreferrer"&gt;&lt;code&gt;nix-system-graphics&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/numtide/system-manager" target="_blank" rel="noreferrer"&gt;&lt;code&gt;system-manager&lt;/code&gt;&lt;/a&gt; and is actually &lt;em&gt;very&lt;/em&gt; similar to a configuration I ran in my own &lt;a href="https://github.com/jnsgruk/nixos-config" target="_blank" rel="noreferrer"&gt;nixos-config&lt;/a&gt; repository for my laptop for a while - though Wimpy has chased down significantly more of the papercuts than I did!&lt;/p&gt;
&lt;h2 id="are-we-stuck-with-the-same-desktop-ux-forever" class="relative group"&gt;Are we stuck with the same Desktop UX forever? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#are-we-stuck-with-the-same-desktop-ux-forever" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="06.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2025/11/ubuntu-summit-25/06_hu_9509dcaa896a87c.webp 330w,https://jnsgr.uk/2025/11/ubuntu-summit-25/06_hu_cd096a2b6be3a7cf.webp 660w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/06_hu_e7aaa31012bfd7fe.webp 1024w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/06_hu_8caa86dfbc373634.webp 1280w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1280"
height="720"
class="mx-auto my-0 rounded-md"
alt="opening slide for desktop ux talk"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2025/11/ubuntu-summit-25/06_hu_652830ca100ce6c5.png" srcset="https://jnsgr.uk/2025/11/ubuntu-summit-25/06_hu_942ca798315d8db4.png 330w,https://jnsgr.uk/2025/11/ubuntu-summit-25/06_hu_652830ca100ce6c5.png 660w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/06_hu_63850a6cf7ed9e47.png 1024w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/06.png 1280w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jenson.org/" target="_blank" rel="noreferrer"&gt;Scott Jenson&lt;/a&gt; delivered an incredibly engaging &lt;a href="https://discourse.ubuntu.com/t/are-we-stuck-with-the-same-desktop-ux-forever/67253" target="_blank" rel="noreferrer"&gt;talk&lt;/a&gt; in which he posited that desktop user experience has somewhat stagnated, and worse that many of the patterns we&amp;rsquo;ve become used to on the desktop are antiquated and unergonomic.&lt;/p&gt;
&lt;p&gt;The crux of the talk was to focus on user &lt;em&gt;experience&lt;/em&gt;, rather than user &lt;em&gt;interfaces&lt;/em&gt; - challenging developers to think about how people learn, and how desktops could benefit more from design affordances by rethinking some critical elements such as window management or text editing.&lt;/p&gt;
&lt;p&gt;Using his years of experience at Apple, Symbian and Google, Scott delivered one of the most engaging conference talks I&amp;rsquo;ve seen, and I thoroughly recommend watching it on our YouTube channel!&lt;/p&gt;
&lt;h2 id="honorable-mentions" class="relative group"&gt;Honorable Mentions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#honorable-mentions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;In addition to the talks above, it was a delight to meet &lt;a href="https://cs.ru.nl/~M.Schoolderman/" target="_blank" rel="noreferrer"&gt;Mark Schoolderman&lt;/a&gt; from the &lt;a href="https://trifectatech.org/" target="_blank" rel="noreferrer"&gt;Trifecta Tech Foundation&lt;/a&gt; in-person, who led the work on &lt;a href="https://github.com/trifectatechfoundation/sudo-rs" target="_blank" rel="noreferrer"&gt;&lt;code&gt;sudo-rs&lt;/code&gt;&lt;/a&gt; as part of our &amp;ldquo;Oxidising Ubuntu&amp;rdquo; story, and interesting to hear about the value the project derived from Ubuntu&amp;rsquo;s &lt;a href="https://documentation.ubuntu.com/project/MIR/main-inclusion-review/" target="_blank" rel="noreferrer"&gt;Main Inclusion Review&lt;/a&gt; process as part of landing &lt;code&gt;sudo-rs&lt;/code&gt; in &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Equally, I was delighted that &lt;a href="https://github.com/kaplun" target="_blank" rel="noreferrer"&gt;Samuele Kaplun&lt;/a&gt; from &lt;a href="https://proton.me/" target="_blank" rel="noreferrer"&gt;Proton&lt;/a&gt; could join us to talk about the work we&amp;rsquo;ve been doing together on bringing first-class Snap packages for &lt;a href="https://proton.me/mail" target="_blank" rel="noreferrer"&gt;Proton Mail&lt;/a&gt;, &lt;a href="https://protonvpn.com/?ref=pme_lp_b2c_proton_submenu" target="_blank" rel="noreferrer"&gt;Proton VPN&lt;/a&gt;, &lt;a href="https://proton.me/pass" target="_blank" rel="noreferrer"&gt;Proton Pass&lt;/a&gt; and &lt;a href="https://proton.me/authenticator" target="_blank" rel="noreferrer"&gt;Proton Authenticator&lt;/a&gt; to the &lt;a href="https://snapcraft.io/publisher/proton-ag" target="_blank" rel="noreferrer"&gt;Snap store&lt;/a&gt;, and their reasons for choosing Snaps, adventures with &lt;a href="https://snapcraft.io/docs/snap-confinement" target="_blank" rel="noreferrer"&gt;confinement&lt;/a&gt;, and more.&lt;/p&gt;
&lt;p&gt;I was delighted to see &lt;a href="https://www.craigloewen.com/" target="_blank" rel="noreferrer"&gt;Craig Loewen&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/clintrutkas/" target="_blank" rel="noreferrer"&gt;Clint Rutkas&lt;/a&gt; present on their &lt;a href="https://discourse.ubuntu.com/t/engineering-wsl-in-the-open-a-deep-dive-into-open-sourcing-wsl-at-microsoft/67022" target="_blank" rel="noreferrer"&gt;journey&lt;/a&gt; open sourcing the &lt;a href="https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux" target="_blank" rel="noreferrer"&gt;Windows Subsystem For Linux (WSL)&lt;/a&gt;, which represents a growing proportion of Ubuntu users, and a key bridge to open source development for many.&lt;/p&gt;
&lt;p&gt;Finally, thank you to &lt;a href="https://github.com/utkarsh2102" target="_blank" rel="noreferrer"&gt;Utkarsh&lt;/a&gt; for this wonderful slide as part of his talk on Ubuntu Snapshot Releases:&lt;/p&gt;
&lt;p&gt;&lt;a href="01.jpg"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2025/11/ubuntu-summit-25/01_hu_33528e98771d0bee.webp 330w,https://jnsgr.uk/2025/11/ubuntu-summit-25/01_hu_3200c3c97ea3fdc8.webp 660w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/01_hu_bdcdf80fde7402d2.webp 1024w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/01_hu_dee895df12e2c378.webp 1320w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1445"
height="813"
class="mx-auto my-0 rounded-md"
alt="a slide depicting my profile picture, but with laser eyes and the title &amp;ldquo;violence&amp;rdquo;"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2025/11/ubuntu-summit-25/01_hu_25071a7fcfa9dc2a.jpg" srcset="https://jnsgr.uk/2025/11/ubuntu-summit-25/01_hu_aa0d0f0d8dcb5517.jpg 330w,https://jnsgr.uk/2025/11/ubuntu-summit-25/01_hu_25071a7fcfa9dc2a.jpg 660w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/01_hu_f6f1d1cda3bd05f2.jpg 1024w
,https://jnsgr.uk/2025/11/ubuntu-summit-25/01_hu_41b986c0c48d6e4d.jpg 1320w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="conclusion" class="relative group"&gt;Conclusion &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusion" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Overall, I found the Ubuntu Summit 25.10 a really enjoyable event, with talks that were uniformly high in quality, charisma and creativity. I&amp;rsquo;m pleased that Canonical has broadened the Summit&amp;rsquo;s reach and I hope it continues to serve as a platform to showcase the very best open source innovation.&lt;/p&gt;
&lt;p&gt;Until next time!&lt;/p&gt;</description></item><item><title>Continuous Profiling for Juju with Parca</title><link>https://jnsgr.uk/2022/08/continuous-profiling-juju/</link><pubDate>Tue, 02 Aug 2022 00:00:00 +0000</pubDate><guid>https://jnsgr.uk/2022/08/continuous-profiling-juju/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This post was originally posted &lt;a href="https://discourse.charmhub.io/t/continuous-profiling-for-juju-parca-on-machines-and-kubernetes/6815" target="_blank" rel="noreferrer"&gt;on Charmhub&lt;/a&gt; on 02 August 2022. I&amp;rsquo;ve posted it to my blog retrospectively, but the article is unchanged. Some commands may need slight adjustments today, feel free to reach out if you get stuck!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="introduction" class="relative group"&gt;Introduction &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#introduction" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Over the past few days, I&amp;rsquo;ve been diving into some charm development to get a hands-on feel for where Juju and the Charmed Operator ecosystem has gotten to over the past 15 months. In this post we will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Outline the progress we&amp;rsquo;ve made, and the current state of charm development and integration&lt;/li&gt;
&lt;li&gt;Show how the Observability libraries can be used to rapidly instrument charmed operators&lt;/li&gt;
&lt;li&gt;Highlight a nice open source continuous profiling tool&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But first, let&amp;rsquo;s start with a juicy screenshot showing where we&amp;rsquo;re headed with this post!&lt;/p&gt;
&lt;p&gt;&lt;a href="01.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2022/08/continuous-profiling-juju/01_hu_8e8e8468a09ec6b7.webp 330w,https://jnsgr.uk/2022/08/continuous-profiling-juju/01_hu_902983b2e820e934.webp 660w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/01_hu_b840beed04f3cf95.webp 1024w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/01_hu_7e268c4ee75e6d20.webp 1320w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1840"
height="1390"
class="mx-auto my-0 rounded-md"
alt="controller-profile"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2022/08/continuous-profiling-juju/01_hu_68ca4c7c69792e17.png" srcset="https://jnsgr.uk/2022/08/continuous-profiling-juju/01_hu_9718b382dfc24e97.png 330w,https://jnsgr.uk/2022/08/continuous-profiling-juju/01_hu_68ca4c7c69792e17.png 660w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/01_hu_a8dea93e3480c161.png 1024w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/01_hu_1a534b357876e32c.png 1320w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="what-is-continuous-profiling" class="relative group"&gt;What is continuous profiling? &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#what-is-continuous-profiling" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Profiling itself is not a new concept. Profiling is all about measuring applications dynamically at runtime to understand their CPU usage, memory usage, and other important metrics. Profiling can yield deep insights about your application&amp;rsquo;s performance at runtime right down to the line of code that allocated some memory, or created a thread&lt;/p&gt;
&lt;p&gt;Previously profiling was almost always performed on a &amp;ldquo;point in time&amp;rdquo; basis; continuous profiling improves upon this methodology by introducing a new dimension to your profiling results: time. The basic principle is that by profiling your code at regular intervals, you can understand more easily how different stimuli and runtime conditions affect the performance of your code, and its effect in turn on the underlying system.&lt;/p&gt;
&lt;p&gt;Continuous profiling itself is not particularly new either, but its certainly a more regular topic of conversation for many in the last twelve months. Google wrote about it back in 2010 in a paper named &lt;a href="https://research.google/pubs/pub36575/" target="_blank" rel="noreferrer"&gt;Google Wide Profiling&lt;/a&gt;. They also stewarded the &lt;a href="https://github.com/google/pprof" target="_blank" rel="noreferrer"&gt;&lt;code&gt;pprof&lt;/code&gt;&lt;/a&gt; project which not only defines a data format for profiles themselves, but resulted in the inclusion of the &lt;a href="https://pkg.go.dev/gopkg.in/gin-contrib/pprof.v1" target="_blank" rel="noreferrer"&gt;&lt;code&gt;pprof&lt;/code&gt; Go package&lt;/a&gt; which provides a trivial means for including an HTTP server that&amp;rsquo;s ready to serve performance profiles in the &lt;code&gt;pprof&lt;/code&gt; format, giving insights into memory allocations, CPU usage and goroutines created in the Go runtime.&lt;/p&gt;
&lt;h2 id="enter-parca" class="relative group"&gt;Enter Parca &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#enter-parca" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="https://parca.dev" target="_blank" rel="noreferrer"&gt;Parca&lt;/a&gt; is an open source continuous profiling tool by &lt;a href="https://www.polarsignals.com/" target="_blank" rel="noreferrer"&gt;Polar Signals&lt;/a&gt;. It&amp;rsquo;s written in Go, and takes inspiration from Prometheus in its configuration and storage of data. Better still, while Polar Signals are the primary stewards of Parca, the project is fully open source and has an &lt;a href="https://www.parca.dev/docs/governance" target="_blank" rel="noreferrer"&gt;open governance model&lt;/a&gt; which means anyone can become a maintainer.&lt;/p&gt;
&lt;p&gt;We have been troubleshooting some crunchy performance issues in the Juju controller code of late, and it led me to think more carefully about profiling tools and start experimenting with Parca&lt;/p&gt;
&lt;p&gt;Polar Signals &lt;a href="https://www.parca.dev/docs/parca" target="_blank" rel="noreferrer"&gt;distribute two key components&lt;/a&gt; for their solution: the Parca server, and the Parca agent. The server is responsible for collecting profiles across applications (and hosts) and making them available for viewing, filtering and analysis in a nice modern web interface. The agent is focused on specific hosts and unlocks some very powerful capabilities, including host-wide profiling using eBPF, which means you can benefit from profiling even if the applications themselves are not natively instrumented for profiling.&lt;/p&gt;
&lt;p&gt;I read a little about Parca, and dived right in to configuring it in an SSH session on my controller (I even &lt;a href="https://twitter.com/jnsgruk/status/1550184107568762880" target="_blank" rel="noreferrer"&gt;tweeted&lt;/a&gt; about it!). After I&amp;rsquo;d got things running, I decided to write a simple charm for Parca, but at the time it was just distributed by means of signed binaries in a Github release. I wanted an easier way to get access to Parca from within my charm that would save me the hassle of working out which architecture to fetch, verifying checksums and figuring out an escape hatch for &amp;ldquo;airgapped&amp;rdquo; systems. I decided to start building a snap package…&lt;/p&gt;
&lt;h2 id="snap-install-parca" class="relative group"&gt;&lt;code&gt;snap install parca&lt;/code&gt; &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#snap-install-parca" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Building a snap for Parca turned out to be a dream&lt;/p&gt;
&lt;p&gt;Being written in Go gives it an unfair advantage, but at this early stage there isn&amp;rsquo;t a huge amount of config to contend with either. Even better, the server component requires very little access to the underlying host, making it a great candidate for a strictly confined snap. You can find the code for the Parca snap &lt;a href="https://github.com/parca-dev/parca/blob/64e853a94dc382feae3481f3f64efa47e8f5709c/.goreleaser.yml#L37-L85" target="_blank" rel="noreferrer"&gt;on Github&lt;/a&gt;. You get started right away with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap install parca --channel edge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;At the time of writing, the snap has two modes of operation: firstly it&amp;rsquo;ll make the &lt;code&gt;parca&lt;/code&gt; command available for you to run one-shot. Parca is configured using command line flags in conjunction with a YAML file for specifying scrape targets and object storage. Because the snap is strictly confined, it can only read from &lt;code&gt;/var/snap/parca/current&lt;/code&gt; and &lt;code&gt;/var/snap/parca/common&lt;/code&gt;, so you&amp;rsquo;ll need to be careful about where you place your config file. The snap is also automatically granted access to &lt;code&gt;/etc/parca&lt;/code&gt;, so you can drop the config file in &lt;code&gt;/etc/parca/parca.yaml&lt;/code&gt; like the upstream docs &lt;a href="https://www.parca.dev/docs/systemd" target="_blank" rel="noreferrer"&gt;suggest&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In addition to the &amp;ldquo;one-shot&amp;rdquo; mode of operation, the snap also provides a service. This essentially provides an out-of-the-box systemd configuration with a set of sensible defaults. Once installed you can start Parca immediately using the default configuration like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Start the service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap start parca
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Follow the logs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap logs -f parca
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;There are a couple of configuration options, though they&amp;rsquo;re intentionally limited for now. If you look around carefully you&amp;rsquo;ll find options to configure the in-memory profile storage limit, and the experimental on-disk storage mode.&lt;/p&gt;
&lt;h2 id="charmed-parca" class="relative group"&gt;Charmed Parca &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#charmed-parca" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;With a nice convenient way to install and basically configure Parca on any Linux machine, it was time to craft a simple charm! I&amp;rsquo;ll not delve too deep here, as the details of writing Charmed Operators is well covered in the &lt;a href="https://juju.is/docs/sdk" target="_blank" rel="noreferrer"&gt;SDK Docs&lt;/a&gt;. I do want to highlight some interesting points from those early commits, though…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I created a simple &lt;a href="https://github.com/jnsgruk/parca-operator/blob/a63ae8ba18d01c6bf3f002853cf043846ba79605/src/parca.py" target="_blank" rel="noreferrer"&gt;class&lt;/a&gt; that represents Parca in the codebase. This is a very simple wrapper around a set of snap commands.&lt;/li&gt;
&lt;li&gt;I&amp;rsquo;m utilising the snap &lt;a href="https://charmhub.io/operator-libs-linux/libraries/snap" target="_blank" rel="noreferrer"&gt;library&lt;/a&gt; from Charmhub to keep things brief&lt;/li&gt;
&lt;li&gt;The above class enables us to keep the actual &lt;a href="https://github.com/jnsgruk/parca-operator/blob/a63ae8ba18d01c6bf3f002853cf043846ba79605/src/charm.py" target="_blank" rel="noreferrer"&gt;charm class&lt;/a&gt; very simple indeed!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I used to opportunity to test out a new way of testing &amp;ldquo;machine charms&amp;rdquo;. If you&amp;rsquo;re so inclined, you can dig in and see that there are &lt;a href="https://github.com/jnsgruk/parca-operator/tree/a63ae8ba18d01c6bf3f002853cf043846ba79605/tests/unit" target="_blank" rel="noreferrer"&gt;unit tests&lt;/a&gt; that focus solely on the lifecycle of the charm and its interation with the Juju hook tools, followed by &lt;a href="https://github.com/jnsgruk/parca-operator/tree/a63ae8ba18d01c6bf3f002853cf043846ba79605/tests/functional" target="_blank" rel="noreferrer"&gt;functional tests&lt;/a&gt; which make no assumptions about being run in the context of Juju and validate only the system-level behaviour of installing and manipulating the snap, and finally &lt;a href="https://github.com/jnsgruk/parca-operator/blob/a63ae8ba18d01c6bf3f002853cf043846ba79605/tests/integration/test_charm.py" target="_blank" rel="noreferrer"&gt;integration tests&lt;/a&gt; which build and deploy the charm on a real LXD cluster.&lt;/p&gt;
&lt;p&gt;But what about Kubernetes, I hear you ask? Well thankfully, because the kind folks at Polar Signals provide OCI images for each of their builds , it wasn&amp;rsquo;t much trouble to get it running on Kubernetes either, as early commits &lt;a href="https://github.com/jnsgruk/parca-k8s-operator/blob/0a45421025d381fcb21629095e84e33c56e827fd/src/charm.py" target="_blank" rel="noreferrer"&gt;would indicate&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="integrating-parca-with-the-canonical-observability-stack" class="relative group"&gt;Integrating Parca with the Canonical Observability Stack &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#integrating-parca-with-the-canonical-observability-stack" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Here&amp;rsquo;s where things got a bit magic Over the past 12 months, the Observability charm team have been busily working on the &lt;a href="https://charmhub.io/topics/canonical-observability-stack" target="_blank" rel="noreferrer"&gt;Canonical Observability Stack&lt;/a&gt;, which combines Prometheus, Grafana, Loki and Alertmanager into a turn-key observability solution on top of MicroK8s (or any other CNCF-conformant Kubernetes , for that matter.).&lt;/p&gt;
&lt;p&gt;I mentioned earlier on that Parca took inspiration from Prometheus&amp;rsquo; configuration when it comes to defining its profiling targets. This made my life very easy in this case. The Observability team have defined the &lt;a href="https://charmhub.io/prometheus-k8s/libraries/prometheus_scrape" target="_blank" rel="noreferrer"&gt;prometheus_scrape&lt;/a&gt; relation which provides a Charm library that anyone can use to integrate their application such that prometheus can scrape it for metrics. In my case, I wanted to re-use the other side of that library! While the overall changes I made to the charm in this phase were large, this &lt;a href="https://github.com/jnsgruk/parca-operator/commit/7537ae0526dbbadf9f22c5968193d126c104618b#diff-b9ed39bbc9c0387bd3e07da31d13373745534a1cd723d3e292c73496b12e307c" target="_blank" rel="noreferrer"&gt;diff&lt;/a&gt; highlights they key changes I needed to make in order to reuse the existing implementation. I later forked this library and updated the interface name to &lt;code&gt;parca_scrape&lt;/code&gt; to ensure that there are no mistakes when relating charms at runtime.&lt;/p&gt;
&lt;p&gt;This meant that any charmed application could now trivially implement a relation that enabled it to be profiled by Parca . I chose to do this initially with a small stub operator called &lt;code&gt;juju-introspect&lt;/code&gt; (&lt;a href="https://charmhub.io/juju-introspect" target="_blank" rel="noreferrer"&gt;Charmhub&lt;/a&gt;/&lt;a href="https://github.com/jnsgruk/juju-introspect-operator" target="_blank" rel="noreferrer"&gt;Github&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Of course, once I&amp;rsquo;d worked this out, the implementation was relatively trivial to port to the Kubernetes charm too. Over a total of a few hours, I had created and published a Charmed Operator for Parca for both Kubernetes and machines that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Installs Parca from the Snap store (machines only)&lt;/li&gt;
&lt;li&gt;Starts and manages Parca&amp;rsquo;s configuration with minimal overhead on human operators&lt;/li&gt;
&lt;li&gt;Enables Parca to profile other applications using relations&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jnsgruk/parca-operator/commit/53f6f078ed5fa1489f5526ef501f17a2e1c9ad1e" target="_blank" rel="noreferrer"&gt;Provide integrations with Prometheus&lt;/a&gt; so that Parca can be scraped for metrics&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jnsgruk/parca-k8s-operator/commit/2160139ab427a528f9b4597969b7ac224fdfd949" target="_blank" rel="noreferrer"&gt;Provide integrations with Grafana&lt;/a&gt; and include a &lt;a href="https://github.com/jnsgruk/parca-k8s-operator/commit/2160139ab427a528f9b4597969b7ac224fdfd949#diff-dd822e68fe3d5e5e25161716bce5afdc7ac65b1d9754b622cce1d3690f38ddb2" target="_blank" rel="noreferrer"&gt;default dashboard&lt;/a&gt; for both charms&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jnsgruk/parca-k8s-operator/commit/60543697a59c148a0408105901d542472e0d5623" target="_blank" rel="noreferrer"&gt;Integrate with the Traefik ingress&lt;/a&gt; on Kubernetes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The other side of the coin is similarly approachable. Take the &lt;a href="https://charmhub.io/zinc-k8s" target="_blank" rel="noreferrer"&gt;Zinc&lt;/a&gt; operator as an example - Zinc is a modern, efficient alternative to Elasticsearch written in Go, and happens to provide a profiling endpoint when configured correctly - you can see &lt;em&gt;all of the effort&lt;/em&gt; required to enable that integration in the Juju model in &lt;a href="https://github.com/jnsgruk/zinc-k8s-operator/commit/ac64482af13f92777841f7782a7b1320c5454e3c" target="_blank" rel="noreferrer"&gt;this diff&lt;/a&gt; .&lt;/p&gt;
&lt;h2 id="try-it-out" class="relative group"&gt;Try it out! &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#try-it-out" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;So what if you want to get started?! I think there are two interesting experiments for the reader as a result of this article:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Profiling a Juju controller on LXD&lt;/li&gt;
&lt;li&gt;Profiling Zinc on Kubernetes&lt;/li&gt;
&lt;li&gt;Integrating Parca with the Canonical Observability Stack&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following sections assume that you have access to a machine with a LXD setup, and a &lt;a href="https://microk8s.io" target="_blank" rel="noreferrer"&gt;MicroK8s&lt;/a&gt; setup. I use &lt;a href="https://multipass.run" target="_blank" rel="noreferrer"&gt;Multipass&lt;/a&gt; for this, but you can find a nice break down &lt;a href="https://juju.is/docs/sdk/dev-setup" target="_blank" rel="noreferrer"&gt;in the Juju docs&lt;/a&gt; if you need to get set up.&lt;/p&gt;
&lt;h3 id="profiling-a-juju-controller-on-lxd" class="relative group"&gt;Profiling a Juju controller on LXD &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#profiling-a-juju-controller-on-lxd" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;Make sure you&amp;rsquo;ve got access to a LXD cluster, and the perform the following steps to bootstrap a Juju controller, then augment the controller machine with the &lt;code&gt;juju-introspect&lt;/code&gt; operator (I&amp;rsquo;m going to give this some more thought in coming months; as Juju 3.0 releases we&amp;rsquo;ll introduce a &amp;lsquo;controller charm&amp;rsquo; that&amp;rsquo;ll be able to handle this natively!)&lt;/p&gt;
&lt;p&gt;Check out the asciinema recording below for a detailed walkthrough, or follow the instructions below:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://asciinema.org/a/517942" target="_blank" rel="noreferrer"&gt;
&lt;figure&gt;&lt;img src="https://asciinema.org/a/517942.svg" alt="asciicast" class="mx-auto my-0 rounded-md" /&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="01.jpg"&gt;
&lt;figure&gt;&lt;img src="01.jpg" alt="controller-profile" class="mx-auto my-0 rounded-md" /&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Bootstrap a new Juju controller on LXD&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju bootstrap localhost lxd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Switch to the controller model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju switch controller
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Deploy the charm to the controller machine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju deploy juju-introspect -to &lt;span class="m"&gt;0&lt;/span&gt; --channel edge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Now you&amp;#39;ve got a controller machine up, you&amp;#39;re ready to start profiling.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Deploy the Parca operator&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju deploy parca --channel edge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Relate Parca to the juju-introspect operator to configure a profiling target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju relate parca juju-introspect
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You can monitor the status of these operations with &lt;code&gt;juju status&lt;/code&gt;, once things are settled you should be able to browse to the address of the Parca charm (on port &lt;code&gt;7070&lt;/code&gt;) and start exploring profiles.&lt;/p&gt;
&lt;h3 id="profiling-zinc-on-kubernetes" class="relative group"&gt;Profiling Zinc on Kubernetes &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#profiling-zinc-on-kubernetes" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;In this section, we&amp;rsquo;ll explore how to profile Zinc with Parca on Kubernetes with Juju, but also the integrations with Prometheus and Grafana. I&amp;rsquo;ve included a short recording here to show the process, and some abbreviated instructions…&lt;/p&gt;
&lt;p&gt;Check out the asciinema recording below for a detailed walkthrough, or follow the instructions below:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://asciinema.org/a/517947" target="_blank" rel="noreferrer"&gt;
&lt;figure&gt;&lt;img src="https://asciinema.org/a/517947.svg" alt="asciicast" class="mx-auto my-0 rounded-md" /&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Once you&amp;rsquo;re done with that, you can login to the Parca dashboard and start comparing profiles:&lt;/p&gt;
&lt;p&gt;&lt;a href="02.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2022/08/continuous-profiling-juju/02_hu_54497b8f4a6ee356.webp 330w,https://jnsgr.uk/2022/08/continuous-profiling-juju/02_hu_24390646f300fc19.webp 660w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/02_hu_98ec0ce03fd4b4a4.webp 1024w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/02_hu_df5d4de5fab10682.webp 1320w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1776"
height="1380"
class="mx-auto my-0 rounded-md"
alt="parca-zinc-profile"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2022/08/continuous-profiling-juju/02_hu_6b1951fb75571310.png" srcset="https://jnsgr.uk/2022/08/continuous-profiling-juju/02_hu_1bb95c34f0ff7db0.png 330w,https://jnsgr.uk/2022/08/continuous-profiling-juju/02_hu_6b1951fb75571310.png 660w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/02_hu_b5baac81a2f9d707.png 1024w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/02_hu_6de5e1322b48ce17.png 1320w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And also take time to check out the targets page, and notice that the target has been automatically labelled with information about the target application&amp;rsquo;s location in the Juju model:&lt;/p&gt;
&lt;p&gt;&lt;a href="03.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2022/08/continuous-profiling-juju/03_hu_d3f9066834c80aa0.webp 330w,https://jnsgr.uk/2022/08/continuous-profiling-juju/03_hu_625f17997029c3.webp 660w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/03_hu_490a4089fd18ae84.webp 1024w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/03_hu_63d6a331abad69ee.webp 1320w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1835"
height="1303"
class="mx-auto my-0 rounded-md"
alt="parca-zinc-target"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2022/08/continuous-profiling-juju/03_hu_c149236a5cc56756.png" srcset="https://jnsgr.uk/2022/08/continuous-profiling-juju/03_hu_f51dc4683bcc59e8.png 330w,https://jnsgr.uk/2022/08/continuous-profiling-juju/03_hu_c149236a5cc56756.png 660w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/03_hu_8f68939bd1cdedb3.png 1024w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/03_hu_3aabbe947fb4b4bd.png 1320w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To try out profiling Zinc with Parca yourself, try the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Bootstrap a Juju controller on MicroK8s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju bootstrap microk8s micro
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add a model for us to deploy into&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju add-model dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Deploy Zinc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju deploy zinc-k8s --trust
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Deploy Parca&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju deploy parca-k8s --channel edge --trust
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Relate the two apps to configure profiling&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju relate parca-k8s zinc-k8s:profiling-endpoint
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;As before, if you login to the Parca dashboard you should now see Zinc as a profiling target.&lt;/p&gt;
&lt;h3 id="integrating-parca-with-the-canonical-observability-stack-1" class="relative group"&gt;Integrating Parca with the Canonical Observability Stack &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#integrating-parca-with-the-canonical-observability-stack-1" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;&lt;p&gt;As a bonus step, you can now deploy Prometheus and Grafana, and use them to monitor Parca itself!&lt;/p&gt;
&lt;p&gt;Check out the asciinema recording below for a detailed walkthrough, or follow the instructions below. It assumes the starting point is the end-state of the Kubernetes walkthrough above:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://asciinema.org/a/517948" target="_blank" rel="noreferrer"&gt;
&lt;figure&gt;&lt;img src="https://asciinema.org/a/517948.svg" alt="asciicast" class="mx-auto my-0 rounded-md" /&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Once you&amp;rsquo;re done, you can login to the Grafana instance and check the dashboard for Parca:&lt;/p&gt;
&lt;p&gt;&lt;a href="04.png"&gt;
&lt;figure&gt;
&lt;picture
class="mx-auto my-0 rounded-md"
&gt;
&lt;source
srcset="https://jnsgr.uk/2022/08/continuous-profiling-juju/04_hu_9103193b810c630b.webp 330w,https://jnsgr.uk/2022/08/continuous-profiling-juju/04_hu_b4447ad850014919.webp 660w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/04_hu_1766095538fbf712.webp 1024w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/04_hu_447f08761fc603ea.webp 1320w
"
sizes="100vw"
type="image/webp"
/&gt;
&lt;img
width="1835"
height="1226"
class="mx-auto my-0 rounded-md"
alt="grafana"
loading="lazy" decoding="async"
src="https://jnsgr.uk/2022/08/continuous-profiling-juju/04_hu_b6dffcc595db1a84.png" srcset="https://jnsgr.uk/2022/08/continuous-profiling-juju/04_hu_259e9354d1ff2e1e.png 330w,https://jnsgr.uk/2022/08/continuous-profiling-juju/04_hu_b6dffcc595db1a84.png 660w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/04_hu_3f8eb6fadfe09d0d.png 1024w
,https://jnsgr.uk/2022/08/continuous-profiling-juju/04_hu_fa9f7c1fdc452fb9.png 1320w
"
sizes="100vw"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To try out the COS x Parca integration yourself, try the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Deploy Prometheus&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju deploy prometheus-k8s --trust --channel edge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Deploy Grafana&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju deploy grafana-k8s --trust --channel edge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Setup the relations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju relate grafana-k8s:grafana-source prometheus-k8s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju relate prometheus-k8s parca-k8s:metrics-endpoint
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju relate grafana-k8s parca-k8s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Wait for things to settle in the Juju status output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Get the admin password for Grafana&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;juju run-action grafana-k8s/0 get-admin-password --wait
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Now you should be able to login to the Grafana application at http://&amp;lt;app address&amp;gt;:3000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# and see the Parca dashboard!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;And that&amp;rsquo;s it! You&amp;rsquo;re now profiling Zinc with Parca, which is being scraped by Prometheus for metrics, and dashboarded in Grafana.&lt;/p&gt;
&lt;h2 id="conclusions" class="relative group"&gt;Conclusions &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#conclusions" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;Well, that was fun! What have we learned?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The combination of snap packaging and Charmed Operators can make for a powerful, yet readable and maintainable set of automation for deploying applications &lt;em&gt;anywhere&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;With the proliferation of more charm libraries (particularly from the Observability team!) it&amp;rsquo;s getting easier and easier for developers to integrate pieces of the Charmed Operator ecosystem&lt;/li&gt;
&lt;li&gt;The Operator Framework makes it trivial to share code between operators designed for machines/bare-metal and Kubernetes, reducing the development time for operators&lt;/li&gt;
&lt;li&gt;Parca looks really nice&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;m going to continue to play with Parca. I&amp;rsquo;d like to have a continuous profiling tool better integrated with Juju 3.0 so that the team, and others, can use it to help us improve the performance of Juju itself. With the introduction of the controller charm, this should be eminently feasible. We may seek one day to integrate a continuous profiling tool into the Canonical Observability Stack. If you&amp;rsquo;ve got ideas about this, or you&amp;rsquo;d like to contribute then get in touch and let&amp;rsquo;s talk about it!&lt;/p&gt;
&lt;p&gt;Additionally, this post only really explored the possibility of using the Parca Server to scrape applications that are already set up for profiling. In the future I&amp;rsquo;d like to have a go at packaging the Parca Agent, so that we can unlock that juicy host-level, eBPF powered profiling and enable you get the benefit of continuous profiling in all of your deployments, irrespective of the technologies you&amp;rsquo;re deploying with Juju.&lt;/p&gt;
&lt;h2 id="links" class="relative group"&gt;Links &lt;span class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100"&gt;&lt;a class="group-hover:text-primary-300 dark:group-hover:text-neutral-700" style="text-decoration-line: none !important;" href="#links" aria-label="Anchor"&gt;#&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;I&amp;rsquo;ve collected some links from throughout the article for reference:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parca - &lt;a href="https://parca.dev" target="_blank" rel="noreferrer"&gt;Homepage&lt;/a&gt; / &lt;a href="https://github.com/parca-dev/parca" target="_blank" rel="noreferrer"&gt;Github&lt;/a&gt; / &lt;a href="https://snapcraft.io/parca" target="_blank" rel="noreferrer"&gt;Snap Store&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Parca Operator - &lt;a href="https://github.com/jnsgruk/parca-operator" target="_blank" rel="noreferrer"&gt;Github&lt;/a&gt; / &lt;a href="https://charmhub.io/parca" target="_blank" rel="noreferrer"&gt;Charmhub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Parca Kubernetes Operator - &lt;a href="https://github.com/jnsgruk/parca-k8s-operator" target="_blank" rel="noreferrer"&gt;Github&lt;/a&gt; / &lt;a href="https://charmhub.io/parca-k8s" target="_blank" rel="noreferrer"&gt;Charmhub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>