<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>PageFortress</title><description>Dylan Page on platform engineering, Kubernetes, the CNCF community, and whatever else is on the workbench.</description><link>https://pagefortress.com/</link><item><title>Reviving This Blog</title><link>https://pagefortress.com/posts/reviving-this-blog/</link><guid isPermaLink="true">https://pagefortress.com/posts/reviving-this-blog/</guid><description>The last post here was March 2020. New stack, updated bio, feeds that actually work, and what to expect from this site going forward.</description><pubDate>Wed, 15 Jul 2026 04:30:00 GMT</pubDate><content:encoded>&lt;p&gt;The last post here went up in March 2020, a guide to keeping monitoring simple. Then the world got interesting, and this site sat frozen while the bio drifted two jobs out of date. If you visited recently, the sidebar and the about page couldn&apos;t even agree on where I worked. I&apos;ll take the hit on that one.&lt;/p&gt;
&lt;p&gt;Funny part is, the first post on this blog was about picking Pelican and Netlify specifically to remove the friction that killed my old Hugo site, so I could &quot;gain back that drive to produce content.&quot; Three posts and then six years of silence says the friction was never really the stack. Since that last post I picked up a Principal title at Autodesk, jumped to Lambda to build GPU cloud infrastructure, and moved into engineering management. The writing energy went into RFCs, decision docs, and CNCF work instead, and the blog lost every prioritization battle it entered.&lt;/p&gt;
&lt;p&gt;So this is the rebuild. The site now runs on &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt; with the &lt;a href=&quot;https://github.com/satnaing/astro-paper&quot;&gt;AstroPaper&lt;/a&gt; theme: dark mode, an RSS feed that&apos;s actually on (I had feeds disabled for eight years and didn&apos;t know until this migration), a &lt;a href=&quot;/talks&quot;&gt;talks page&lt;/a&gt;, and social cards that unfurl properly. Netlify stays. It&apos;s been quietly deploying this thing since 2018 and has earned its keep. Comments are gone. Disqus wasn&apos;t worth what it cost, and if you want to argue with me about something I wrote, I&apos;m easy to find.&lt;/p&gt;
&lt;p&gt;Full disclosure: an AI agent did most of this migration while I made the calls. It audited the old setup, caught that the build was pinned to a Python version Netlify no longer ships (the next deploy would have failed), converted the old posts, and wired up redirects so old links still work. Working with agents like this is a big part of my day job now, and it&apos;s exactly the kind of thing I want to write about here.&lt;/p&gt;
&lt;p&gt;What to expect going forward: platform engineering and Kubernetes, CNCF and TAG Infrastructure community work, engineering management, and the occasional personal project. I&apos;m not promising a cadence. I&apos;m promising the next gap won&apos;t be six years.&lt;/p&gt;
</content:encoded></item><item><title>Knowing Is Half the Battle</title><link>https://pagefortress.com/posts/knowing-is-half-the-battle/</link><guid isPermaLink="true">https://pagefortress.com/posts/knowing-is-half-the-battle/</guid><description>A DevOps Guide to Keeping Monitoring Simple</description><pubDate>Mon, 09 Mar 2020 00:33:00 GMT</pubDate><content:encoded>&lt;p&gt;One of our current struggles with stabilizing a platform is usually an overabundance of data generated from systems, presented on dashboards, and generating noise for our monitoring/alerts. &lt;strong&gt;Too many times we have had red herring after red herring as we try to decipher what exactly the data is telling us.&lt;/strong&gt; There is no guarantee that an on-call engineer or administrator will know where to look or what queries will yield meaningful insight into the current system state.&lt;/p&gt;
&lt;p&gt;Even if you have experience with setting up monitoring/alerting for your distributed systems/micro-services, I highly suggest you keep reading. I will do my best to suggest some best practices when it comes to these topics and hope they help you bridge the gap between Development and Ops.&lt;/p&gt;
&lt;p&gt;We need to go back and understand the basics of simple monitoring. I&apos;ll go over some solid signals to monitoring, that should help identify and isolate problems during an incident. The goal is the reduction of erroneous on-call engineer pages, more time spent on identifying and troubleshooting the root cause, and quicker &lt;strong&gt;MTTD&lt;/strong&gt; (Mean Time to Detection) and &lt;strong&gt;MTTR&lt;/strong&gt; (Mean Time to Resolution).&lt;/p&gt;
&lt;h2&gt;Table of contents&lt;/h2&gt;
&lt;h2&gt;Golden Signals&lt;/h2&gt;
&lt;p&gt;One of the things I will reference as a core theme for this post is Google&apos;s &quot;&lt;a href=&quot;https://landing.google.com/sre/sre-book/chapters/monitoring-distributed-systems/#xref_monitoring_golden-signals&quot;&gt;Four Golden Signals&lt;/a&gt;&quot; from its SRE book. These signals are &lt;strong&gt;latency, traffic, errors, and saturation&lt;/strong&gt;. I highly recommend reading up on them and keeping it in the back of your mind as we will use this when going over the type of things we will be monitoring depending on the type of service.&lt;/p&gt;
&lt;p&gt;As stated previously, one of the main problems faced is an overabundance of data. We do not do a great job of aggregating or isolating the important &quot;four signals&quot; for our services. &lt;strong&gt;Great aggregation is magical&lt;/strong&gt;. Systems instantly appear simpler and the extra application data is isolated to where they belong. Having a good system for aggregation and classification of your services reduces the amount of thinking required to troubleshoot.&lt;/p&gt;
&lt;p&gt;A lot of systems can be easily classified into 4 categories: &lt;strong&gt;HTTP/RPC, Queue Processing, Stream Processing, and Job Processing&lt;/strong&gt;. Taking into consideration Google&apos;s &quot;Golden Signals&quot;, you&apos;ll see that for each different type of service, there will be different golden signals that really give a good overview of a system&apos;s health without needing much raw data to analyze.&lt;/p&gt;
&lt;h3&gt;HTTP/RPC&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(Traffic) Request rate&lt;/strong&gt; — how much traffic is the service dealing with, measured in queries per second.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Errors) Error rate&lt;/strong&gt; — how much of the incoming requests are failing, measured as a portion of total traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Latency) Duration&lt;/strong&gt; — how long are we taking to process each request, measured as a percentile on a histogram, usually the 99th percentile.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Queue Processor (SQS, ZeroMQ, RabbitMQ, etc)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(Latency/Traffic) Lag&lt;/strong&gt; — how much time passed between the message ingress time and when we start processing it, measured in milliseconds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Traffic/Saturation) Net queue size&lt;/strong&gt; — how many messages were written to the queue minus how many messages were removed from the queue in a given time frame.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Errors) Error rate&lt;/strong&gt; — the number of messages we failed processing divided by the number of messages we tried to process. Measured as a percentage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Latency) Duration&lt;/strong&gt; — see HTTP/RPC Duration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Stream Processor (Batch File, Kafka, Kinesis)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(Latency) Lag per partition per ingress topic&lt;/strong&gt; — Kafka, for example, takes topics as input, then splits each topic into one or more partition. The lag is determined based on the difference in index position of the consumer groups across multiple partitions. Measured in message counts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Errors) Errors&lt;/strong&gt; — see queue processor error rate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Traffic) Throughput&lt;/strong&gt; — a sum of how many messages the processor emits in a given time frame, for a specific topic.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Scheduled Job (cron, K8s, etc.)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;(Errors) Failed jobs&lt;/strong&gt; — a count of how many jobs failed to run to completion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Traffic/Saturation) Missed Executions&lt;/strong&gt; — by nature, scheduled jobs depend on a scheduler being available to invoke them. We monitor missed executions by comparing actual attempts vs duration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Latency) Duration&lt;/strong&gt; — see other duration signals.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These key signals should be kept in mind when designing alerts or monitoring around the different services worked on everyday. This does not mean these signals should be the only ones you use in terms of monitoring the health of your system, but it should be a good starting point or a bare minimum to help clear out any unwanted red herrings or unnecessary data points.&lt;/p&gt;
&lt;h2&gt;Platform Metrics&lt;/h2&gt;
&lt;p&gt;Up until now, we were solely focused on application metrics and what good &quot;golden signals&quot; for that specific type of data looked like. However, you&apos;ll notice a lack of representation of one signal, &lt;strong&gt;Saturation&lt;/strong&gt;. While saturation is easily measured for some services, others are not as easily measured based on just application data alone. That is where platform metrics come in.&lt;/p&gt;
&lt;p&gt;These are your typical platform metrics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Disk
&lt;ul&gt;
&lt;li&gt;Free Space&lt;/li&gt;
&lt;li&gt;I/O&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Network
&lt;ul&gt;
&lt;li&gt;I/O (throughput)&lt;/li&gt;
&lt;li&gt;latency/loss&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Platform metrics alone are the biggest culprit of red herrings and noisy alerts. Thresholds are often set too high or too low. Dashboard resolution (time spans) are often set too long or too short to reveal the correct picture. It is easy to get rabbit-holed into a CPU spike, or a memory dip, but remember that they tend to lead in the wrong direction without corroborating evidence from logs or application data. Platform metrics are at best circumstantial.&lt;/p&gt;
&lt;h2&gt;Keep. It. Simple. Silly.&lt;/h2&gt;
&lt;p&gt;My favorite part of the Golden Signals section is &quot;&lt;a href=&quot;https://landing.google.com/sre/sre-book/chapters/monitoring-distributed-systems/#as-simple-as-possible-no-simpler-lqskHx&quot;&gt;As Simple as Possible, No Simpler&lt;/a&gt;&quot;.&lt;/p&gt;
&lt;p&gt;It highlights just how easy it is for a monitoring system to become excessively complex even with the right intentions, and I believe it highlights where exactly what to strive for as a whole when it comes to monitoring our systems and services.&lt;/p&gt;
&lt;p&gt;A monitoring system can be fragile, complicated, and a maintenance burden. It ties up engineering teams from working on new products and services, and contributes to our ever growing mountain of tech debt. But we can change that. Start back at the basics and keep things simple and organized. It will be the only way we fully understand the services we created and keep our systems understandable.&lt;/p&gt;
&lt;p&gt;Please feel free to leave feedback or questions!&lt;/p&gt;
</content:encoded></item><item><title>Icingapy</title><link>https://pagefortress.com/posts/icingapy/</link><guid isPermaLink="true">https://pagefortress.com/posts/icingapy/</guid><description>A library for interacting/scrapping Icinga 1 CGI endpoints.</description><pubDate>Wed, 03 Oct 2018 19:17:00 GMT</pubDate><content:encoded>&lt;p&gt;A couple weeks ago, I created a new python project called Icingapy that act as a library for interacting with icinga cgi endpoints. It is published on PyPI as icingapy and can be found here: https://pypi.org/project/icingapy/&lt;/p&gt;
&lt;p&gt;One of the reasons I came around to doing this project is the need for interacting with Icinga at a base configuration out of box. To clarify, this is without any additional tooling setup such as &lt;a href=&quot;https://github.com/zorkian/nagios-api/blob/master/nagios-cli&quot;&gt;Nagios-API&lt;/a&gt; or any other additional solutions that require additional configuration of the Icinga/Nagios server.&lt;/p&gt;
&lt;p&gt;Why bother? In situations where Icinga 1 is a legacy system or under strict control that additional solutions are not possible, there is still a need for a library such as this.&lt;/p&gt;
&lt;p&gt;Currently the library only supports three commands, &lt;strong&gt;summary&lt;/strong&gt;, &lt;strong&gt;status&lt;/strong&gt;, and &lt;strong&gt;downtime&lt;/strong&gt;. I do plan to expand functionality however I felt that these three represent a solid start for the library. I rather focus on a few core methods first to make sure they are reliably working before expanding the feature creep.&lt;/p&gt;
&lt;p&gt;Let me know what you think about the library and feel free to leave issues or submit PRs!&lt;/p&gt;
</content:encoded></item><item><title>Setting up Pelican and Netlify</title><link>https://pagefortress.com/posts/setting-up-pelican-netlify/</link><guid isPermaLink="true">https://pagefortress.com/posts/setting-up-pelican-netlify/</guid><description>Spending all day working as a system administrator, sometimes you just don&apos;t want to spend your free time administrating more servers and services...</description><pubDate>Fri, 14 Sep 2018 19:17:00 GMT</pubDate><content:encoded>&lt;p&gt;Spending all day working as a system administrator, sometimes you just don&apos;t want to spend your free time administrating more servers and services. This is the predicament I found myself in. My previous &quot;blog&quot; was just a static site powered by &lt;a href=&quot;https://gohugo.io/&quot;&gt;Hugo&lt;/a&gt;, and I really liked it. So what happened?&lt;/p&gt;
&lt;p&gt;When I had previously setup Hugo it was all done manually, with no build pipeline, or consideration of continuous integration. It was a manual process to make changes, build the static site, and upload the files. I found myself dreading making changes to it or figuring out how to add pages/post actual blog articles. I also took it as an opportunity to gain more experience with Golang. However, the cost was losing the drive to maintain and add content. The learning curve required actively fought my drive to make blog posts or update it with changes. So, I chose to try out Netlify as a possible solution to automating some of the manual parts of maintaining a static site and hopefully gain back that drive to produce content.&lt;/p&gt;
&lt;p&gt;After signing up, Netlify setup OAuth to my GitHub account and asked for a repository. Naturally, I paused and realized I needed actual code/content before I could proceed. So naturally with the goal of making things easier, I decided on Python/Pelican. I choose Python because it is my most fluent coding language and &lt;a href=&quot;http://docs.getpelican.com/en/stable/index.html&quot;&gt;Pelican&lt;/a&gt; because that was the first recommendation that I found. After taking some time to read and research the documentation, it appeared to be mature and stable.&lt;/p&gt;
&lt;p&gt;After setting up a new Git blank git repo, I made sure to add the git repo to Netlify so that my first commit would trigger a build. I did the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dpage@do-ops:~/Coding/pagefortress.com$ mkvirtualenv -p python3.6 pelican
(pelican) dpage@do-ops:~/Coding/pagefortress.com$ pip install pelican
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you haven&apos;t used virtualenv or virtualenv-wrapper, I highly recommend checking it out here: https://virtualenvwrapper.readthedocs.io/en/latest/
It is a GREAT way to manage and organize your python virtual environments all in one place if you do not want to keep them within your project directory.&lt;/p&gt;
&lt;p&gt;For example if you use pelican for multiple projects, instead of needing a virtualenv subfolder for each project, the venv is keep in your home directory and activated simply by typing &lt;code&gt;workon pelican&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(pelican) dpage@do-ops:~/Coding/pagefortress.com$ pelican-quickstart
Welcome to pelican-quickstart v3.7.1.

This script will help you create a new Pelican-based website.

Please answer the following questions so this script can generate the files
needed by Pelican.


&amp;gt; Where do you want to create your new web site? [.]
&amp;gt; What will be the title of this web site? PageFortress
&amp;gt; Who will be the author of this web site? Dylan Page
&amp;gt; What will be the default language of this web site? [en]
&amp;gt; Do you want to specify a URL prefix? e.g., http://example.com   (Y/n) Y
&amp;gt; What is your URL prefix? (see above example; no trailing slash) http://pagefortress.com
&amp;gt; Do you want to enable article pagination? (Y/n)
&amp;gt; How many articles per page do you want? [10] 5
&amp;gt; What is your time zone? [Europe/Paris] Eastern
Please enter a valid time zone:
 (check [http://en.wikipedia.org/wiki/List_of_tz_database_time_zones])
&amp;gt; What is your time zone? [Europe/Paris] America/Detroit
&amp;gt; Do you want to generate a Fabfile/Makefile to automate generation and publishing? (Y/n)
&amp;gt; Do you want an auto-reload &amp;amp; simpleHTTP script to assist with theme and site development? (Y/n)
&amp;gt; Do you want to upload your website using FTP? (y/N)
&amp;gt; Do you want to upload your website using SSH? (y/N)
&amp;gt; Do you want to upload your website using Dropbox? (y/N)
&amp;gt; Do you want to upload your website using S3? (y/N)
&amp;gt; Do you want to upload your website using Rackspace Cloud Files? (y/N)
&amp;gt; Do you want to upload your website using GitHub Pages? (y/N)
Done. Your new project is available at /home/dpage/Coding/pagefortress.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now that the project core is ready, setup Netlify to build the site using the command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(pelican) dpage@do-ops:~/Coding/pagefortress.com$ pelican content
Done: Processed 1 article, 0 drafts, 1 page and 0 hidden pages in 0.21 seconds.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you run into issues with the build failing, using the &lt;code&gt;-D&lt;/code&gt; option for debug output, to review the logs.&lt;/p&gt;
&lt;p&gt;You can find the Pelican install documentation here: http://docs.getpelican.com/en/stable/install.html&lt;/p&gt;
&lt;p&gt;Also make sure to freeze your pip versions to &lt;code&gt;requirements.txt&lt;/code&gt; and set a python version in &lt;code&gt;runtime.txt&lt;/code&gt;. See: https://www.netlify.com/docs/continuous-deployment/#set-node-ruby-or-python-version&lt;/p&gt;
&lt;p&gt;Next, it was simple as picking a theme (http://docs.getpelican.com/en/stable/settings.html#themes) and start to write content! I chose reStructuredText, but Markdown is also supported.&lt;/p&gt;
</content:encoded></item></channel></rss>