<!-- CANARY: REQ=REQ-SERVER-STARTUP-INTEGRATION-001; FEATURE="Server Startup Integration Tests"; ASPECT=EndToEndServerTesting; STATUS=TESTED; OWNER=server; UPDATED=2025-10-05 -->
<h3 id="overview" class="position-relative d-flex align-items-center group">
<span>Overview</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="overview"
aria-haspopup="dialog"
aria-label="Share link: Overview">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
<div class="hsm-dialog" role="document">
<div class="hsm-header">
<h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2>
<button type="button" class="hsm-close" aria-label="Close">
<i class="fa-solid fa-xmark"></i>
</button>
</div>
<div class="hsm-body">
<label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label>
<div class="input-group mb-4 hsm-url-group">
<input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" />
<button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
<i class="fa-duotone fa-clipboard" aria-hidden="true"></i>
</button>
</div>
<div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div>
<div class="hsm-share-grid">
<a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-twitter me-2"></i>Twitter
</a>
<a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-linkedin me-2"></i>LinkedIn
</a>
<a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-facebook me-2"></i>Facebook
</a>
</div>
</div>
</div>
</div>
<style>
.heading-share-modal {
position: fixed;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.6);
z-index: 1050;
padding: 1rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.heading-share-modal[hidden] { display: none !important; }
.hsm-dialog {
max-width: 420px;
width: 100%;
background: var(--bs-body-bg, #fff);
color: var(--bs-body-color, #212529);
border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
border-radius: 1rem;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
overflow: hidden;
animation: hsm-fade-in 0.2s ease-out;
}
@keyframes hsm-fade-in {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
[data-bs-theme="dark"] .hsm-dialog {
background: #1e293b;
border-color: rgba(255,255,255,0.1);
color: #f8f9fa;
}
.hsm-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
background: rgba(0,0,0,0.02);
}
[data-bs-theme="dark"] .hsm-header {
background: rgba(255,255,255,0.02);
border-color: rgba(255,255,255,0.1);
}
.hsm-close {
background: transparent;
border: none;
color: inherit;
opacity: 0.5;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 1.2rem;
line-height: 1;
transition: opacity 0.2s;
}
.hsm-close:hover {
opacity: 1;
}
.hsm-body {
padding: 1.5rem;
}
.hsm-url-group {
display: flex !important;
align-items: stretch;
}
.hsm-url-group .form-control {
flex: 1;
min-width: 0;
margin: 0;
background: var(--bs-secondary-bg, #f8f9fa);
border-color: var(--bs-border-color, #dee2e6);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
height: 42px;
}
.hsm-url-group .btn {
flex: 0 0 auto;
margin: 0;
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 1.25rem;
z-index: 2;
}
[data-bs-theme="dark"] .hsm-url-group .form-control {
background: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
.hsm-share-grid {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.hsm-share-grid .btn {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
padding: 0.6rem;
border-color: var(--bs-border-color);
width: 100%;
}
[data-bs-theme="dark"] .hsm-share-grid .btn {
color: #e2e8f0;
border-color: #475569;
}
[data-bs-theme="dark"] .hsm-share-grid .btn:hover {
background: #334155;
border-color: #cbd5e1;
}
</style>
<script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest && e.target.closest('.h-share');
if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
</script><p>Geode provides comprehensive telemetry capabilities for production observability, including streaming paging events, Prometheus metrics integration, QUIC transport metrics, and customizable monitoring dashboards.</p>
<p><strong>Version</strong>: v0.1.1+ (includes QUIC+TLS metrics)</p>
<h4 id="what-youll-learn" class="position-relative d-flex align-items-center group">
<span>What You&rsquo;ll Learn</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="what-youll-learn"
aria-haspopup="dialog"
aria-label="Share link: What Youll Learn">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ul>
<li>How to enable and configure streaming telemetry</li>
<li>Prometheus metrics integration and scraping</li>
<li>Grafana dashboard setup and customization</li>
<li>QUIC transport metrics monitoring</li>
<li>Custom metric instrumentation</li>
<li>Alerting and incident response patterns</li>
</ul>
<h4 id="prerequisites" class="position-relative d-flex align-items-center group">
<span>Prerequisites</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="prerequisites"
aria-haspopup="dialog"
aria-label="Share link: Prerequisites">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ul>
<li>Geode v0.1.1+ installed</li>
<li>Basic understanding of metrics and monitoring</li>
<li>Prometheus and Grafana (optional, for integration sections)</li>
</ul>
<h3 id="streaming-telemetry" class="position-relative d-flex align-items-center group">
<span>Streaming Telemetry</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="streaming-telemetry"
aria-haspopup="dialog"
aria-label="Share link: Streaming Telemetry">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="paging-events" class="position-relative d-flex align-items-center group">
<span>Paging Events</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="paging-events"
aria-haspopup="dialog"
aria-label="Share link: Paging Events">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Geode can emit optional paging telemetry as JSON Lines on stderr. This feature is disabled by default to avoid noisy logs.</p>
<p><strong>Status</strong>: Optional, single-node, development/ops aid</p>
<h5 id="environment-variables" class="position-relative d-flex align-items-center group">
<span>Environment Variables</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="environment-variables"
aria-haspopup="dialog"
aria-label="Share link: Environment Variables">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><p><strong>Core Toggles</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Enable pagination telemetry</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GEODE_TELEMETRY_PAGING</span><span class="o">=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Client-side: Capture server stderr for e2e tests</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GEODE_CAPTURE_SERVER_STDERR</span><span class="o">=</span><span class="m">1</span>
</span></span></code></pre></div><p><strong>CI/Testing Variables</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Enable telemetry smoke test</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GEODE_CI_TELEMETRY_SMOKE</span><span class="o">=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Strict mode: Fail if telemetry missing</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GEODE_CI_TELEMETRY_STRICT</span><span class="o">=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Safety: Avoid vendor teardown crashes in short-lived tests</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GEODE_QUIC_PASSIVE_TEARDOWN</span><span class="o">=</span><span class="m">1</span>
</span></span></code></pre></div>
<h5 id="event-shape" class="position-relative d-flex align-items-center group">
<span>Event Shape</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="event-shape"
aria-haspopup="dialog"
aria-label="Share link: Event Shape">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><p>Each page emission produces a single JSON line on stderr:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"ts"</span><span class="p">:</span> <span class="s2">"1758732000"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"level"</span><span class="p">:</span> <span class="s2">"INFO"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"component"</span><span class="p">:</span> <span class="s2">"server"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"type"</span><span class="p">:</span> <span class="s2">"TELEMETRY"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"event"</span><span class="p">:</span> <span class="s2">"PULL_PAGE"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"page_size"</span><span class="p">:</span> <span class="s2">"1000"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"rows_emitted"</span><span class="p">:</span> <span class="s2">"1000"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"final"</span><span class="p">:</span> <span class="s2">"false"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"page"</span><span class="p">:</span> <span class="p">{</span> <span class="nt">"index"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nt">"size"</span><span class="p">:</span> <span class="mi">1000</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"ordered"</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"order_keys"</span><span class="p">:</span> <span class="p">[</span><span class="s2">"timestamp"</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"request_id"</span><span class="p">:</span> <span class="s2">"550e8400-e29b-41d4-a716-446655440000"</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p><strong>Field Descriptions</strong>:</p>
<ul>
<li><code>type</code>: Always <code>TELEMETRY</code> for these events</li>
<li><code>event</code>: Always <code>PULL_PAGE</code> for paging emissions</li>
<li><code>page_size</code>: Requested page size (stringified)</li>
<li><code>rows_emitted</code>: Actual rows in this page (stringified)</li>
<li><code>final</code>: <code>true</code> if last page, else <code>false</code></li>
<li><code>ordered</code>: Whether result set is ordered</li>
<li><code>order_keys</code>: Keys used for ordering</li>
<li><code>request_id</code>: Unique identifier for the request</li>
</ul>
<p><strong>Emission Location</strong>: <code>src/server/main.zig</code> (guarded by <code>state.telemetry_paging</code>)</p>
<h5 id="usage-examples" class="position-relative d-flex align-items-center group">
<span>Usage Examples</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="usage-examples"
aria-haspopup="dialog"
aria-label="Share link: Usage Examples">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><p><strong>Server with Telemetry</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Start server with paging telemetry enabled</span>
</span></span><span class="line"><span class="cl"><span class="nv">GEODE_TELEMETRY_PAGING</span><span class="o">=</span><span class="m">1</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> geode serve <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --listen 127.0.0.1:7567 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --log-json <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --result-format json <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> 2>server.log <span class="p">&</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">PID</span><span class="o">=</span><span class="nv">$!</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run queries</span>
</span></span><span class="line"><span class="cl">geode query <span class="s2">"RETURN 1 AS x ORDER BY x LIMIT 1"</span> --format json
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Check telemetry</span>
</span></span><span class="line"><span class="cl"><span class="nb">kill</span> <span class="nv">$PID</span>
</span></span><span class="line"><span class="cl">cat server.log <span class="p">|</span> grep <span class="s1">'"event":"PULL_PAGE"'</span>
</span></span></code></pre></div><p><strong>Client with Server Stderr Capture</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">GEODE_CAPTURE_SERVER_STDERR</span><span class="o">=</span><span class="m">1</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> geode query <span class="s2">"RETURN 1 AS x ORDER BY x LIMIT 1"</span> --format json
</span></span></code></pre></div><p><strong>Helper Script</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Quick local validation</span>
</span></span><span class="line"><span class="cl">make build <span class="o">&&</span> bash scripts/telemetry-smoke.sh <span class="m">1</span>
</span></span></code></pre></div><p>The script:</p>
<ul>
<li>Builds <code>zig-out/bin/geode</code></li>
<li>Starts server with <code>GEODE_TELEMETRY_PAGING=1</code></li>
<li>Runs ordered+limited query</li>
<li>Prints telemetry lines containing <code>"event":"PULL_PAGE"</code></li>
<li>Cleans up server process</li>
</ul>
<h4 id="testing-telemetry" class="position-relative d-flex align-items-center group">
<span>Testing Telemetry</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="testing-telemetry"
aria-haspopup="dialog"
aria-label="Share link: Testing Telemetry">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>CANARY Integration</strong>:</p>
<ul>
<li>Test: <code>TestCANARY_REQ_GQL_090_TelemetryPagingPull</code></li>
<li>Requirement: <code>REQ-GQL-090</code> - Streaming Telemetry, Paging Events</li>
<li>Status: <code>TESTED</code></li>
</ul>
<p><strong>Smoke Tests</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Basic smoke test (non-fatal)</span>
</span></span><span class="line"><span class="cl"><span class="nv">GEODE_TELEMETRY_PAGING</span><span class="o">=</span><span class="m">1</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span><span class="nv">GEODE_CI_TELEMETRY_SMOKE</span><span class="o">=</span><span class="m">1</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> zig <span class="nb">test</span> test_telemetry_smoke.zig
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Strict mode (fails if telemetry missing)</span>
</span></span><span class="line"><span class="cl">make quic-smoke-strict
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Convenience (non-fatal)</span>
</span></span><span class="line"><span class="cl">make quic-smoke
</span></span></code></pre></div>
<h3 id="quic-transport-metrics" class="position-relative d-flex align-items-center group">
<span>QUIC Transport Metrics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="quic-transport-metrics"
aria-haspopup="dialog"
aria-label="Share link: QUIC Transport Metrics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p><strong>New in v0.1.1</strong>: QUIC+TLS transport telemetry replaces TCP metrics.</p>
<h4 id="quic-metrics" class="position-relative d-flex align-items-center group">
<span>QUIC Metrics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="quic-metrics"
aria-haspopup="dialog"
aria-label="Share link: QUIC Metrics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Handshake Metrics</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode_quic_handshake_duration_seconds{quantile="0.5"} 0.015
</span></span><span class="line"><span class="cl">geode_quic_handshake_duration_seconds{quantile="0.95"} 0.045
</span></span><span class="line"><span class="cl">geode_quic_handshake_duration_seconds{quantile="0.99"} 0.120
</span></span><span class="line"><span class="cl">geode_quic_handshake_success_total{} 1234
</span></span><span class="line"><span class="cl">geode_quic_handshake_failure_total{} 5
</span></span></code></pre></div><p><strong>Stream Multiplexing</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode_quic_active_streams{} 42
</span></span><span class="line"><span class="cl">geode_quic_stream_create_total{} 5678
</span></span><span class="line"><span class="cl">geode_quic_stream_close_total{} 5636
</span></span><span class="line"><span class="cl">geode_quic_max_concurrent_streams{} 100
</span></span></code></pre></div><p><strong>Loss Recovery</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode_quic_packet_loss_rate{} 0.001
</span></span><span class="line"><span class="cl">geode_quic_rtt_milliseconds{quantile="0.5"} 12.5
</span></span><span class="line"><span class="cl">geode_quic_rtt_milliseconds{quantile="0.95"} 45.0
</span></span><span class="line"><span class="cl">geode_quic_retransmit_total{} 23
</span></span><span class="line"><span class="cl">geode_quic_congestion_events_total{} 3
</span></span></code></pre></div><p><strong>Data Transfer</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode_quic_bytes_sent_total{} 12345678
</span></span><span class="line"><span class="cl">geode_quic_bytes_received_total{} 98765432
</span></span><span class="line"><span class="cl">geode_quic_throughput_mbps{} 125.5
</span></span></code></pre></div>
<h4 id="tls-metrics" class="position-relative d-flex align-items-center group">
<span>TLS Metrics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="tls-metrics"
aria-haspopup="dialog"
aria-label="Share link: TLS Metrics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode_tls_version{version="1.3"} 1
</span></span><span class="line"><span class="cl">geode_tls_cipher_suite{suite="TLS_AES_256_GCM_SHA384"} 1
</span></span><span class="line"><span class="cl">geode_tls_handshake_duration_seconds{quantile="0.95"} 0.035
</span></span><span class="line"><span class="cl">geode_tls_session_reuse_total{} 456
</span></span><span class="line"><span class="cl">geode_tls_cert_verification_errors_total{} 0
</span></span></code></pre></div>
<h3 id="prometheus-integration" class="position-relative d-flex align-items-center group">
<span>Prometheus Integration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="prometheus-integration"
aria-haspopup="dialog"
aria-label="Share link: Prometheus Integration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="server-configuration" class="position-relative d-flex align-items-center group">
<span>Server Configuration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="server-configuration"
aria-haspopup="dialog"
aria-label="Share link: Server Configuration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Enable Prometheus metrics endpoint:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># geode.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">monitoring</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">prometheus</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enable</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="m">9090</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/metrics</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">interval</span><span class="p">:</span><span class="w"> </span><span class="l">15s</span><span class="w">
</span></span></span></code></pre></div><p><strong>Command-Line</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">geode serve <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --prometheus-enable <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --prometheus-port <span class="m">9090</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --prometheus-path /metrics
</span></span></code></pre></div><p><strong>Environment Variables</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GEODE_PROMETHEUS_ENABLE</span><span class="o">=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GEODE_PROMETHEUS_PORT</span><span class="o">=</span><span class="m">9090</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GEODE_PROMETHEUS_PATH</span><span class="o">=</span>/metrics
</span></span></code></pre></div>
<h4 id="prometheus-configuration" class="position-relative d-flex align-items-center group">
<span>Prometheus Configuration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="prometheus-configuration"
aria-haspopup="dialog"
aria-label="Share link: Prometheus Configuration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Add Geode as a scrape target in <code>prometheus.yml</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">global</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">scrape_interval</span><span class="p">:</span><span class="w"> </span><span class="l">15s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">evaluation_interval</span><span class="p">:</span><span class="w"> </span><span class="l">15s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">scrape_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">job_name</span><span class="p">:</span><span class="w"> </span><span class="s1">'geode'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">static_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">targets</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s1">'localhost:9090'</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">instance</span><span class="p">:</span><span class="w"> </span><span class="s1">'geode-primary'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w"> </span><span class="s1">'production'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">scrape_interval</span><span class="p">:</span><span class="w"> </span><span class="l">15s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">scrape_timeout</span><span class="p">:</span><span class="w"> </span><span class="l">10s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">metrics_path</span><span class="p">:</span><span class="w"> </span><span class="s1">'/metrics'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">job_name</span><span class="p">:</span><span class="w"> </span><span class="s1">'geode-federation'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">static_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">targets</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">'geode-shard-1:9090'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">'geode-shard-2:9090'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">'geode-shard-3:9090'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">scrape_interval</span><span class="p">:</span><span class="w"> </span><span class="l">30s</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="available-metrics" class="position-relative d-flex align-items-center group">
<span>Available Metrics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="available-metrics"
aria-haspopup="dialog"
aria-label="Share link: Available Metrics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Query Metrics</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode_queries_total{status="success"} 12345
</span></span><span class="line"><span class="cl">geode_queries_total{status="error"} 23
</span></span><span class="line"><span class="cl">geode_query_duration_seconds{quantile="0.5"} 0.015
</span></span><span class="line"><span class="cl">geode_query_duration_seconds{quantile="0.95"} 0.250
</span></span><span class="line"><span class="cl">geode_query_duration_seconds{quantile="0.99"} 1.500
</span></span><span class="line"><span class="cl">geode_slow_queries_total{threshold="1s"} 45
</span></span></code></pre></div><p><strong>Connection Metrics</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode_active_connections{} 42
</span></span><span class="line"><span class="cl">geode_connection_create_total{} 1234
</span></span><span class="line"><span class="cl">geode_connection_close_total{} 1192
</span></span><span class="line"><span class="cl">geode_connection_errors_total{} 5
</span></span><span class="line"><span class="cl">geode_connection_pool_size{type="max"} 5000
</span></span><span class="line"><span class="cl">geode_connection_pool_size{type="current"} 42
</span></span></code></pre></div><p><strong>Transaction Metrics</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode_transactions_active{} 8
</span></span><span class="line"><span class="cl">geode_transactions_total{status="committed"} 5678
</span></span><span class="line"><span class="cl">geode_transactions_total{status="rolled_back"} 12
</span></span><span class="line"><span class="cl">geode_transaction_duration_seconds{quantile="0.95"} 2.5
</span></span><span class="line"><span class="cl">geode_transaction_conflicts_total{} 3
</span></span><span class="line"><span class="cl">geode_deadlocks_detected_total{} 1
</span></span></code></pre></div><p><strong>Storage Metrics</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode_storage_size_bytes{type="data"} 10737418240
</span></span><span class="line"><span class="cl">geode_storage_size_bytes{type="wal"} 536870912
</span></span><span class="line"><span class="cl">geode_storage_size_bytes{type="index"} 2147483648
</span></span><span class="line"><span class="cl">geode_wal_sync_duration_seconds{quantile="0.95"} 0.005
</span></span><span class="line"><span class="cl">geode_checkpoint_duration_seconds{quantile="0.95"} 5.0
</span></span><span class="line"><span class="cl">geode_page_faults_total{} 1234
</span></span></code></pre></div><p><strong>Memory Metrics</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode_memory_used_bytes{} 4294967296
</span></span><span class="line"><span class="cl">geode_memory_limit_bytes{} 17179869184
</span></span><span class="line"><span class="cl">geode_memory_usage_percent{} 25.0
</span></span><span class="line"><span class="cl">geode_buffer_pool_size_bytes{} 8589934592
</span></span><span class="line"><span class="cl">geode_buffer_pool_hit_rate{} 0.98
</span></span></code></pre></div><p><strong>Index Metrics</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode_index_operations_total{type="insert"} 12345
</span></span><span class="line"><span class="cl">geode_index_operations_total{type="delete"} 234
</span></span><span class="line"><span class="cl">geode_index_operations_total{type="search"} 56789
</span></span><span class="line"><span class="cl">geode_index_size_bytes{name="hnsw_embeddings"} 1073741824
</span></span><span class="line"><span class="cl">geode_hnsw_search_duration_seconds{quantile="0.95"} 0.012
</span></span></code></pre></div><p><strong>Graph Metrics</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode_node_count{label="Person"} 1000000
</span></span><span class="line"><span class="cl">geode_node_count{label="Product"} 50000
</span></span><span class="line"><span class="cl">geode_relationship_count{type="KNOWS"} 5000000
</span></span><span class="line"><span class="cl">geode_relationship_count{type="PURCHASED"} 250000
</span></span><span class="line"><span class="cl">geode_graph_size_nodes_total{} 1050000
</span></span><span class="line"><span class="cl">geode_graph_size_relationships_total{} 5250000
</span></span></code></pre></div><p><strong>Session Metrics</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode_active_sessions{} 42
</span></span><span class="line"><span class="cl">geode_session_create_total{} 1234
</span></span><span class="line"><span class="cl">geode_session_timeout_total{} 5
</span></span><span class="line"><span class="cl">geode_avg_session_duration_seconds{} 180.5
</span></span><span class="line"><span class="cl">geode_session_parameters_total{} 156
</span></span></code></pre></div>
<h3 id="grafana-dashboards" class="position-relative d-flex align-items-center group">
<span>Grafana Dashboards</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="grafana-dashboards"
aria-haspopup="dialog"
aria-label="Share link: Grafana Dashboards">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="installation" class="position-relative d-flex align-items-center group">
<span>Installation</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="installation"
aria-haspopup="dialog"
aria-label="Share link: Installation">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Install Grafana</strong>:</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Docker</span>
</span></span><span class="line"><span class="cl">docker run -d <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --name<span class="o">=</span>grafana <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -p 3000:3000 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> grafana/grafana
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Or use package manager</span>
</span></span><span class="line"><span class="cl">sudo apt-get install -y grafana
</span></span><span class="line"><span class="cl">sudo systemctl start grafana-server
</span></span></code></pre></div><ol start="2">
<li>
<p><strong>Access Grafana</strong>: http://localhost:3000 (default: admin/admin)</p>
</li>
<li>
<p><strong>Add Prometheus Data Source</strong>:</p>
<ul>
<li>Configuration → Data Sources → Add data source</li>
<li>Select Prometheus</li>
<li>URL: http://localhost:9091 (Prometheus server)</li>
<li>Save & Test</li>
</ul>
</li>
</ol>
<h4 id="pre-built-dashboards" class="position-relative d-flex align-items-center group">
<span>Pre-Built Dashboards</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="pre-built-dashboards"
aria-haspopup="dialog"
aria-label="Share link: Pre-Built Dashboards">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Geode includes pre-built Grafana dashboards:</p>
<p><strong>Location</strong>: <code>monitoring/grafana/dashboards/</code></p>
<p><strong>Available Dashboards</strong>:</p>
<ol>
<li><code>geode-overview.json</code> - System overview</li>
<li><code>geode-queries.json</code> - Query performance</li>
<li><code>geode-transactions.json</code> - Transaction monitoring</li>
<li><code>geode-storage.json</code> - Storage and I/O</li>
<li><code>geode-quic.json</code> - QUIC transport metrics (v0.1.1+)</li>
</ol>
<p><strong>Import Dashboard</strong>:</p>
<ol>
<li>Dashboards → Import</li>
<li>Upload JSON file or paste JSON</li>
<li>Select Prometheus data source</li>
<li>Import</li>
</ol>
<h4 id="custom-dashboard-examples" class="position-relative d-flex align-items-center group">
<span>Custom Dashboard Examples</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="custom-dashboard-examples"
aria-haspopup="dialog"
aria-label="Share link: Custom Dashboard Examples">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4>
<h5 id="system-overview-dashboard" class="position-relative d-flex align-items-center group">
<span>System Overview Dashboard</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="system-overview-dashboard"
aria-haspopup="dialog"
aria-label="Share link: System Overview Dashboard">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><p><strong>Key Panels</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"dashboard"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"title"</span><span class="p">:</span> <span class="s2">"Geode System Overview"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"panels"</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"title"</span><span class="p">:</span> <span class="s2">"Query Rate"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"type"</span><span class="p">:</span> <span class="s2">"graph"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"targets"</span><span class="p">:</span> <span class="p">[{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"expr"</span><span class="p">:</span> <span class="s2">"rate(geode_queries_total[5m])"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"legendFormat"</span><span class="p">:</span> <span class="s2">"{{status}}"</span>
</span></span><span class="line"><span class="cl"> <span class="p">}]</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"title"</span><span class="p">:</span> <span class="s2">"Active Connections"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"type"</span><span class="p">:</span> <span class="s2">"stat"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"targets"</span><span class="p">:</span> <span class="p">[{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"expr"</span><span class="p">:</span> <span class="s2">"geode_active_connections"</span>
</span></span><span class="line"><span class="cl"> <span class="p">}]</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"title"</span><span class="p">:</span> <span class="s2">"Memory Usage"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"type"</span><span class="p">:</span> <span class="s2">"gauge"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"targets"</span><span class="p">:</span> <span class="p">[{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"expr"</span><span class="p">:</span> <span class="s2">"(geode_memory_used_bytes / geode_memory_limit_bytes) * 100"</span>
</span></span><span class="line"><span class="cl"> <span class="p">}]</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"title"</span><span class="p">:</span> <span class="s2">"Query Duration (p95)"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"type"</span><span class="p">:</span> <span class="s2">"graph"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"targets"</span><span class="p">:</span> <span class="p">[{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"expr"</span><span class="p">:</span> <span class="s2">"geode_query_duration_seconds{quantile=\"0.95\"}"</span>
</span></span><span class="line"><span class="cl"> <span class="p">}]</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
<h5 id="quic-transport-dashboard-v011" class="position-relative d-flex align-items-center group">
<span>QUIC Transport Dashboard (v0.1.1+)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="quic-transport-dashboard-v011"
aria-haspopup="dialog"
aria-label="Share link: QUIC Transport Dashboard (v0.1.1&#43;)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"panels"</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"title"</span><span class="p">:</span> <span class="s2">"QUIC Handshake Duration"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"targets"</span><span class="p">:</span> <span class="p">[{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"expr"</span><span class="p">:</span> <span class="s2">"geode_quic_handshake_duration_seconds"</span>
</span></span><span class="line"><span class="cl"> <span class="p">}]</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"title"</span><span class="p">:</span> <span class="s2">"Active QUIC Streams"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"targets"</span><span class="p">:</span> <span class="p">[{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"expr"</span><span class="p">:</span> <span class="s2">"geode_quic_active_streams"</span>
</span></span><span class="line"><span class="cl"> <span class="p">}]</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"title"</span><span class="p">:</span> <span class="s2">"Packet Loss Rate"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"targets"</span><span class="p">:</span> <span class="p">[{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"expr"</span><span class="p">:</span> <span class="s2">"geode_quic_packet_loss_rate"</span>
</span></span><span class="line"><span class="cl"> <span class="p">}]</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"title"</span><span class="p">:</span> <span class="s2">"RTT Distribution"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"targets"</span><span class="p">:</span> <span class="p">[{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"expr"</span><span class="p">:</span> <span class="s2">"geode_quic_rtt_milliseconds"</span>
</span></span><span class="line"><span class="cl"> <span class="p">}]</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
<h4 id="dashboard-variables" class="position-relative d-flex align-items-center group">
<span>Dashboard Variables</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="dashboard-variables"
aria-haspopup="dialog"
aria-label="Share link: Dashboard Variables">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Create dynamic dashboards with variables:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"templating"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"list"</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"name"</span><span class="p">:</span> <span class="s2">"instance"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"type"</span><span class="p">:</span> <span class="s2">"query"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"query"</span><span class="p">:</span> <span class="s2">"label_values(geode_queries_total, instance)"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"multi"</span><span class="p">:</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"name"</span><span class="p">:</span> <span class="s2">"label"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"type"</span><span class="p">:</span> <span class="s2">"query"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"query"</span><span class="p">:</span> <span class="s2">"label_values(geode_node_count, label)"</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Use in queries:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-promql" data-lang="promql"><span class="line"><span class="cl"><span class="nv">geode_node_count</span><span class="p">{</span><span class="nl">instance</span><span class="o">=~</span><span class="p">"</span><span class="s">$instance</span><span class="p">",</span><span class="w"> </span><span class="nl">label</span><span class="o">=</span><span class="p">"</span><span class="s">$label</span><span class="p">"}</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="custom-metrics" class="position-relative d-flex align-items-center group">
<span>Custom Metrics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="custom-metrics"
aria-haspopup="dialog"
aria-label="Share link: Custom Metrics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="application-level-metrics" class="position-relative d-flex align-items-center group">
<span>Application-Level Metrics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="application-level-metrics"
aria-haspopup="dialog"
aria-label="Share link: Application-Level Metrics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Instrument your application code:</p>
<p><strong>Go Example</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s">"github.com/prometheus/client_golang/prometheus"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"github.com/prometheus/client_golang/prometheus/promauto"</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">var</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="nx">userLoginCounter</span> <span class="p">=</span> <span class="nx">promauto</span><span class="p">.</span><span class="nf">NewCounterVec</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="nx">prometheus</span><span class="p">.</span><span class="nx">CounterOpts</span><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Name</span><span class="p">:</span> <span class="s">"app_user_logins_total"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Help</span><span class="p">:</span> <span class="s">"Total number of user logins"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">"status"</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">queryLatency</span> <span class="p">=</span> <span class="nx">promauto</span><span class="p">.</span><span class="nf">NewHistogramVec</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="nx">prometheus</span><span class="p">.</span><span class="nx">HistogramOpts</span><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Name</span><span class="p">:</span> <span class="s">"app_query_duration_seconds"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Help</span><span class="p">:</span> <span class="s">"Query execution duration"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Buckets</span><span class="p">:</span> <span class="nx">prometheus</span><span class="p">.</span><span class="nx">DefBuckets</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">"query_type"</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">handleLogin</span><span class="p">(</span><span class="nx">username</span><span class="p">,</span> <span class="nx">password</span> <span class="kt">string</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">start</span> <span class="o">:=</span> <span class="nx">time</span><span class="p">.</span><span class="nf">Now</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">defer</span> <span class="kd">func</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">duration</span> <span class="o">:=</span> <span class="nx">time</span><span class="p">.</span><span class="nf">Since</span><span class="p">(</span><span class="nx">start</span><span class="p">).</span><span class="nf">Seconds</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="nx">queryLatency</span><span class="p">.</span><span class="nf">WithLabelValues</span><span class="p">(</span><span class="s">"user_auth"</span><span class="p">).</span><span class="nf">Observe</span><span class="p">(</span><span class="nx">duration</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">err</span> <span class="o">:=</span> <span class="nf">authenticateUser</span><span class="p">(</span><span class="nx">username</span><span class="p">,</span> <span class="nx">password</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">userLoginCounter</span><span class="p">.</span><span class="nf">WithLabelValues</span><span class="p">(</span><span class="s">"failure"</span><span class="p">).</span><span class="nf">Inc</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">err</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">userLoginCounter</span><span class="p">.</span><span class="nf">WithLabelValues</span><span class="p">(</span><span class="s">"success"</span><span class="p">).</span><span class="nf">Inc</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="kc">nil</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p><strong>Python Example</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">prometheus_client</span> <span class="kn">import</span> <span class="n">Counter</span><span class="p">,</span> <span class="n">Histogram</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">user_login_counter</span> <span class="o">=</span> <span class="n">Counter</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'app_user_logins_total'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'Total number of user logins'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">[</span><span class="s1">'status'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">query_latency</span> <span class="o">=</span> <span class="n">Histogram</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'app_query_duration_seconds'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'Query execution duration'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">[</span><span class="s1">'query_type'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">handle_login</span><span class="p">(</span><span class="n">username</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">password</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">with</span> <span class="n">query_latency</span><span class="o">.</span><span class="n">labels</span><span class="p">(</span><span class="s1">'user_auth'</span><span class="p">)</span><span class="o">.</span><span class="n">time</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">authenticated</span> <span class="o">=</span> <span class="k">await</span> <span class="n">authenticate_user</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">authenticated</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">user_login_counter</span><span class="o">.</span><span class="n">labels</span><span class="p">(</span><span class="s1">'success'</span><span class="p">)</span><span class="o">.</span><span class="n">inc</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl"> <span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">user_login_counter</span><span class="o">.</span><span class="n">labels</span><span class="p">(</span><span class="s1">'failure'</span><span class="p">)</span><span class="o">.</span><span class="n">inc</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="kc">False</span>
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">user_login_counter</span><span class="o">.</span><span class="n">labels</span><span class="p">(</span><span class="s1">'error'</span><span class="p">)</span><span class="o">.</span><span class="n">inc</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span>
</span></span></code></pre></div>
<h4 id="business-metrics" class="position-relative d-flex align-items-center group">
<span>Business Metrics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="business-metrics"
aria-haspopup="dialog"
aria-label="Share link: Business Metrics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Track domain-specific metrics:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-promql" data-lang="promql"><span class="line"><span class="cl"><span class="c1"># Fraud detection rate</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">sum</span><span class="o">(</span><span class="kr">rate</span><span class="o">(</span><span class="nv">fraud_detected_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">))</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="k">sum</span><span class="o">(</span><span class="kr">rate</span><span class="o">(</span><span class="nv">transactions_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># Recommendation click-through rate</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">sum</span><span class="o">(</span><span class="kr">rate</span><span class="o">(</span><span class="nv">recommendation_clicks_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">))</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="k">sum</span><span class="o">(</span><span class="kr">rate</span><span class="o">(</span><span class="nv">recommendations_shown_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># Knowledge graph coverage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">geode_node_count</span><span class="p">{</span><span class="nl">label</span><span class="o">=</span><span class="p">"</span><span class="s">Entity</span><span class="p">"}</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nv">geode_target_entities</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="alerting" class="position-relative d-flex align-items-center group">
<span>Alerting</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="alerting"
aria-haspopup="dialog"
aria-label="Share link: Alerting">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="prometheus-alerting-rules" class="position-relative d-flex align-items-center group">
<span>Prometheus Alerting Rules</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="prometheus-alerting-rules"
aria-haspopup="dialog"
aria-label="Share link: Prometheus Alerting Rules">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Create <code>alerts.yml</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">groups</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">interval</span><span class="p">:</span><span class="w"> </span><span class="l">30s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">GeodeDown</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">up{job="geode"} == 0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">critical</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">"Geode instance is down"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">"Geode instance {{ $labels.instance }} has been down for more than 5 minutes."</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">HighQueryLatency</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">geode_query_duration_seconds{quantile="0.95"} > 5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">2m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">"High query latency detected"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">"P95 query latency is {{ $value }}s on {{ $labels.instance }}"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">HighMemoryUsage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">(geode_memory_used_bytes / geode_memory_limit_bytes) * 100 > 90</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">2m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">"High memory usage"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">"Memory usage is {{ $value }}% on {{ $labels.instance }}"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">HighConnectionCount</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">geode_active_connections > geode_max_connections * 0.9</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">1m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">"High connection count"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">"{{ $value }} active connections on {{ $labels.instance }}"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">TransactionDeadlock</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">rate(geode_deadlocks_detected_total[5m]) > 0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">1m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">"Transaction deadlocks detected"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">"{{ $value }} deadlocks/sec on {{ $labels.instance }}"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">SlowQueries</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">rate(geode_slow_queries_total[5m]) > 10</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">info</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">"High rate of slow queries"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">"{{ $value }} slow queries/sec on {{ $labels.instance }}"</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="alertmanager-configuration" class="position-relative d-flex align-items-center group">
<span>Alertmanager Configuration</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="alertmanager-configuration"
aria-haspopup="dialog"
aria-label="Share link: Alertmanager Configuration">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Configure alert routing in <code>alertmanager.yml</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">global</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">smtp_smarthost</span><span class="p">:</span><span class="w"> </span><span class="s1">'localhost:587'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">smtp_from</span><span class="p">:</span><span class="w"> </span><span class="s1">'[email protected]'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">route</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">group_by</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s1">'alertname'</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">group_wait</span><span class="p">:</span><span class="w"> </span><span class="l">10s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">group_interval</span><span class="p">:</span><span class="w"> </span><span class="l">10s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">repeat_interval</span><span class="p">:</span><span class="w"> </span><span class="l">1h</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">receiver</span><span class="p">:</span><span class="w"> </span><span class="s1">'web.hook'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">routes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">match</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">critical</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">receiver</span><span class="p">:</span><span class="w"> </span><span class="l">critical</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">repeat_interval</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">match</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">receiver</span><span class="p">:</span><span class="w"> </span><span class="l">warnings</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">receivers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s1">'web.hook'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">webhook_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="s1">'http://localhost:5001/webhook'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">send_resolved</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s1">'critical'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">email_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">to</span><span class="p">:</span><span class="w"> </span><span class="s1">'[email protected]'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">subject: '🚨 Critical Alert</span><span class="p">:</span><span class="w"> </span>{{<span class="w"> </span><span class="l">range .Alerts }}{{ .Annotations.summary }}{{ end }}'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">slack_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">api_url</span><span class="p">:</span><span class="w"> </span><span class="s1">'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">channel</span><span class="p">:</span><span class="w"> </span><span class="s1">'#alerts'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s1">'Geode Critical Alert'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">text</span><span class="p">:</span><span class="w"> </span><span class="s1">'{{ range .Alerts }}{{ .Annotations.summary }}{{ end }}'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s1">'warnings'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">email_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">to</span><span class="p">:</span><span class="w"> </span><span class="s1">'[email protected]'</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="advanced-monitoring-patterns" class="position-relative d-flex align-items-center group">
<span>Advanced Monitoring Patterns</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="advanced-monitoring-patterns"
aria-haspopup="dialog"
aria-label="Share link: Advanced Monitoring Patterns">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="slislo-monitoring" class="position-relative d-flex align-items-center group">
<span>SLI/SLO Monitoring</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="slislo-monitoring"
aria-haspopup="dialog"
aria-label="Share link: SLI/SLO Monitoring">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Track Service Level Indicators and Objectives:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-promql" data-lang="promql"><span class="line"><span class="cl"><span class="c1"># Availability SLI (target: 99.9%)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">(</span><span class="k">sum</span><span class="o">(</span><span class="kr">rate</span><span class="o">(</span><span class="nv">geode_queries_total</span><span class="p">{</span><span class="nl">status</span><span class="o">=</span><span class="p">"</span><span class="s">success</span><span class="p">"}[</span><span class="s">30d</span><span class="p">]</span><span class="o">))</span><span class="w"> </span><span class="o">/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">sum</span><span class="o">(</span><span class="kr">rate</span><span class="o">(</span><span class="nv">geode_queries_total</span><span class="p">[</span><span class="s">30d</span><span class="p">]</span><span class="o">)))</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># Latency SLI (target: p95 < 100ms)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">geode_query_duration_seconds</span><span class="p">{</span><span class="nl">quantile</span><span class="o">=</span><span class="p">"</span><span class="s">0.95</span><span class="p">"}</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mf">0.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># Error budget remaining (1 - availability target)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="mi">1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="o">((</span><span class="k">sum</span><span class="o">(</span><span class="kr">rate</span><span class="o">(</span><span class="nv">geode_queries_total</span><span class="p">{</span><span class="nl">status</span><span class="o">=</span><span class="p">"</span><span class="s">success</span><span class="p">"}[</span><span class="s">30d</span><span class="p">]</span><span class="o">))</span><span class="w"> </span><span class="o">/</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">sum</span><span class="o">(</span><span class="kr">rate</span><span class="o">(</span><span class="nv">geode_queries_total</span><span class="p">[</span><span class="s">30d</span><span class="p">]</span><span class="o">))))</span><span class="w">
</span></span></span></code></pre></div><p><strong>Grafana SLO Dashboard</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"panels"</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"title"</span><span class="p">:</span> <span class="s2">"Availability (30d rolling)"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"targets"</span><span class="p">:</span> <span class="p">[{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"expr"</span><span class="p">:</span> <span class="s2">"(sum(rate(geode_queries_total{status=\"success\"}[30d])) / sum(rate(geode_queries_total[30d]))) * 100"</span>
</span></span><span class="line"><span class="cl"> <span class="p">}],</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"thresholds"</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span> <span class="nt">"value"</span><span class="p">:</span> <span class="mf">99.9</span><span class="p">,</span> <span class="nt">"color"</span><span class="p">:</span> <span class="s2">"green"</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span> <span class="nt">"value"</span><span class="p">:</span> <span class="mf">99.0</span><span class="p">,</span> <span class="nt">"color"</span><span class="p">:</span> <span class="s2">"yellow"</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span> <span class="nt">"value"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nt">"color"</span><span class="p">:</span> <span class="s2">"red"</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
<h4 id="capacity-planning" class="position-relative d-flex align-items-center group">
<span>Capacity Planning</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="capacity-planning"
aria-haspopup="dialog"
aria-label="Share link: Capacity Planning">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Monitor resource trends:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-promql" data-lang="promql"><span class="line"><span class="cl"><span class="c1"># Predict storage exhaustion (linear regression)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">predict_linear</span><span class="o">(</span><span class="nv">geode_storage_size_bytes</span><span class="p">{</span><span class="nl">type</span><span class="o">=</span><span class="p">"</span><span class="s">data</span><span class="p">"}[</span><span class="s">7d</span><span class="p">],</span><span class="w"> </span><span class="mi">30</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">24</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">3600</span><span class="o">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># Connection pool utilization trend</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">avg_over_time</span><span class="o">(</span><span class="nv">geode_active_connections</span><span class="p">[</span><span class="s">7d</span><span class="p">]</span><span class="o">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nv">geode_connection_pool_size</span><span class="p">{</span><span class="nl">type</span><span class="o">=</span><span class="p">"</span><span class="s">max</span><span class="p">"}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># Memory growth rate</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">deriv</span><span class="o">(</span><span class="nv">geode_memory_used_bytes</span><span class="p">[</span><span class="s">1h</span><span class="p">]</span><span class="o">)</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="anomaly-detection" class="position-relative d-flex align-items-center group">
<span>Anomaly Detection</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="anomaly-detection"
aria-haspopup="dialog"
aria-label="Share link: Anomaly Detection">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>Use recording rules for anomaly detection:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">groups</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">anomaly_detection</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">interval</span><span class="p">:</span><span class="w"> </span><span class="l">1m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">record</span><span class="p">:</span><span class="w"> </span><span class="l">query_latency_baseline</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">avg_over_time(geode_query_duration_seconds{quantile="0.95"}[7d])</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">LatencyAnomaly</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">geode_query_duration_seconds{quantile="0.95"} > query_latency_baseline * 2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">"Query latency anomaly detected"</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="troubleshooting" class="position-relative d-flex align-items-center group">
<span>Troubleshooting</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="troubleshooting"
aria-haspopup="dialog"
aria-label="Share link: Troubleshooting">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="missing-metrics" class="position-relative d-flex align-items-center group">
<span>Missing Metrics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="missing-metrics"
aria-haspopup="dialog"
aria-label="Share link: Missing Metrics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Symptom</strong>: Prometheus shows no targets or metrics unavailable</p>
<p><strong>Solutions</strong>:</p>
<ol>
<li>
<p>Verify server is running with metrics enabled:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl http://localhost:9090/metrics
</span></span></code></pre></div></li>
<li>
<p>Check Prometheus configuration:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">promtool check config prometheus.yml
</span></span></code></pre></div></li>
<li>
<p>Verify firewall allows port 9090</p>
</li>
<li>
<p>Check Prometheus logs:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">journalctl -u prometheus -f
</span></span></code></pre></div></li>
</ol>
<h4 id="high-cardinality-metrics" class="position-relative d-flex align-items-center group">
<span>High Cardinality Metrics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="high-cardinality-metrics"
aria-haspopup="dialog"
aria-label="Share link: High Cardinality Metrics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Symptom</strong>: Prometheus consuming excessive memory</p>
<p><strong>Solutions</strong>:</p>
<ol>
<li>
<p>Limit label cardinality:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># ❌ Bad: Unique label per user</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">geode_user_queries_total{user_id="12345"}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># ✅ Good: Aggregated labels</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">geode_user_queries_total{user_type="premium"}</span><span class="w">
</span></span></span></code></pre></div></li>
<li>
<p>Use recording rules to pre-aggregate:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">- <span class="nt">record</span><span class="p">:</span><span class="w"> </span><span class="l">query_rate_by_type</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">sum(rate(geode_queries_total[5m])) by (type)</span><span class="w">
</span></span></span></code></pre></div></li>
<li>
<p>Adjust Prometheus retention:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">prometheus --storage.tsdb.retention.time<span class="o">=</span>15d
</span></span></code></pre></div></li>
</ol>
<h4 id="telemetry-performance-impact" class="position-relative d-flex align-items-center group">
<span>Telemetry Performance Impact</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="telemetry-performance-impact"
aria-haspopup="dialog"
aria-label="Share link: Telemetry Performance Impact">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Symptom</strong>: Telemetry causing performance degradation</p>
<p><strong>Solutions</strong>:</p>
<ol>
<li>
<p>Disable paging telemetry in production:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">unset</span> GEODE_TELEMETRY_PAGING
</span></span></code></pre></div></li>
<li>
<p>Reduce Prometheus scrape interval:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">scrape_interval</span><span class="p">:</span><span class="w"> </span><span class="l">60s </span><span class="w"> </span><span class="c"># Instead of 15s</span><span class="w">
</span></span></span></code></pre></div></li>
<li>
<p>Use sampling for high-frequency events</p>
</li>
</ol>
<h3 id="next-steps" class="position-relative d-flex align-items-center group">
<span>Next Steps</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="next-steps"
aria-haspopup="dialog"
aria-label="Share link: Next Steps">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p><strong>Explore More</strong>:</p>
<ul>
<li><a
href="/docs/ops/observability/"
>Observability Guide</a>
- Logging and tracing</li>
<li><a
href="/docs/ops/deployment/"
>Deployment</a>
- Production deployment</li>
<li><a
href="/docs/query/performance-tuning/"
>Performance Tuning</a>
- Query optimization</li>
</ul>
<p><strong>Related Topics</strong>:</p>
<ul>
<li><a
href="/docs/ops/observability/#alerting"
>Alerting Best Practices</a>
- Alert design</li>
<li><a
href="/docs/guides/backup-automation/"
>Backup and Recovery</a>
- Data protection</li>
<li><a
href="/docs/security/overview/#audit-logging"
>Security Monitoring</a>
- Security events</li>
</ul>
<p><strong>Tools</strong>:</p>
<ul>
<li><a
href="https://prometheus.io/"
aria-label="Prometheus – opens in new window"
target="_blank" rel="noopener noreferrer"
>Prometheus
<span aria-hidden="true" class="external-icon">↗</span>
</a>
- Metrics collection</li>
<li><a
href="https://grafana.com/"
aria-label="Grafana – opens in new window"
target="_blank" rel="noopener noreferrer"
>Grafana
<span aria-hidden="true" class="external-icon">↗</span>
</a>
- Visualization</li>
<li><a
href="https://prometheus.io/docs/alerting/latest/alertmanager/"
aria-label="Alertmanager – opens in new window"
target="_blank" rel="noopener noreferrer"
>Alertmanager
<span aria-hidden="true" class="external-icon">↗</span>
</a>
- Alert routing</li>
</ul>
<hr>
<p><strong>Version</strong>: v0.1.1+ (QUIC+TLS metrics)
<strong>Telemetry</strong>: Optional streaming events (stderr JSON Lines)
<strong>Prometheus</strong>: Full integration with 50+ metrics
<strong>Status</strong>: Production-ready</p>
Advanced Telemetry and Monitoring Guide
Complete guide to Geode's telemetry system including custom metrics, Prometheus integration, Grafana dashboards, paging events, and advanced monitoring patterns.