501 lines
28 KiB
HTML
501 lines
28 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
|
||
<meta charset="utf-8" />
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||
|
||
<title>The TwinSLO Proposal</title>
|
||
<meta name="HandheldFriendly" content="True" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
|
||
<link rel="stylesheet" type="text/css" href="https://blog.relyabilit.ie/assets/css/style.css?v=QmDy475QI3K1foi7" />
|
||
|
||
<script>
|
||
var siteUrl = 'https://blog.relyabilit.ie';
|
||
</script>
|
||
|
||
<script>
|
||
var localTheme = localStorage.getItem('attila_theme');
|
||
switch (localTheme) {
|
||
case 'dark':
|
||
document.documentElement.classList.add('theme-dark');
|
||
break;
|
||
case 'light':
|
||
document.documentElement.classList.add('theme-light');
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
</script>
|
||
|
||
|
||
|
||
<style>
|
||
.theme-dark:root {
|
||
--ghost-accent-color: #ff6633;
|
||
}
|
||
@media (prefers-color-scheme: dark) {
|
||
html:not(.theme-light):root {
|
||
--ghost-accent-color: #ff6633;
|
||
}
|
||
}
|
||
</style>
|
||
|
||
<link rel="icon" href="https://storage.ghost.io/c/35/8b/358be036-5da7-4000-beff-df259098e18a/content/images/2021/09/App-Amethyst.ico" type="image/x-icon">
|
||
<link rel="canonical" href="https://blog.relyabilit.ie/the-twinslo-proposal/">
|
||
<meta name="referrer" content="no-referrer-when-downgrade">
|
||
|
||
<meta property="og:site_name" content="RelyAbility Blog">
|
||
<meta property="og:type" content="article">
|
||
<meta property="og:title" content="The TwinSLO Proposal">
|
||
<meta property="og:description" content="Comments/Insights/Contributions from
|
||
|
||
|
||
* Niall Murphy
|
||
* Toby Burress
|
||
* Štěpán Davidovič
|
||
* Sal Furino
|
||
|
||
(Note that when I say "we" below, I don't specifically intend to speak for these fine people, I'm just using the academic "we". -Niall)
|
||
|
||
|
||
|
||
Introduction
|
||
|
||
If you don’t already know about SLOs, we can recommend">
|
||
<meta property="og:url" content="https://blog.relyabilit.ie/the-twinslo-proposal/">
|
||
<meta property="og:image" content="https://storage.ghost.io/c/35/8b/358be036-5da7-4000-beff-df259098e18a/content/images/2024/03/niallm_twin_slos_39ba93db-a872-4f63-8724-bce4f3fde06d.png">
|
||
<meta property="article:published_time" content="2024-03-27T20:57:14.000Z">
|
||
<meta property="article:modified_time" content="2024-03-27T21:40:05.000Z">
|
||
<meta property="article:tag" content="SLOs">
|
||
<meta property="article:tag" content="models">
|
||
|
||
<meta property="article:publisher" content="https://www.facebook.com/ghost">
|
||
<meta name="twitter:card" content="summary_large_image">
|
||
<meta name="twitter:title" content="The TwinSLO Proposal">
|
||
<meta name="twitter:description" content="Comments/Insights/Contributions from
|
||
|
||
|
||
* Niall Murphy
|
||
* Toby Burress
|
||
* Štěpán Davidovič
|
||
* Sal Furino
|
||
|
||
(Note that when I say "we" below, I don't specifically intend to speak for these fine people, I'm just using the academic "we". -Niall)
|
||
|
||
|
||
|
||
Introduction
|
||
|
||
If you don’t already know about SLOs, we can recommend">
|
||
<meta name="twitter:url" content="https://blog.relyabilit.ie/the-twinslo-proposal/">
|
||
<meta name="twitter:image" content="https://storage.ghost.io/c/35/8b/358be036-5da7-4000-beff-df259098e18a/content/images/2024/03/niallm_twin_slos_39ba93db-a872-4f63-8724-bce4f3fde06d.png">
|
||
<meta name="twitter:label1" content="Written by">
|
||
<meta name="twitter:data1" content="Niall Murphy">
|
||
<meta name="twitter:label2" content="Filed under">
|
||
<meta name="twitter:data2" content="SLOs, models">
|
||
<meta name="twitter:site" content="@niallm">
|
||
<meta name="twitter:creator" content="@niallm">
|
||
<meta property="og:image:width" content="1024">
|
||
<meta property="og:image:height" content="1024">
|
||
|
||
<script type="application/ld+json">
|
||
{
|
||
"@context": "https://schema.org",
|
||
"@type": "Article",
|
||
"publisher": {
|
||
"@type": "Organization",
|
||
"name": "RelyAbility Blog",
|
||
"url": "https://blog.relyabilit.ie/",
|
||
"logo": {
|
||
"@type": "ImageObject",
|
||
"url": "https://storage.ghost.io/c/35/8b/358be036-5da7-4000-beff-df259098e18a/content/images/2021/09/Logo---Alternate-Layout---Black-2.png"
|
||
}
|
||
},
|
||
"author": {
|
||
"@type": "Person",
|
||
"name": "Niall Murphy",
|
||
"image": {
|
||
"@type": "ImageObject",
|
||
"url": "https://storage.ghost.io/c/35/8b/358be036-5da7-4000-beff-df259098e18a/content/images/2021/11/recent-headshot--2-.jpg",
|
||
"width": 622,
|
||
"height": 587
|
||
},
|
||
"url": "https://blog.relyabilit.ie/author/niallmurphy/",
|
||
"sameAs": [
|
||
"http://www.relyabilit.ie",
|
||
"https://x.com/niallm"
|
||
]
|
||
},
|
||
"headline": "The TwinSLO Proposal",
|
||
"url": "https://blog.relyabilit.ie/the-twinslo-proposal/",
|
||
"datePublished": "2024-03-27T20:57:14.000Z",
|
||
"dateModified": "2024-03-27T21:40:05.000Z",
|
||
"image": {
|
||
"@type": "ImageObject",
|
||
"url": "https://storage.ghost.io/c/35/8b/358be036-5da7-4000-beff-df259098e18a/content/images/2024/03/niallm_twin_slos_39ba93db-a872-4f63-8724-bce4f3fde06d.png",
|
||
"width": 1024,
|
||
"height": 1024
|
||
},
|
||
"keywords": "SLOs, models",
|
||
"description": "\n\n\n\n\nComments/Insights/Contributions from\n\n\n * Niall Murphy\n * Toby Burress\n * Štěpán Davidovič\n * Sal Furino\n\n (Note that when I say \"we\" below, I don't specifically intend to speak for these fine people, I'm just using the academic \"we\". -Niall)\n\n\n\nIntroduction\n\nIf you don’t already know about SLOs, we can recommend Alex Hidalgo’s book, the original SRE book chapter about them, the SRE Workbook elaborations, or the antecedents those borrow from, particularly in the telecommunications industr",
|
||
"mainEntityOfPage": "https://blog.relyabilit.ie/the-twinslo-proposal/"
|
||
}
|
||
</script>
|
||
|
||
<meta name="generator" content="Ghost 6.64">
|
||
<link rel="alternate" type="application/rss+xml" title="RelyAbility Blog" href="https://blog.relyabilit.ie/rss/">
|
||
<script defer src="https://cdn.jsdelivr.net/ghost/portal@~2.71/umd/portal.min.js" data-i18n="true" data-ghost="https://blog.relyabilit.ie/" data-key="b25ad4e06b5e0cae96b3fa8e63" data-api="https://niallmurphy.ghost.io/ghost/api/content/" data-locale="en" crossorigin="anonymous"></script><style id="gh-members-styles">.gh-post-upgrade-cta-content,
|
||
.gh-post-upgrade-cta {
|
||
display: flex;
|
||
flex-direction: column;
|
||
align-items: center;
|
||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
||
text-align: center;
|
||
width: 100%;
|
||
color: #ffffff;
|
||
font-size: 16px;
|
||
}
|
||
|
||
.gh-post-upgrade-cta-content {
|
||
border-radius: 8px;
|
||
padding: 40px 4vw;
|
||
}
|
||
|
||
.gh-post-upgrade-cta h2 {
|
||
color: #ffffff;
|
||
font-size: 28px;
|
||
letter-spacing: -0.2px;
|
||
margin: 0;
|
||
padding: 0;
|
||
}
|
||
|
||
.gh-post-upgrade-cta p {
|
||
margin: 20px 0 0;
|
||
padding: 0;
|
||
}
|
||
|
||
.gh-post-upgrade-cta small {
|
||
font-size: 16px;
|
||
letter-spacing: -0.2px;
|
||
}
|
||
|
||
.gh-post-upgrade-cta a {
|
||
color: #ffffff;
|
||
cursor: pointer;
|
||
font-weight: 500;
|
||
box-shadow: none;
|
||
text-decoration: underline;
|
||
}
|
||
|
||
.gh-post-upgrade-cta a:hover {
|
||
color: #ffffff;
|
||
opacity: 0.8;
|
||
box-shadow: none;
|
||
text-decoration: underline;
|
||
}
|
||
|
||
.gh-post-upgrade-cta a.gh-btn {
|
||
display: block;
|
||
background: #ffffff;
|
||
text-decoration: none;
|
||
margin: 28px 0 0;
|
||
padding: 8px 18px;
|
||
border-radius: 4px;
|
||
font-size: 16px;
|
||
font-weight: 600;
|
||
}
|
||
|
||
.gh-post-upgrade-cta a.gh-btn:hover {
|
||
opacity: 0.92;
|
||
}</style>
|
||
<script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/sodo-search.min.js" data-key="b25ad4e06b5e0cae96b3fa8e63" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/main.css" data-sodo-search="https://niallmurphy.ghost.io/" data-locale="en" crossorigin="anonymous"></script>
|
||
|
||
<link href="https://blog.relyabilit.ie/webmentions/receive/" rel="webmention">
|
||
<script defer src="/public/cards.min.js?v=ShRHxgy4po8zN-Wf"></script>
|
||
<link rel="stylesheet" type="text/css" href="/public/cards.min.css?v=WwnU9jw5ancNC8Gc">
|
||
<script defer src="/public/member-attribution.min.js?v=AKG4hWena9j3yX3I"></script>
|
||
<script defer src="/public/ghost-stats.min.js?v=vFcCUf6ZQ0Hyhc8h" data-stringify-payload="false" data-datasource="analytics_events" data-storage="localStorage" data-host="https://blog.relyabilit.ie/.ghost/analytics/api/v1/page_hit" tb_site_uuid="358be036-5da7-4000-beff-df259098e18a" tb_post_uuid="c09bafa3-6a15-4026-856c-eecb551ae862" tb_post_type="post" tb_member_uuid="undefined" tb_member_status="undefined" tb_gift_link=""></script><style>:root {--ghost-accent-color: #b18cfe;}</style>
|
||
</head>
|
||
|
||
<body class="post-template tag-slos tag-models">
|
||
|
||
<div class="nav-header">
|
||
<nav class="nav-wrapper" aria-label="Main">
|
||
<span class="logo">
|
||
<a href="https://blog.relyabilit.ie" title="Home"><img src="https://storage.ghost.io/c/35/8b/358be036-5da7-4000-beff-df259098e18a/content/images/2021/09/Logo---Alternate-Layout---Black-2.png" alt="Logo" /></a>
|
||
</span>
|
||
<ul>
|
||
<li class="nav-main-website"><a href="https://www.relyabilit.ie/"><span>Main Website</span></a></li>
|
||
<li class="nav-blog"><a href="https://blog.relyabilit.ie/"><span>Blog</span></a></li>
|
||
<li class="nav-help"><a href="https://ghost.org/docs/"><span>Help</span></a></li>
|
||
</ul>
|
||
|
||
<ul class="nav-meta">
|
||
<li class="nav-twitter">
|
||
<a aria-label="Twitter" href="https://x.com/niallm" title="@niallm" target="_blank">
|
||
<i class="icon icon-twitter" aria-hidden="true"></i>
|
||
<span>@niallm</span>
|
||
</a>
|
||
</li>
|
||
<li class="nav-facebook">
|
||
<a aria-label="Facebook" href="https://www.facebook.com/ghost" title="ghost" target="_blank">
|
||
<i class="icon icon-facebook" aria-hidden="true"></i>
|
||
<span>ghost</span>
|
||
</a>
|
||
</li>
|
||
<li class="nav-search" style="display: none;">
|
||
<a title="Search">
|
||
<i class="icon icon-search" aria-hidden="true"></i>
|
||
<span>Search</span>
|
||
</a>
|
||
</li>
|
||
<!--
|
||
<li class="nav-subscribe">
|
||
<a href="#/portal">Subscribe</a>
|
||
</li>
|
||
-->
|
||
</ul>
|
||
</nav>
|
||
|
||
<div class="nav-wrapper-control">
|
||
<div class="inner">
|
||
<a class="nav-menu" role="button"><i class="icon icon-menu" aria-hidden="true"></i>Menu</a>
|
||
<a class="nav-search" style="display: none;" title="Search" role="button"><i class="icon icon-search" aria-hidden="true"></i></a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="nav-close" role="button" aria-label="Close"></div>
|
||
|
||
<section class="page-wrapper">
|
||
|
||
|
||
|
||
<div class="progress-container">
|
||
<span class="progress-bar"></span>
|
||
</div>
|
||
|
||
<header class="post-header has-cover ">
|
||
<div class="inner">
|
||
<span class="post-info">
|
||
<span class="post-type">Article</span>
|
||
<span class="post-count">SLOs</span>
|
||
</span>
|
||
<h1 class="post-title">The TwinSLO Proposal</h1>
|
||
<div class="post-meta">
|
||
<div class="post-meta-avatars">
|
||
<figure class="post-meta-avatar avatar">
|
||
<a href="/author/niallmurphy/" class="author-avatar">
|
||
<img class="author-profile-image" src="https://storage.ghost.io/c/35/8b/358be036-5da7-4000-beff-df259098e18a/content/images/2021/11/recent-headshot--2-.jpg" alt="Niall Murphy" />
|
||
</a>
|
||
</figure>
|
||
</div>
|
||
<h4 class="post-meta-author"><a href="/author/niallmurphy/">Niall Murphy</a></h4>
|
||
<time datetime="27-03-2024">27 Mar 2024</time> • 5 min read
|
||
</div>
|
||
<div class="post-cover cover">
|
||
<img
|
||
srcset="https://storage.ghost.io/c/35/8b/358be036-5da7-4000-beff-df259098e18a/content/images/size/w320/2024/03/niallm_twin_slos_39ba93db-a872-4f63-8724-bce4f3fde06d.png 320w,
|
||
https://storage.ghost.io/c/35/8b/358be036-5da7-4000-beff-df259098e18a/content/images/size/w640/2024/03/niallm_twin_slos_39ba93db-a872-4f63-8724-bce4f3fde06d.png 640w,
|
||
https://storage.ghost.io/c/35/8b/358be036-5da7-4000-beff-df259098e18a/content/images/size/w960/2024/03/niallm_twin_slos_39ba93db-a872-4f63-8724-bce4f3fde06d.png 960w,
|
||
https://storage.ghost.io/c/35/8b/358be036-5da7-4000-beff-df259098e18a/content/images/size/w1920/2024/03/niallm_twin_slos_39ba93db-a872-4f63-8724-bce4f3fde06d.png 1920w"
|
||
src="https://storage.ghost.io/c/35/8b/358be036-5da7-4000-beff-df259098e18a/content/images/size/w1920/2024/03/niallm_twin_slos_39ba93db-a872-4f63-8724-bce4f3fde06d.png"
|
||
alt="The TwinSLO Proposal" />
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
<main class="content" role="main">
|
||
<article class="post tag-slos tag-models">
|
||
<div class="inner">
|
||
|
||
<section class="post-content">
|
||
|
||
<!--kg-card-begin: html-->
|
||
<p align="right">
|
||
<b>Comments/Insights/Contributions from</b>
|
||
<ul align="right">
|
||
<li>Niall Murphy</li>
|
||
<li>Toby Burress</li>
|
||
<li>Štěpán Davidovič</li>
|
||
<li>Sal Furino</li>
|
||
<p align="right"><small>(Note that when I say "we" below, I don't specifically intend to speak for these fine people, I'm just using the academic "we". -Niall)</small></p>
|
||
</ul>
|
||
<!--kg-card-end: html-->
|
||
<p><strong>Introduction</strong></p><p>If you don’t already know about SLOs, we can recommend <a href="https://www.alex-hidalgo.com/the-slo-book?ref=blog.relyabilit.ie"><u>Alex Hidalgo’s book</u></a>, the <a href="https://sre.google/sre-book/service-level-objectives/?ref=blog.relyabilit.ie"><u>original SRE book chapter about them</u></a>, the <a href="https://sre.google/workbook/implementing-slos/?ref=blog.relyabilit.ie"><u>SRE Workbook</u></a> <a href="https://sre.google/workbook/slo-engineering-case-studies/?ref=blog.relyabilit.ie"><u>elaborations</u></a>, or the antecedents those borrow from, particularly in the telecommunications industry.</p><p>The rest of this document assumes a familiarity with SLOs.</p><p><strong>Problem Statement</strong></p><p>One of the weaknesses of SLO availability reporting is that one number isn’t enough to capture <em>detail that matters</em> for high cardinalities.</p><p>Once your user population goes above a certain threshold, a perfect adherence to a 3 or 4 9s SLO doesn’t tell you anything meaningful about who or what specifically is being affected by outages. Trivially, once you have a large enough user population or underlying service volume, a potentially significant number of customers or queries can be affected by an outage and this won’t trigger an SLO violation. Indeed, whether something is a “wide-spread” violation or not depends on the size of the user population, and not on the SLO.</p><p>More importantly, one-number SLO reporting doesn’t allow for understanding the <em>distribution</em> of the failures. If some particular narrow subset of your user population is affected by an outage, perhaps even repeatedly, one-number SLO reporting doesn't allow you to discover this. Of course, any particular cohort being systematically punished is typically much worse for churn in that cohort.</p><p>On the other side of the coin, you could argue that successful SLO reporting is conditional on an environment where failures are evenly distributed - or to put it another way, if one-number SLO reporting is not working for you, SLOs are not the right tool for you precisely because your failure distributions are non-evenly distributed. Yet if in some sense, part of the idea of SLOs is help you understand <em>what you can successfully ignore</em>, it is clear that the larger and more complex your production environment gets, the problems you ignore because the SLO tells you you can, also get larger and more complex.</p><p><strong>Proposal</strong></p><p>Summary: we need a measure of the concentration of the failures that can be displayed in a simple numerical format alongside a standard one-number SLO compliance figure, that will allow the viewer to immediately understand how concentrated the failures are.</p><p>By way of analogy, consider <em>standard deviation</em>, a statistical metric designed to capture the degree of variance from a mean in a normally-distributed population. Without retreading well-understood material in excessive detail, an example might help: the average height of men in Europe is 178cm, with a standard deviation of 7cm. This means that 68% of men’s heights range between 171cm and 185cm, with 95% falling within 164cm and 192cm. The ability to say precisely this flows from the specific properties of the normal distribution. In this example, if the standard deviation was a much larger number, you would expect to see much more variation in heights; conversely, if it was smaller, you would expect to see less. In some respects, it is therefore a measure of <em>concentration</em>.</p><p>Now we turn back to our website SLO example. To really understand what’s going on, we need some measure of concentration accompanying a one-number SLO report. This measure should reflect the level of concentration of the SLO <em>failures</em>, so we can understand whether or not intervention is required.</p><p>How could we achieve this? Of course, we need a way of calculating a summary metric, but it’s actually more important to have labelled source data. A variety of metric calculation methods exist (and we talk about one of them later), but it’s really the fact that labelled data allows the creation of cohorts that matters the most. At root, the SLO model is very simple and just counts successes and failures. To properly compare distributions we need to measure more than just a boolean, so we’ll need access to an underlying dataset with full details - we can’t compute it from the SLO success/failure counts alone.</p><p>In other words, when we’re measuring concentration in this context, we really mean concentration <em>across some categories</em>. Using a Prometheus-based example, let’s say we have a metric that has <em>labels</em> associated with it - e.g. browser-requested language, source IP address, AWS region, and so on. Naively, we could calculate concentration across such labels by looking at how evenly distributed across each label they are, but this will fail for low-cardinality data (in the example above, if you only support one or two languages, or all your traffic appears to originate from a restricted set of load-balancers). Instead, we need labels with high cardinality, and ideally an underlying metric with (potentially) high variation - for example, latency. This allows you to detect concentration more effectively because you have a higher number of potential partitions to detect it in.</p><p><strong>Measuring concentration</strong></p><p>We mentioned above there are multiple ways to establish concentration metrics. Variance and standard deviation are examples of same, and are still applicable though most Internet-associated distributions are not normal, but long-tailed.</p><p>Our proposed method is to use <em>entropy loss</em>. This is illustrated in detail in <a href="https://github.com/niallrmurphy/twinslo?ref=blog.relyabilit.ie" rel="noreferrer">the twinslo repository</a>, but in summary we use the <a href="https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html?ref=blog.relyabilit.ie" rel="noreferrer">DecisionTreeClassifier</a> method of the <a href="https://scikit-learn.org/stable/index.html?ref=blog.relyabilit.ie" rel="noreferrer">sklearn module</a> to compare the expected distribution of the failures (technically, it measures log loss, but the overall effect is the same). This can also be used to stack-rank the various contributors to loss, as well as to surface one that stands out. The repository shows an example of randomly generated data with subsets that are specifically "punished", which the method can extract automatically while the rest of the data varies normally.</p><p>To summarise, assume we have a collection of labelled data with categories, and the classifier takes new, unlabelled data and tries to predict the category while the regressor tries to predict the value. As per classic ML/data-science approaches, the training data is partitioned into two sets: set A where f1<=x, and set B where f1>x. It chooses f1 and x in a couple of ways, usually either by minimizing the entropy or a squared loss function. Ultimately, no partition of your data set should have a large decrease in entropy. If it does, that means that one of the features is acting very differently from the others and is therefore appropriate for surfacing.</p><p><strong>Future Work</strong></p><p>As-is, the scikit-learn/DecisionTreeClassifier is not very inspectable and is not lift-and-shift into your existing setup. But it seems a promising avenue to investigate.</p><p>We've suggested that reporting two numbers would provide a significant benefit over reporting just one. Obviously this is most immediately relevant to the debugging case, though it's possible it's also useful in less immediate reporting contexts, so that remains to be investigated.</p><p>It's possible that exposing other things simultaneously in some UI, say distribution shapes via <a href="https://en.wikipedia.org/wiki/Sparkline?ref=blog.relyabilit.ie" rel="noreferrer">sparklines</a> or equivalent, might give you more information at approximately the same cost.</p><p>This technique relies on having labelled data in order to discriminate between subsets. In classic "SLO-only" deployments, such labels are not available, and we currently believe it is not possible to discriminate successfully as a result, since you are throwing away too much data. Perhaps we're wrong.</p><p><strong>Related Work</strong></p><p><a href="https://www.usenix.org/conference/srecon22emea/presentation/palcuie?ref=blog.relyabilit.ie"><u>Going from 30 to 30 million SLOs</u></a></p><p><a href="https://www.honeycomb.io/bubbleup?ref=blog.relyabilit.ie"><u>Honeycomb Bubbleup</u></a></p>
|
||
</section>
|
||
|
||
<section class="post-footer">
|
||
|
||
<div class="post-share">
|
||
<span class="post-info-label">Share</span>
|
||
<a title="Twitter" aria-label="Twitter" class="twitter" href="https://twitter.com/share?text=The TwinSLO Proposal&url=https://blog.relyabilit.ie/the-twinslo-proposal/" onclick="window.open(this.href, 'twitter-share', 'width=550,height=235');return false;">
|
||
<i class="icon icon-twitter" aria-hidden="true"></i>
|
||
</a>
|
||
<a title="Facebook" aria-label="Facebook" class="facebook" href="https://www.facebook.com/sharer/sharer.php?u=https://blog.relyabilit.ie/the-twinslo-proposal/" onclick="window.open(this.href, 'facebook-share','width=580,height=296');return false;">
|
||
<i class="icon icon-facebook" aria-hidden="true"></i>
|
||
</a>
|
||
<a title="LinkedIn" aria-label="LinkedIn" class="linkedin" href="https://www.linkedin.com/shareArticle?mini=true&url=https://blog.relyabilit.ie/the-twinslo-proposal//&title=The TwinSLO Proposal" onclick="window.open(this.href, 'linkedin-share', 'width=930,height=720');return false;">
|
||
<i class="icon icon-linkedin" aria-hidden="true"></i>
|
||
</a>
|
||
<a title="Email" aria-label="Email" class="email" href="mailto:?subject=The TwinSLO Proposal&body=https://blog.relyabilit.ie/the-twinslo-proposal/">
|
||
<i class="icon icon-mail" aria-hidden="true"></i>
|
||
</a>
|
||
</div>
|
||
|
||
<aside class="post-tags">
|
||
<span class="post-info-label">Topic</span>
|
||
<a href="/tag/slos/">SLOs</a> <a href="/tag/models/">models</a>
|
||
</aside>
|
||
|
||
</section>
|
||
|
||
|
||
<div id="commento"></div>
|
||
<script defer
|
||
src="https://cdn.commento.io/js/commento.js">
|
||
</script>
|
||
|
||
|
||
|
||
<aside class="post-nav">
|
||
|
||
<a class="post-nav-next" href="/graceful-degradation-and-slos/">
|
||
<section class="post-nav-teaser">
|
||
<i class="icon icon-arrow-left" aria-label="Next post"></i>
|
||
<h2 class="post-nav-title">Graceful Degradation and SLOs</h2>
|
||
<p class="post-nav-excerpt">What is graceful degradation?
|
||
|
||
Graceful degradation is the idea that, when you…</p>
|
||
<p class="post-nav-meta"><time datetime="09-04-2024">09 Apr 2024</time></p>
|
||
</section>
|
||
</a>
|
||
|
||
<a class="post-nav-prev" href="/virtual-reflections-on-kubecon-na-2023/">
|
||
<section class="post-nav-teaser">
|
||
<i class="icon icon-arrow-right" aria-label="Previous post"></i>
|
||
<h2 class="post-nav-title">Virtual Reflections on Kubecon NA 2023</h2>
|
||
<p class="post-nav-excerpt">[Reposted from Medium company blog]
|
||
|
||
Introduction
|
||
|
||
I feel like a little bit…</p>
|
||
<p class="post-nav-meta"><time datetime="17-11-2023">17 Nov 2023</time></p>
|
||
</section>
|
||
</a>
|
||
<div class="clear"></div>
|
||
</aside>
|
||
|
||
</div>
|
||
</article>
|
||
</main>
|
||
|
||
|
||
|
||
|
||
|
||
<div class="search-wrapper">
|
||
<div class="search">
|
||
<form class="search-form">
|
||
<input class="search-field" type="text" placeholder="Search …">
|
||
<button class="search-button" type="submit">
|
||
<i class="icon icon-search" aria-hidden="true"></i>
|
||
</button>
|
||
</form>
|
||
<div class="popular-wrapper">
|
||
<h4 class="popular-title">Topics</h4>
|
||
<span class="popular-tags post-tags">
|
||
<a href='/tag/models/'>models: 6</a>
|
||
<a href='/tag/sre-identity/'>sre-identity: 4</a>
|
||
<a href='/tag/slos/'>SLOs: 4</a>
|
||
<a href='/tag/organizational/'>organizational: 3</a>
|
||
<a href='/tag/incidents/'>incidents: 3</a>
|
||
<a href='/tag/planning/'>planning: 2</a>
|
||
<a href='/tag/future/'>future: 2</a>
|
||
<a href='/tag/gatekeeping/'>gatekeeping: 1</a>
|
||
<a href='/tag/horizontal/'>horizontal: 1</a>
|
||
<a href='/tag/is-not/'>is-not: 1</a>
|
||
<a href='/tag/legibility/'>legibility: 1</a>
|
||
<a href='/tag/okrs/'>okrs: 1</a>
|
||
<a href='/tag/systems-thinking/'>systems-thinking: 1</a>
|
||
<a href='/tag/google/'>google: 1</a>
|
||
</span>
|
||
</div>
|
||
<div class="search-result"></div>
|
||
</div>
|
||
<button class="search-wrapper-close" aria-label="Close"></button>
|
||
</div>
|
||
|
||
<div class="nav-footer">
|
||
<nav class="nav-wrapper" aria-label="Footer">
|
||
<span class="nav-copy">RelyAbility Blog © 2026 <a class="nav-rss" title="RSS" href="https://blog.relyabilit.ie/rss/" target="_blank"><i class="icon icon-rss" aria-hidden="true"></i></a></span>
|
||
<span class="nav-credits">Published with <a href="https://ghost.org">Ghost</a> • Theme <a href="https://github.com/zutrinken/attila">Attila</a> • <a class="menu-item js-theme" href="#" data-system="System theme" data-dark="Dark theme" data-light="Light theme"><span class="theme-icon"></span><span class="theme-text">System theme</span> </a> </span>
|
||
</nav>
|
||
</div>
|
||
|
||
</section>
|
||
|
||
<script type="text/javascript" src="https://blog.relyabilit.ie/assets/js/script.js?v=GM11IFKYlUnuOcir"></script>
|
||
|
||
<script>
|
||
$(document).ready(function () {
|
||
var viewport = $(window);
|
||
var post = $('.post-content');
|
||
// Responsive videos with fitVids
|
||
post.fitVids();
|
||
// Format code blocks and add line numbers
|
||
function codestyling() {
|
||
$('pre code').each(function(i, e) {
|
||
// Code highlight
|
||
hljs.highlightBlock(e);
|
||
// No lines for plain text blocks
|
||
if (!$(this).hasClass('language-text')) {
|
||
var code = $(this);
|
||
// Calculate amount of lines
|
||
var lines = code.html().split(/\n(?!$)/g).length;
|
||
var numbers = [];
|
||
if (lines > 1) {
|
||
lines++;
|
||
}
|
||
for (i = 1; i < lines; i++) {
|
||
numbers += '<span class="line" aria-hidden="true">' + i + '</span>';
|
||
}
|
||
code.parent().append('<div class="lines">' + numbers + '</div>');
|
||
}
|
||
});
|
||
}
|
||
codestyling();
|
||
// Reading progress bar on window top
|
||
function readingProgress() {
|
||
var postBottom = post.offset().top + post.height();
|
||
var viewportHeight = viewport.height();
|
||
var progress = 100 - (((postBottom - (viewport.scrollTop() + viewportHeight) + viewportHeight / 3) / (postBottom - viewportHeight + viewportHeight / 3)) * 100);
|
||
$('.progress-bar').css('width', progress + '%');
|
||
(progress > 100) ? $('.progress-container').addClass('complete'): $('.progress-container').removeClass('complete');
|
||
}
|
||
readingProgress();
|
||
// Trigger reading progress
|
||
viewport.on({
|
||
'scroll': function() {
|
||
readingProgress();
|
||
},
|
||
'resize': function() {
|
||
readingProgress();
|
||
},
|
||
'orientationchange': function() {
|
||
readingProgress();
|
||
}
|
||
});
|
||
|
||
});
|
||
</script>
|
||
|
||
|
||
<!-- 100% privacy friendly analytics -->
|
||
<script async defer src="https://scripts.simpleanalyticscdn.com/latest.js"></script>
|
||
<noscript><img src="https://queue.simpleanalyticscdn.com/noscript.gif" alt="" referrerpolicy="no-referrer-when-downgrade" /></noscript>
|
||
|
||
</body>
|
||
</html>
|