<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 -->
<p>Observability is the ability to understand a system’s internal state by examining its outputs. Unlike traditional monitoring that focuses on predefined metrics, observability enables you to ask arbitrary questions about your system’s behavior, making it essential for debugging complex distributed systems and understanding emergent behaviors.</p>
<p>Geode implements comprehensive observability through the three pillars: metrics for quantitative measurements, logs for detailed event records, and traces for request flow visualization. This multi-dimensional approach provides complete visibility into query execution, transaction behavior, resource utilization, and system health.</p>
<p>This guide covers observability architecture, implementation patterns, debugging strategies, and best practices for maintaining observable Geode deployments.</p>
<h3 id="the-three-pillars-of-observability" class="position-relative d-flex align-items-center group">
<span>The Three Pillars of Observability</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="the-three-pillars-of-observability"
aria-haspopup="dialog"
aria-label="Share link: The Three Pillars of Observability">
<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>
<h4 id="metrics-what-is-happening" class="position-relative d-flex align-items-center group">
<span>Metrics: What is Happening</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="metrics-what-is-happening"
aria-haspopup="dialog"
aria-label="Share link: Metrics: What is Happening">
<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>Metrics provide aggregated, time-series data about system behavior:</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"># Query throughput over time</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">rate</span><span class="o">(</span><span class="nv">geode_queries_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"># p95 query latency trend</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">histogram_quantile</span><span class="o">(</span><span class="mf">0.95</span><span class="p">,</span><span class="w"> </span><span class="kr">rate</span><span class="o">(</span><span class="nv">geode_query_duration_seconds_bucket</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"># Memory usage pattern</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">geode_memory_used_bytes</span><span class="w">
</span></span></span></code></pre></div><p><strong>Use Cases</strong>:</p>
<ul>
<li>Trend analysis and anomaly detection</li>
<li>Performance baseline establishment</li>
<li>Capacity planning</li>
<li>SLO monitoring</li>
<li>Alerting on threshold violations</li>
</ul>
<h4 id="logs-why-is-it-happening" class="position-relative d-flex align-items-center group">
<span>Logs: Why is it Happening</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="logs-why-is-it-happening"
aria-haspopup="dialog"
aria-label="Share link: Logs: Why is it Happening">
<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>Logs capture discrete events with contextual details:</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">"timestamp"</span><span class="p">:</span> <span class="s2">"2026-01-24T10:15:30.123Z"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"level"</span><span class="p">:</span> <span class="s2">"ERROR"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"message"</span><span class="p">:</span> <span class="s2">"Query execution failed"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"query_id"</span><span class="p">:</span> <span class="s2">"q-12847"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"user"</span><span class="p">:</span> <span class="s2">"analyst"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"error"</span><span class="p">:</span> <span class="s2">"Index out of bounds"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"query_text"</span><span class="p">:</span> <span class="s2">"MATCH (n:User) WHERE n.id > $limit RETURN n"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"stack_trace"</span><span class="p">:</span> <span class="s2">"..."</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"duration_ms"</span><span class="p">:</span> <span class="mf">234.5</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p><strong>Use Cases</strong>:</p>
<ul>
<li>Root cause analysis</li>
<li>Error investigation</li>
<li>Audit trails</li>
<li>Security forensics</li>
<li>Understanding specific execution paths</li>
</ul>
<h4 id="traces-how-is-it-flowing" class="position-relative d-flex align-items-center group">
<span>Traces: How is it Flowing</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="traces-how-is-it-flowing"
aria-haspopup="dialog"
aria-label="Share link: Traces: How is it Flowing">
<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>Traces show request flows through distributed systems:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Trace ID: abc123-def456-ghi789
</span></span><span class="line"><span class="cl">Span: http_handler [250ms]
</span></span><span class="line"><span class="cl"> └─ Span: authenticate_user [15ms]
</span></span><span class="line"><span class="cl"> └─ Span: execute_gql_query [220ms]
</span></span><span class="line"><span class="cl"> ├─ Span: parse_query [5ms]
</span></span><span class="line"><span class="cl"> ├─ Span: optimize_plan [10ms]
</span></span><span class="line"><span class="cl"> ├─ Span: execute_plan [200ms]
</span></span><span class="line"><span class="cl"> │ ├─ Span: index_lookup [30ms]
</span></span><span class="line"><span class="cl"> │ ├─ Span: expand_relationships [150ms]
</span></span><span class="line"><span class="cl"> │ └─ Span: aggregate_results [20ms]
</span></span><span class="line"><span class="cl"> └─ Span: serialize_response [5ms]
</span></span></code></pre></div><p><strong>Use Cases</strong>:</p>
<ul>
<li>Performance bottleneck identification</li>
<li>Understanding service dependencies</li>
<li>Latency attribution</li>
<li>Distributed debugging</li>
<li>Optimization targeting</li>
</ul>
<h3 id="structured-logging" class="position-relative d-flex align-items-center group">
<span>Structured Logging</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="structured-logging"
aria-haspopup="dialog"
aria-label="Share link: Structured Logging">
<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>Geode uses structured JSON logging for machine-readable, queryable log data:</p>
<h4 id="log-configuration" class="position-relative d-flex align-items-center group">
<span>Log 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="log-configuration"
aria-haspopup="dialog"
aria-label="Share link: Log 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><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="c"># geode.toml</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">logging</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">level</span> <span class="p">=</span> <span class="s2">"INFO"</span> <span class="c"># DEBUG, INFO, WARN, ERROR</span>
</span></span><span class="line"><span class="cl"><span class="nx">format</span> <span class="p">=</span> <span class="s2">"json"</span> <span class="c"># json or text</span>
</span></span><span class="line"><span class="cl"><span class="nx">output</span> <span class="p">=</span> <span class="s2">"stdout"</span> <span class="c"># stdout, stderr, file</span>
</span></span><span class="line"><span class="cl"><span class="nx">file</span> <span class="p">=</span> <span class="s2">"/var/log/geode/geode.log"</span>
</span></span><span class="line"><span class="cl"><span class="nx">rotate_size</span> <span class="p">=</span> <span class="s2">"100MB"</span>
</span></span><span class="line"><span class="cl"><span class="nx">rotate_count</span> <span class="p">=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl"><span class="nx">include_caller</span> <span class="p">=</span> <span class="kc">true</span> <span class="c"># Include file:line information</span>
</span></span></code></pre></div>
<h4 id="log-levels" class="position-relative d-flex align-items-center group">
<span>Log Levels</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="log-levels"
aria-haspopup="dialog"
aria-label="Share link: Log Levels">
<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>DEBUG</strong>: Detailed diagnostic information</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">"level"</span><span class="p">:</span> <span class="s2">"DEBUG"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"message"</span><span class="p">:</span> <span class="s2">"Query plan generated"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"query_id"</span><span class="p">:</span> <span class="s2">"q-12847"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"plan_type"</span><span class="p">:</span> <span class="s2">"indexed_lookup"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"estimated_rows"</span><span class="p">:</span> <span class="mi">1250</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"index_used"</span><span class="p">:</span> <span class="s2">"User.email"</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p><strong>INFO</strong>: General operational events</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">"level"</span><span class="p">:</span> <span class="s2">"INFO"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"message"</span><span class="p">:</span> <span class="s2">"Query executed successfully"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"query_id"</span><span class="p">:</span> <span class="s2">"q-12847"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"duration_ms"</span><span class="p">:</span> <span class="mf">45.3</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"rows_returned"</span><span class="p">:</span> <span class="mi">1250</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p><strong>WARN</strong>: Warning conditions</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">"level"</span><span class="p">:</span> <span class="s2">"WARN"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"message"</span><span class="p">:</span> <span class="s2">"Slow query detected"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"query_id"</span><span class="p">:</span> <span class="s2">"q-12847"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"duration_ms"</span><span class="p">:</span> <span class="mf">1234.5</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"threshold_ms"</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">"query_text"</span><span class="p">:</span> <span class="s2">"MATCH (n) RETURN n"</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p><strong>ERROR</strong>: Error events requiring attention</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">"level"</span><span class="p">:</span> <span class="s2">"ERROR"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"message"</span><span class="p">:</span> <span class="s2">"Transaction conflict"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"transaction_id"</span><span class="p">:</span> <span class="s2">"tx-456"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"conflict_type"</span><span class="p">:</span> <span class="s2">"write_write"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"retry_count"</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"error_code"</span><span class="p">:</span> <span class="s2">"40001"</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
<h4 id="contextual-logging" class="position-relative d-flex align-items-center group">
<span>Contextual Logging</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="contextual-logging"
aria-haspopup="dialog"
aria-label="Share link: Contextual Logging">
<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 context to log entries for correlation:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Python client with logging context</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">logging</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">geode_client</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><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">process_user_query</span><span class="p">(</span><span class="n">user_id</span><span class="p">,</span> <span class="n">query</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Add context to all subsequent logs</span>
</span></span><span class="line"><span class="cl"> <span class="k">with</span> <span class="n">logger</span><span class="o">.</span><span class="n">contextualize</span><span class="p">(</span><span class="n">user_id</span><span class="o">=</span><span class="n">user_id</span><span class="p">,</span> <span class="n">request_id</span><span class="o">=</span><span class="n">generate_id</span><span class="p">()):</span>
</span></span><span class="line"><span class="cl"> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Processing user query"</span><span class="p">,</span> <span class="n">query_type</span><span class="o">=</span><span class="s2">"recommendation"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</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">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">query</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"Query completed"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">rows_returned</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="n">duration_ms</span><span class="o">=</span><span class="n">result</span><span class="o">.</span><span class="n">duration</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">result</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">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"Query failed"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">error</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="n">query_text</span><span class="o">=</span><span class="n">query</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span>
</span></span></code></pre></div>
<h4 id="log-aggregation" class="position-relative d-flex align-items-center group">
<span>Log Aggregation</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="log-aggregation"
aria-haspopup="dialog"
aria-label="Share link: Log Aggregation">
<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>Centralize logs with popular aggregation tools:</p>
<p><strong>Elasticsearch Integration</strong>:</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"># filebeat.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">filebeat.inputs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</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">paths</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">/var/log/geode/*.log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">json.keys_under_root</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">json.add_error_key</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">output.elasticsearch</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">hosts</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"elasticsearch:9200"</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">index</span><span class="p">:</span><span class="w"> </span><span class="s2">"geode-logs-%{+yyyy.MM.dd}"</span><span class="w">
</span></span></span></code></pre></div><p><strong>Loki Integration</strong>:</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"># promtail.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">clients</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="l">http://loki:3100/loki/api/v1/push</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="l">geode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">static_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">targets</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">localhost</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">job</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">__path__</span><span class="p">:</span><span class="w"> </span><span class="l">/var/log/geode/*.log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">pipeline_stages</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">json</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expressions</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">level</span><span class="p">:</span><span class="w"> </span><span class="l">level</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">timestamp</span><span class="p">:</span><span class="w"> </span><span class="l">timestamp</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">message</span><span class="p">:</span><span class="w"> </span><span class="l">message</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">level</span><span class="p">:</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="distributed-tracing" class="position-relative d-flex align-items-center group">
<span>Distributed Tracing</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="distributed-tracing"
aria-haspopup="dialog"
aria-label="Share link: Distributed Tracing">
<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="opentelemetry-integration" class="position-relative d-flex align-items-center group">
<span>OpenTelemetry 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="opentelemetry-integration"
aria-haspopup="dialog"
aria-label="Share link: OpenTelemetry 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>
</h4><p>Geode supports OpenTelemetry for standardized distributed tracing:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="c"># geode.toml</span>
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">tracing</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">enabled</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="nx">exporter</span> <span class="p">=</span> <span class="s2">"otlp"</span>
</span></span><span class="line"><span class="cl"><span class="nx">endpoint</span> <span class="p">=</span> <span class="s2">"http://localhost:4317"</span>
</span></span><span class="line"><span class="cl"><span class="nx">sample_rate</span> <span class="p">=</span> <span class="mf">0.1</span> <span class="c"># Sample 10% of traces</span>
</span></span><span class="line"><span class="cl"><span class="nx">service_name</span> <span class="p">=</span> <span class="s2">"geode"</span>
</span></span><span class="line"><span class="cl"><span class="nx">environment</span> <span class="p">=</span> <span class="s2">"production"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Trace specific operations</span>
</span></span><span class="line"><span class="cl"><span class="nx">trace_queries</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="nx">trace_transactions</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl"><span class="nx">trace_index_operations</span> <span class="p">=</span> <span class="kc">true</span>
</span></span></code></pre></div>
<h4 id="trace-instrumentation" class="position-relative d-flex align-items-center group">
<span>Trace Instrumentation</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="trace-instrumentation"
aria-haspopup="dialog"
aria-label="Share link: Trace Instrumentation">
<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>Automatic instrumentation captures spans for:</p>
<p><strong>Query Execution</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Span: execute_gql_query
</span></span><span class="line"><span class="cl"> Attributes:
</span></span><span class="line"><span class="cl"> - query.text: "MATCH (u:User) WHERE u.age > 25 RETURN u"
</span></span><span class="line"><span class="cl"> - query.id: "q-12847"
</span></span><span class="line"><span class="cl"> - query.status: "success"
</span></span><span class="line"><span class="cl"> - query.rows: 1250
</span></span><span class="line"><span class="cl"> Duration: 145ms
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> Child Spans:
</span></span><span class="line"><span class="cl"> - parse_query (5ms)
</span></span><span class="line"><span class="cl"> - optimize_plan (10ms)
</span></span><span class="line"><span class="cl"> - execute_plan (125ms)
</span></span><span class="line"><span class="cl"> - serialize_response (5ms)
</span></span></code></pre></div><p><strong>Transaction Lifecycle</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Span: transaction
</span></span><span class="line"><span class="cl"> Attributes:
</span></span><span class="line"><span class="cl"> - tx.id: "tx-456"
</span></span><span class="line"><span class="cl"> - tx.isolation_level: "SERIALIZABLE"
</span></span><span class="line"><span class="cl"> - tx.status: "committed"
</span></span><span class="line"><span class="cl"> Duration: 2340ms
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> Child Spans:
</span></span><span class="line"><span class="cl"> - begin (2ms)
</span></span><span class="line"><span class="cl"> - execute_query_1 (145ms)
</span></span><span class="line"><span class="cl"> - execute_query_2 (234ms)
</span></span><span class="line"><span class="cl"> - commit (15ms)
</span></span></code></pre></div><p><strong>Index Operations</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Span: index_build
</span></span><span class="line"><span class="cl"> Attributes:
</span></span><span class="line"><span class="cl"> - index.name: "User.email"
</span></span><span class="line"><span class="cl"> - index.type: "btree"
</span></span><span class="line"><span class="cl"> - index.rows: 1000000
</span></span><span class="line"><span class="cl"> Duration: 45000ms
</span></span></code></pre></div>
<h4 id="custom-spans" class="position-relative d-flex align-items-center group">
<span>Custom Spans</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-spans"
aria-haspopup="dialog"
aria-label="Share link: Custom Spans">
<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 application-specific tracing:</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">opentelemetry</span> <span class="kn">import</span> <span class="n">trace</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">tracer</span> <span class="o">=</span> <span class="n">trace</span><span class="o">.</span><span class="n">get_tracer</span><span class="p">(</span><span class="vm">__name__</span><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">recommend_products</span><span class="p">(</span><span class="n">user_id</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="k">with</span> <span class="n">tracer</span><span class="o">.</span><span class="n">start_as_current_span</span><span class="p">(</span><span class="s2">"recommend_products"</span><span class="p">)</span> <span class="k">as</span> <span class="n">span</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">span</span><span class="o">.</span><span class="n">set_attribute</span><span class="p">(</span><span class="s2">"user_id"</span><span class="p">,</span> <span class="n">user_id</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Fetch user preferences</span>
</span></span><span class="line"><span class="cl"> <span class="k">with</span> <span class="n">tracer</span><span class="o">.</span><span class="n">start_as_current_span</span><span class="p">(</span><span class="s2">"fetch_preferences"</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="n">prefs</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">query</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"MATCH (u:User {id: $id})-[:LIKES]->(p:Product) RETURN p"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="n">user_id</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="c1"># Generate recommendations</span>
</span></span><span class="line"><span class="cl"> <span class="k">with</span> <span class="n">tracer</span><span class="o">.</span><span class="n">start_as_current_span</span><span class="p">(</span><span class="s2">"generate_recommendations"</span><span class="p">)</span> <span class="k">as</span> <span class="n">rec_span</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">rec_span</span><span class="o">.</span><span class="n">set_attribute</span><span class="p">(</span><span class="s2">"input_products"</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">prefs</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"> <span class="n">recommendations</span> <span class="o">=</span> <span class="k">await</span> <span class="n">compute_recommendations</span><span class="p">(</span><span class="n">prefs</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">rec_span</span><span class="o">.</span><span class="n">set_attribute</span><span class="p">(</span><span class="s2">"recommendations_count"</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">recommendations</span><span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">recommendations</span>
</span></span></code></pre></div>
<h4 id="trace-sampling" class="position-relative d-flex align-items-center group">
<span>Trace Sampling</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="trace-sampling"
aria-haspopup="dialog"
aria-label="Share link: Trace Sampling">
<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>Control trace volume with intelligent sampling:</p>
<p><strong>Tail-Based Sampling</strong>: Sample based on trace characteristics</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">tracing</span><span class="p">.</span><span class="nx">sampling</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">strategy</span> <span class="p">=</span> <span class="s2">"tail_based"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Always sample errors</span>
</span></span><span class="line"><span class="cl"><span class="nx">sample_on_error</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Always sample slow requests</span>
</span></span><span class="line"><span class="cl"><span class="nx">slow_threshold_ms</span> <span class="p">=</span> <span class="mi">1000</span>
</span></span><span class="line"><span class="cl"><span class="nx">sample_slow</span> <span class="p">=</span> <span class="kc">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c"># Sample 10% of normal requests</span>
</span></span><span class="line"><span class="cl"><span class="nx">default_rate</span> <span class="p">=</span> <span class="mf">0.1</span>
</span></span></code></pre></div><p><strong>Probabilistic Sampling</strong>: Random sampling percentage</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">tracing</span><span class="p">.</span><span class="nx">sampling</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="nx">strategy</span> <span class="p">=</span> <span class="s2">"probabilistic"</span>
</span></span><span class="line"><span class="cl"><span class="nx">rate</span> <span class="p">=</span> <span class="mf">0.05</span> <span class="c"># Sample 5% of traces</span>
</span></span></code></pre></div>
<h3 id="correlation-across-pillars" class="position-relative d-flex align-items-center group">
<span>Correlation Across Pillars</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="correlation-across-pillars"
aria-haspopup="dialog"
aria-label="Share link: Correlation Across Pillars">
<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>Link metrics, logs, and traces for comprehensive debugging:</p>
<h4 id="request-id-propagation" class="position-relative d-flex align-items-center group">
<span>Request ID Propagation</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="request-id-propagation"
aria-haspopup="dialog"
aria-label="Share link: Request ID Propagation">
<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-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">uuid</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Generate request ID</span>
</span></span><span class="line"><span class="cl"><span class="n">request_id</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">uuid</span><span class="o">.</span><span class="n">uuid4</span><span class="p">())</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Include in query metadata</span>
</span></span><span class="line"><span class="cl"><span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">query</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">query</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">params</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">metadata</span><span class="o">=</span><span class="p">{</span><span class="s2">"request_id"</span><span class="p">:</span> <span class="n">request_id</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="c1"># Request ID appears in:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - Trace (span attribute)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - Logs (log field)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># - Metrics (optional label for custom metrics)</span>
</span></span></code></pre></div>
<h4 id="trace-id-in-logs" class="position-relative d-flex align-items-center group">
<span>Trace ID in Logs</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="trace-id-in-logs"
aria-haspopup="dialog"
aria-label="Share link: Trace ID in Logs">
<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-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">"timestamp"</span><span class="p">:</span> <span class="s2">"2026-01-24T10:15:30.123Z"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"level"</span><span class="p">:</span> <span class="s2">"ERROR"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"message"</span><span class="p">:</span> <span class="s2">"Query execution failed"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"trace_id"</span><span class="p">:</span> <span class="s2">"abc123def456ghi789"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"span_id"</span><span class="p">:</span> <span class="s2">"xyz789"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"query_id"</span><span class="p">:</span> <span class="s2">"q-12847"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"error"</span><span class="p">:</span> <span class="s2">"Index out of bounds"</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Query logs in trace UI or trace from logs:</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"># Find logs for specific trace</span>
</span></span><span class="line"><span class="cl">jq <span class="s1">'select(.trace_id == "abc123def456ghi789")'</span> /var/log/geode/geode.log
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Find trace from log entry</span>
</span></span><span class="line"><span class="cl">curl <span class="s2">"http://jaeger:16686/api/traces/abc123def456ghi789"</span>
</span></span></code></pre></div>
<h3 id="observability-driven-debugging" class="position-relative d-flex align-items-center group">
<span>Observability-Driven Debugging</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="observability-driven-debugging"
aria-haspopup="dialog"
aria-label="Share link: Observability-Driven Debugging">
<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="performance-regression-investigation" class="position-relative d-flex align-items-center group">
<span>Performance Regression Investigation</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="performance-regression-investigation"
aria-haspopup="dialog"
aria-label="Share link: Performance Regression Investigation">
<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>Detect anomaly in metrics</strong>:</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-promql" data-lang="promql"><span class="line"><span class="cl"><span class="c1"># p95 latency spiked</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">histogram_quantile</span><span class="o">(</span><span class="mf">0.95</span><span class="p">,</span><span class="w"> </span><span class="kr">rate</span><span class="o">(</span><span class="nv">geode_query_duration_seconds_bucket</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="mf">0.5</span><span class="w">
</span></span></span></code></pre></div><ol start="2">
<li><strong>Identify affected queries from logs</strong>:</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">jq <span class="s1">'select(.duration_ms > 500) | {query_id, query_text, duration_ms}'</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> /var/log/geode/geode.log
</span></span></code></pre></div><ol start="3">
<li>
<p><strong>Analyze traces for bottlenecks</strong>:
Look for spans with unexpectedly high duration in trace viewer.</p>
</li>
<li>
<p><strong>Profile slow query</strong>:</p>
</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">other</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="py">other</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="error-rate-spike-investigation" class="position-relative d-flex align-items-center group">
<span>Error Rate Spike Investigation</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="error-rate-spike-investigation"
aria-haspopup="dialog"
aria-label="Share link: Error Rate Spike Investigation">
<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>Detect in metrics</strong>:</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-promql" data-lang="promql"><span class="line"><span class="cl"><span class="kr">rate</span><span class="o">(</span><span class="nv">geode_queries_total</span><span class="p">{</span><span class="nl">status</span><span class="o">=</span><span class="p">"</span><span class="s">error</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="mi">10</span><span class="w">
</span></span></span></code></pre></div><ol start="2">
<li><strong>Analyze error logs</strong>:</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">jq <span class="s1">'select(.level == "ERROR") | {timestamp, message, error, query_text}'</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> /var/log/geode/geode.log <span class="p">|</span> tail -100
</span></span></code></pre></div><ol start="3">
<li><strong>Group errors by type</strong>:</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">jq -r <span class="s1">'select(.level == "ERROR") | .error'</span> /var/log/geode/geode.log <span class="p">|</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> sort <span class="p">|</span> uniq -c <span class="p">|</span> sort -rn
</span></span></code></pre></div><ol start="4">
<li><strong>Examine failed traces</strong>:
Filter traces by error status to see failure patterns.</li>
</ol>
<h3 id="observability-best-practices" class="position-relative d-flex align-items-center group">
<span>Observability Best Practices</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="observability-best-practices"
aria-haspopup="dialog"
aria-label="Share link: Observability Best Practices">
<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>High Cardinality Awareness</strong>: Avoid unbounded label/field values (user IDs, session IDs) that explode storage requirements.</p>
<p><strong>Consistent Naming</strong>: Use consistent naming conventions across metrics, logs, and traces for easy correlation.</p>
<p><strong>Contextual Enrichment</strong>: Include relevant context (user, query type, client) in all observability signals.</p>
<p><strong>Sampling Strategy</strong>: Sample traces appropriately to balance coverage and overhead (1-10% for high-volume systems).</p>
<p><strong>Retention Policies</strong>: Define appropriate retention periods for each pillar based on use case (metrics: 30d, logs: 7d, traces: 3d).</p>
<p><strong>Alert on Symptoms, Not Causes</strong>: Alert on user-impacting symptoms (high latency, errors) rather than internal metrics (CPU, memory).</p>
<p><strong>Documentation</strong>: Maintain runbooks linking alerts to investigation procedures using observability tools.</p>
<p><strong>Cost Management</strong>: Monitor observability pipeline costs and optimize sampling, retention, and cardinality.</p>
<h3 id="related-topics" class="position-relative d-flex align-items-center group">
<span>Related Topics</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="related-topics"
aria-haspopup="dialog"
aria-label="Share link: Related Topics">
<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><ul>
<li><a
href="/tags/monitoring/"
>System Monitoring</a>
- Monitoring strategies</li>
<li><a
href="/tags/metrics/"
>Performance Metrics</a>
- Metrics collection</li>
<li><a
href="/tags/logging/"
>Application Logging</a>
- Logging best practices</li>
<li><a
href="/tags/tracing/"
>Distributed Tracing</a>
- Tracing implementation</li>
<li><a
href="/tags/prometheus/"
>Prometheus Integration</a>
- Metrics collection</li>
<li><a
href="/tags/performance/"
>Performance Tuning</a>
- Optimization techniques</li>
<li><a
href="/tags/troubleshooting/"
>Troubleshooting</a>
- Debugging guide</li>
</ul>
<h3 id="further-reading" class="position-relative d-flex align-items-center group">
<span>Further Reading</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="further-reading"
aria-haspopup="dialog"
aria-label="Share link: Further Reading">
<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><ul>
<li>Observability Engineering Handbook</li>
<li>OpenTelemetry Integration Guide</li>
<li>Distributed Tracing Patterns</li>
<li>Log Analysis Best Practices</li>
<li>Production Debugging Strategies</li>
</ul>
Related Articles
Docs
8 min
Monitoring
Set up comprehensive monitoring for Geode including Prometheus metrics, Grafana dashboards, alerting, and log aggregation
Docs
6 min
Monitoring and Telemetry
Monitor Geode with health checks and Prometheus metrics, enable optional paging telemetry, and configure tamper-evident audit logging with tracing IDs
Docs
8 min
Statistics and Metrics Reference
Complete reference for Geode statistics, metrics, and monitoring including query statistics, storage metrics, index statistics, and Prometheus …
Docs
9 min
Advanced Telemetry and Monitoring Guide
Complete guide to Geode's telemetry system including custom metrics, Prometheus integration, Grafana dashboards, paging events, and advanced …
Guides
16 min
Monitoring Guide
Monitor Geode with built-in metrics, Prometheus, Grafana, and alerting