<!-- 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&amp;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">&#34;ts&#34;</span><span class="p">:</span> <span class="s2">&#34;1758732000&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;level&#34;</span><span class="p">:</span> <span class="s2">&#34;INFO&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;component&#34;</span><span class="p">:</span> <span class="s2">&#34;server&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;TELEMETRY&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;event&#34;</span><span class="p">:</span> <span class="s2">&#34;PULL_PAGE&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;page_size&#34;</span><span class="p">:</span> <span class="s2">&#34;1000&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;rows_emitted&#34;</span><span class="p">:</span> <span class="s2">&#34;1000&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;final&#34;</span><span class="p">:</span> <span class="s2">&#34;false&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;page&#34;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&#34;index&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nt">&#34;size&#34;</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">&#34;ordered&#34;</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">&#34;order_keys&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;timestamp&#34;</span><span class="p">],</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;request_id&#34;</span><span class="p">:</span> <span class="s2">&#34;550e8400-e29b-41d4-a716-446655440000&#34;</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&gt;server.log <span class="p">&amp;</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">&#34;RETURN 1 AS x ORDER BY x LIMIT 1&#34;</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">&#39;&#34;event&#34;:&#34;PULL_PAGE&#34;&#39;</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">&#34;RETURN 1 AS x ORDER BY x LIMIT 1&#34;</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">&amp;&amp;</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>&quot;event&quot;:&quot;PULL_PAGE&quot;</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=&#34;0.5&#34;} 0.015 </span></span><span class="line"><span class="cl">geode_quic_handshake_duration_seconds{quantile=&#34;0.95&#34;} 0.045 </span></span><span class="line"><span class="cl">geode_quic_handshake_duration_seconds{quantile=&#34;0.99&#34;} 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=&#34;0.5&#34;} 12.5 </span></span><span class="line"><span class="cl">geode_quic_rtt_milliseconds{quantile=&#34;0.95&#34;} 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=&#34;1.3&#34;} 1 </span></span><span class="line"><span class="cl">geode_tls_cipher_suite{suite=&#34;TLS_AES_256_GCM_SHA384&#34;} 1 </span></span><span class="line"><span class="cl">geode_tls_handshake_duration_seconds{quantile=&#34;0.95&#34;} 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">&#39;geode&#39;</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">&#39;localhost:9090&#39;</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">&#39;geode-primary&#39;</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">&#39;production&#39;</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">&#39;/metrics&#39;</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">&#39;geode-federation&#39;</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">&#39;geode-shard-1:9090&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;geode-shard-2:9090&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="s1">&#39;geode-shard-3:9090&#39;</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=&#34;success&#34;} 12345 </span></span><span class="line"><span class="cl">geode_queries_total{status=&#34;error&#34;} 23 </span></span><span class="line"><span class="cl">geode_query_duration_seconds{quantile=&#34;0.5&#34;} 0.015 </span></span><span class="line"><span class="cl">geode_query_duration_seconds{quantile=&#34;0.95&#34;} 0.250 </span></span><span class="line"><span class="cl">geode_query_duration_seconds{quantile=&#34;0.99&#34;} 1.500 </span></span><span class="line"><span class="cl">geode_slow_queries_total{threshold=&#34;1s&#34;} 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=&#34;max&#34;} 5000 </span></span><span class="line"><span class="cl">geode_connection_pool_size{type=&#34;current&#34;} 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=&#34;committed&#34;} 5678 </span></span><span class="line"><span class="cl">geode_transactions_total{status=&#34;rolled_back&#34;} 12 </span></span><span class="line"><span class="cl">geode_transaction_duration_seconds{quantile=&#34;0.95&#34;} 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=&#34;data&#34;} 10737418240 </span></span><span class="line"><span class="cl">geode_storage_size_bytes{type=&#34;wal&#34;} 536870912 </span></span><span class="line"><span class="cl">geode_storage_size_bytes{type=&#34;index&#34;} 2147483648 </span></span><span class="line"><span class="cl">geode_wal_sync_duration_seconds{quantile=&#34;0.95&#34;} 0.005 </span></span><span class="line"><span class="cl">geode_checkpoint_duration_seconds{quantile=&#34;0.95&#34;} 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=&#34;insert&#34;} 12345 </span></span><span class="line"><span class="cl">geode_index_operations_total{type=&#34;delete&#34;} 234 </span></span><span class="line"><span class="cl">geode_index_operations_total{type=&#34;search&#34;} 56789 </span></span><span class="line"><span class="cl">geode_index_size_bytes{name=&#34;hnsw_embeddings&#34;} 1073741824 </span></span><span class="line"><span class="cl">geode_hnsw_search_duration_seconds{quantile=&#34;0.95&#34;} 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=&#34;Person&#34;} 1000000 </span></span><span class="line"><span class="cl">geode_node_count{label=&#34;Product&#34;} 50000 </span></span><span class="line"><span class="cl">geode_relationship_count{type=&#34;KNOWS&#34;} 5000000 </span></span><span class="line"><span class="cl">geode_relationship_count{type=&#34;PURCHASED&#34;} 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 &amp; 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">&#34;dashboard&#34;</span><span class="p">:</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Geode System Overview&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;panels&#34;</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">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Query Rate&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;graph&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;targets&#34;</span><span class="p">:</span> <span class="p">[{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;expr&#34;</span><span class="p">:</span> <span class="s2">&#34;rate(geode_queries_total[5m])&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;legendFormat&#34;</span><span class="p">:</span> <span class="s2">&#34;{{status}}&#34;</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">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Active Connections&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;stat&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;targets&#34;</span><span class="p">:</span> <span class="p">[{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;expr&#34;</span><span class="p">:</span> <span class="s2">&#34;geode_active_connections&#34;</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">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Memory Usage&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;gauge&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;targets&#34;</span><span class="p">:</span> <span class="p">[{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;expr&#34;</span><span class="p">:</span> <span class="s2">&#34;(geode_memory_used_bytes / geode_memory_limit_bytes) * 100&#34;</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">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Query Duration (p95)&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;graph&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;targets&#34;</span><span class="p">:</span> <span class="p">[{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;expr&#34;</span><span class="p">:</span> <span class="s2">&#34;geode_query_duration_seconds{quantile=\&#34;0.95\&#34;}&#34;</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&#43;)</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&amp;#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">&#34;panels&#34;</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">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;QUIC Handshake Duration&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;targets&#34;</span><span class="p">:</span> <span class="p">[{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;expr&#34;</span><span class="p">:</span> <span class="s2">&#34;geode_quic_handshake_duration_seconds&#34;</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">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Active QUIC Streams&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;targets&#34;</span><span class="p">:</span> <span class="p">[{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;expr&#34;</span><span class="p">:</span> <span class="s2">&#34;geode_quic_active_streams&#34;</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">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Packet Loss Rate&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;targets&#34;</span><span class="p">:</span> <span class="p">[{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;expr&#34;</span><span class="p">:</span> <span class="s2">&#34;geode_quic_packet_loss_rate&#34;</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">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;RTT Distribution&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;targets&#34;</span><span class="p">:</span> <span class="p">[{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;expr&#34;</span><span class="p">:</span> <span class="s2">&#34;geode_quic_rtt_milliseconds&#34;</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">&#34;templating&#34;</span><span class="p">:</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;list&#34;</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">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;instance&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;query&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;query&#34;</span><span class="p">:</span> <span class="s2">&#34;label_values(geode_queries_total, instance)&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;multi&#34;</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">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;label&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;type&#34;</span><span class="p">:</span> <span class="s2">&#34;query&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;query&#34;</span><span class="p">:</span> <span class="s2">&#34;label_values(geode_node_count, label)&#34;</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">&#34;</span><span class="s">$instance</span><span class="p">&#34;,</span><span class="w"> </span><span class="nl">label</span><span class="o">=</span><span class="p">&#34;</span><span class="s">$label</span><span class="p">&#34;}</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">&#34;github.com/prometheus/client_golang/prometheus&#34;</span> </span></span><span class="line"><span class="cl"> <span class="s">&#34;github.com/prometheus/client_golang/prometheus/promauto&#34;</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">&#34;app_user_logins_total&#34;</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">&#34;Total number of user logins&#34;</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">&#34;status&#34;</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">&#34;app_query_duration_seconds&#34;</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">&#34;Query execution duration&#34;</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">&#34;query_type&#34;</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">&#34;user_auth&#34;</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">&#34;failure&#34;</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">&#34;success&#34;</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">&#39;app_user_logins_total&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;Total number of user logins&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="p">[</span><span class="s1">&#39;status&#39;</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">&#39;app_query_duration_seconds&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;Query execution duration&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="p">[</span><span class="s1">&#39;query_type&#39;</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">-&gt;</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">&#39;user_auth&#39;</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">&#39;success&#39;</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">&#39;failure&#39;</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">&#39;error&#39;</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">&#34;</span><span class="s">Entity</span><span class="p">&#34;}</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=&#34;geode&#34;} == 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">&#34;Geode instance is down&#34;</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">&#34;Geode instance {{ $labels.instance }} has been down for more than 5 minutes.&#34;</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=&#34;0.95&#34;} &gt; 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">&#34;High query latency detected&#34;</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">&#34;P95 query latency is {{ $value }}s on {{ $labels.instance }}&#34;</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 &gt; 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">&#34;High memory usage&#34;</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">&#34;Memory usage is {{ $value }}% on {{ $labels.instance }}&#34;</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 &gt; 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">&#34;High connection count&#34;</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">&#34;{{ $value }} active connections on {{ $labels.instance }}&#34;</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]) &gt; 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">&#34;Transaction deadlocks detected&#34;</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">&#34;{{ $value }} deadlocks/sec on {{ $labels.instance }}&#34;</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]) &gt; 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">&#34;High rate of slow queries&#34;</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">&#34;{{ $value }} slow queries/sec on {{ $labels.instance }}&#34;</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">&#39;localhost:587&#39;</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">&#39;[email protected]&#39;</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">&#39;alertname&#39;</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">&#39;web.hook&#39;</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">&#39;web.hook&#39;</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">&#39;http://localhost:5001/webhook&#39;</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">&#39;critical&#39;</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">&#39;[email protected]&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">subject: &#39;🚨 Critical Alert</span><span class="p">:</span><span class="w"> </span>{{<span class="w"> </span><span class="l">range .Alerts }}{{ .Annotations.summary }}{{ end }}&#39;</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">&#39;https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK&#39;</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">&#39;#alerts&#39;</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">&#39;Geode Critical Alert&#39;</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">&#39;{{ range .Alerts }}{{ .Annotations.summary }}{{ end }}&#39;</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">&#39;warnings&#39;</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">&#39;[email protected]&#39;</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">&#34;</span><span class="s">success</span><span class="p">&#34;}[</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 &lt; 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">&#34;</span><span class="s">0.95</span><span class="p">&#34;}</span><span class="w"> </span><span class="o">&lt;</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">&#34;</span><span class="s">success</span><span class="p">&#34;}[</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">&#34;panels&#34;</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">&#34;title&#34;</span><span class="p">:</span> <span class="s2">&#34;Availability (30d rolling)&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;targets&#34;</span><span class="p">:</span> <span class="p">[{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;expr&#34;</span><span class="p">:</span> <span class="s2">&#34;(sum(rate(geode_queries_total{status=\&#34;success\&#34;}[30d])) / sum(rate(geode_queries_total[30d]))) * 100&#34;</span> </span></span><span class="line"><span class="cl"> <span class="p">}],</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;thresholds&#34;</span><span class="p">:</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span> <span class="nt">&#34;value&#34;</span><span class="p">:</span> <span class="mf">99.9</span><span class="p">,</span> <span class="nt">&#34;color&#34;</span><span class="p">:</span> <span class="s2">&#34;green&#34;</span> <span class="p">},</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span> <span class="nt">&#34;value&#34;</span><span class="p">:</span> <span class="mf">99.0</span><span class="p">,</span> <span class="nt">&#34;color&#34;</span><span class="p">:</span> <span class="s2">&#34;yellow&#34;</span> <span class="p">},</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span> <span class="nt">&#34;value&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="nt">&#34;color&#34;</span><span class="p">:</span> <span class="s2">&#34;red&#34;</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">&#34;</span><span class="s">data</span><span class="p">&#34;}[</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">&#34;</span><span class="s">max</span><span class="p">&#34;}</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=&#34;0.95&#34;}[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=&#34;0.95&#34;} &gt; 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">&#34;Query latency anomaly detected&#34;</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=&#34;12345&#34;}</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=&#34;premium&#34;}</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>