CINXE.COM

Observability Dashboards: Prometheus, Grafana + Couchbase

<!DOCTYPE html> <html lang="en-US"> <head><meta charset="UTF-8"><script>if(navigator.userAgent.match(/MSIE|Internet Explorer/i)||navigator.userAgent.match(/Trident\/7\..*?rv:11/i)){var href=document.location.href;if(!href.match(/[?&]nowprocket/)){if(href.indexOf("?")==-1){if(href.indexOf("#")==-1){document.location.href=href+"?nowprocket=1"}else{document.location.href=href.replace("#","?nowprocket=1#")}}else{if(href.indexOf("#")==-1){document.location.href=href+"&nowprocket=1"}else{document.location.href=href.replace("#","&nowprocket=1#")}}}}</script><script>(()=>{class RocketLazyLoadScripts{constructor(){this.v="2.0.2",this.userEvents=["keydown","keyup","mousedown","mouseup","mousemove","mouseover","mouseenter","mouseout","mouseleave","touchmove","touchstart","touchend","touchcancel","wheel","click","dblclick","input","visibilitychange"],this.attributeEvents=["onblur","onclick","oncontextmenu","ondblclick","onfocus","onmousedown","onmouseenter","onmouseleave","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onscroll","onsubmit"]}async t(){this.i(),this.o(),/iP(ad|hone)/.test(navigator.userAgent)&&this.h(),this.u(),this.l(this),this.m(),this.k(this),this.p(this),this._(),await Promise.all([this.R(),this.L()]),this.lastBreath=Date.now(),this.S(this),this.P(),this.D(),this.O(),this.M(),await this.C(this.delayedScripts.normal),await this.C(this.delayedScripts.defer),await this.C(this.delayedScripts.async),this.T("domReady"),await this.F(),await this.j(),await this.I(),this.T("windowLoad"),await this.A(),window.dispatchEvent(new Event("rocket-allScriptsLoaded")),this.everythingLoaded=!0,this.lastTouchEnd&&await new Promise((t=>setTimeout(t,500-Date.now()+this.lastTouchEnd))),this.H(),this.T("all"),this.U(),this.W()}i(){this.CSPIssue=sessionStorage.getItem("rocketCSPIssue"),document.addEventListener("securitypolicyviolation",(t=>{this.CSPIssue||"script-src-elem"!==t.violatedDirective||"data"!==t.blockedURI||(this.CSPIssue=!0,sessionStorage.setItem("rocketCSPIssue",!0))}),{isRocket:!0})}o(){window.addEventListener("pageshow",(t=>{this.persisted=t.persisted,this.realWindowLoadedFired=!0}),{isRocket:!0}),window.addEventListener("pagehide",(()=>{this.onFirstUserAction=null}),{isRocket:!0})}h(){let t;function e(e){t=e}window.addEventListener("touchstart",e,{isRocket:!0}),window.addEventListener("touchend",(function i(o){Math.abs(o.changedTouches[0].pageX-t.changedTouches[0].pageX)<10&&Math.abs(o.changedTouches[0].pageY-t.changedTouches[0].pageY)<10&&o.timeStamp-t.timeStamp<200&&(o.target.dispatchEvent(new PointerEvent("click",{target:o.target,bubbles:!0,cancelable:!0})),event.preventDefault(),window.removeEventListener("touchstart",e,{isRocket:!0}),window.removeEventListener("touchend",i,{isRocket:!0}))}),{isRocket:!0})}q(t){this.userActionTriggered||("mousemove"!==t.type||this.firstMousemoveIgnored?"keyup"===t.type||"mouseover"===t.type||"mouseout"===t.type||(this.userActionTriggered=!0,this.onFirstUserAction&&this.onFirstUserAction()):this.firstMousemoveIgnored=!0),"click"===t.type&&t.preventDefault(),this.savedUserEvents.length>0&&(t.stopPropagation(),t.stopImmediatePropagation()),"touchstart"===this.lastEvent&&"touchend"===t.type&&(this.lastTouchEnd=Date.now()),"click"===t.type&&(this.lastTouchEnd=0),this.lastEvent=t.type,this.savedUserEvents.push(t)}u(){this.savedUserEvents=[],this.userEventHandler=this.q.bind(this),this.userEvents.forEach((t=>window.addEventListener(t,this.userEventHandler,{passive:!1,isRocket:!0})))}U(){this.userEvents.forEach((t=>window.removeEventListener(t,this.userEventHandler,{passive:!1,isRocket:!0}))),this.savedUserEvents.forEach((t=>{t.target.dispatchEvent(new window[t.constructor.name](t.type,t))}))}m(){this.eventsMutationObserver=new MutationObserver((t=>{const e="return false";for(const i of t){if("attributes"===i.type){const t=i.target.getAttribute(i.attributeName);t&&t!==e&&(i.target.setAttribute("data-rocket-"+i.attributeName,t),i.target.setAttribute(i.attributeName,e))}"childList"===i.type&&i.addedNodes.forEach((t=>{if(t.nodeType===Node.ELEMENT_NODE)for(const i of t.attributes)this.attributeEvents.includes(i.name)&&i.value&&""!==i.value&&(t.setAttribute("data-rocket-"+i.name,i.value),t.setAttribute(i.name,e))}))}})),this.eventsMutationObserver.observe(document,{subtree:!0,childList:!0,attributeFilter:this.attributeEvents})}H(){this.eventsMutationObserver.disconnect(),this.attributeEvents.forEach((t=>{document.querySelectorAll("[data-rocket-"+t+"]").forEach((e=>{e.setAttribute(t,e.getAttribute("data-rocket-"+t)),e.removeAttribute("data-rocket-"+t)}))}))}k(t){Object.defineProperty(HTMLElement.prototype,"onclick",{get(){return this.rocketonclick},set(e){this.rocketonclick=e,this.setAttribute(t.everythingLoaded?"onclick":"data-rocket-onclick","this.rocketonclick(event)")}})}S(t){function e(e,i){let o=e[i];e[i]=null,Object.defineProperty(e,i,{get:()=>o,set(s){t.everythingLoaded?o=s:e["rocket"+i]=o=s}})}e(document,"onreadystatechange"),e(window,"onload"),e(window,"onpageshow");try{Object.defineProperty(document,"readyState",{get:()=>t.rocketReadyState,set(e){t.rocketReadyState=e},configurable:!0}),document.readyState="loading"}catch(t){console.log("WPRocket DJE readyState conflict, bypassing")}}l(t){this.originalAddEventListener=EventTarget.prototype.addEventListener,this.originalRemoveEventListener=EventTarget.prototype.removeEventListener,this.savedEventListeners=[],EventTarget.prototype.addEventListener=function(e,i,o){o&&o.isRocket||!t.B(e,this)&&!t.userEvents.includes(e)||t.B(e,this)&&!t.userActionTriggered||e.startsWith("rocket-")?t.originalAddEventListener.call(this,e,i,o):t.savedEventListeners.push({target:this,remove:!1,type:e,func:i,options:o})},EventTarget.prototype.removeEventListener=function(e,i,o){o&&o.isRocket||!t.B(e,this)&&!t.userEvents.includes(e)||t.B(e,this)&&!t.userActionTriggered||e.startsWith("rocket-")?t.originalRemoveEventListener.call(this,e,i,o):t.savedEventListeners.push({target:this,remove:!0,type:e,func:i,options:o})}}T(t){"all"===t&&(EventTarget.prototype.addEventListener=this.originalAddEventListener,EventTarget.prototype.removeEventListener=this.originalRemoveEventListener),this.savedEventListeners=this.savedEventListeners.filter((e=>{let i=e.type,o=e.target||window;return"domReady"===t&&"DOMContentLoaded"!==i&&"readystatechange"!==i||("windowLoad"===t&&"load"!==i&&"readystatechange"!==i&&"pageshow"!==i||(this.B(i,o)&&(i="rocket-"+i),e.remove?o.removeEventListener(i,e.func,e.options):o.addEventListener(i,e.func,e.options),!1))}))}p(t){let e;function i(e){return t.everythingLoaded?e:e.split(" ").map((t=>"load"===t||t.startsWith("load.")?"rocket-jquery-load":t)).join(" ")}function o(o){function s(e){const s=o.fn[e];o.fn[e]=o.fn.init.prototype[e]=function(){return this[0]===window&&t.userActionTriggered&&("string"==typeof arguments[0]||arguments[0]instanceof String?arguments[0]=i(arguments[0]):"object"==typeof arguments[0]&&Object.keys(arguments[0]).forEach((t=>{const e=arguments[0][t];delete arguments[0][t],arguments[0][i(t)]=e}))),s.apply(this,arguments),this}}if(o&&o.fn&&!t.allJQueries.includes(o)){const e={DOMContentLoaded:[],"rocket-DOMContentLoaded":[]};for(const t in e)document.addEventListener(t,(()=>{e[t].forEach((t=>t()))}),{isRocket:!0});o.fn.ready=o.fn.init.prototype.ready=function(i){function s(){parseInt(o.fn.jquery)>2?setTimeout((()=>i.bind(document)(o))):i.bind(document)(o)}return t.realDomReadyFired?!t.userActionTriggered||t.fauxDomReadyFired?s():e["rocket-DOMContentLoaded"].push(s):e.DOMContentLoaded.push(s),o([])},s("on"),s("one"),s("off"),t.allJQueries.push(o)}e=o}t.allJQueries=[],o(window.jQuery),Object.defineProperty(window,"jQuery",{get:()=>e,set(t){o(t)}})}P(){const t=new Map;document.write=document.writeln=function(e){const i=document.currentScript,o=document.createRange(),s=i.parentElement;let n=t.get(i);void 0===n&&(n=i.nextSibling,t.set(i,n));const a=document.createDocumentFragment();o.setStart(a,0),a.appendChild(o.createContextualFragment(e)),s.insertBefore(a,n)}}async R(){return new Promise((t=>{this.userActionTriggered?t():this.onFirstUserAction=t}))}async L(){return new Promise((t=>{document.addEventListener("DOMContentLoaded",(()=>{this.realDomReadyFired=!0,t()}),{isRocket:!0})}))}async I(){return this.realWindowLoadedFired?Promise.resolve():new Promise((t=>{window.addEventListener("load",t,{isRocket:!0})}))}M(){this.pendingScripts=[];this.scriptsMutationObserver=new MutationObserver((t=>{for(const e of t)e.addedNodes.forEach((t=>{"SCRIPT"!==t.tagName||t.noModule||t.isWPRocket||this.pendingScripts.push({script:t,promise:new Promise((e=>{const i=()=>{const i=this.pendingScripts.findIndex((e=>e.script===t));i>=0&&this.pendingScripts.splice(i,1),e()};t.addEventListener("load",i,{isRocket:!0}),t.addEventListener("error",i,{isRocket:!0}),setTimeout(i,1e3)}))})}))})),this.scriptsMutationObserver.observe(document,{childList:!0,subtree:!0})}async j(){await this.J(),this.pendingScripts.length?(await this.pendingScripts[0].promise,await this.j()):this.scriptsMutationObserver.disconnect()}D(){this.delayedScripts={normal:[],async:[],defer:[]},document.querySelectorAll("script[type$=rocketlazyloadscript]").forEach((t=>{t.hasAttribute("data-rocket-src")?t.hasAttribute("async")&&!1!==t.async?this.delayedScripts.async.push(t):t.hasAttribute("defer")&&!1!==t.defer||"module"===t.getAttribute("data-rocket-type")?this.delayedScripts.defer.push(t):this.delayedScripts.normal.push(t):this.delayedScripts.normal.push(t)}))}async _(){await this.L();let t=[];document.querySelectorAll("script[type$=rocketlazyloadscript][data-rocket-src]").forEach((e=>{let i=e.getAttribute("data-rocket-src");if(i&&!i.startsWith("data:")){i.startsWith("//")&&(i=location.protocol+i);try{const o=new URL(i).origin;o!==location.origin&&t.push({src:o,crossOrigin:e.crossOrigin||"module"===e.getAttribute("data-rocket-type")})}catch(t){}}})),t=[...new Map(t.map((t=>[JSON.stringify(t),t]))).values()],this.N(t,"preconnect")}async $(t){if(await this.G(),!0!==t.noModule||!("noModule"in HTMLScriptElement.prototype))return new Promise((e=>{let i;function o(){(i||t).setAttribute("data-rocket-status","executed"),e()}try{if(navigator.userAgent.includes("Firefox/")||""===navigator.vendor||this.CSPIssue)i=document.createElement("script"),[...t.attributes].forEach((t=>{let e=t.nodeName;"type"!==e&&("data-rocket-type"===e&&(e="type"),"data-rocket-src"===e&&(e="src"),i.setAttribute(e,t.nodeValue))})),t.text&&(i.text=t.text),t.nonce&&(i.nonce=t.nonce),i.hasAttribute("src")?(i.addEventListener("load",o,{isRocket:!0}),i.addEventListener("error",(()=>{i.setAttribute("data-rocket-status","failed-network"),e()}),{isRocket:!0}),setTimeout((()=>{i.isConnected||e()}),1)):(i.text=t.text,o()),i.isWPRocket=!0,t.parentNode.replaceChild(i,t);else{const i=t.getAttribute("data-rocket-type"),s=t.getAttribute("data-rocket-src");i?(t.type=i,t.removeAttribute("data-rocket-type")):t.removeAttribute("type"),t.addEventListener("load",o,{isRocket:!0}),t.addEventListener("error",(i=>{this.CSPIssue&&i.target.src.startsWith("data:")?(console.log("WPRocket: CSP fallback activated"),t.removeAttribute("src"),this.$(t).then(e)):(t.setAttribute("data-rocket-status","failed-network"),e())}),{isRocket:!0}),s?(t.fetchPriority="high",t.removeAttribute("data-rocket-src"),t.src=s):t.src="data:text/javascript;base64,"+window.btoa(unescape(encodeURIComponent(t.text)))}}catch(i){t.setAttribute("data-rocket-status","failed-transform"),e()}}));t.setAttribute("data-rocket-status","skipped")}async C(t){const e=t.shift();return e?(e.isConnected&&await this.$(e),this.C(t)):Promise.resolve()}O(){this.N([...this.delayedScripts.normal,...this.delayedScripts.defer,...this.delayedScripts.async],"preload")}N(t,e){this.trash=this.trash||[];let i=!0;var o=document.createDocumentFragment();t.forEach((t=>{const s=t.getAttribute&&t.getAttribute("data-rocket-src")||t.src;if(s&&!s.startsWith("data:")){const n=document.createElement("link");n.href=s,n.rel=e,"preconnect"!==e&&(n.as="script",n.fetchPriority=i?"high":"low"),t.getAttribute&&"module"===t.getAttribute("data-rocket-type")&&(n.crossOrigin=!0),t.crossOrigin&&(n.crossOrigin=t.crossOrigin),t.integrity&&(n.integrity=t.integrity),t.nonce&&(n.nonce=t.nonce),o.appendChild(n),this.trash.push(n),i=!1}})),document.head.appendChild(o)}W(){this.trash.forEach((t=>t.remove()))}async F(){try{document.readyState="interactive"}catch(t){}this.fauxDomReadyFired=!0;try{await this.G(),document.dispatchEvent(new Event("rocket-readystatechange")),await this.G(),document.rocketonreadystatechange&&document.rocketonreadystatechange(),await this.G(),document.dispatchEvent(new Event("rocket-DOMContentLoaded")),await this.G(),window.dispatchEvent(new Event("rocket-DOMContentLoaded"))}catch(t){console.error(t)}}async A(){try{document.readyState="complete"}catch(t){}try{await this.G(),document.dispatchEvent(new Event("rocket-readystatechange")),await this.G(),document.rocketonreadystatechange&&document.rocketonreadystatechange(),await this.G(),window.dispatchEvent(new Event("rocket-load")),await this.G(),window.rocketonload&&window.rocketonload(),await this.G(),this.allJQueries.forEach((t=>t(window).trigger("rocket-jquery-load"))),await this.G();const t=new Event("rocket-pageshow");t.persisted=this.persisted,window.dispatchEvent(t),await this.G(),window.rocketonpageshow&&window.rocketonpageshow({persisted:this.persisted})}catch(t){console.error(t)}}async G(){Date.now()-this.lastBreath>45&&(await this.J(),this.lastBreath=Date.now())}async J(){return document.hidden?new Promise((t=>setTimeout(t))):new Promise((t=>requestAnimationFrame(t)))}B(t,e){return e===document&&"readystatechange"===t||(e===document&&"DOMContentLoaded"===t||(e===window&&"DOMContentLoaded"===t||(e===window&&"load"===t||e===window&&"pageshow"===t)))}static run(){(new RocketLazyLoadScripts).t()}}RocketLazyLoadScripts.run()})();</script> <!-- <meta name="viewport" content="width=device-width, initial-scale=1"> --> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0"> <meta name="insight-app-sec-validation" content="8c2f44ef-0f60-427d-a3ac-7297063db717"> <link rel="profile" href="https://gmpg.org/xfn/11"> <link rel="pingback" href="https://www.couchbase.com/blog/xmlrpc.php"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <noscript> </noscript> <link rel="stylesheet" href="https://www.couchbase.com/blog/wp-content/themes/couchbase/css/libraries/satellite-min.css" /> <link data-minify="1" rel="stylesheet" href="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/css/libraries/autocomplete-theme-classic.css?ver=1738056956" /> <style type="text/css"></style> <script type="rocketlazyloadscript" data-rocket-type="text/javascript">var heateorSlDefaultLang = 'en_US', heateorSlCloseIconPath = 'https://www.couchbase.com/blog/wp-content/plugins/heateor-social-login/public/images/close.png'; var heateorSlSiteUrl = 'https://www.couchbase.com/blog', heateorSlVerified = 0, heateorSlEmailPopup = 0; </script> <script type="rocketlazyloadscript"> var heateorSlLoadingImgPath = 'https://www.couchbase.com/blog/wp-content/plugins/heateor-social-login/public/../images/ajax_loader.gif'; var heateorSlAjaxUrl = 'https://www.couchbase.com/blog/wp-admin/admin-ajax.php'; var heateorSlRedirectionUrl = 'https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/'; var heateorSlRegRedirectionUrl = 'https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/'; </script> <script type="rocketlazyloadscript"> var heateorSlFBKey = '1326406188301490', heateorSlSameTabLogin = '1', heateorSlVerified = 0; var heateorSlAjaxUrl = 'https://www.couchbase.com/blog/wp-admin/admin-ajax.php'; var heateorSlPopupTitle = ''; var heateorSlEmailPopup = 0; var heateorSlEmailAjaxUrl = 'https://www.couchbase.com/blog/wp-admin/admin-ajax.php'; var heateorSlEmailPopupTitle = ''; var heateorSlEmailPopupErrorMsg = ''; var heateorSlEmailPopupUniqueId = ''; var heateorSlEmailPopupVerifyMessage = ''; var heateorSlSteamAuthUrl = ""; var heateorSlCurrentPageUrl = 'https%3A%2F%2Fwww.couchbase.com%2Fblog%2Fhow-to-build-observability-dashboards-prometheus-grafana-couchbase%2F'; var heateorMSEnabled = 0; var heateorSlTwitterAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=X&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlFacebookAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Facebook&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlGoogleAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Google&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlYoutubeAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Youtube&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlLineAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Line&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlLiveAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Live&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlVkontakteAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Vkontakte&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlLinkedinAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Linkedin&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlSpotifyAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Spotify&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlKakaoAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Kakao&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlGithubAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Github&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlWordpressAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Wordpress&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlYahooAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Yahoo&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlInstagramAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Instagram&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlDribbbleAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Dribbble&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlTwitchAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Twitch&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlRedditAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Reddit&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlDisqusAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Disqus&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlFoursquareAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Foursquare&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlDropboxAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Dropbox&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlAmazonAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Amazon&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlStackoverflowAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Stackoverflow&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlDiscordAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Discord&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlMailruAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Mailru&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl; var heateorSlYandexAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Yandex&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl ;var heateorSlOdnoklassnikiAuthUrl = heateorSlSiteUrl + "?HeateorSlAuth=Odnoklassniki&heateor_sl_redirect_to=" + heateorSlCurrentPageUrl;</script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript">function heateorSlLoadEvent(e ) {var t=window.onload;if ( typeof window.onload!="function" ) {window.onload=e} else {window.onload=function() {t();e()}}}</script> <meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> <style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style> <!-- Google Tag Manager for WordPress by gtm4wp.com --> <script data-cfasync="false" data-pagespeed-no-defer> var gtm4wp_datalayer_name = "dataLayer"; var dataLayer = dataLayer || []; </script> <!-- End Google Tag Manager for WordPress by gtm4wp.com --> <!-- This site is optimized with the Yoast SEO Premium plugin v24.5 (Yoast SEO v24.5) - https://yoast.com/wordpress/plugins/seo/ --> <title>Observability Dashboards: Prometheus, Grafana + Couchbase</title> <link rel="preload" as="font" href="https://www.couchbase.com/wp-content/themes/couchbase/hco_fonts/woff2/Gotham-Bold_Web.woff2" crossorigin> <link rel="preload" as="font" href="https://www.couchbase.com/wp-content/themes/couchbase/hco_fonts/woff2/Gotham-Book_Web.woff2" crossorigin> <link rel="preload" as="font" href="https://www.couchbase.com/wp-content/themes/couchbase/hco_fonts/woff2/Gotham-Medium_Web.woff2" crossorigin><link rel="preload" data-rocket-preload as="image" href="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/how-to-make-observability-dashboard-couchbase-grafana-prometheus.png" fetchpriority="high"><link rel="preload" data-rocket-preload as="style" href="https://fonts.googleapis.com/css?family=Abril%20FatFace%3A400%2C400i%2C700%2C700i%7CAlegreya%3A400%2C400i%2C700%2C700i%7CAlegreya%20Sans%3A400%2C400i%2C700%2C700i%7CAmatic%20SC%3A400%2C400i%2C700%2C700i%7CAnonymous%20Pro%3A400%2C400i%2C700%2C700i%7CArchitects%20Daughter%3A400%2C400i%2C700%2C700i%7CArchivo%3A400%2C400i%2C700%2C700i%7CArchivo%20Narrow%3A400%2C400i%2C700%2C700i%7CAsap%3A400%2C400i%2C700%2C700i%7CBarlow%3A400%2C400i%2C700%2C700i%7CBioRhyme%3A400%2C400i%2C700%2C700i%7CBonbon%3A400%2C400i%2C700%2C700i%7CCabin%3A400%2C400i%2C700%2C700i%7CCairo%3A400%2C400i%2C700%2C700i%7CCardo%3A400%2C400i%2C700%2C700i%7CChivo%3A400%2C400i%2C700%2C700i%7CConcert%20One%3A400%2C400i%2C700%2C700i%7CCormorant%3A400%2C400i%2C700%2C700i%7CCrimson%20Text%3A400%2C400i%2C700%2C700i%7CEczar%3A400%2C400i%2C700%2C700i%7CExo%202%3A400%2C400i%2C700%2C700i%7CFira%20Sans%3A400%2C400i%2C700%2C700i%7CFjalla%20One%3A400%2C400i%2C700%2C700i%7CFrank%20Ruhl%20Libre%3A400%2C400i%2C700%2C700i%7CGreat%20Vibes%3A400%2C400i%2C700%2C700i%7CHeebo%3A400%2C400i%2C700%2C700i%7CIBM%20Plex%3A400%2C400i%2C700%2C700i%7CInconsolata%3A400%2C400i%2C700%2C700i%7CIndie%20Flower%3A400%2C400i%2C700%2C700i%7CInknut%20Antiqua%3A400%2C400i%2C700%2C700i%7CInter%3A400%2C400i%2C700%2C700i%7CKarla%3A400%2C400i%2C700%2C700i%7CLibre%20Baskerville%3A400%2C400i%2C700%2C700i%7CLibre%20Franklin%3A400%2C400i%2C700%2C700i%7CMontserrat%3A400%2C400i%2C700%2C700i%7CNeuton%3A400%2C400i%2C700%2C700i%7CNotable%3A400%2C400i%2C700%2C700i%7CNothing%20You%20Could%20Do%3A400%2C400i%2C700%2C700i%7CNoto%20Sans%3A400%2C400i%2C700%2C700i%7CNunito%3A400%2C400i%2C700%2C700i%7COld%20Standard%20TT%3A400%2C400i%2C700%2C700i%7COxygen%3A400%2C400i%2C700%2C700i%7CPacifico%3A400%2C400i%2C700%2C700i%7CPoppins%3A400%2C400i%2C700%2C700i%7CProza%20Libre%3A400%2C400i%2C700%2C700i%7CPT%20Sans%3A400%2C400i%2C700%2C700i%7CPT%20Serif%3A400%2C400i%2C700%2C700i%7CRakkas%3A400%2C400i%2C700%2C700i%7CReenie%20Beanie%3A400%2C400i%2C700%2C700i%7CRoboto%20Slab%3A400%2C400i%2C700%2C700i%7CRopa%20Sans%3A400%2C400i%2C700%2C700i%7CRubik%3A400%2C400i%2C700%2C700i%7CShadows%20Into%20Light%3A400%2C400i%2C700%2C700i%7CSpace%20Mono%3A400%2C400i%2C700%2C700i%7CSpectral%3A400%2C400i%2C700%2C700i%7CSue%20Ellen%20Francisco%3A400%2C400i%2C700%2C700i%7CTitillium%20Web%3A400%2C400i%2C700%2C700i%7CUbuntu%3A400%2C400i%2C700%2C700i%7CVarela%3A400%2C400i%2C700%2C700i%7CVollkorn%3A400%2C400i%2C700%2C700i%7CWork%20Sans%3A400%2C400i%2C700%2C700i%7CYatra%20One%3A400%2C400i%2C700%2C700i&#038;display=swap" /><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Abril%20FatFace%3A400%2C400i%2C700%2C700i%7CAlegreya%3A400%2C400i%2C700%2C700i%7CAlegreya%20Sans%3A400%2C400i%2C700%2C700i%7CAmatic%20SC%3A400%2C400i%2C700%2C700i%7CAnonymous%20Pro%3A400%2C400i%2C700%2C700i%7CArchitects%20Daughter%3A400%2C400i%2C700%2C700i%7CArchivo%3A400%2C400i%2C700%2C700i%7CArchivo%20Narrow%3A400%2C400i%2C700%2C700i%7CAsap%3A400%2C400i%2C700%2C700i%7CBarlow%3A400%2C400i%2C700%2C700i%7CBioRhyme%3A400%2C400i%2C700%2C700i%7CBonbon%3A400%2C400i%2C700%2C700i%7CCabin%3A400%2C400i%2C700%2C700i%7CCairo%3A400%2C400i%2C700%2C700i%7CCardo%3A400%2C400i%2C700%2C700i%7CChivo%3A400%2C400i%2C700%2C700i%7CConcert%20One%3A400%2C400i%2C700%2C700i%7CCormorant%3A400%2C400i%2C700%2C700i%7CCrimson%20Text%3A400%2C400i%2C700%2C700i%7CEczar%3A400%2C400i%2C700%2C700i%7CExo%202%3A400%2C400i%2C700%2C700i%7CFira%20Sans%3A400%2C400i%2C700%2C700i%7CFjalla%20One%3A400%2C400i%2C700%2C700i%7CFrank%20Ruhl%20Libre%3A400%2C400i%2C700%2C700i%7CGreat%20Vibes%3A400%2C400i%2C700%2C700i%7CHeebo%3A400%2C400i%2C700%2C700i%7CIBM%20Plex%3A400%2C400i%2C700%2C700i%7CInconsolata%3A400%2C400i%2C700%2C700i%7CIndie%20Flower%3A400%2C400i%2C700%2C700i%7CInknut%20Antiqua%3A400%2C400i%2C700%2C700i%7CInter%3A400%2C400i%2C700%2C700i%7CKarla%3A400%2C400i%2C700%2C700i%7CLibre%20Baskerville%3A400%2C400i%2C700%2C700i%7CLibre%20Franklin%3A400%2C400i%2C700%2C700i%7CMontserrat%3A400%2C400i%2C700%2C700i%7CNeuton%3A400%2C400i%2C700%2C700i%7CNotable%3A400%2C400i%2C700%2C700i%7CNothing%20You%20Could%20Do%3A400%2C400i%2C700%2C700i%7CNoto%20Sans%3A400%2C400i%2C700%2C700i%7CNunito%3A400%2C400i%2C700%2C700i%7COld%20Standard%20TT%3A400%2C400i%2C700%2C700i%7COxygen%3A400%2C400i%2C700%2C700i%7CPacifico%3A400%2C400i%2C700%2C700i%7CPoppins%3A400%2C400i%2C700%2C700i%7CProza%20Libre%3A400%2C400i%2C700%2C700i%7CPT%20Sans%3A400%2C400i%2C700%2C700i%7CPT%20Serif%3A400%2C400i%2C700%2C700i%7CRakkas%3A400%2C400i%2C700%2C700i%7CReenie%20Beanie%3A400%2C400i%2C700%2C700i%7CRoboto%20Slab%3A400%2C400i%2C700%2C700i%7CRopa%20Sans%3A400%2C400i%2C700%2C700i%7CRubik%3A400%2C400i%2C700%2C700i%7CShadows%20Into%20Light%3A400%2C400i%2C700%2C700i%7CSpace%20Mono%3A400%2C400i%2C700%2C700i%7CSpectral%3A400%2C400i%2C700%2C700i%7CSue%20Ellen%20Francisco%3A400%2C400i%2C700%2C700i%7CTitillium%20Web%3A400%2C400i%2C700%2C700i%7CUbuntu%3A400%2C400i%2C700%2C700i%7CVarela%3A400%2C400i%2C700%2C700i%7CVollkorn%3A400%2C400i%2C700%2C700i%7CWork%20Sans%3A400%2C400i%2C700%2C700i%7CYatra%20One%3A400%2C400i%2C700%2C700i&#038;display=swap" media="print" onload="this.media='all'" /><noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Abril%20FatFace%3A400%2C400i%2C700%2C700i%7CAlegreya%3A400%2C400i%2C700%2C700i%7CAlegreya%20Sans%3A400%2C400i%2C700%2C700i%7CAmatic%20SC%3A400%2C400i%2C700%2C700i%7CAnonymous%20Pro%3A400%2C400i%2C700%2C700i%7CArchitects%20Daughter%3A400%2C400i%2C700%2C700i%7CArchivo%3A400%2C400i%2C700%2C700i%7CArchivo%20Narrow%3A400%2C400i%2C700%2C700i%7CAsap%3A400%2C400i%2C700%2C700i%7CBarlow%3A400%2C400i%2C700%2C700i%7CBioRhyme%3A400%2C400i%2C700%2C700i%7CBonbon%3A400%2C400i%2C700%2C700i%7CCabin%3A400%2C400i%2C700%2C700i%7CCairo%3A400%2C400i%2C700%2C700i%7CCardo%3A400%2C400i%2C700%2C700i%7CChivo%3A400%2C400i%2C700%2C700i%7CConcert%20One%3A400%2C400i%2C700%2C700i%7CCormorant%3A400%2C400i%2C700%2C700i%7CCrimson%20Text%3A400%2C400i%2C700%2C700i%7CEczar%3A400%2C400i%2C700%2C700i%7CExo%202%3A400%2C400i%2C700%2C700i%7CFira%20Sans%3A400%2C400i%2C700%2C700i%7CFjalla%20One%3A400%2C400i%2C700%2C700i%7CFrank%20Ruhl%20Libre%3A400%2C400i%2C700%2C700i%7CGreat%20Vibes%3A400%2C400i%2C700%2C700i%7CHeebo%3A400%2C400i%2C700%2C700i%7CIBM%20Plex%3A400%2C400i%2C700%2C700i%7CInconsolata%3A400%2C400i%2C700%2C700i%7CIndie%20Flower%3A400%2C400i%2C700%2C700i%7CInknut%20Antiqua%3A400%2C400i%2C700%2C700i%7CInter%3A400%2C400i%2C700%2C700i%7CKarla%3A400%2C400i%2C700%2C700i%7CLibre%20Baskerville%3A400%2C400i%2C700%2C700i%7CLibre%20Franklin%3A400%2C400i%2C700%2C700i%7CMontserrat%3A400%2C400i%2C700%2C700i%7CNeuton%3A400%2C400i%2C700%2C700i%7CNotable%3A400%2C400i%2C700%2C700i%7CNothing%20You%20Could%20Do%3A400%2C400i%2C700%2C700i%7CNoto%20Sans%3A400%2C400i%2C700%2C700i%7CNunito%3A400%2C400i%2C700%2C700i%7COld%20Standard%20TT%3A400%2C400i%2C700%2C700i%7COxygen%3A400%2C400i%2C700%2C700i%7CPacifico%3A400%2C400i%2C700%2C700i%7CPoppins%3A400%2C400i%2C700%2C700i%7CProza%20Libre%3A400%2C400i%2C700%2C700i%7CPT%20Sans%3A400%2C400i%2C700%2C700i%7CPT%20Serif%3A400%2C400i%2C700%2C700i%7CRakkas%3A400%2C400i%2C700%2C700i%7CReenie%20Beanie%3A400%2C400i%2C700%2C700i%7CRoboto%20Slab%3A400%2C400i%2C700%2C700i%7CRopa%20Sans%3A400%2C400i%2C700%2C700i%7CRubik%3A400%2C400i%2C700%2C700i%7CShadows%20Into%20Light%3A400%2C400i%2C700%2C700i%7CSpace%20Mono%3A400%2C400i%2C700%2C700i%7CSpectral%3A400%2C400i%2C700%2C700i%7CSue%20Ellen%20Francisco%3A400%2C400i%2C700%2C700i%7CTitillium%20Web%3A400%2C400i%2C700%2C700i%7CUbuntu%3A400%2C400i%2C700%2C700i%7CVarela%3A400%2C400i%2C700%2C700i%7CVollkorn%3A400%2C400i%2C700%2C700i%7CWork%20Sans%3A400%2C400i%2C700%2C700i%7CYatra%20One%3A400%2C400i%2C700%2C700i&#038;display=swap" /></noscript><link rel="preload" data-rocket-preload as="style" href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700;800&#038;family=Roboto+Mono:wght@500&#038;display=swap" /><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700;800&#038;family=Roboto+Mono:wght@500&#038;display=swap" media="print" onload="this.media='all'" /><noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700;800&#038;family=Roboto+Mono:wght@500&#038;display=swap" /></noscript> <meta name="description" content="In this blog, we take you through the process you need to follow to build your own observability dashboard using Prometheus, Grafana and Couchbase." /> <link rel="canonical" href="https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/" /> <meta property="og:locale" content="en_US" /> <meta property="og:type" content="article" /> <meta property="og:title" content="How to Build Observability Dashboards with Prometheus, Grafana &amp; Couchbase" /> <meta property="og:description" content="In this blog, we take you through the process you need to follow to build your own observability dashboard using Prometheus, Grafana and Couchbase." /> <meta property="og:url" content="https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/" /> <meta property="og:site_name" content="The Couchbase Blog" /> <meta property="article:published_time" content="2021-09-23T07:00:10+00:00" /> <meta property="article:modified_time" content="2023-07-11T23:23:06+00:00" /> <meta property="og:image" content="https://www.couchbase.com/blog/wp-content/uploads/2021/09/how-to-make-observability-dashboard-couchbase-grafana-prometheus-social.png" /> <meta property="og:image:width" content="800" /> <meta property="og:image:height" content="418" /> <meta property="og:image:type" content="image/png" /> <meta name="author" content="Jake Rawsthorne &amp; Jagadesh Munta" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:image" content="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/how-to-make-observability-dashboard-couchbase-grafana-prometheus-social.png" /> <meta name="twitter:label1" content="Written by" /> <meta name="twitter:data1" content="Jake Rawsthorne &amp; Jagadesh Munta" /> <meta name="twitter:label2" content="Est. reading time" /> <meta name="twitter:data2" content="14 minutes" /> <script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"TechArticle","@id":"https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/#article","isPartOf":{"@id":"https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/"},"author":{"name":"Jake &amp; Jagadesh Shared byline","@id":"https://www.couchbase.com/blog/#/schema/person/230246994a3a6b7d090cbc77f27133ba"},"headline":"How to Build Observability Dashboards with Prometheus, Grafana &amp; Couchbase","datePublished":"2021-09-23T07:00:10+00:00","dateModified":"2023-07-11T23:23:06+00:00","mainEntityOfPage":{"@id":"https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/"},"wordCount":2667,"commentCount":1,"publisher":{"@id":"https://www.couchbase.com/blog/#organization"},"image":{"@id":"https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/#primaryimage"},"thumbnailUrl":"https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/how-to-make-observability-dashboard-couchbase-grafana-prometheus.png","keywords":["data visualization","Grafana","JSON","key value","N1QL","Prometheus","python"],"articleSection":["Best Practices and Tutorials","Community","Couchbase SDK","Couchbase Server","JavaScript","Monitoring","Python","SQL++ / N1QL Query"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/#respond"]}]},{"@type":"WebPage","@id":"https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/","url":"https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/","name":"Observability Dashboards: Prometheus, Grafana + Couchbase","isPartOf":{"@id":"https://www.couchbase.com/blog/#website"},"primaryImageOfPage":{"@id":"https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/#primaryimage"},"image":{"@id":"https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/#primaryimage"},"thumbnailUrl":"https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/how-to-make-observability-dashboard-couchbase-grafana-prometheus.png","datePublished":"2021-09-23T07:00:10+00:00","dateModified":"2023-07-11T23:23:06+00:00","description":"In this blog, we take you through the process you need to follow to build your own observability dashboard using Prometheus, Grafana and Couchbase.","breadcrumb":{"@id":"https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/#primaryimage","url":"https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/how-to-make-observability-dashboard-couchbase-grafana-prometheus.png","contentUrl":"https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/how-to-make-observability-dashboard-couchbase-grafana-prometheus.png","width":1200,"height":628,"caption":"Learn how to make observability dashboards with Couchbase, Grafana & Prometheus for time-series data"},{"@type":"BreadcrumbList","@id":"https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://www.couchbase.com/blog/"},{"@type":"ListItem","position":2,"name":"How to Build Observability Dashboards with Prometheus, Grafana &amp; Couchbase"}]},{"@type":"WebSite","@id":"https://www.couchbase.com/blog/#website","url":"https://www.couchbase.com/blog/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https://www.couchbase.com/blog/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://www.couchbase.com/blog/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https://www.couchbase.com/blog/#organization","name":"The Couchbase Blog","url":"https://www.couchbase.com/blog/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https://www.couchbase.com/blog/#/schema/logo/image/","url":"https://www.couchbase.com/blog/wp-content/uploads/2023/04/admin-logo.png","contentUrl":"https://www.couchbase.com/blog/wp-content/uploads/2023/04/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https://www.couchbase.com/blog/#/schema/logo/image/"}},{"@type":"Person","@id":"https://www.couchbase.com/blog/#/schema/person/230246994a3a6b7d090cbc77f27133ba","name":"Jake Rawsthorne &amp; Jagadesh Munta","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https://www.couchbase.com/blog/#/schema/person/image/6b5c82568cb218e8a06486a2bd0cc6e7","url":"https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/jake-rawsthorne-jagadesh-munta-couchbase.png","contentUrl":"https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/jake-rawsthorne-jagadesh-munta-couchbase.png","caption":"Jake Rawsthorne &amp; Jagadesh Munta"},"url":"https://www.couchbase.com/blog/author/jake-and-jagadesh/"}]}</script> <!-- / Yoast SEO Premium plugin. --> <link href='https://fonts.gstatic.com' crossorigin rel='preconnect' /> <link rel="alternate" type="application/rss+xml" title="The Couchbase Blog &raquo; Feed" href="https://www.couchbase.com/blog/feed/" /> <link rel="alternate" type="application/rss+xml" title="The Couchbase Blog &raquo; Comments Feed" href="https://www.couchbase.com/blog/comments/feed/" /> <script type="text/javascript" id="wpp-js" src="https://www.couchbase.com/blog/wp-content/plugins/wordpress-popular-posts/assets/js/wpp.min.js?ver=7.2.0" data-sampling="0" data-sampling-rate="100" data-api-url="https://www.couchbase.com/blog/wp-json/wordpress-popular-posts" data-post-id="11527" data-token="83cca8be04" data-lang="0" data-debug="0"></script> <link rel="alternate" type="application/rss+xml" title="The Couchbase Blog &raquo; How to Build Observability Dashboards with Prometheus, Grafana &amp; Couchbase Comments Feed" href="https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/feed/" /> <link rel='stylesheet' id='urvanov_syntax_highlighter-css' href='https://www.couchbase.com/blog/wp-content/plugins/urvanov-syntax-highlighter/css/min/urvanov_syntax_highlighter.min.css?ver=2.8.38' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='crayon-theme-classic-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/plugins/urvanov-syntax-highlighter/themes/classic/classic.css?ver=1738056956' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='crayon-font-monaco-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/plugins/urvanov-syntax-highlighter/fonts/monaco.css?ver=1738056956' type='text/css' media='all' /> <style id='wp-emoji-styles-inline-css' type='text/css'> img.wp-smiley, img.emoji { display: inline !important; border: none !important; box-shadow: none !important; height: 1em !important; width: 1em !important; margin: 0 0.07em !important; vertical-align: -0.1em !important; background: none !important; padding: 0 !important; } </style> <style id='classic-theme-styles-inline-css' type='text/css'> /*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} </style> <style id='global-styles-inline-css' type='text/css'> :root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;} </style> <link data-minify="1" rel='stylesheet' id='dashicons-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-includes/css/dashicons.min.css?ver=1738056956' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='wordpress-popular-posts-css-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/plugins/wordpress-popular-posts/assets/css/wpp.css?ver=1738056956' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='paperback-style-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/paperback/style.css?ver=1738056956' type='text/css' media='all' /> <style id='paperback-style-inline-css' type='text/css'> /* Top Nav Background Color */ .top-navigation, .secondary-navigation ul.sub-menu { background-color: #ffffff; } /* Top Nav Text Color */ .top-navigation, .top-navigation nav a, .top-navigation li ul li a, .drawer-toggle { color: #000000; } .main-navigation:not(.secondary-navigation) ul.menu > li.current-menu-item > a { border-color: #ec1e2c; } /* Header Background Color */ .site-identity { background-color: #ffffff; } /* Header Text Color */ .main-navigation a, .site-title a, .site-description { color: #000000; } /* Accent Color */ .hero-cats a, .post-navigation .nav-label, .entry-cats a { background-color: #ec1e2c; } .page-numbers.current, .page-numbers:hover, #page #infinite-handle button:hover { background-color: #ec1e2c; } /* Footer Background Color */ .site-footer { background-color: #f6f6f6; } /* Footer Text Color */ .site-footer .widget-title, .site-footer a:hover { color: #000000; } .site-footer, .site-footer a { color: rgba( 0, 0, 0, 0.8); } /* Footer Border Color */ .footer-widgets ul li, .footer-widgets + .footer-bottom { border-color: rgba( 0, 0, 0, 0.3); } </style> <link data-minify="1" rel='stylesheet' id='couchbase-style-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/style.css?ver=1738056956' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='root-css-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/css/root.css?ver=1738056956' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='font-awesome-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/paperback/inc/fontawesome/css/font-awesome.css?ver=1738056956' type='text/css' media='screen' /> <style id='akismet-widget-style-inline-css' type='text/css'> .a-stats { --akismet-color-mid-green: #357b49; --akismet-color-white: #fff; --akismet-color-light-grey: #f6f7f7; max-width: 350px; width: auto; } .a-stats * { all: unset; box-sizing: border-box; } .a-stats strong { font-weight: 600; } .a-stats a.a-stats__link, .a-stats a.a-stats__link:visited, .a-stats a.a-stats__link:active { background: var(--akismet-color-mid-green); border: none; box-shadow: none; border-radius: 8px; color: var(--akismet-color-white); cursor: pointer; display: block; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen-Sans', 'Ubuntu', 'Cantarell', 'Helvetica Neue', sans-serif; font-weight: 500; padding: 12px; text-align: center; text-decoration: none; transition: all 0.2s ease; } /* Extra specificity to deal with TwentyTwentyOne focus style */ .widget .a-stats a.a-stats__link:focus { background: var(--akismet-color-mid-green); color: var(--akismet-color-white); text-decoration: none; } .a-stats a.a-stats__link:hover { filter: brightness(110%); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06), 0 0 2px rgba(0, 0, 0, 0.16); } .a-stats .count { color: var(--akismet-color-white); display: block; font-size: 1.5em; line-height: 1.4; padding: 0 13px; white-space: nowrap; } </style> <link data-minify="1" rel='stylesheet' id='heateor_sl_frontend_css-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/plugins/heateor-social-login/public/css/heateor-social-login-public.css?ver=1738056956' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='thickbox-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-includes/js/thickbox/thickbox.css?ver=1738056956' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='heateor_sss_frontend_css-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/plugins/sassy-social-share/public/css/sassy-social-share-public.css?ver=1738056956' type='text/css' media='all' /> <style id='heateor_sss_frontend_css-inline-css' type='text/css'> .heateor_sss_button_instagram span.heateor_sss_svg,a.heateor_sss_instagram span.heateor_sss_svg{background:radial-gradient(circle at 30% 107%,#fdf497 0,#fdf497 5%,#fd5949 45%,#d6249f 60%,#285aeb 90%)}.heateor_sss_horizontal_sharing .heateor_sss_svg,.heateor_sss_standard_follow_icons_container .heateor_sss_svg{color:#fff;border-width:0px;border-style:solid;border-color:transparent}.heateor_sss_horizontal_sharing .heateorSssTCBackground{color:#666}.heateor_sss_horizontal_sharing span.heateor_sss_svg:hover,.heateor_sss_standard_follow_icons_container span.heateor_sss_svg:hover{border-color:transparent;}.heateor_sss_vertical_sharing span.heateor_sss_svg,.heateor_sss_floating_follow_icons_container span.heateor_sss_svg{color:#fff;border-width:0px;border-style:solid;border-color:transparent;}.heateor_sss_vertical_sharing .heateorSssTCBackground{color:#666;}.heateor_sss_vertical_sharing span.heateor_sss_svg:hover,.heateor_sss_floating_follow_icons_container span.heateor_sss_svg:hover{border-color:transparent;}@media screen and (max-width:783px) {.heateor_sss_vertical_sharing{display:none!important}}div.heateor_sss_mobile_footer{display:none;}@media screen and (max-width:783px){div.heateor_sss_bottom_sharing .heateorSssTCBackground{background-color:white}div.heateor_sss_bottom_sharing{width:100%!important;left:0!important;}div.heateor_sss_bottom_sharing a{width:25% !important;}div.heateor_sss_bottom_sharing .heateor_sss_svg{width: 100% !important;}div.heateor_sss_bottom_sharing div.heateorSssTotalShareCount{font-size:1em!important;line-height:28px!important}div.heateor_sss_bottom_sharing div.heateorSssTotalShareText{font-size:.7em!important;line-height:0px!important}div.heateor_sss_mobile_footer{display:block;height:40px;}.heateor_sss_bottom_sharing{padding:0!important;display:block!important;width:auto!important;bottom:-2px!important;top: auto!important;}.heateor_sss_bottom_sharing .heateor_sss_square_count{line-height:inherit;}.heateor_sss_bottom_sharing .heateorSssSharingArrow{display:none;}.heateor_sss_bottom_sharing .heateorSssTCBackground{margin-right:1.1em!important}} </style> <link data-minify="1" rel='stylesheet' id='algolia-autocomplete-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/plugins/wp-search-with-algolia/css/algolia-autocomplete.css?ver=1738056956' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='header-style-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/css/header.css?ver=1738056956' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='header-ipad-style-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/css/header-ipad.css?ver=1738056956' type='text/css' media='only screen and (min-width: 1025px)' /> <link data-minify="1" rel='stylesheet' id='common-style-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/css/common.css?ver=1738056956' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='paperback-fonts-gotham-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/hco_fonts/hco_fonts.css?ver=1738056956' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='posts-style-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/css/posts.css?ver=1738056956' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='posts-ipad-style-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/css/posts-ipad.css?ver=1738056956' type='text/css' media='only screen and (min-width: 768px)' /> <link data-minify="1" rel='stylesheet' id='promotion-style-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/css/promotion-banner.css?ver=1738056956' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='footer-style-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/css/footer.css?ver=1738056957' type='text/css' media='all' /> <link data-minify="1" rel='stylesheet' id='footer-ipad-style-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/css/footer-ipad.css?ver=1738056957' type='text/css' media='only screen and (min-width: 768px)' /> <script type="text/javascript" src="https://www.couchbase.com/blog/wp-content/themes/couchbase/js/jquery.min.js?ver=3.3.9" id="jquery-js"></script> <script type="text/javascript" id="urvanov_syntax_highlighter_js-js-extra"> /* <![CDATA[ */ var UrvanovSyntaxHighlighterSyntaxSettings = {"version":"2.8.38","is_admin":"0","ajaxurl":"https:\/\/www.couchbase.com\/blog\/wp-admin\/admin-ajax.php","prefix":"urvanov-syntax-highlighter-","setting":"urvanov-syntax-highlighter-setting","selected":"urvanov-syntax-highlighter-setting-selected","changed":"urvanov-syntax-highlighter-setting-changed","special":"urvanov-syntax-highlighter-setting-special","orig_value":"data-orig-value","debug":""}; var UrvanovSyntaxHighlighterSyntaxStrings = {"copy":"Copied to the clipboard","minimize":"Click To Expand Code"}; /* ]]> */ </script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/plugins/urvanov-syntax-highlighter/js/min/urvanov_syntax_highlighter.min.js?ver=2.8.38" id="urvanov_syntax_highlighter_js-js"></script> <script type="rocketlazyloadscript" data-minify="1" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/js/paperback.js?ver=1738056957" id="couchbase-paperback-js-js"></script> <link rel="https://api.w.org/" href="https://www.couchbase.com/blog/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://www.couchbase.com/blog/wp-json/wp/v2/posts/11527" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://www.couchbase.com/blog/xmlrpc.php?rsd" /> <link rel='shortlink' href='https://www.couchbase.com/blog/?p=11527' /> <link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://www.couchbase.com/blog/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.couchbase.com%2Fblog%2Fhow-to-build-observability-dashboards-prometheus-grafana-couchbase%2F" /> <link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://www.couchbase.com/blog/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwww.couchbase.com%2Fblog%2Fhow-to-build-observability-dashboards-prometheus-grafana-couchbase%2F&#038;format=xml" /> <!-- Google Tag Manager for WordPress by gtm4wp.com --> <!-- GTM Container placement set to footer --> <script data-cfasync="false" data-pagespeed-no-defer type="text/javascript"> var dataLayer_content = {"pageTitle":"Observability Dashboards: Prometheus, Grafana + Couchbase","pagePostType":"post","pagePostType2":"single-post","pageCategory":["best-practices-and-tutorials","community","couchbase-sdk","couchbase-server","javascript","monitoring","python","n1ql-query"],"pageAttributes":["data-visualization","grafana","json","key-value","n1ql","prometheus","python"],"pagePostAuthorID":78989,"pagePostAuthor":"Jake &amp; Jagadesh Shared byline","pagePostDate":"September 23, 2021","pagePostDateYear":2021,"pagePostDateMonth":9,"pagePostDateDay":23,"pagePostDateDayName":"Thursday","pagePostDateHour":0,"pagePostDateMinute":0,"pagePostDateIso":"2021-09-23T00:00:10-07:00","pagePostDateUnix":1632355210,"postCountOnPage":1,"postCountTotal":1,"postID":11527,"postFormat":"standard"}; dataLayer.push( dataLayer_content ); </script> <script type="rocketlazyloadscript" data-cfasync="false"> (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//metrics.couchbase.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-MVPNN2'); </script> <!-- End Google Tag Manager for WordPress by gtm4wp.com --> <style id="wpp-loading-animation-styles">@-webkit-keyframes bgslide{from{background-position-x:0}to{background-position-x:-200%}}@keyframes bgslide{from{background-position-x:0}to{background-position-x:-200%}}.wpp-widget-block-placeholder,.wpp-shortcode-placeholder{margin:0 auto;width:60px;height:3px;background:#dd3737;background:linear-gradient(90deg,#dd3737 0%,#571313 10%,#dd3737 100%);background-size:200% auto;border-radius:3px;-webkit-animation:bgslide 1s infinite linear;animation:bgslide 1s infinite linear}</style> <style type="text/css"> .site-identity { padding: 2% 0; } .single .hero-posts .with-featured-image { padding-top: 26%; } </style> <link rel="icon" href="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2023/10/couchbase-favicon.svg" sizes="32x32" /> <link rel="icon" href="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2023/10/couchbase-favicon.svg" sizes="192x192" /> <link rel="apple-touch-icon" href="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2023/10/couchbase-favicon.svg" /> <meta name="msapplication-TileImage" content="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2023/10/couchbase-favicon.svg" /> <style type="text/css" id="wp-custom-css"> @media all and (max-width: 1200px) { .algolia-autocomplete { display: none !important; } } </style> <style type="text/css">/** Mega Menu CSS: disabled **/</style> <!-- OneTrust Cookies Consent Notice start for couchbase.com --> <script type="rocketlazyloadscript" data-rocket-src="https://cdn.cookielaw.org/scripttemplates/otSDKStub.js" data-rocket-type="text/javascript" charset="UTF-8" data-domain-script="748511ff-10bf-44bf-88b8-36382e5b5fd9"></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript"> function OptanonWrapper() {} </script> <!-- OneTrust Cookies Consent Notice end for couchbase.com --><style id="rocket-lazyrender-inline-css">[data-wpr-lazyrender] {content-visibility: auto;}</style><meta name="generator" content="WP Rocket 3.18.1.5" data-wpr-features="wpr_delay_js wpr_minify_js wpr_preload_fonts wpr_automatic_lazy_rendering wpr_oci wpr_minify_css wpr_desktop wpr_preload_links" /></head> <body class="post-template-default single single-post postid-11527 single-format-standard mega-menu-cb-header-menu has-sidebar two-column group-blog"> <header id="masthead" class="site-header" role="banner"> <div class="container flex"> <div class="brand_logo_wrap"> <a href="https://www.couchbase.com/"> <img src="https://www.couchbase.com/blog/wp-content/themes/couchbase/images/Logo-2000.svg" width="203" height="46" alt="Couchbase Website"> </a> </div> <div class="mega-menu-toggle ipad-menu" id="megaToggle"></div> <nav class="menu-container"> <div id="mega-menu-wrap-cb-header-menu" class="mega-menu-wrap"><div class="mega-menu-toggle"><div class="mega-toggle-blocks-left"></div><div class="mega-toggle-blocks-center"></div><div class="mega-toggle-blocks-right"><div class='mega-toggle-block mega-menu-toggle-animated-block mega-toggle-block-0' id='mega-toggle-block-0'><button aria-label="Toggle Menu" class="mega-toggle-animated mega-toggle-animated-slider" type="button" aria-expanded="false"> <span class="mega-toggle-animated-box"> <span class="mega-toggle-animated-inner"></span> </span> </button></div></div></div><ul id="mega-menu-cb-header-menu" class="mega-menu max-mega-menu mega-menu-horizontal mega-no-js" data-event="hover" data-effect="disabled" data-effect-speed="200" data-effect-mobile="disabled" data-effect-speed-mobile="0" data-mobile-force-width="false" data-second-click="go" data-document-click="collapse" data-vertical-behaviour="standard" data-breakpoint="1024" data-unbind="true" data-mobile-state="collapse_all" data-mobile-direction="vertical" data-hover-intent-timeout="300" data-hover-intent-interval="100"><li class='mega-products-menu mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-menu-megamenu mega-align-bottom-left mega-menu-grid mega-menu-item-13438 products-menu' id='mega-menu-item-13438'><a class="mega-menu-link" href="#" aria-expanded="false" tabindex="0">Products<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-row mega-row-products-menu row-products-menu' id='mega-menu-13438-0'> <ul class="mega-sub-menu"> <li class='mega-menu-column mega-grid-products-menu mega-menu-columns-1-of-2 grid-products-menu' id='mega-menu-13438-0-0'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-29' id='mega-menu-item-nav_menu-29'><h4 class="mega-block-title">Platform</h4><div class="menu-platform-container"><ul id="menu-platform" class="menu"><li id="menu-item-15750" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15750"><a href="/products/capella/">Couchbase Capella<span>Database-as-a-Service</span></a></li> </ul></div></li><li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-30' id='mega-menu-item-nav_menu-30'><h4 class="mega-block-title">Self-Managed</h4><div class="menu-self-managed-container"><ul id="menu-self-managed" class="menu"><li id="menu-item-15755" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15755"><a href="/products/server/">Couchbase Server<span>On-prem, multicloud, community</span></a></li> </ul></div></li> </ul> </li><li class='mega-menu-column mega-grid-products-menu mega-menu-columns-1-of-2 grid-products-menu' id='mega-menu-13438-0-1'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-27' id='mega-menu-item-nav_menu-27'><h4 class="mega-block-title">Services</h4><div class="menu-services-container"><ul id="menu-services" class="menu"><li id="menu-item-15751" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15751"><a href="/products/ai-services/">AI Services <span>AI-enabled agent development and <br>deployment</span></a></li> <li id="menu-item-15752" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15752"><a href="/products/full-text-search/">Search <span>Full-text, hybrid, geospatial, vector</span></a></li> <li id="menu-item-15753" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15753"><a href="/products/mobile/">Mobile<span>Embedded NoSQL, cloud to edge sync, offline-first</span></a></li> <li id="menu-item-15754" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15754"><a href="/products/analytics/">Columnar Analytics<span>Real-time, multisource analytics</span></a></li> </ul></div></li><li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-28' id='mega-menu-item-nav_menu-28'><h4 class="mega-block-title">Capabilities</h4><div class="menu-capabilities-container"><ul id="menu-capabilities" class="menu"><li id="menu-item-15756" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15756"><a href="/developers/architecture/">In-memory Architecture<span>Speed, scale, availability</span></a></li> <li id="menu-item-15757" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15757"><a href="/developers/data-modeling/">Build Flexible Apps<span>JSON, SQL++, multipurpose</span></a></li> <li id="menu-item-15758" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15758"><a href="/products/operator/">Cloud Automation<span>Kubernetes Operator</span></a></li> <li id="menu-item-15759" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15759"><a href="/developers/sdks/">Dev Tools<span>SDKs, integrations, Capella iQ</span></a></li> </ul></div></li> </ul> </li> </ul> </li><li class='mega-menu-row mega-bg-peach bg-peach' id='mega-menu-13438-1'> <ul class="mega-sub-menu"> <li class='mega-menu-column mega-menu-columns-1-of-1' id='mega-menu-13438-1-0'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_custom_html mega-menu-item-custom_html-16' id='mega-menu-item-custom_html-16'><h4 class="mega-block-title">Why Couchbase?</h4><div class="textwidget custom-html-widget"><div class='menu-card'> <p>Developers and enterprises choose Couchbase for their mission-critical applications.</p> <a href='/why-couchbase/' class='cta-btn bg-black text-white'>See Why</a> </div> <div class='menu-card before-border'> <h4 class="mega-inner-title">Migrate to Capella</h4> <p>Top reasons to upgrade from Server Enterprise Edition to Couchbase Capella</p> <a href='/products/ai-services/' class='cta-btn bg-black text-white'>See Why</a> </div></div></li> </ul> </li> </ul> </li></ul> </li><li class='mega-solutions-menu mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-menu-megamenu mega-align-bottom-left mega-menu-grid mega-menu-item-13439 solutions-menu' id='mega-menu-item-13439'><a class="mega-menu-link" href="#" aria-expanded="false" tabindex="0">Solutions<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-row' id='mega-menu-13439-0'> <ul class="mega-sub-menu"> <li class='mega-menu-column mega-w-36 mega-menu-columns-4-of-12 w-36' id='mega-menu-13439-0-0'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-31' id='mega-menu-item-nav_menu-31'><h4 class="mega-block-title">By Use Case</h4><div class="menu-by-use-case-container"><ul id="menu-by-use-case" class="menu"><li id="menu-item-15760" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15760"><a href="/use-cases/artificial-intelligence/">Artificial Intelligence</a></li> <li id="menu-item-15761" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15761"><a href="/use-cases/session-management/">Caching and Session Management</a></li> <li id="menu-item-15762" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15762"><a href="/use-cases/product-catalog/">Adaptive Product Catalog</a></li> <li id="menu-item-15763" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15763"><a href="/use-cases/smart-personalization/">Smart Personalization &#038; Profiles</a></li> <li id="menu-item-15764" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15764"><a href="/use-cases/field-service/">Adaptive Field Services</a></li> <li id="menu-item-15765" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15765"><a href="/use-cases/real-time-analytics/">Real-Time Analytics for AI</a></li> <li id="menu-item-15766" class="active-link menu-item menu-item-type-custom menu-item-object-custom menu-item-15766"><a href="/use-cases/#usecaseIndustry_1">See all use cases</a></li> </ul></div></li> </ul> </li><li class='mega-menu-column mega-w-28 mega-menu-columns-4-of-12 w-28' id='mega-menu-13439-0-1'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-32' id='mega-menu-item-nav_menu-32'><h4 class="mega-block-title">By Industry</h4><div class="menu-by-industry-container"><ul id="menu-by-industry" class="menu"><li id="menu-item-13452" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13452"><a href="/use-cases/energy-and-utilities/">Energy &#038; Utilities</a></li> <li id="menu-item-13453" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13453"><a href="/use-cases/gaming/">Gaming</a></li> <li id="menu-item-13454" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13454"><a href="/use-cases/healthcare/">Healthcare</a></li> <li id="menu-item-13455" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13455"><a href="/use-cases/media-and-entertainment/">Entertainment</a></li> <li id="menu-item-13456" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13456"><a href="/use-cases/retail-and-ecommerce/">Retail</a></li> <li id="menu-item-15024" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15024"><a href="/use-cases/travel-and-hospitality/">Travel &#038; Hospitality</a></li> <li id="menu-item-13457" class="active-link menu-item menu-item-type-custom menu-item-object-custom menu-item-13457"><a href="/use-cases/#usecaseIndustry_2">See all industries</a></li> </ul></div></li> </ul> </li><li class='mega-menu-column mega-w-36 mega-menu-columns-4-of-12 w-36' id='mega-menu-13439-0-2'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-33' id='mega-menu-item-nav_menu-33'><h4 class="mega-block-title">By Application Need</h4><div class="menu-by-application-need-container"><ul id="menu-by-application-need" class="menu"><li id="menu-item-13458" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13458"><a href="/use-cases/application-performance/">Application Performance</a></li> <li id="menu-item-13459" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13459"><a href="/use-cases/distributed-workloads/">Distributed Workloads</a></li> <li id="menu-item-13460" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13460"><a href="/use-cases/application-flexibility/">Application Flexibility</a></li> <li id="menu-item-13461" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13461"><a href="/use-cases/edge-computing/">Mobile, IoT, &#038; Edge</a></li> <li id="menu-item-13462" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13462"><a href="/use-cases/developer-productivity/">Developer Productivity</a></li> <li id="menu-item-15023" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15023"><a href="/use-cases/operational-cost-reduction/">High Cost Of Operations</a></li> <li id="menu-item-13463" class="active-link menu-item menu-item-type-custom menu-item-object-custom menu-item-13463"><a href="/use-cases/#usecaseIndustry_3">See all application needs</a></li> </ul></div></li> </ul> </li> </ul> </li></ul> </li><li class='mega-developers-menu mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-menu-megamenu mega-align-bottom-left mega-menu-grid mega-menu-item-14175 developers-menu' id='mega-menu-item-14175'><a class="mega-menu-link" href="#" aria-expanded="false" tabindex="0">Developers<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-row' id='mega-menu-14175-0'> <ul class="mega-sub-menu"> <li class='mega-menu-column mega-w-30 mega-menu-columns-4-of-12 w-30' id='mega-menu-14175-0-0'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-35' id='mega-menu-item-nav_menu-35'><h4 class="mega-block-title">Popular Docs</h4><div class="menu-popular-docs-container"><ul id="menu-popular-docs" class="menu"><li id="menu-item-13485" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13485"><a target="_blank" href="https://docs.couchbase.com/home/cloud.html">Capella Overview</a></li> <li id="menu-item-13486" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13486"><a target="_blank" href="https://docs.couchbase.com/server/current/introduction/why-couchbase.html">Server Overview</a></li> <li id="menu-item-13487" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13487"><a target="_blank" href="https://docs.couchbase.com/home/mobile.html">Mobile &#038; Edge Overview</a></li> <li id="menu-item-13488" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13488"><a target="_blank" href="https://docs.couchbase.com/home/sdk.html">Connecting Apps (SDKs)</a></li> <li id="menu-item-13489" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13489"><a target="_blank" href="https://developer.couchbase.com/tutorials">Tutorials &#038; Samples</a></li> <li id="menu-item-13490" class="active-link menu-item menu-item-type-custom menu-item-object-custom menu-item-13490"><a target="_blank" href="https://docs.couchbase.com/home/index.html">Docs Home</a></li> </ul></div></li> </ul> </li><li class='mega-menu-column mega-w-28 mega-menu-columns-4-of-12 w-28' id='mega-menu-14175-0-1'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-34' id='mega-menu-item-nav_menu-34'><h4 class="mega-block-title">By Developer Role</h4><div class="menu-by-developer-role-container"><ul id="menu-by-developer-role" class="menu"><li id="menu-item-15012" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15012"><a href="https://www.couchbase.com/developers/backend/">Backend</a></li> <li id="menu-item-15013" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15013"><a href="https://www.couchbase.com/developers/full-stack/">Full Stack</a></li> <li id="menu-item-15014" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15014"><a href="https://www.couchbase.com/developers/mobile/">Mobile</a></li> <li id="menu-item-15015" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15015"><a href="https://www.couchbase.com/developers/devops-dbas/">Ops / DBA</a></li> <li id="menu-item-15025" class="active-link menu-item menu-item-type-custom menu-item-object-custom menu-item-15025"><a href="https://www.couchbase.com/developers/">Developers Home</a></li> </ul></div></li> </ul> </li><li class='mega-menu-column mega-custom-width mega-bg-peach mega-menu-columns-4-of-12 custom-width bg-peach' id='mega-menu-14175-0-2'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_custom_html mega-menu-item-custom_html-17' id='mega-menu-item-custom_html-17'><h4 class="mega-block-title">COMMUNITY</h4><div class="textwidget custom-html-widget"><div class='menu-card'> <a class='menu-banner' href='https://www.couchbase.com/developers/community/'><img loading='lazy' src='https://www.couchbase.com/wp-content/uploads/2024/11/Dev-Community.png' alt=''> </a> <h6 class='mega-inner-title'> Join the Developer Community </h6> <p> Explore developer resources, ambassadors, and events in your area. </p> <a href='https://www.couchbase.com/developers/community/' class='cta-btn bg-black text-white' target='_blank'>Learn More</a> </div></div></li> </ul> </li> </ul> </li></ul> </li><li class='mega-resources-menu mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-menu-megamenu mega-align-bottom-left mega-menu-grid mega-menu-item-13441 resources-menu' id='mega-menu-item-13441'><a class="mega-menu-link" href="#" aria-expanded="false" tabindex="0">Resources<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-row' id='mega-menu-13441-0'> <ul class="mega-sub-menu"> <li class='mega-menu-column mega-w-36 mega-menu-columns-4-of-12 w-36' id='mega-menu-13441-0-0'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-36' id='mega-menu-item-nav_menu-36'><h4 class="mega-block-title">Resource Center</h4><div class="menu-resource-center-container"><ul id="menu-resource-center" class="menu"><li id="menu-item-15016" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-15016"><a target="_blank" href="https://www.couchbase.com/blog/">Blogs</a></li> <li id="menu-item-13514" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13514"><a href="https://www.couchbase.com/resources/webcasts-and-events/">Webcasts &#038; Events</a></li> <li id="menu-item-13513" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13513"><a href="https://www.couchbase.com/resources/?query=&#038;content=Videos%20and%20Presentations&#038;page=1">Videos &#038; Presentations</a></li> <li id="menu-item-13515" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13515"><a href="https://www.couchbase.com/resources/nosql-whitepapers/">Whitepapers</a></li> <li id="menu-item-13516" class="active-link menu-item menu-item-type-custom menu-item-object-custom menu-item-13516"><a href="https://www.couchbase.com/resources/">See all resources</a></li> </ul></div></li> </ul> </li><li class='mega-menu-column mega-w-28 mega-menu-columns-4-of-12 w-28' id='mega-menu-13441-0-1'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-37' id='mega-menu-item-nav_menu-37'><h4 class="mega-block-title">Education</h4><div class="menu-education-container"><ul id="menu-education" class="menu"><li id="menu-item-13473" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13473"><a href="https://www.couchbase.com/academy/">Academy</a></li> <li id="menu-item-13474" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13474"><a href="https://www.couchbase.com/academy/certification/">Certification</a></li> <li id="menu-item-13476" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13476"><a target="_blank" href="https://www.couchbase.com/forums/">Forums</a></li> <li id="menu-item-13477" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13477"><a target="_blank" href="https://support.couchbase.com/hc/en-us/">Support Login</a></li> <li id="menu-item-15017" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15017"><a href="https://docs.couchbase.com/home/index.html">Documentation</a></li> </ul></div></li> </ul> </li><li class='mega-menu-column mega-w-36 mega-menu-columns-4-of-12 w-36' id='mega-menu-13441-0-2'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-41' id='mega-menu-item-nav_menu-41'><h4 class="mega-block-title">Compare</h4><div class="menu-compare-container"><ul id="menu-compare" class="menu"><li id="menu-item-16598" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-16598"><a href="/comparing-couchbase-vs-mongodb/">Couchbase vs. MongoDB</a></li> <li id="menu-item-16599" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-16599"><a href="/comparing-couchbase-vs-oracle/">Couchbase vs. Oracle</a></li> <li id="menu-item-16600" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-16600"><a href="/comparing-couchbase-vs-dynamodb/">Couchbase vs. DynamoDB</a></li> <li id="menu-item-16601" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-16601"><a href="/mongodb-redis/">Couchbase vs. Redis</a></li> <li id="menu-item-16602" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-16602"><a href="/nosql-database-cloud-comparison/">NoSQL Cloud Comparison</a></li> </ul></div></li> </ul> </li> </ul> </li></ul> </li><li class='mega-company-menu mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-menu-item-has-children mega-menu-megamenu mega-align-bottom-left mega-menu-grid mega-menu-item-13442 company-menu' id='mega-menu-item-13442'><a class="mega-menu-link" href="#" aria-expanded="false" tabindex="0">Company<span class="mega-indicator"></span></a> <ul class="mega-sub-menu"> <li class='mega-menu-row' id='mega-menu-13442-0'> <ul class="mega-sub-menu"> <li class='mega-menu-column mega-w-20 mega-pr-10 mega-menu-columns-3-of-12 w-20 pr-10' id='mega-menu-13442-0-0'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-38' id='mega-menu-item-nav_menu-38'><h4 class="mega-block-title">About</h4><div class="menu-about-container"><ul id="menu-about" class="menu"><li id="menu-item-13446" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13446"><a href="https://www.couchbase.com/about/">About Us</a></li> <li id="menu-item-13447" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13447"><a href="https://www.couchbase.com/leadership/">Leadership</a></li> <li id="menu-item-13448" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13448"><a href="https://www.couchbase.com/customers/">Customers</a></li> <li id="menu-item-15021" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15021"><a href="https://investors.couchbase.com/">Investors</a></li> <li id="menu-item-15022" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-15022"><a href="https://www.couchbase.com/blog/">Blog</a></li> <li id="menu-item-13450" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13450"><a href="https://www.couchbase.com/news-and-press-releases/">Newsroom</a></li> <li id="menu-item-13451" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13451"><a href="/careers/">Careers</a></li> </ul></div></li> </ul> </li><li class='mega-menu-column mega-w-20 mega-pl-20 mega-pr-10 mega-menu-columns-3-of-12 w-20 pl-20 pr-10' id='mega-menu-13442-0-1'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-39' id='mega-menu-item-nav_menu-39'><h4 class="mega-block-title">Partnerships</h4><div class="menu-partnerships-container"><ul id="menu-partnerships" class="menu"><li id="menu-item-15018" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15018"><a href="/partners/find-a-partner/">Find a Partner</a></li> <li id="menu-item-15019" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15019"><a href="/partners/partner-with-couchbase/">Become a Partner</a></li> <li id="menu-item-15020" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-15020"><a href="/register-a-deal/">Register a Deal</a></li> </ul></div></li> </ul> </li><li class='mega-menu-column mega-w-26 mega-pl-20 mega-menu-columns-3-of-12 w-26 pl-20' id='mega-menu-13442-0-2'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_nav_menu mega-menu-item-nav_menu-40' id='mega-menu-item-nav_menu-40'><h4 class="mega-block-title">Our Services</h4><div class="menu-our-services-container"><ul id="menu-our-services" class="menu"><li id="menu-item-13482" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13482"><a href="https://www.couchbase.com/professional-services/">Professional Services</a></li> <li id="menu-item-13484" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-13484"><a target="_blank" href="https://support.couchbase.com/hc/en-us/">Enterprise Support</a></li> </ul></div></li> </ul> </li><li class='mega-menu-column mega-bg-peach mega-cp-custom-width mega-menu-columns-3-of-12 bg-peach cp-custom-width' id='mega-menu-13442-0-3'> <ul class="mega-sub-menu"> <li class='mega-menu-item mega-menu-item-type-widget widget_custom_html mega-menu-item-custom_html-19' id='mega-menu-item-custom_html-19'><h4 class="mega-block-title">Partners: Register a Deal</h4><div class="textwidget custom-html-widget"><div class='menu-card'> <h6 class='mega-inner-title'> Ready to register a deal with Couchbase? </h6> <p> Let us know your partner details and more about the prospect you are registering. </p> <a href='https://www.couchbase.com/register-a-deal/' class='cta-btn bg-black text-white'>Start here</a> </div> <div class='menu-card before-border'> <h6 class='mega-inner-title'> Marriott </h6> <p> Marriott chose Couchbase over MongoDB and Cassandra for their reliable personalized customer experience. </p> <a href='https://www.couchbase.com/customers/marriott/' class='cta-btn bg-black text-white'>Learn more</a> </div></div></li> </ul> </li> </ul> </li></ul> </li><li class='mega-action-item mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-align-bottom-left mega-menu-flyout mega-menu-item-13445 action-item' id='mega-menu-item-13445'><a class="mega-menu-link" href="https://www.couchbase.com/pricing/" tabindex="0">Pricing</a></li><li class='mega-free-trial mega-blue-btn mega-right-side-menu mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-align-bottom-left mega-menu-flyout mega-menu-item-13443 free-trial blue-btn right-side-menu' id='mega-menu-item-13443'><a class="mega-menu-link" href="https://www.couchbase.com/downloads/" tabindex="0">Try Free</a></li><li class='mega-sign-in-link mega-right-side-menu mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-align-bottom-left mega-menu-flyout mega-menu-item-13444 sign-in-link right-side-menu' id='mega-menu-item-13444'><a target="_blank" class="mega-menu-link" href="https://cloud.couchbase.com/sign-in" tabindex="0">Sign In</a></li><li class='mega-right-side-menu mega-search-icon mega-menu-item mega-menu-item-type-custom mega-menu-item-object-custom mega-align-bottom-left mega-menu-flyout mega-menu-item-13971 right-side-menu search-icon' id='mega-menu-item-13971'><a class="mega-menu-link" href="/search/" tabindex="0">search</a></li></ul></div> <div class="blog-main-menu drawer-menu-explore"> <nav id="site-navigation" class="blog-main-navigation " role="navigation"> <div class="menu-md-wrap"> <div class="menu-primary-container"><ul id="menu-primary" class="blog-menu"><li id="menu-item-5792" class="disable-link menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-5792"><a href="https://www.couchbase.com/blog/">Blog</a></li> <li id="menu-item-1086" class="disable-link menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-1086"><a href="javascript:void(0);">Browse by Topic</a> <ul class="sub-menu"> <li id="menu-item-12007" class="menu-heading menu-heading-red menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-12007"><a href="javascript:void(0);">Topics</a> <ul class="sub-menu"> <li id="menu-item-12008" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12008"><a href="/blog/category/application-design/?ref=blog-menu">Application Design</a></li> <li id="menu-item-12009" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12009"><a href="/blog/category/data-modeling/?ref=blog-menu">Data Modeling</a></li> <li id="menu-item-12010" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12010"><a href="/blog/category/couchbase-architecture/?ref=blog-menu">Architecture</a></li> <li id="menu-item-12011" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12011"><a href="/blog/category/performance/?ref=blog-menu">Performance</a></li> <li id="menu-item-16036" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-16036"><a href="/blog/tag/artificial-intelligence/?ref=blog-menu">Artificial Intelligence</a></li> <li id="menu-item-12013" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12013"><a href="/blog/category/security/?ref=blog-menu">Security</a></li> <li id="menu-item-12012" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12012"><a href="/blog/category/best-practices-and-tutorials/?ref=blog-menu">Best Practices &#038; Tutorials</a></li> </ul> </li> </ul> </li> <li id="menu-item-12014" class="disable-link menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-12014"><a href="javascript:void(0);">Browse by Specialization</a> <ul class="sub-menu"> <li id="menu-item-12015" class="menu-heading menu-heading-red menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-12015"><a href="javascript:void(0);">Specializations</a> <ul class="sub-menu"> <li id="menu-item-12016" class="disable-link menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-12016"><a href="javascript:void(0);">Products</a> <ul class="sub-menu"> <li id="menu-item-12017" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12017"><a href="/blog/category/cloud/?ref=blog-menu">Capella</a></li> <li id="menu-item-12018" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12018"><a href="/blog/category/couchbase-server/?ref=blog-menu">Server</a></li> <li id="menu-item-12019" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12019"><a href="/blog/category/couchbase-autonomous-operator/?ref=blog-menu">Autonomous Operator</a></li> <li id="menu-item-12020" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12020"><a href="/blog/category/couchbase-mobile/?ref=blog-menu">Mobile</a></li> <li id="menu-item-12021" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12021"><a href="/blog/category/sync-gateway/?ref=blog-menu">Sync Gateway</a></li> <li id="menu-item-12022" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12022"><a href="/blog/category/couchbase-lite/?ref=blog-menu">Lite</a></li> </ul> </li> <li id="menu-item-12023" class="disable-link menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-12023"><a href="javascript:void(0);">SDKs</a> <ul class="sub-menu"> <li id="menu-item-12024" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12024"><a href="/blog/category/java/?ref=blog-menu">Java</a></li> <li id="menu-item-12025" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12025"><a href="/blog/category/dotnet/?ref=blog-menu">.NET</a></li> <li id="menu-item-12026" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12026"><a href="/blog/category/scala/?ref=blog-menu">Scala</a></li> <li id="menu-item-12027" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12027"><a href="/blog/category/ruby/?ref=blog-menu">Ruby</a></li> <li id="menu-item-12028" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12028"><a href="/blog/category/node-js/?ref=blog-menu">Node.js</a></li> <li id="menu-item-12029" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12029"><a href="/blog/category/android/?ref=blog-menu">Android</a></li> <li id="menu-item-12030" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12030"><a href="/blog/category/python/?ref=blog-menu">Python</a></li> <li id="menu-item-12031" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12031"><a href="/blog/category/php/?ref=blog-menu">PHP</a></li> <li id="menu-item-12032" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12032"><a href="/blog/category/swift/?ref=blog-menu">Swift</a></li> <li id="menu-item-12033" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12033"><a href="/blog/category/golang/?ref=blog-menu">GoLang</a></li> <li id="menu-item-12034" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12034"><a href="/blog/category/objective-c/?ref=blog-menu">Objective-C</a></li> </ul> </li> <li id="menu-item-12035" class="disable-link menu-item menu-item-type-custom menu-item-object-custom menu-item-has-children menu-item-12035"><a href="javascript:void(0);">Capabilities</a> <ul class="sub-menu"> <li id="menu-item-12036" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12036"><a href="/blog/category/n1ql-query/?ref=blog-menu">SQL++ (N1QL)</a></li> <li id="menu-item-12037" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12037"><a href="/blog/category/multi-dimensional-scaling/?ref=blog-menu">Multi-Dimensional Scaling</a></li> <li id="menu-item-12038" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12038"><a href="/blog/category/xdcr/?ref=blog-menu">XDCR</a></li> <li id="menu-item-12039" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12039"><a href="/blog/tag/caching/?ref=blog-menu">Caching</a></li> <li id="menu-item-12040" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12040"><a href="/blog/category/full-text-search/?ref=blog-menu">Full-Text Search</a></li> <li id="menu-item-12041" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12041"><a href="/blog/category/analytics/?ref=blog-menu">Analytics</a></li> <li id="menu-item-12042" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12042"><a href="/blog/category/indexing/?ref=blog-menu">Indexing</a></li> <li id="menu-item-12043" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12043"><a href="/blog/category/eventing/?ref=blog-menu">Eventing</a></li> <li id="menu-item-12044" class="hyperlink-effect menu-item menu-item-type-custom menu-item-object-custom menu-item-12044"><a href="/blog/category/backup/?ref=blog-menu">Backup</a></li> </ul> </li> </ul> </li> </ul> </li> </ul></div> </div> <div class="top-navigation-right"> <!-- --> <!-- <div id="dummy-search-box" class="nav-searchbox"> <input type="text" class='ais-SearchBox-input' placeholder="Search here..."> </div> --> <div id="searchbox" class="nav-searchbox"></div> <a class="blog-login-btn" href="/blog/wp-login.php" title="Blog Sign In" rel="home">Blog Sign In ></a> </div> </nav> </div> </nav> </div> </header> <div class="nav-overlay"></div> <div class="algolia-hits" id="hits-block"> <h6 class="algolia-post-title">All Posts</h6> <div id="hits"></div> <button id="see-all-button" class="see-all-button cta-btn bg-black text-white">See All Results</button> </div> <div class="hero-wrapper"> <div class="hero-posts"> <div id="post-11527" class="with-featured-image hero-post post-11527 post type-post status-publish format-standard has-post-thumbnail hentry category-best-practices-and-tutorials category-community category-couchbase-sdk category-couchbase-server category-javascript category-monitoring category-python category-n1ql-query tag-data-visualization tag-grafana tag-json tag-key-value tag-n1ql tag-prometheus tag-python"> <!-- Get the hero background image --> <div class="site-header-bg-wrap"> <div class="header-opacity"> <div class="header-gradient"></div> <div class="site-header-bg background-effect" style="background-image: url(https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/how-to-make-observability-dashboard-couchbase-grafana-prometheus.png); opacity: 0.5;"></div> </div> </div><!-- .site-header-bg-wrap --> <div class="container hero-container"> <!-- Hero title --> <div class="hero-text"> <h1 class="entry-title">How to Build Observability Dashboards with Prometheus, Grafana &amp; Couchbase</h1> <div class="hero-date"> <ul> <li> <!-- Create an avatar link --> <a class="author-profile-avatar" href="https://www.couchbase.com/blog/author/jake-and-jagadesh/" title="Posts by Jake Rawsthorne &amp; Jagadesh Munta"> <img alt='' src='https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/jake-rawsthorne-jagadesh-munta-couchbase.png' srcset='https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/jake-rawsthorne-jagadesh-munta-couchbase.png 2x' class='avatar avatar-65 photo avatar-default' height='65' width='65' decoding='async'/> </a> </li> <li> <div class="auth_detail_wrp"> <!-- Create an author post link --> <a class="auth_name" href="https://www.couchbase.com/blog/author/jake-and-jagadesh/"> Jake Rawsthorne &amp; Jagadesh Munta </a> </div> <div class="date_blog"> <span class="hero-date-span">September 23, 2021</span> </div> </li> </ul> </div> </div><!-- .photo-overlay --> </div><!-- .container --> </div> </div><!-- .hero-posts --> </div><!-- .hero-wrapper --> <div id="page" class="hfeed site container"> <div id="content" class="site-content"> <div id="primary" class="content-area"> <main id="main" class="site-main" role="main"> <article id="post-11527" class="post full-post post-11527 type-post status-publish format-standard has-post-thumbnail hentry category-best-practices-and-tutorials category-community category-couchbase-sdk category-couchbase-server category-javascript category-monitoring category-python category-n1ql-query tag-data-visualization tag-grafana tag-json tag-key-value tag-n1ql tag-prometheus tag-python"> <div class="entry-content"> <p><strong>You&#8217;ve certainly heard it before:</strong> &#8220;What gets measured gets done.&#8221;</p> <p>It&#8217;s true: what you observe and measure is what you can improve.</p> <p>The key to any improvement is to first identify <em>what</em> to measure and then collect the related metrics. Using those metrics, you can tune the underlying work and analyze the effectiveness of any changes. Then repeat the cycle until you&#8217;ve sufficiently improved.</p> <p>At Couchbase, we needed to improve some of our day-to-day operations, so we created observability dashboards to help us identify issues and track improvement. We used a combination of <a href="https://prometheus.io/?ref=hello-from-couchbase" target="_blank" rel="noopener">Prometheus</a>, which simplifies storing and querying time-series data, and <a href="https://grafana.com/?ref=hello-from-couchbase" target="_blank" rel="noopener">Grafana</a>, which can be used to make stunning data visualizations. In addition, we used <a href="https://developer.couchbase.com/new-to-couchbase/?ref=blog" target="_blank" rel="noopener">Couchbase</a> to store historical data for later use with its <a href="https://www.couchbase.com/products/full-text-search/?ref=blog" target="_blank" rel="noopener">Full-Text Search</a> and <a href="https://www.couchbase.com/products/analytics/?ref=blog" target="_blank" rel="noopener">Analytics</a> tools.</p> <p>In this article, we&#8217;ll walk you through how to build your own observability dashboard using Prometheus, Grafana and Couchbase.</p> <p>Your in-house data source pipelines may vary – as might your data visualization software. However, the steps we&#8217;ll show you today should be applicable across a number of tools and deployments.</p> <h2>Generic Observability Dashboard: Design &amp; Architecture</h2> <p>In order to build a reusable and scalable tool, it&#8217;s better to work from common designs and templates as a first step. From there, you can customize as needed. With this approach, it&#8217;s quick and easy to develop future dashboards.</p> <p>The diagram below shows the generic architecture of the observability dashboards we&#8217;ll build together:</p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><a href="https://www.couchbase.com/blog/wp-content/uploads/2021/09/architecture-diagram-couchbase-grafana-prometheus-dashboard.png"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-12097" src="https://www.couchbase.com/blog/wp-content/uploads/2021/09/architecture-diagram-couchbase-grafana-prometheus-dashboard.png" alt="An observability dashboard architecture using Prometheus, Couchbase and Grafana" width="1000" height="526" srcset="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/architecture-diagram-couchbase-grafana-prometheus-dashboard.png 1000w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/architecture-diagram-couchbase-grafana-prometheus-dashboard-300x158.png 300w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/architecture-diagram-couchbase-grafana-prometheus-dashboard-768x404.png 768w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/architecture-diagram-couchbase-grafana-prometheus-dashboard-20x11.png 20w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p>In this architecture, two different data inputs form an interface to the dashboard service. Let&#8217;s take a closer look at each of these below.</p> <ol> <li><strong>JSON metadata about the dashboard</strong> <ul> <li>Data source definitions, including information about the data sources (like DB URL, SQL, credentials), the file paths, and Jenkins artifacts URLs.</li> <li>The Grafana layout template (or visual dashboard view), which we&#8217;ll design first and then use as templates for panels in our later dashboards.</li> </ul> </li> <li><strong>The actual data source files from <code>.json</code> and <code>.csv</code> files and from Couchbase</strong>. <ul> <li>The design of these observability dashboards supports various data sources like Couchbase Server, and direct files like <a href="https://www.couchbase.com/blog/json-database/?ref=blog" target="_blank" rel="noopener">JSON documents</a> and CSV (Comma Separated Values) files. You can extend the databoard proxy service code (in <code>dashboard.py</code>) to parse other data formats as needed.</li> </ul> </li> </ol> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p>The expected output will be a Grafana dashboard UI and Prometheus time-series collected metrics from the two inputs listed above. The central part of the above diagram shows the different services in the collection that support the creation of the dashboards.</p> <p>Let&#8217;s take a closer look at the different facets and services included in the architecture diagram:</p> <ul> <li><strong>Dashboard proxy service:</strong> <ul> <li>This is a generic Python Flask web app service (<code>dashboard.py</code>) that interacts with the Grafana service to serve the tabular data and other APIs like <code>/query</code>, <code>/add</code>, <code>/import</code> and <code>/export</code> endpoints. You can develop a similar one to have a generic template (JSON) for the panels on Grafana and attach the graph data points and tabular-data points as target JSON to display on your Grafana dashboard.</li> </ul> </li> <li><strong>Prometheus export service:</strong> <ul> <li>This is a custom Prometheus exporter (say <code>prometheus.py</code>) Flask web app service that connects to the data sources and serves the requests from Prometheus itself. At a high level, this acts as a bridge between the Prometheus and datasources. Note that this service is needed only when the data source is to be maintained for time series (many trends need this).</li> </ul> </li> <li><strong>Grafana service:</strong> <ul> <li>This is the regular Grafana tool itself that you use to create panels and display as dashboards.</li> </ul> </li> <li><strong>Prometheus service:</strong> <ul> <li>This is the regular Prometheus tool itself that holds your metrics as time-series data.</li> </ul> </li> <li><strong>Alert Manager:</strong> <ul> <li>The Alert Manager has custom alert rules that receive alerts when certain thresholds are met.</li> </ul> </li> <li>Other services: <ul> <li><strong>Couchbase:</strong> You might already be using this <a href="https://www.couchbase.com/resources/why-nosql/?ref=blog" target="_blank" rel="noopener">NoSQL</a> document database, but if not, you can install it through a container or directly on a different host. Couchbase stores your data as JSON documents, or you can have it store required fields as separate documents for historic trends while preparing your health or trend data.</li> <li><strong>Docker:</strong> You&#8217;ll need to install the docker agent software on the host in order to use this containerized service deployment.</li> </ul> </li> </ul> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <h3>Sample Dashboard JSON Structure</h3> <p>In the table below, you&#8217;ll see a sample of the structure of both the input metadata and the input data source.</p> <table> <tbody> <tr> <td>Input metadata JSON structure:</td> <td>Input data sources structure:</td> </tr> <tr> <td><code>{<br /> "dashboard_title": "",<br /> "data": [<br /> {<br /> "source": "couchbase|json|csv",<br /> "type": "timeseries|table",<br /> "name": "&lt;unique name for this data source&gt;",<br /> "refresh": "&lt;how often the data should be refreshed (seconds)&gt;"<br /> }<br /> ],<br /> "grafana": [<br /> { “template”: “link to template json” },<br /> {<br /> "title": "Links",<br /> "grid_position": {},<br /> "type": "text",<br /> "links": []<br /> },<br /> ]<br /> }<br /> </code></td> <td><code>//Couchbase source<br /> {<br /> "host": "&lt;couchbase host&gt;",<br /> "username": "&lt;couchbase username&gt;",<br /> "password": "&lt;couchbase password&gt;",<br /> "query": "&lt;couchbase query&gt;"<br /> }<br /> //JSON or CSV source<br /> {<br /> "file": "&lt;link to file served via http&gt;"<br /> }<br /> //CSV source<br /> {<br /> "delimiter": "&lt;comma, space, tab or custom character&gt;"<br /> }</code></td> </tr> </tbody> </table> <h3>Deploying the Observability Dashboard Services</h3> <p>Use the <code>docker-compose</code> file below to bring up all of the required services – e.g., Dashboard proxy, Grafana, Prometheus, Exporter, Alert manager – that appear in the architecture diagram above for our observability dashboards. You can install Couchbase on a different host to store your growing high-volume data.</p> <p>To bring up: <code>docker-compose up</code></p> <p>Next, visit <code>http://host:3000</code> for the Grafana page.</p> <p>To bring down: <code>docker-compose down</code></p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48a2817779745" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> version: "2" services: dashboard: restart: unless-stopped build: ../../ ports: - 5001:5000 environment: - GRAFANA_HOST=http://admin:password@grafana:3000 volumes: - ./config/targets.json:/app/targets.json grafana: image: grafana/grafana:8.0.1 restart: unless-stopped volumes: - ./config/grafana:/var/lib/grafana environment: GF_INSTALL_PLUGINS: "simpod-json-datasource,marcusolsson-csv-datasource,ae3e-plotly-panel" GF_AUTH_ANONYMOUS_ENABLED: "true" GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS: "ae3e-plotly-panel" GF_RENDERING_SERVER_URL: http://renderer:8081/render GF_RENDERING_CALLBACK_URL: http://grafana:3000/ ports: - 4000:3000 renderer: image: grafana/grafana-image-renderer:latest prometheus: restart: unless-stopped image: prom/prometheus volumes: - ./config/prometheus.yml:/etc/prometheus/prometheus.yml - ./config/alert.rules.yml:/etc/prometheus/alert.rules.yml exporter: restart: unless-stopped build: ../../exporter volumes: - ./config/queries.json:/app/queries.json alertmanager: restart: unless-stopped image: prom/alertmanager ports: - 9093:9093 volumes: - ./config/alertmanager.yml:/etc/alertmanager/alertmanager.yml - ./config/alert_templates:/etc/alertmanager/templates</textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-2">2</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-3">3</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-4">4</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-5">5</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-6">6</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-7">7</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-8">8</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-9">9</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-10">10</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-11">11</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-12">12</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-13">13</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-14">14</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-15">15</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-16">16</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-17">17</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-18">18</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-19">19</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-20">20</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-21">21</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-22">22</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-23">23</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-24">24</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-25">25</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-26">26</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-27">27</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-28">28</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-29">29</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-30">30</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-31">31</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-32">32</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-33">33</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-34">34</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-35">35</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-36">36</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-37">37</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-38">38</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-39">39</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-40">40</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-41">41</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-42">42</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-43">43</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-44">44</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-45">45</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-46">46</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-47">47</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-48">48</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-49">49</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48a2817779745-50">50</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-1"><span class="crayon-v">version</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"2"</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-2"><span class="crayon-v">services</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-3"><span class="crayon-h"> </span><span class="crayon-v">dashboard</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-4"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">restart</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">unless</span><span class="crayon-o">-</span><span class="crayon-e">stopped</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-5"><span class="crayon-e">&nbsp;&nbsp; </span><span class="crayon-v">build</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-o">/</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-6"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">ports</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-7"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-cn">5001</span><span class="crayon-o">:</span><span class="crayon-cn">5000</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-8"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">environment</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-9"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-v">GRAFANA_HOST</span><span class="crayon-o">=</span><span class="crayon-v">http</span><span class="crayon-o">:</span><span class="crayon-c">//admin:password@grafana:3000</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-10"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">volumes</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-11"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-v">config</span><span class="crayon-o">/</span><span class="crayon-v">targets</span><span class="crayon-sy">.</span><span class="crayon-v">json</span><span class="crayon-o">:</span><span class="crayon-o">/</span><span class="crayon-v">app</span><span class="crayon-o">/</span><span class="crayon-v">targets</span><span class="crayon-sy">.</span><span class="crayon-e">json</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-12"><span class="crayon-e"> </span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-13"><span class="crayon-e"> </span><span class="crayon-v">grafana</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-14"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">image</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">grafana</span><span class="crayon-o">/</span><span class="crayon-v">grafana</span><span class="crayon-o">:</span><span class="crayon-cn">8.0.1</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-15"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">restart</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">unless</span><span class="crayon-o">-</span><span class="crayon-e">stopped</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-16"><span class="crayon-e">&nbsp;&nbsp; </span><span class="crayon-v">volumes</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-17"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-v">config</span><span class="crayon-o">/</span><span class="crayon-v">grafana</span><span class="crayon-o">:</span><span class="crayon-o">/</span><span class="crayon-t">var</span><span class="crayon-o">/</span><span class="crayon-v">lib</span><span class="crayon-o">/</span><span class="crayon-e">grafana</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-18"><span class="crayon-e">&nbsp;&nbsp; </span><span class="crayon-v">environment</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-19"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-v">GF_INSTALL_PLUGINS</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"simpod-json-datasource,marcusolsson-csv-datasource,ae3e-plotly-panel"</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-20"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-v">GF_AUTH_ANONYMOUS_ENABLED</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"true"</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-21"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-v">GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"ae3e-plotly-panel"</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-22"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-v">GF_RENDERING_SERVER_URL</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">http</span><span class="crayon-o">:</span><span class="crayon-c">//renderer:8081/render</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-23"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-v">GF_RENDERING_CALLBACK_URL</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">http</span><span class="crayon-o">:</span><span class="crayon-c">//grafana:3000/</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-24"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">ports</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-25"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-cn">4000</span><span class="crayon-o">:</span><span class="crayon-cn">3000</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-26"><span class="crayon-h"> </span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-27"><span class="crayon-h"> </span><span class="crayon-v">renderer</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-28"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">image</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">grafana</span><span class="crayon-o">/</span><span class="crayon-v">grafana</span><span class="crayon-o">-</span><span class="crayon-v">image</span><span class="crayon-o">-</span><span class="crayon-v">renderer</span><span class="crayon-o">:</span><span class="crayon-e">latest</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-29"><span class="crayon-e"> </span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-30"><span class="crayon-e"> </span><span class="crayon-v">prometheus</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-31"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">restart</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">unless</span><span class="crayon-o">-</span><span class="crayon-e">stopped</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-32"><span class="crayon-e">&nbsp;&nbsp; </span><span class="crayon-v">image</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">prom</span><span class="crayon-o">/</span><span class="crayon-e">prometheus</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-33"><span class="crayon-e">&nbsp;&nbsp; </span><span class="crayon-v">volumes</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-34"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-v">config</span><span class="crayon-o">/</span><span class="crayon-v">prometheus</span><span class="crayon-sy">.</span><span class="crayon-v">yml</span><span class="crayon-o">:</span><span class="crayon-o">/</span><span class="crayon-v">etc</span><span class="crayon-o">/</span><span class="crayon-v">prometheus</span><span class="crayon-o">/</span><span class="crayon-v">prometheus</span><span class="crayon-sy">.</span><span class="crayon-v">yml</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-35"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-v">config</span><span class="crayon-o">/</span><span class="crayon-v">alert</span><span class="crayon-sy">.</span><span class="crayon-v">rules</span><span class="crayon-sy">.</span><span class="crayon-v">yml</span><span class="crayon-o">:</span><span class="crayon-o">/</span><span class="crayon-v">etc</span><span class="crayon-o">/</span><span class="crayon-v">prometheus</span><span class="crayon-o">/</span><span class="crayon-v">alert</span><span class="crayon-sy">.</span><span class="crayon-v">rules</span><span class="crayon-sy">.</span><span class="crayon-e">yml</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-36"><span class="crayon-e"> </span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-37"><span class="crayon-e"> </span><span class="crayon-v">exporter</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-38"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">restart</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">unless</span><span class="crayon-o">-</span><span class="crayon-e">stopped</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-39"><span class="crayon-e">&nbsp;&nbsp; </span><span class="crayon-v">build</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-e">exporter</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-40"><span class="crayon-e">&nbsp;&nbsp; </span><span class="crayon-v">volumes</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-41"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-v">config</span><span class="crayon-o">/</span><span class="crayon-v">queries</span><span class="crayon-sy">.</span><span class="crayon-v">json</span><span class="crayon-o">:</span><span class="crayon-o">/</span><span class="crayon-v">app</span><span class="crayon-o">/</span><span class="crayon-v">queries</span><span class="crayon-sy">.</span><span class="crayon-e">json</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-42"><span class="crayon-e"> </span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-43"><span class="crayon-e"> </span><span class="crayon-v">alertmanager</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-44"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">restart</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">unless</span><span class="crayon-o">-</span><span class="crayon-e">stopped</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-45"><span class="crayon-e">&nbsp;&nbsp; </span><span class="crayon-v">image</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">prom</span><span class="crayon-o">/</span><span class="crayon-e">alertmanager</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-46"><span class="crayon-e">&nbsp;&nbsp; </span><span class="crayon-v">ports</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-47"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-cn">9093</span><span class="crayon-o">:</span><span class="crayon-cn">9093</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-48"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">volumes</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-49"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-v">config</span><span class="crayon-o">/</span><span class="crayon-v">alertmanager</span><span class="crayon-sy">.</span><span class="crayon-v">yml</span><span class="crayon-o">:</span><span class="crayon-o">/</span><span class="crayon-v">etc</span><span class="crayon-o">/</span><span class="crayon-v">alertmanager</span><span class="crayon-o">/</span><span class="crayon-v">alertmanager</span><span class="crayon-sy">.</span><span class="crayon-v">yml</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48a2817779745-50"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-v">config</span><span class="crayon-o">/</span><span class="crayon-v">alert_templates</span><span class="crayon-o">:</span><span class="crayon-o">/</span><span class="crayon-v">etc</span><span class="crayon-o">/</span><span class="crayon-v">alertmanager</span><span class="crayon-o">/</span><span class="crayon-v">templates</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0027 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p>The above service reference files content – or snippets for brevity – can be found in <a href="#implementation">the implementation section below</a>.</p> <p>Using these tools, you can create a wide variety of dashboards to suit your requirements. We&#8217;ll walk through three types of example dashboards to give you an idea of what&#8217;s possible.</p> <h2>Example Dashboards: Overview</h2> <table> <tbody> <tr> <td><strong>#</strong></td> <td><strong>Dashboard</strong></td> <td><strong>Measurements</strong></td> <td><strong>Metrics</strong></td> </tr> <tr> <td>1</td> <td>Functional Regression Testing Cycles dashboards</td> <td>Trends among functional regression testing cycles at both the build level &amp; component level</td> <td>total tests, passed, failed, aborts, total time, fresh run time, etc.</td> </tr> <tr> <td>2</td> <td>Infra VMs usage dashboards, including Static VMs &amp; Dynamic VMs</td> <td>Resources utilization &amp; history</td> <td>active count, available count, compute hours/max/created per day, week, month</td> </tr> <tr> <td>3</td> <td>Infra VMs Health dashboards, Static Servers, Jenkins Slaves VMs</td> <td>VM health monitoring, alerts &amp; history tracking of VMs</td> <td>ssh_fail, pool_os vs real_os, cpu-memory-disk-swap usages, file descriptors, firewall rules, pool_mac_address vs real_mac_address, booted days, total and product processes, installed app versions and services etc.</td> </tr> </tbody> </table> <h2>Dashboard #1: Functional Regression Testing Cycles Dashboard</h2> <p><strong>Problem</strong>: Before we created this dashboard for ourselves, there were no trend graphs on the regression test cycles with metrics like total time taken, pass rate, fresh vs. reruns (e.g., due to infrastructure issues), inconsistent number of aborts and failures, and also no separate component- or module-level trends.</p> <p><strong>Solution</strong>: The plan was to create a run analyzer script that analyzes the test data that is already stored in the Couchbase bucket. After that, we get the time-series data for the last <em>n</em> number of builds and targeted metrics for each build.</p> <p><strong>Dashboard snapshots:</strong></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><a href="https://www.couchbase.com/blog/wp-content/uploads/2021/09/functional-regression-testing-cycles-Grafana-dashboard-1.png"><img decoding="async" class="aligncenter size-full wp-image-12098" src="https://www.couchbase.com/blog/wp-content/uploads/2021/09/functional-regression-testing-cycles-Grafana-dashboard-1.png" alt="Weekly functional regression testing cycles Grafana dashboard, part 1" width="1000" height="484" srcset="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-1.png 1000w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-1-300x145.png 300w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-1-768x372.png 768w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-1-20x10.png 20w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><a href="https://www.couchbase.com/blog/wp-content/uploads/2021/09/functional-regression-testing-cycles-Grafana-dashboard-2.png"><img decoding="async" class="aligncenter size-full wp-image-12099" src="https://www.couchbase.com/blog/wp-content/uploads/2021/09/functional-regression-testing-cycles-Grafana-dashboard-2.png" alt="Weekly functional regression testing cycles Grafana dashboard, part 2" width="1000" height="511" srcset="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-2.png 1000w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-2-300x153.png 300w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-2-768x392.png 768w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-2-20x10.png 20w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><a href="https://www.couchbase.com/blog/wp-content/uploads/2021/09/functional-regression-testing-cycles-Grafana-dashboard-3.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-12100" src="https://www.couchbase.com/blog/wp-content/uploads/2021/09/functional-regression-testing-cycles-Grafana-dashboard-3.png" alt="Weekly functional regression testing cycles Grafana dashboard, part 3" width="1000" height="456" srcset="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-3.png 1000w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-3-300x137.png 300w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-3-768x350.png 768w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-3-20x9.png 20w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><a href="https://www.couchbase.com/blog/wp-content/uploads/2021/09/functional-regression-testing-cycles-Grafana-dashboard-4.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-12101" src="https://www.couchbase.com/blog/wp-content/uploads/2021/09/functional-regression-testing-cycles-Grafana-dashboard-4.png" alt="Weekly functional regression testing cycles Grafana dashboard, part 4" width="1000" height="453" srcset="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-4.png 1000w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-4-300x136.png 300w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-4-768x348.png 768w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-4-20x9.png 20w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><a href="https://www.couchbase.com/blog/wp-content/uploads/2021/09/functional-regression-testing-cycles-Grafana-dashboard-5.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-12102" src="https://www.couchbase.com/blog/wp-content/uploads/2021/09/functional-regression-testing-cycles-Grafana-dashboard-5.png" alt="Weekly functional regression testing cycles Grafana dashboard, part 5" width="1000" height="429" srcset="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-5.png 1000w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-5-300x129.png 300w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-5-768x329.png 768w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/functional-regression-testing-cycles-Grafana-dashboard-5-20x9.png 20w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <h2>Dashboard #2: Infrastructure Resources / VMs Usage Dashboard</h2> <p><strong>Problem:</strong> Prior to building this dashboard, we had a large number of static and dynamic virtual machines but there was no tracking of how the hardware resources were utilized. We had no insight into metrics such as active VMs used at the time, available count, machine time used, or compute hours on a daily, weekly or monthly basis.</p> <p><strong>Solution:</strong> Our plan was to first collect the data for all the VMs such as dynamically allocating and releasing IPs, exact time creation, and release times, as well as any groupings such as pools, etc. Most of this data already existed in <a href="https://www.couchbase.com/products/server/?ref=blog" target="_blank" rel="noopener">Couchbase Server</a> (managed by the respective service managers). Using the flexibility of <a href="https://query-tutorial.couchbase.com/tutorial/?ref=blog/#1" target="_blank" rel="noopener">the SQL++ query language</a> (aka N1QL), we were able to extract that data into a format suitable for the graphs we wanted to show in this observability dashboard.</p> <p><strong>Dashboard snapshots</strong>:</p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><a href="https://www.couchbase.com/blog/wp-content/uploads/2021/09/static-pool-VMs-Grafana-dashboard-1.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-12104" src="https://www.couchbase.com/blog/wp-content/uploads/2021/09/static-pool-VMs-Grafana-dashboard-1.png" alt="Static pool VMs Grafana dashboard, part 1" width="1000" height="534" srcset="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/static-pool-VMs-Grafana-dashboard-1.png 1000w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/static-pool-VMs-Grafana-dashboard-1-300x160.png 300w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/static-pool-VMs-Grafana-dashboard-1-768x410.png 768w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/static-pool-VMs-Grafana-dashboard-1-20x11.png 20w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><a href="https://www.couchbase.com/blog/wp-content/uploads/2021/09/static-pool-VMs-Grafana-dashboard-2.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-12105" src="https://www.couchbase.com/blog/wp-content/uploads/2021/09/static-pool-VMs-Grafana-dashboard-2.png" alt="Static pool VMs Grafana dashboard, part 2" width="1000" height="378" srcset="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/static-pool-VMs-Grafana-dashboard-2.png 1000w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/static-pool-VMs-Grafana-dashboard-2-300x113.png 300w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/static-pool-VMs-Grafana-dashboard-2-768x290.png 768w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/static-pool-VMs-Grafana-dashboard-2-20x8.png 20w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><a href="https://www.couchbase.com/blog/wp-content/uploads/2021/09/server-dynamic-VMs-Grafana-dashboard.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-12103" src="https://www.couchbase.com/blog/wp-content/uploads/2021/09/server-dynamic-VMs-Grafana-dashboard.png" alt="Server dynamic VMs Grafana dashboard" width="1000" height="534" srcset="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/server-dynamic-VMs-Grafana-dashboard.png 1000w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/server-dynamic-VMs-Grafana-dashboard-300x160.png 300w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/server-dynamic-VMs-Grafana-dashboard-768x410.png 768w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/server-dynamic-VMs-Grafana-dashboard-20x11.png 20w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <h2>Dashboard #3: Infrastructure VMs Health Dashboard</h2> <p><strong>Problem:</strong> Before we had this dashboard, regression test runs were failing inconsistently, and there were low-hanging issues with the VMs. Some of the issues included SSH Failures, OS mismatches, VM IP switches, too many open files, swap issues, need reboots, duplicate IPs among multiple runs, high memory usage, disk full (<code>/</code> or <code>/data</code>), firewall rules stopping the endpoint connection, slave issues due to high memory, and disk usage were all common. There was no observability dashboard to look at and observe these metrics and also no checks and alerts for the test infrastructure health.</p> <p><strong>Solution:</strong> We decided to create an automatic periodic health check that captures metrics data for the targeted VMs such as <code>ssh_fail</code>, <code>pool_os</code> vs <code>real_os</code>, <code>cpu-memory-disk-swap</code> usages, file descriptors, firewall rules, <code>pool_mac_address</code> vs <code>real_mac_address</code>, booted days, total and Couchbase processes, installed Couchbase version and services. (In sum, we captured ~50 metrics). These metrics are exposed as a Prometheus endpoint that is displayed in Grafana, and the information is also saved in Couchbase for future data analysis. Alerts were also created to monitor the key health metrics for issues to allow for quick intervention and finally achieve increased stability of the test runs.</p> <p><strong>Dashboard snapshots:</strong></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><a href="https://www.couchbase.com/blog/wp-content/uploads/2021/09/VM-health-Grafana-dashboard-1.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-12106" src="https://www.couchbase.com/blog/wp-content/uploads/2021/09/VM-health-Grafana-dashboard-1.png" alt="VM health Grafana dashboard, part 1" width="1000" height="536" srcset="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/VM-health-Grafana-dashboard-1.png 1000w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/VM-health-Grafana-dashboard-1-300x161.png 300w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/VM-health-Grafana-dashboard-1-768x412.png 768w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/VM-health-Grafana-dashboard-1-20x11.png 20w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><a href="https://www.couchbase.com/blog/wp-content/uploads/2021/09/VM-health-Grafana-dashboard-2.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-12107" src="https://www.couchbase.com/blog/wp-content/uploads/2021/09/VM-health-Grafana-dashboard-2.png" alt="VM health Grafana dashboard, part 2" width="1000" height="526" srcset="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/VM-health-Grafana-dashboard-2.png 1000w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/VM-health-Grafana-dashboard-2-300x158.png 300w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/VM-health-Grafana-dashboard-2-768x404.png 768w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/VM-health-Grafana-dashboard-2-20x11.png 20w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <h2 id="implementation">Implementation</h2> <p>So far, you&#8217;ve seen the high-level architecture of the observability dashboards, what services are required, what kind of dashboards you might need, and also how to deploy these services. Now, it&#8217;s time to look at some implementation details.</p> <p>Our first stop is the collection and storage of metrics and the data visualization of the dashboards. Most of the data storage and display steps are similar for all use cases, but the metrics data collection depends on which metrics you choose to target.</p> <h3>How to Get Health Data for Your Dashboards</h3> <p>For the infrastructure monitoring use case, you have to collect various health metrics from hundreds of VMs to create a stable infrastructure.</p> <p>For this step, we created a Python script that does the SSH connection to the VMs in parallel (multiprocessing pool) and collects the required data. In our case, we also have a Jenkins job that periodically runs this script and collects the health data (CSV), and then saves it to the Couchbase database.</p> <p>The reason we created this custom script – rather than the readily available node exporter provided by Prometheus – is that some of the required metrics were not supported. In addition, this solution was simpler than deploying and maintaining the new software on 1000+ servers. The code snippet below shows some of the checks being done at the VM level.</p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48af173840167" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> def check_vm(os_name, host): client = SSHClient() client.set_missing_host_key_policy(AutoAddPolicy()) ... cpus = get_cpuinfo(client) meminfo = get_meminfo(client) diskinfo = get_diskinfo(client) uptime = get_uptime(client) ... return ssh_status, '', ssh_resp_time, real_os_version, cpus, meminfo, diskinfo, uptime, uptime_days, systime, cpu_load, cpu_total_processes, fdinfo, \ iptables_rules_count, mac_address, swapinfo, cb_processes, cb_version, cb_running_serv, cb_ind_serv def get_cpuinfo(ssh_client): return ssh_command(ssh_client,"cat /proc/cpuinfo |egrep processor |wc -l") def get_meminfo(ssh_client): return ssh_command(ssh_client,"cat /proc/meminfo |egrep Mem |cut -f2- -d':'|sed 's/ //g'|xargs|sed 's/ /,/g'|sed 's/kB//g'") def get_diskinfo(ssh_client): return ssh_command(ssh_client,"df -ml --output=size,used,avail,pcent / |tail -1 |sed 's/ \+/,/g'|cut -f2- -d','|sed 's/%//g'") def get_uptime(ssh_client): return ssh_command(ssh_client, "uptime -s") def get_cpu_users_load_avg(ssh_client): return ssh_command(ssh_client, "uptime |rev|cut -f1-4 -d','|rev|sed 's/load average://g'|sed 's/ \+//g'|sed 's/users,/,/g'|sed 's/user,/,/g'") def get_file_descriptors(ssh_client): return ssh_command(ssh_client, "echo $(cat /proc/sys/fs/file-nr;ulimit -n)|sed 's/ /,/g'") def get_mac_address(ssh_client): return ssh_command(ssh_client, "ifconfig `ip link show | egrep eth[0-9]: -A 1 |tail -2 |xargs|cut -f2 -d' '|sed 's/://g'`|egrep ether |xargs|cut -f2 -d' '") def get_mac_address_ip(ssh_client): return ssh_command(ssh_client, "ip a show `ip link show | egrep eth[0-9]: -A 1 |tail -2 |xargs|cut -f2 -d' '|sed 's/://g'`|egrep ether |xargs|cut -f2 -d' '")</textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-2">2</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-3">3</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-4">4</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-5">5</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-6">6</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-7">7</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-8">8</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-9">9</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-10">10</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-11">11</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-12">12</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-13">13</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-14">14</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-15">15</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-16">16</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-17">17</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-18">18</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-19">19</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-20">20</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-21">21</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-22">22</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-23">23</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-24">24</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-25">25</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-26">26</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-27">27</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-28">28</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-29">29</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-30">30</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-31">31</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-32">32</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-33">33</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-34">34</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48af173840167-35">35</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-1"><span class="crayon-e">def </span><span class="crayon-e">check_vm</span><span class="crayon-sy">(</span><span class="crayon-v">os_name</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">host</span><span class="crayon-sy">)</span><span class="crayon-o">:</span><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-2"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">client</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">SSHClient</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-3"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">client</span><span class="crayon-sy">.</span><span class="crayon-e">set_missing_host_key_policy</span><span class="crayon-sy">(</span><span class="crayon-e">AutoAddPolicy</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-4"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-5"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">cpus</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">get_cpuinfo</span><span class="crayon-sy">(</span><span class="crayon-v">client</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-6"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">meminfo</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">get_meminfo</span><span class="crayon-sy">(</span><span class="crayon-v">client</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-7"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">diskinfo</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">get_diskinfo</span><span class="crayon-sy">(</span><span class="crayon-v">client</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-8"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">uptime</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">get_uptime</span><span class="crayon-sy">(</span><span class="crayon-v">client</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-9"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-10"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-v">ssh_status</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-s">''</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">ssh_resp_time</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">real_os_version</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">cpus</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">meminfo</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">diskinfo</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">uptime</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">uptime_days</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">systime</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">cpu_load</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">cpu_total_processes</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">fdinfo</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-sy">\</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-11"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">iptables_rules_count</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">mac_address</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">swapinfo</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">cb_processes</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">cb_version</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">cb_running_serv</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-e">cb_ind_serv</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-12">&nbsp;</div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-13"><span class="crayon-e">def </span><span class="crayon-e">get_cpuinfo</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-14"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-e">ssh_command</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">,</span><span class="crayon-s">"cat /proc/cpuinfo&nbsp;&nbsp;|egrep processor |wc -l"</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-15">&nbsp;</div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-16"><span class="crayon-e">def </span><span class="crayon-e">get_meminfo</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-17"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-e">ssh_command</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">,</span><span class="crayon-s">"cat /proc/meminfo |egrep Mem |cut -f2- -d':'|sed 's/ //g'|xargs|sed 's/ /,/g'|sed 's/kB//g'"</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-18">&nbsp;</div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-19"><span class="crayon-e">def </span><span class="crayon-e">get_diskinfo</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-20"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-e">ssh_command</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">,</span><span class="crayon-s">"df -ml --output=size,used,avail,pcent / |tail -1 |sed 's/ \+/,/g'|cut -f2- -d','|sed 's/%//g'"</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-21">&nbsp;</div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-22"><span class="crayon-e">def </span><span class="crayon-e">get_uptime</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-23"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-e">ssh_command</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-s">"uptime -s"</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-24">&nbsp;</div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-25"><span class="crayon-e">def </span><span class="crayon-e">get_cpu_users_load_avg</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-26"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-e">ssh_command</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-s">"uptime |rev|cut -f1-4 -d','|rev|sed 's/load average://g'|sed 's/ \+//g'|sed 's/users,/,/g'|sed 's/user,/,/g'"</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-27">&nbsp;</div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-28"><span class="crayon-e">def </span><span class="crayon-e">get_file_descriptors</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-29"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-e">ssh_command</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-s">"echo $(cat /proc/sys/fs/file-nr;ulimit -n)|sed 's/ /,/g'"</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-30">&nbsp;</div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-31"><span class="crayon-e">def </span><span class="crayon-e">get_mac_address</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-32"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-e">ssh_command</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-s">"ifconfig `ip link show | egrep eth[0-9]: -A 1 |tail -2 |xargs|cut -f2 -d' '|sed 's/://g'`|egrep ether |xargs|cut -f2 -d' '"</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-33">&nbsp;</div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-34"><span class="crayon-e">def </span><span class="crayon-e">get_mac_address_ip</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48af173840167-35"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-e">ssh_command</span><span class="crayon-sy">(</span><span class="crayon-v">ssh_client</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-s">"ip a show `ip link show | egrep eth[0-9]: -A 1 |tail -2 |xargs|cut -f2 -d' '|sed 's/://g'`|egrep ether |xargs|cut -f2 -d' '"</span><span class="crayon-sy">)</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0016 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p>The below code snippet shows you how to connect to Couchbase using Python SDK 3.x with key-value operations, getting a document, or saving a document in the database.</p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48b5911370505" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> try: self.cb_cluster = Cluster("couchbase://"+self.cb_host, ClusterOptions(PasswordAuthenticator(self.cb_username, self.cb_userpassword), \ timeout_options=ClusterTimeoutOptions(kv_timeout=timedelta(seconds=10)))) self.cb_b = self.cb_cluster.bucket(self.cb_bucket) self.cb = self.cb_b.default_collection() except Exception as e: print('Connection Failed: %s ' % self.cb_host) print(e) def get_doc(self, doc_key, retries=3): # .. return self.cb.get(doc_key) def save_doc(self, doc_key, doc_value, retries=3): #... self.cb.upsert(doc_key, doc_value) #... </textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-2">2</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-3">3</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-4">4</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-5">5</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-6">6</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-7">7</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-8">8</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-9">9</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-10">10</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-11">11</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-12">12</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-13">13</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-14">14</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-15">15</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-16">16</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b5911370505-17">17</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-1"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">try</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-2"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-v">cb_cluster</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">Cluster</span><span class="crayon-sy">(</span><span class="crayon-s">"couchbase://"</span><span class="crayon-o">+</span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-v">cb_host</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-e">ClusterOptions</span><span class="crayon-sy">(</span><span class="crayon-e">PasswordAuthenticator</span><span class="crayon-sy">(</span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-v">cb_username</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-v">cb_userpassword</span><span class="crayon-sy">)</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-sy">\</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-3"><span class="crayon-v">timeout_options</span><span class="crayon-o">=</span><span class="crayon-e">ClusterTimeoutOptions</span><span class="crayon-sy">(</span><span class="crayon-v">kv_timeout</span><span class="crayon-o">=</span><span class="crayon-e">timedelta</span><span class="crayon-sy">(</span><span class="crayon-v">seconds</span><span class="crayon-o">=</span><span class="crayon-cn">10</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-4"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-v">cb_b</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-v">cb_cluster</span><span class="crayon-sy">.</span><span class="crayon-e">bucket</span><span class="crayon-sy">(</span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-v">cb_bucket</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-5"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-v">cb</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-v">cb_b</span><span class="crayon-sy">.</span><span class="crayon-e">default_collection</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-6"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">except </span><span class="crayon-e">Exception </span><span class="crayon-st">as</span><span class="crayon-h"> </span><span class="crayon-v">e</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-7"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">print</span><span class="crayon-sy">(</span><span class="crayon-s">'Connection Failed: %s '</span><span class="crayon-h"> </span><span class="crayon-o">%</span><span class="crayon-h"> </span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-v">cb_host</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-8"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">print</span><span class="crayon-sy">(</span><span class="crayon-v">e</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-9">&nbsp;</div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-10"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">def </span><span class="crayon-e">get_doc</span><span class="crayon-sy">(</span><span class="crayon-r">self</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">doc_key</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">retries</span><span class="crayon-o">=</span><span class="crayon-cn">3</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-11"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-p"># ..</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-12"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-v">cb</span><span class="crayon-sy">.</span><span class="crayon-e">get</span><span class="crayon-sy">(</span><span class="crayon-v">doc_key</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-13"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-14"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">def </span><span class="crayon-e">save_doc</span><span class="crayon-sy">(</span><span class="crayon-r">self</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">doc_key</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">doc_value</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">retries</span><span class="crayon-o">=</span><span class="crayon-cn">3</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-15"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-p">#...</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-16"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-r">self</span><span class="crayon-sy">.</span><span class="crayon-v">cb</span><span class="crayon-sy">.</span><span class="crayon-e">upsert</span><span class="crayon-sy">(</span><span class="crayon-v">doc_key</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">doc_value</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b5911370505-17"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-p">#...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0010 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <h3>Implementing the Dashboard Proxy Service</h3> <p>For the tests observability use cases, the data is in a Jenkins artifact URL and also in Couchbase Server. To bridge these multiple data sources together (CSV, DB), we created a proxy API service that would accept requests from Grafana and return the data format understood by Grafana.</p> <p>The below code snippets give the implementation and service preparation details.</p> <p><code>dashboard.py</code></p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48b8826594384" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> # Dashboard API service @app.route("/query", methods=['POST']) def query(): """ /query responds to a Grafana data request and is formatted as either data points for time series data or rows and columns for tabular data """ for target in request.json['targets']: data_type = target['type'] if data_type == "timeseries": datapoints = calculate_datapoints(target) elif data_type == "table": datapoints = calculate_rows_and_columns(target) ... def calculate_datapoints(target): """ Returns data in a time series format datapoints is formatted as a list of 2 item tuples in the format [value, timestamp] """ ... if target['source'] == "couchbase": ... elif target['source'] == "json": ... elif target['source'] == "csv":</textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-2">2</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-3">3</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-4">4</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-5">5</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-6">6</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-7">7</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-8">8</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-9">9</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-10">10</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-11">11</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-12">12</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-13">13</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-14">14</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-15">15</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-16">16</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-17">17</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-18">18</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-19">19</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-20">20</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-21">21</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-22">22</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-23">23</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-24">24</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-25">25</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-26">26</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-27">27</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-28">28</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48b8826594384-29">29</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-1"><span class="crayon-p"># Dashboard API service</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-2"><span class="crayon-sy">@</span><span class="crayon-v">app</span><span class="crayon-sy">.</span><span class="crayon-e">route</span><span class="crayon-sy">(</span><span class="crayon-s">"/query"</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">methods</span><span class="crayon-o">=</span><span class="crayon-sy">[</span><span class="crayon-s">'POST'</span><span class="crayon-sy">]</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-3"><span class="crayon-e">def </span><span class="crayon-e">query</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-4"><span class="crayon-h"> </span><span class="crayon-s">""</span><span class="crayon-s">"</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-5"><span class="crayon-s"> /query responds to a Grafana data request and is </span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-6"><span class="crayon-s">formatted as either data points for time series data</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-7"><span class="crayon-s"> or rows and columns for tabular data</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-8"><span class="crayon-s"> "</span><span class="crayon-s">""</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-9"><span class="crayon-h"> </span><span class="crayon-st">for</span><span class="crayon-h"> </span><span class="crayon-e">target </span><span class="crayon-st">in</span><span class="crayon-h"> </span><span class="crayon-v">request</span><span class="crayon-sy">.</span><span class="crayon-v">json</span><span class="crayon-sy">[</span><span class="crayon-s">'targets'</span><span class="crayon-sy">]</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-10"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">data_type</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-v">target</span><span class="crayon-sy">[</span><span class="crayon-s">'type'</span><span class="crayon-sy">]</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-11"><span class="crayon-h">&nbsp;&nbsp; </span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-12"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-v">data_type</span><span class="crayon-h"> </span><span class="crayon-o">==</span><span class="crayon-h"> </span><span class="crayon-s">"timeseries"</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-13"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">datapoints</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">calculate_datapoints</span><span class="crayon-sy">(</span><span class="crayon-v">target</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-14"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp; </span><span class="crayon-e">elif </span><span class="crayon-v">data_type</span><span class="crayon-h"> </span><span class="crayon-o">==</span><span class="crayon-h"> </span><span class="crayon-s">"table"</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-15"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-v">datapoints</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">calculate_rows_and_columns</span><span class="crayon-sy">(</span><span class="crayon-v">target</span><span class="crayon-sy">)</span><span class="crayon-h">&nbsp;&nbsp; </span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-16"><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-17"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-18"><span class="crayon-e">def </span><span class="crayon-e">calculate_datapoints</span><span class="crayon-sy">(</span><span class="crayon-v">target</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-19"><span class="crayon-h"> </span><span class="crayon-s">""</span><span class="crayon-s">"</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-20"><span class="crayon-s"> Returns data in a time series format</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-21"><span class="crayon-s"> datapoints is formatted as a list of 2 item tuples in the format [value, timestamp]</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-22"><span class="crayon-s"> "</span><span class="crayon-s">""</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-23"><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-24"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-25"><span class="crayon-h"> </span><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-v">target</span><span class="crayon-sy">[</span><span class="crayon-s">'source'</span><span class="crayon-sy">]</span><span class="crayon-h"> </span><span class="crayon-o">==</span><span class="crayon-h"> </span><span class="crayon-s">"couchbase"</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-26"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-27"><span class="crayon-h"> </span><span class="crayon-e">elif </span><span class="crayon-v">target</span><span class="crayon-sy">[</span><span class="crayon-s">'source'</span><span class="crayon-sy">]</span><span class="crayon-h"> </span><span class="crayon-o">==</span><span class="crayon-h"> </span><span class="crayon-s">"json"</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-28"><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48b8826594384-29"><span class="crayon-h"> </span><span class="crayon-e">elif </span><span class="crayon-v">target</span><span class="crayon-sy">[</span><span class="crayon-s">'source'</span><span class="crayon-sy">]</span><span class="crayon-h"> </span><span class="crayon-o">==</span><span class="crayon-h"> </span><span class="crayon-s">"csv"</span><span class="crayon-o">:</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0009 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><code>Dockerfile</code></p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48bb045232208" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> FROM ubuntu:latest ENV DEBIAN_FRONTEND "noninteractive" RUN apt-get update -y &amp;amp;&amp;amp; apt-get install -y python3-dev python3-pip python3-setuptools cmake build-essential RUN mkdir /app COPY ./requirements.txt /app WORKDIR /app RUN pip3 install -r requirements.txt COPY ./dashboard.py /app COPY ./entrypoint.sh /app ENTRYPOINT ["./entrypoint.sh"]</textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48bb045232208-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48bb045232208-2">2</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48bb045232208-3">3</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48bb045232208-4">4</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48bb045232208-5">5</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48bb045232208-6">6</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48bb045232208-7">7</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48bb045232208-8">8</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48bb045232208-9">9</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48bb045232208-10">10</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48bb045232208-11">11</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48bb045232208-1"><span class="crayon-e">FROM </span><span class="crayon-v">ubuntu</span><span class="crayon-o">:</span><span class="crayon-e">latest</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48bb045232208-2"><span class="crayon-e">ENV </span><span class="crayon-v">DEBIAN</span><span class="crayon-sy">_</span>FRONTEND<span class="crayon-h"> </span><span class="crayon-s">"noninteractive"</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48bb045232208-3"><span class="crayon-e">RUN </span><span class="crayon-v">apt</span><span class="crayon-o">-</span><span class="crayon-e">get </span><span class="crayon-v">update</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-v">y</span><span class="crayon-h"> </span><span class="crayon-o">&amp;</span><span class="crayon-v">amp</span><span class="crayon-sy">;</span><span class="crayon-o">&amp;</span><span class="crayon-v">amp</span><span class="crayon-sy">;</span><span class="crayon-h"> </span><span class="crayon-v">apt</span><span class="crayon-o">-</span><span class="crayon-e">get </span><span class="crayon-v">install</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">y</span><span class="crayon-h"> </span><span class="crayon-v">python3</span><span class="crayon-o">-</span><span class="crayon-e">dev </span><span class="crayon-v">python3</span><span class="crayon-o">-</span><span class="crayon-e">pip </span><span class="crayon-v">python3</span><span class="crayon-o">-</span><span class="crayon-e">setuptools </span><span class="crayon-e">cmake </span><span class="crayon-v">build</span><span class="crayon-o">-</span><span class="crayon-e">essential</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48bb045232208-4"><span class="crayon-e">RUN </span><span class="crayon-v">mkdir</span><span class="crayon-h"> </span><span class="crayon-o">/</span><span class="crayon-e">app</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48bb045232208-5"><span class="crayon-i">COPY</span><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-v">requirements</span><span class="crayon-sy">.</span><span class="crayon-v">txt</span><span class="crayon-h"> </span><span class="crayon-o">/</span><span class="crayon-e">app</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48bb045232208-6"><span class="crayon-v">WORKDIR</span><span class="crayon-h"> </span><span class="crayon-o">/</span><span class="crayon-e">app</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48bb045232208-7"><span class="crayon-e">RUN </span><span class="crayon-e">pip3 </span><span class="crayon-v">install</span><span class="crayon-h"> </span><span class="crayon-o">-</span><span class="crayon-i">r</span><span class="crayon-h"> </span><span class="crayon-v">requirements</span><span class="crayon-sy">.</span><span class="crayon-e">txt</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48bb045232208-8"><span class="crayon-i">COPY</span><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-v">dashboard</span><span class="crayon-sy">.</span><span class="crayon-v">py</span><span class="crayon-h"> </span><span class="crayon-o">/</span><span class="crayon-e">app</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48bb045232208-9"><span class="crayon-i">COPY</span><span class="crayon-h"> </span><span class="crayon-sy">.</span><span class="crayon-o">/</span><span class="crayon-v">entrypoint</span><span class="crayon-sy">.</span><span class="crayon-v">sh</span><span class="crayon-h"> </span><span class="crayon-o">/</span><span class="crayon-e">app</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48bb045232208-10">&nbsp;</div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48bb045232208-11"><span class="crayon-i">ENTRYPOINT</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-s">"./entrypoint.sh"</span><span class="crayon-sy">]</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0006 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><code>entrypoint.sh</code></p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48bf189096456" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> #!/bin/bash python3 dashboard.py $GRAFANA_HOST</textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48bf189096456-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48bf189096456-2">2</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48bf189096456-1"><span class="crayon-p">#!/bin/bash</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48bf189096456-2"><span class="crayon-e">python3 </span><span class="crayon-v">dashboard</span><span class="crayon-sy">.</span><span class="crayon-i">py</span><span class="crayon-h"> </span><span class="crayon-sy">$</span><span class="crayon-v">GRAFANA_HOST</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0001 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><code>requirements.txt</code></p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48c2606724626" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> couchbase==3.0.7 Flask==1.1.2 requests==2.24.0</textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c2606724626-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c2606724626-2">2</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c2606724626-3">3</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c2606724626-1"><span class="crayon-v">couchbase</span><span class="crayon-o">==</span><span class="crayon-cn">3.0.7</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c2606724626-2"><span class="crayon-v">Flask</span><span class="crayon-o">==</span><span class="crayon-cn">1.1.2</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c2606724626-3"><span class="crayon-v">requests</span><span class="crayon-o">==</span><span class="crayon-cn">2.24.0</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0001 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <h3>How to Get the Tabular Data in Grafana</h3> <p>Grafana is a great tool for viewing time-series data. However, sometimes you want to show some non-time-series data in the same interface.</p> <p>We achieved this goal using the <a href="https://grafana.com/grafana/plugins/ae3e-plotly-panel/?ref=hello-from-couchbase" target="_blank" rel="noopener">Plotly plugin</a> which is a JavaScript graphing library. Our main use case was to illustrate trends across a variety of important metrics for our weekly regression testing runs. Some of the most important metrics we wanted to track were pass rate, the number of tests, aborted jobs, and total time is taken. Since the release of Grafana 8, there is limited support for bar graphs. At the time of writing, the bar graph functionality is still in beta and doesn’t offer all of the features we require, such as stacking.</p> <p>Our goal was to support generic CSV/JSON files or a Couchbase SQL++ query and view the data as a table in Grafana. For maximum portability, we wanted to have a single file that would define both the data sources and Grafana template layout together.</p> <p>For the tabular data to be displayed, below are the two viable options.</p> <ol> <li>Write a UI plugin for Grafana</li> <li>Provide a JSON proxy using the <a href="https://grafana.com/grafana/plugins/grafana-simple-json-datasource/?ref=hello-from-couchbase" target="_blank" rel="noopener">JSON datasource plugin</a></li> </ol> <p>We chose option 2 for our implementation, since it seemed simpler than trying to learn the Grafana plugin tools and creating a separate UI plugin for the configuration.</p> <p>Note that since finishing this project, <a href="https://grafana.com/grafana/plugins/marcusolsson-csv-datasource/?ref=hello-from-couchbase" target="_blank" rel="noopener">a new plugin</a> has been released that allows you to add CSV data to Grafana directly. If viewing tabular data from a CSV is your only requirement, then this plugin is a good solution.</p> <h3>Implementing the Prometheus Service</h3> <p><code>prometheus.yml</code></p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48c5474164577" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> # Prometheus global config global: scrape_interval: 1m # Set the scrape interval to every 15 seconds. Default is every 1 minute. scrape_timeout: 30s # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: - alertmanager:9093 rule_files: - "alert.rules.yml" - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] - job_name: "automation_exporter" static_configs: - targets: ["exporter:8000"]</textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-2">2</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-3">3</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-4">4</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-5">5</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-6">6</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-7">7</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-8">8</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-9">9</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-10">10</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-11">11</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-12">12</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-13">13</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-14">14</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-15">15</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-16">16</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-17">17</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c5474164577-18">18</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-1"><span class="crayon-p"># Prometheus global config</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-2"><span class="crayon-m">global</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-3"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-v">scrape_interval</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-cn">1m</span><span class="crayon-h"> </span><span class="crayon-p"># Set the scrape interval to every 15 seconds. Default is every 1 minute.</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-4"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-v">scrape_timeout</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-cn">30s</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-5"><span class="crayon-p"># Alertmanager configuration</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-6"><span class="crayon-v">alerting</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-7"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-v">alertmanagers</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-8"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-v">static_configs</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-9"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-v">targets</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-10"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-v">alertmanager</span><span class="crayon-o">:</span><span class="crayon-cn">9093</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-11"><span class="crayon-v">rule_files</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-12"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-s">"alert.rules.yml"</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-13"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-v">job_name</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"prometheus"</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-14"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">static_configs</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-15"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-v">targets</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-s">"localhost:9090"</span><span class="crayon-sy">]</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-16"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-v">job_name</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"automation_exporter"</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-17"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">static_configs</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c5474164577-18"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-v">targets</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-s">"exporter:8000"</span><span class="crayon-sy">]</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0005 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><code>alert.rules.yml</code></p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48c8843346180" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> groups: - name: alert.rules rules: - alert: PoolVMDown expr: vm_health_ssh_status == 0 for: 1m annotations: title: "Server Pool VM {{ $labels.ipaddr }} SSH Failed" description: "{{ $labels.ipaddr }} SSH failed with error: {{ $labels.ssh_error }}." labels: severity: "critical" - alert: PoolVMHighDiskUsage expr: disk_usage &amp;gt;= 95 for: 1m annotations: title: "Server Pool VM {{ $labels.ipaddr }} high disk usage" description: "{{ $labels.ipaddr }} has disk usage of {{ $value }}%" labels: severity: "critical"</textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-2">2</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-3">3</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-4">4</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-5">5</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-6">6</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-7">7</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-8">8</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-9">9</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-10">10</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-11">11</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-12">12</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-13">13</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-14">14</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-15">15</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-16">16</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-17">17</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-18">18</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48c8843346180-19">19</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-1"><span class="crayon-v">groups</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-2"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-v">name</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">alert</span><span class="crayon-sy">.</span><span class="crayon-e">rules</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-3"><span class="crayon-e">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">rules</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-4"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-v">alert</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-e">PoolVMDown</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-5"><span class="crayon-e">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">expr</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">vm_health_ssh_status</span><span class="crayon-h"> </span><span class="crayon-o">==</span><span class="crayon-h"> </span><span class="crayon-cn">0</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-6"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">for</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-cn">1m</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-7"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">annotations</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-8"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">title</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"Server Pool VM {{ $labels.ipaddr }} SSH Failed"</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-9"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">description</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"{{ $labels.ipaddr }} SSH failed with error: {{ $labels.ssh_error }}."</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-10"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">labels</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-11"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">severity</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"critical"</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-12"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-v">alert</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-e">PoolVMHighDiskUsage</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-13"><span class="crayon-e">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">expr</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">disk_usage</span><span class="crayon-h"> </span><span class="crayon-o">&amp;</span><span class="crayon-v">gt</span><span class="crayon-sy">;</span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-cn">95</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-14"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">for</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-cn">1m</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-15"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">annotations</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-16"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">title</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"Server Pool VM {{ $labels.ipaddr }} high disk usage"</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-17"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">description</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"{{ $labels.ipaddr }} has disk usage of {{ $value }}%"</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-18"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">labels</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48c8843346180-19"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">severity</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"critical"</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0006 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <h3>How to Get Custom Metrics through the Prometheus Exporter</h3> <p>Many cloud-native services integrate directly with Prometheus to allow centralized metrics collection for all of your services.</p> <p>We wanted to see how we could utilize this technology to monitor our existing infrastructure. If you have services that don’t directly expose a Prometheus metrics endpoint, the way to solve it is to use an exporter. In fact, there is even a Couchbase exporter to expose all of the important metrics from your cluster. (Note: In <a href="https://www.couchbase.com/blog/couchbase-server-7-0-release/?ref=blog" target="_blank" rel="noopener">Couchbase Server 7.0</a>, a Prometheus endpoint is directly available, and internally, Couchbase 7 uses Prometheus for server stats collection and management to service <a href="https://docs.couchbase.com/server/current/manage/manage-ui/manage-ui.html?ref=blog" target="_blank" rel="noopener">the web UI</a>).</p> <p>While creating our observability dashboards, we had various data stored in JSON files, in CSV files, and in Couchbase buckets. We wanted a way to expose all of this data and show it in Grafana both in tabular format and as time-series data using Prometheus.</p> <p>Prometheus expects a simple line-based text output. Here&#8217;s an example from our server pool monitoring:</p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48cb665049905" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> available_vms{pool="12hrreg"} 1 available_vms{pool="regression"} 16</textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48cb665049905-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48cb665049905-2">2</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48cb665049905-1"><span class="crayon-e">available_vms</span><span class="crayon-sy">{</span><span class="crayon-v">pool</span><span class="crayon-o">=</span><span class="crayon-s">"12hrreg"</span><span class="crayon-sy">}</span><span class="crayon-h"> </span><span class="crayon-cn">1</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48cb665049905-2"><span class="crayon-e">available_vms</span><span class="crayon-sy">{</span><span class="crayon-v">pool</span><span class="crayon-o">=</span><span class="crayon-s">"regression"</span><span class="crayon-sy">}</span><span class="crayon-h"> </span><span class="crayon-cn">16</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0001 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p>Let&#8217;s take a closer look at how to implement data sources from both CSV files and from Couchbase directly.</p> <h4>CSV Files as Your Data Source</h4> <p>Each time Prometheus polls the endpoint, we fetch the CSV, and for each column, we expose a metric, appending labels for multiple rows if a label is supplied in the config.</p> <p>For the above example, the CSV looks like:</p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48ce938529067" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> pool,available_count 12hrreg,1 regression,16</textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48ce938529067-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48ce938529067-2">2</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48ce938529067-3">3</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48ce938529067-1"><span class="crayon-v">pool</span><span class="crayon-sy">,</span><span class="crayon-v">available</span><span class="crayon-sy">_</span>count</div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48ce938529067-2"><span class="crayon-cn">12hrreg</span><span class="crayon-sy">,</span><span class="crayon-cn">1</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48ce938529067-3"><span class="crayon-v">regression</span><span class="crayon-sy">,</span><span class="crayon-cn">16</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0001 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <h4>Couchbase as Your Data Source</h4> <p>Each time Prometheus polls the endpoint, we execute the SQL++ queries defined in the config, and for each query, we expose a metric, appending labels for multiple rows if a label is supplied in the config.</p> <p>Below is an example SQL++ response that produces the above metrics:</p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48d1625634548" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> [{ “pool”, “12hrreg”, “count”: 1 }, { “pool”, “regression”, “count”: 16 }]</textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d1625634548-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d1625634548-2">2</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d1625634548-3">3</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d1625634548-4">4</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d1625634548-5">5</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d1625634548-6">6</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d1625634548-7">7</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d1625634548-8">8</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d1625634548-1"><span class="crayon-sy">[</span><span class="crayon-sy">{</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d1625634548-2"><span class="crayon-h"> </span>“<span class="crayon-i">pool</span>”<span class="crayon-sy">,</span><span class="crayon-h"> </span>“<span class="crayon-cn">12hrreg</span>”<span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d1625634548-3"><span class="crayon-h"> </span>“<span class="crayon-i">count</span>”<span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-cn">1</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d1625634548-4"><span class="crayon-h"> </span><span class="crayon-sy">}</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d1625634548-5"><span class="crayon-h"> </span><span class="crayon-sy">{</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d1625634548-6"><span class="crayon-h"> </span>“<span class="crayon-i">pool</span>”<span class="crayon-sy">,</span><span class="crayon-h"> </span>“<span class="crayon-i">regression</span>”<span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d1625634548-7"><span class="crayon-h"> </span>“<span class="crayon-i">count</span>”<span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-cn">16</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d1625634548-8"><span class="crayon-h"> </span><span class="crayon-sy">}</span><span class="crayon-sy">]</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0002 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p>This exporter Python service exposes a <code>/metrics</code> endpoint to be used in Prometheus. These metrics are defined in <code>queries.json</code> and define which queries and CSV columns should be exposed as metrics. See the below JSON snippet (reduced for brevity) as an example.</p> <p><code>queries.json</code></p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48d4738875701" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> { "clusters": { "static_vms": { "host": "&amp;lt;ip-address&amp;gt;", "username": "Administrator", "password": "xxxx" }, ... }, "queries": [ { "name": "available_vms", "cluster": "static_vms", "query": "SELECT poolId as `pool`, COUNT(*) AS count FROM (SELECT poolId FROM `QE-server-pool` WHERE IS_ARRAY(poolId)=FALSE and state='available' UNION ALL SELECT poolId FROM `QE-server-pool` UNNEST poolId where `QE-server-pool`.state = 'available' ) AS pools group by poolId", "description": "Available VMs for each server pool", "value_key": "count", "labels": ["pool"] }, ... ], "csvs": { "vm_health": "http://&amp;lt;jenkins-host-job-url&amp;gt;/lastSuccessfulBuild/artifact/vm_health_info.csv/", ... }, "columns": [ { "name": "memory_usage", "csv": "vm_health", "description": "Memory usage", "column": "memory_use(%)", "labels": ["ipaddr"] }, { "name": "disk_usage", "csv": "vm_health", "description": "Disk usage", "column": "disk_use%", "labels": ["ipaddr"] }, { "name": "cpu_load_avg_5mins", "csv": "vm_health", "description": "CPU load average (5mins)", "column": "cpu_load_avg_5mins", "labels": ["ipaddr"] }, { "name": "vm_health_ssh_status", "csv": "vm_health", "description": "SSH Status", "column": "ssh_status", "labels": ["ipaddr", "ssh_error", "pool_state", "couchbase_version", "pool_ids"] }, ... ] }</textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-2">2</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-3">3</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-4">4</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-5">5</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-6">6</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-7">7</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-8">8</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-9">9</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-10">10</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-11">11</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-12">12</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-13">13</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-14">14</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-15">15</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-16">16</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-17">17</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-18">18</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-19">19</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-20">20</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-21">21</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-22">22</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-23">23</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-24">24</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-25">25</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-26">26</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-27">27</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-28">28</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-29">29</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-30">30</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-31">31</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-32">32</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-33">33</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-34">34</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-35">35</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-36">36</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-37">37</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-38">38</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-39">39</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-40">40</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-41">41</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-42">42</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-43">43</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-44">44</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-45">45</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-46">46</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-47">47</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-48">48</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-49">49</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-50">50</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-51">51</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-52">52</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-53">53</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-54">54</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-55">55</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d4738875701-56">56</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-1"><span class="crayon-sy">{</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-2"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-s">"clusters"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">{</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-3"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"static_vms"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">{</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-4"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"host"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"&amp;lt;ip-address&amp;gt;"</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-5"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"username"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"Administrator"</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-6"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"password"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"xxxx"</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-7"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">}</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-8"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-9"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-sy">}</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-10"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-s">"queries"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">[</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-11"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">{</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-12"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"name"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"available_vms"</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-13"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"cluster"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"static_vms"</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-14"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"query"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"SELECT poolId as `pool`, COUNT(*) AS count FROM (SELECT poolId FROM `QE-server-pool` WHERE IS_ARRAY(poolId)=FALSE and state='available' UNION ALL SELECT poolId FROM `QE-server-pool` UNNEST poolId where `QE-server-pool`.state = 'available'&nbsp;&nbsp;) AS pools group by poolId"</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-15"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"description"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"Available VMs for each server pool"</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-16"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"value_key"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"count"</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-17"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"labels"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-s">"pool"</span><span class="crayon-sy">]</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-18"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">}</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-19"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-20"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-sy">]</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-21"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-s">"csvs"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">{</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-22"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"vm_health"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"http://&amp;lt;jenkins-host-job-url&amp;gt;/lastSuccessfulBuild/artifact/vm_health_info.csv/"</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-23"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-24"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-sy">}</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-25"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-s">"columns"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">[</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-26"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">{</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-27"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"name"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"memory_usage"</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-28"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"csv"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"vm_health"</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-29"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"description"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"Memory usage"</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-30"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"column"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"memory_use(%)"</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-31"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"labels"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-s">"ipaddr"</span><span class="crayon-sy">]</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-32"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">}</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-33"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">{</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-34"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"name"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"disk_usage"</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-35"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"csv"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"vm_health"</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-36"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"description"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"Disk usage"</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-37"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"column"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"disk_use%"</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-38"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"labels"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-s">"ipaddr"</span><span class="crayon-sy">]</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-39"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">}</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-40"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">{</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-41"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"name"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"cpu_load_avg_5mins"</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-42"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"csv"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"vm_health"</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-43"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"description"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"CPU load average (5mins)"</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-44"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"column"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"cpu_load_avg_5mins"</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-45"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"labels"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-s">"ipaddr"</span><span class="crayon-sy">]</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-46"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">}</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-47"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">{</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-48"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"name"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"vm_health_ssh_status"</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-49"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"csv"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"vm_health"</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-50"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"description"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"SSH Status"</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-51"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"column"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"ssh_status"</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-52"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-s">"labels"</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-s">"ipaddr"</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-s">"ssh_error"</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-s">"pool_state"</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-s">"couchbase_version"</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-s">"pool_ids"</span><span class="crayon-sy">]</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-53"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">}</span><span class="crayon-sy">,</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-54"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span><span class="crayon-sy">.</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-55"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-sy">]</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d4738875701-56"><span class="crayon-sy">}</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0016 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p><code>exporter.py</code></p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48d7307152986" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> for options in settings['queries'] + settings["columns"]: log.info("Registered metrics collection for {}".format(options['name'])) def get_labels(row, options): rename_map = options.get("rename", {}) return ["{}=\"{}\"".format(rename_map[label] if label in rename_map else label, row[label]) for label in options["labels"]] def collect_cb(clusters, metrics, options): rows = clusters[options["cluster"]].query(options["query"]).rows() for row in rows: if len(options["labels"]) &amp;gt; 0: labels = get_labels(row, options) metrics.append("{}{{{}}} {}".format( options["name"], ",".join(labels), row[options["value_key"]])) else: metrics.append("{} {}".format( options["name"], row[options["value_key"]])) def collect_csv(metrics, options) csvfile = requests.get(csvs[options["csv"]]).text.splitlines() reader = DictReader(csvfile) for row in reader: if options["column"] not in row or row[options["column"]] == "": continue if len(options["labels"]) &amp;gt; 0: labels = get_labels(row, options) metrics.append("{}{{{}}} {}".format( options["name"], ",".join(labels), row[options["column"]])) else: metrics.append("{} {}".format( options["name"], row[options["column"]])) @app.route("/metrics") def metrics(): metrics = [] clusters = {} for [cluster_name, options] in settings['clusters'].items(): if cluster_name not in clusters: try: clusters[cluster_name] = Cluster('couchbase://'+options['host'], ClusterOptions( PasswordAuthenticator(options['username'], options['password']))) except Exception as e: log.warning("Couldn't connect to cluster {}".format(e)) log.debug("Connected to {}".format(options['host'])) for options in settings["queries"] + settings["columns"]: log.debug("Collecting metrics for {}".format(options["name"])) try: if "cluster" in options: collect_cb(clusters, metrics, options) elif "csv" in options: collect_csv(metrics, options) else: raise Exception("Invalid type") except Exception as e: log.warning("Error while collecting {}: {}".format( options["name"], e)) return Response("\n".join(metrics), mimetype="text/plain")</textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-2">2</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-3">3</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-4">4</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-5">5</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-6">6</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-7">7</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-8">8</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-9">9</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-10">10</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-11">11</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-12">12</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-13">13</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-14">14</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-15">15</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-16">16</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-17">17</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-18">18</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-19">19</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-20">20</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-21">21</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-22">22</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-23">23</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-24">24</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-25">25</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-26">26</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-27">27</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-28">28</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-29">29</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-30">30</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-31">31</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-32">32</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-33">33</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-34">34</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-35">35</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-36">36</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-37">37</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-38">38</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-39">39</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-40">40</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-41">41</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-42">42</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-43">43</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-44">44</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-45">45</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-46">46</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-47">47</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-48">48</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-49">49</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-50">50</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-51">51</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-52">52</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-53">53</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-54">54</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-55">55</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-56">56</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-57">57</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48d7307152986-58">58</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-1"><span class="crayon-st">for</span><span class="crayon-h"> </span><span class="crayon-e">options </span><span class="crayon-st">in</span><span class="crayon-h"> </span><span class="crayon-v">settings</span><span class="crayon-sy">[</span><span class="crayon-s">'queries'</span><span class="crayon-sy">]</span><span class="crayon-h"> </span><span class="crayon-o">+</span><span class="crayon-h"> </span><span class="crayon-v">settings</span><span class="crayon-sy">[</span><span class="crayon-s">"columns"</span><span class="crayon-sy">]</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-2"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">log</span><span class="crayon-sy">.</span><span class="crayon-e">info</span><span class="crayon-sy">(</span><span class="crayon-s">"Registered metrics collection for {}"</span><span class="crayon-sy">.</span><span class="crayon-e">format</span><span class="crayon-sy">(</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">'name'</span><span class="crayon-sy">]</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-3">&nbsp;</div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-4"><span class="crayon-e">def </span><span class="crayon-e">get_labels</span><span class="crayon-sy">(</span><span class="crayon-v">row</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">options</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-5"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">rename_map</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-v">options</span><span class="crayon-sy">.</span><span class="crayon-e">get</span><span class="crayon-sy">(</span><span class="crayon-s">"rename"</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-sy">{</span><span class="crayon-sy">}</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-6"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-s">"{}=\"{}\""</span><span class="crayon-sy">.</span><span class="crayon-e">format</span><span class="crayon-sy">(</span><span class="crayon-v">rename_map</span><span class="crayon-sy">[</span><span class="crayon-v">label</span><span class="crayon-sy">]</span><span class="crayon-h"> </span><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-e">label </span><span class="crayon-st">in</span><span class="crayon-h"> </span><span class="crayon-e">rename_map </span><span class="crayon-st">else</span><span class="crayon-h"> </span><span class="crayon-v">label</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">row</span><span class="crayon-sy">[</span><span class="crayon-v">label</span><span class="crayon-sy">]</span><span class="crayon-sy">)</span><span class="crayon-h"> </span><span class="crayon-st">for</span><span class="crayon-h"> </span><span class="crayon-e">label </span><span class="crayon-st">in</span><span class="crayon-h"> </span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"labels"</span><span class="crayon-sy">]</span><span class="crayon-sy">]</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-7">&nbsp;</div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-8"><span class="crayon-e">def </span><span class="crayon-e">collect_cb</span><span class="crayon-sy">(</span><span class="crayon-v">clusters</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">metrics</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">options</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-9"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">rows</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-v">clusters</span><span class="crayon-sy">[</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"cluster"</span><span class="crayon-sy">]</span><span class="crayon-sy">]</span><span class="crayon-sy">.</span><span class="crayon-e">query</span><span class="crayon-sy">(</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"query"</span><span class="crayon-sy">]</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span><span class="crayon-e">rows</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-10"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">for</span><span class="crayon-h"> </span><span class="crayon-e">row </span><span class="crayon-st">in</span><span class="crayon-h"> </span><span class="crayon-v">rows</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-11"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-e">len</span><span class="crayon-sy">(</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"labels"</span><span class="crayon-sy">]</span><span class="crayon-sy">)</span><span class="crayon-h"> </span><span class="crayon-o">&amp;</span><span class="crayon-v">gt</span><span class="crayon-sy">;</span><span class="crayon-h"> </span><span class="crayon-cn">0</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-12"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">labels</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">get_labels</span><span class="crayon-sy">(</span><span class="crayon-v">row</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">options</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-13"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">metrics</span><span class="crayon-sy">.</span><span class="crayon-e">append</span><span class="crayon-sy">(</span><span class="crayon-s">"{}{{{}}} {}"</span><span class="crayon-sy">.</span><span class="crayon-e">format</span><span class="crayon-sy">(</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-14"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"name"</span><span class="crayon-sy">]</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-s">","</span><span class="crayon-sy">.</span><span class="crayon-e">join</span><span class="crayon-sy">(</span><span class="crayon-v">labels</span><span class="crayon-sy">)</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">row</span><span class="crayon-sy">[</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"value_key"</span><span class="crayon-sy">]</span><span class="crayon-sy">]</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-15"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">else</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-16"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">metrics</span><span class="crayon-sy">.</span><span class="crayon-e">append</span><span class="crayon-sy">(</span><span class="crayon-s">"{} {}"</span><span class="crayon-sy">.</span><span class="crayon-e">format</span><span class="crayon-sy">(</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-17"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"name"</span><span class="crayon-sy">]</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">row</span><span class="crayon-sy">[</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"value_key"</span><span class="crayon-sy">]</span><span class="crayon-sy">]</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-18">&nbsp;</div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-19"><span class="crayon-e">def </span><span class="crayon-e">collect_csv</span><span class="crayon-sy">(</span><span class="crayon-v">metrics</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">options</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-20"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">csvfile</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-v">requests</span><span class="crayon-sy">.</span><span class="crayon-e">get</span><span class="crayon-sy">(</span><span class="crayon-v">csvs</span><span class="crayon-sy">[</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"csv"</span><span class="crayon-sy">]</span><span class="crayon-sy">]</span><span class="crayon-sy">)</span><span class="crayon-sy">.</span><span class="crayon-v">text</span><span class="crayon-sy">.</span><span class="crayon-e">splitlines</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-21"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">reader</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">DictReader</span><span class="crayon-sy">(</span><span class="crayon-v">csvfile</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-22"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">for</span><span class="crayon-h"> </span><span class="crayon-e">row </span><span class="crayon-st">in</span><span class="crayon-h"> </span><span class="crayon-v">reader</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-23"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"column"</span><span class="crayon-sy">]</span><span class="crayon-h"> </span><span class="crayon-st">not</span><span class="crayon-h"> </span><span class="crayon-st">in</span><span class="crayon-h"> </span><span class="crayon-e">row </span><span class="crayon-st">or</span><span class="crayon-h"> </span><span class="crayon-v">row</span><span class="crayon-sy">[</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"column"</span><span class="crayon-sy">]</span><span class="crayon-sy">]</span><span class="crayon-h"> </span><span class="crayon-o">==</span><span class="crayon-h"> </span><span class="crayon-s">""</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-24"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">continue</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-25"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-e">len</span><span class="crayon-sy">(</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"labels"</span><span class="crayon-sy">]</span><span class="crayon-sy">)</span><span class="crayon-h"> </span><span class="crayon-o">&amp;</span><span class="crayon-v">gt</span><span class="crayon-sy">;</span><span class="crayon-h"> </span><span class="crayon-cn">0</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-26"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">labels</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">get_labels</span><span class="crayon-sy">(</span><span class="crayon-v">row</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">options</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-27"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">metrics</span><span class="crayon-sy">.</span><span class="crayon-e">append</span><span class="crayon-sy">(</span><span class="crayon-s">"{}{{{}}} {}"</span><span class="crayon-sy">.</span><span class="crayon-e">format</span><span class="crayon-sy">(</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-28"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"name"</span><span class="crayon-sy">]</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-s">","</span><span class="crayon-sy">.</span><span class="crayon-e">join</span><span class="crayon-sy">(</span><span class="crayon-v">labels</span><span class="crayon-sy">)</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">row</span><span class="crayon-sy">[</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"column"</span><span class="crayon-sy">]</span><span class="crayon-sy">]</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-29"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">else</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-30"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">metrics</span><span class="crayon-sy">.</span><span class="crayon-e">append</span><span class="crayon-sy">(</span><span class="crayon-s">"{} {}"</span><span class="crayon-sy">.</span><span class="crayon-e">format</span><span class="crayon-sy">(</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-31"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"name"</span><span class="crayon-sy">]</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">row</span><span class="crayon-sy">[</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"column"</span><span class="crayon-sy">]</span><span class="crayon-sy">]</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-32">&nbsp;</div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-33"><span class="crayon-sy">@</span><span class="crayon-v">app</span><span class="crayon-sy">.</span><span class="crayon-e">route</span><span class="crayon-sy">(</span><span class="crayon-s">"/metrics"</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-34"><span class="crayon-e">def </span><span class="crayon-e">metrics</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-35"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">metrics</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-sy">]</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-36"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">clusters</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-sy">{</span><span class="crayon-sy">}</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-37"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">for</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-v">cluster_name</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">options</span><span class="crayon-sy">]</span><span class="crayon-h"> </span><span class="crayon-st">in</span><span class="crayon-h"> </span><span class="crayon-v">settings</span><span class="crayon-sy">[</span><span class="crayon-s">'clusters'</span><span class="crayon-sy">]</span><span class="crayon-sy">.</span><span class="crayon-e">items</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-38"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-e">cluster_name </span><span class="crayon-st">not</span><span class="crayon-h"> </span><span class="crayon-st">in</span><span class="crayon-h"> </span><span class="crayon-v">clusters</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-39"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">try</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-40"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">clusters</span><span class="crayon-sy">[</span><span class="crayon-v">cluster_name</span><span class="crayon-sy">]</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-h"> </span><span class="crayon-e">Cluster</span><span class="crayon-sy">(</span><span class="crayon-s">'couchbase://'</span><span class="crayon-o">+</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">'host'</span><span class="crayon-sy">]</span><span class="crayon-sy">,</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-41"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">ClusterOptions</span><span class="crayon-sy">(</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-42"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">PasswordAuthenticator</span><span class="crayon-sy">(</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">'username'</span><span class="crayon-sy">]</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">'password'</span><span class="crayon-sy">]</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-43"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">except </span><span class="crayon-e">Exception </span><span class="crayon-st">as</span><span class="crayon-h"> </span><span class="crayon-v">e</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-44"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">log</span><span class="crayon-sy">.</span><span class="crayon-e">warning</span><span class="crayon-sy">(</span><span class="crayon-s">"Couldn't connect to cluster {}"</span><span class="crayon-sy">.</span><span class="crayon-e">format</span><span class="crayon-sy">(</span><span class="crayon-v">e</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-45"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">log</span><span class="crayon-sy">.</span><span class="crayon-e">debug</span><span class="crayon-sy">(</span><span class="crayon-s">"Connected to {}"</span><span class="crayon-sy">.</span><span class="crayon-e">format</span><span class="crayon-sy">(</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">'host'</span><span class="crayon-sy">]</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-46"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">for</span><span class="crayon-h"> </span><span class="crayon-e">options </span><span class="crayon-st">in</span><span class="crayon-h"> </span><span class="crayon-v">settings</span><span class="crayon-sy">[</span><span class="crayon-s">"queries"</span><span class="crayon-sy">]</span><span class="crayon-h"> </span><span class="crayon-o">+</span><span class="crayon-h"> </span><span class="crayon-v">settings</span><span class="crayon-sy">[</span><span class="crayon-s">"columns"</span><span class="crayon-sy">]</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-47"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">log</span><span class="crayon-sy">.</span><span class="crayon-e">debug</span><span class="crayon-sy">(</span><span class="crayon-s">"Collecting metrics for {}"</span><span class="crayon-sy">.</span><span class="crayon-e">format</span><span class="crayon-sy">(</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"name"</span><span class="crayon-sy">]</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-48"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">try</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-49"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">if</span><span class="crayon-h"> </span><span class="crayon-s">"cluster"</span><span class="crayon-h"> </span><span class="crayon-st">in</span><span class="crayon-h"> </span><span class="crayon-v">options</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-50"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">collect_cb</span><span class="crayon-sy">(</span><span class="crayon-v">clusters</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">metrics</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">options</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-51"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-i">elif</span><span class="crayon-h"> </span><span class="crayon-s">"csv"</span><span class="crayon-h"> </span><span class="crayon-st">in</span><span class="crayon-h"> </span><span class="crayon-v">options</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-52"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">collect_csv</span><span class="crayon-sy">(</span><span class="crayon-v">metrics</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">options</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-53"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">else</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-54"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">raise </span><span class="crayon-e">Exception</span><span class="crayon-sy">(</span><span class="crayon-s">"Invalid type"</span><span class="crayon-sy">)</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-55"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-e">except </span><span class="crayon-e">Exception </span><span class="crayon-st">as</span><span class="crayon-h"> </span><span class="crayon-v">e</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-56"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">log</span><span class="crayon-sy">.</span><span class="crayon-e">warning</span><span class="crayon-sy">(</span><span class="crayon-s">"Error while collecting {}: {}"</span><span class="crayon-sy">.</span><span class="crayon-e">format</span><span class="crayon-sy">(</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-57"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">options</span><span class="crayon-sy">[</span><span class="crayon-s">"name"</span><span class="crayon-sy">]</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">e</span><span class="crayon-sy">)</span><span class="crayon-sy">)</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48d7307152986-58"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-st">return</span><span class="crayon-h"> </span><span class="crayon-e">Response</span><span class="crayon-sy">(</span><span class="crayon-s">"\n"</span><span class="crayon-sy">.</span><span class="crayon-e">join</span><span class="crayon-sy">(</span><span class="crayon-v">metrics</span><span class="crayon-sy">)</span><span class="crayon-sy">,</span><span class="crayon-h"> </span><span class="crayon-v">mimetype</span><span class="crayon-o">=</span><span class="crayon-s">"text/plain"</span><span class="crayon-sy">)</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0038 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <h3>Implementing the Alert Manager Service</h3> <p>Prometheus also supports alerting where it tracks specific metrics for you over time. If that metric starts returning results, it will trigger an alert.</p> <p>For the example above you could add an alert for when the regression pool has no servers available. If you specify the query as <code>available_vms{pool="regression"} == 0</code> that will return a series when there are <code>0</code> available. Once added, Prometheus tracks this for you (default is every minute). If that is all you do, you can visit the Prometheus UI and the alerts tab will show you which alerts are firing.</p> <p>With the Alert Manager, you can take this a step further and connect communications services so that Prometheus can alert you via email or a Slack channel, for example, when an alert fires. This means you can be informed immediately via your preferred method when something goes wrong. At Couchbase, we set up alerts to be notified of high disk usage on servers as well as when servers could not be reached via SSH. See the example below:</p> <p><code>alertmanager.yml</code></p><!-- Urvanov Syntax Highlighter v2.8.38 --> <div id="urvanov-syntax-highlighter-67be47c6b48dc406377021" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;"> <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><span class="crayon-title"></span> <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;"><div class="crayon-button urvanov-syntax-highlighter-nums-button" title="Toggle Line Numbers"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-plain-button" title="Toggle Plain Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-wrap-button" title="Toggle Line Wrap"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-expand-button" title="Expand Code"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-copy-button" title="Copy"><div class="urvanov-syntax-highlighter-button-icon"></div></div><div class="crayon-button urvanov-syntax-highlighter-popup-button" title="Open Code In New Window"><div class="urvanov-syntax-highlighter-button-icon"></div></div></div></div> <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;"></div> <div class="urvanov-syntax-highlighter-plain-wrap"><textarea wrap="soft" class="urvanov-syntax-highlighter-plain print-no" data-settings="dblclick" readonly style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;"> global: resolve_timeout: 1m smtp_from: qa@couchbase.com smtp_smarthost: mail-com.mail.protection.outlook.com:25 route: group_by: ["alertname"] group_wait: 10s group_interval: 10s repeat_interval: 24h receiver: "infra-email" matchers: - alertname =~ PoolVMDown|PoolVMOSMismatch|PoolVMHighDiskUsage|SlaveVMHighDiskUsage|SlaveVMHighDiskUsageData receivers: - name: "infra-email" email_configs: - to: jake.rawsthorne@couchbase.com,jagadesh.munta@couchbase.com</textarea></div> <div class="urvanov-syntax-highlighter-main" style=""> <table class="crayon-table"> <tr class="urvanov-syntax-highlighter-row"> <td class="crayon-nums " data-settings="show"> <div class="urvanov-syntax-highlighter-nums-content" style="font-size: 12px !important; line-height: 15px !important;"><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-1">1</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-2">2</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-3">3</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-4">4</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-5">5</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-6">6</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-7">7</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-8">8</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-9">9</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-10">10</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-11">11</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-12">12</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-13">13</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-14">14</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-15">15</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-16">16</div><div class="crayon-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-17">17</div><div class="crayon-num crayon-striped-num" data-line="urvanov-syntax-highlighter-67be47c6b48dc406377021-18">18</div></div> </td> <td class="urvanov-syntax-highlighter-code"><div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;"><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-1"><span class="crayon-m">global</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-2"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-v">resolve_timeout</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-cn">1m</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-3"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-v">smtp_from</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">qa</span><span class="crayon-sy">@</span><span class="crayon-v">couchbase</span><span class="crayon-sy">.</span><span class="crayon-e">com</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-4"><span class="crayon-e">&nbsp;&nbsp;</span><span class="crayon-v">smtp_smarthost</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">mail</span><span class="crayon-o">-</span><span class="crayon-v">com</span><span class="crayon-sy">.</span><span class="crayon-v">mail</span><span class="crayon-sy">.</span><span class="crayon-v">protection</span><span class="crayon-sy">.</span><span class="crayon-v">outlook</span><span class="crayon-sy">.</span><span class="crayon-v">com</span><span class="crayon-o">:</span><span class="crayon-cn">25</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-5">&nbsp;</div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-6"><span class="crayon-v">route</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-7"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-v">group_by</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-sy">[</span><span class="crayon-s">"alertname"</span><span class="crayon-sy">]</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-8"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-v">group_wait</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-cn">10s</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-9"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-v">group_interval</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-cn">10s</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-10"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-v">repeat_interval</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-cn">24h</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-11"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-v">receiver</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"infra-email"</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-12"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-v">matchers</span><span class="crayon-o">:</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-13"><span class="crayon-h">&nbsp;&nbsp; </span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-v">alertname</span><span class="crayon-h"> </span><span class="crayon-o">=</span><span class="crayon-o">~</span><span class="crayon-h"> </span><span class="crayon-v">PoolVMDown</span><span class="crayon-o">|</span><span class="crayon-v">PoolVMOSMismatch</span><span class="crayon-o">|</span><span class="crayon-v">PoolVMHighDiskUsage</span><span class="crayon-o">|</span><span class="crayon-v">SlaveVMHighDiskUsage</span><span class="crayon-o">|</span><span class="crayon-e">SlaveVMHighDiskUsageData</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-14">&nbsp;</div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-15"><span class="crayon-v">receivers</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-16"><span class="crayon-h">&nbsp;&nbsp;</span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-v">name</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-s">"infra-email"</span></div><div class="crayon-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-17"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-v">email_configs</span><span class="crayon-o">:</span></div><div class="crayon-line crayon-striped-line" id="urvanov-syntax-highlighter-67be47c6b48dc406377021-18"><span class="crayon-h">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="crayon-o">-</span><span class="crayon-h"> </span><span class="crayon-st">to</span><span class="crayon-o">:</span><span class="crayon-h"> </span><span class="crayon-v">jake</span><span class="crayon-sy">.</span><span class="crayon-v">rawsthorne</span><span class="crayon-sy">@</span><span class="crayon-v">couchbase</span><span class="crayon-sy">.</span><span class="crayon-v">com</span><span class="crayon-sy">,</span><span class="crayon-v">jagadesh</span><span class="crayon-sy">.</span><span class="crayon-v">munta</span><span class="crayon-sy">@</span><span class="crayon-v">couchbase</span><span class="crayon-sy">.</span><span class="crayon-v">com</span></div></div></td> </tr> </table> </div> </div> <!-- [Format Time: 0.0007 seconds] --> <p></p> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <h2>Conclusion</h2> <p>In conclusion, we hope you can learn from our experience of creating observability dashboards that help you hone in on the metrics that matter most in your implementation or use case with the power of data visualization.</p> <p>In our case, this effort allowed us to find server infrastructure and test stability issues. Building dashboards also reduced the number of failed tests as well as the total regression time for multiple product releases.</p> <p>We hope this walkthrough helps you build better observability dashboards in the future.</p> <p><em>Also, we&#8217;d like to extend special thanks to Raju and the QE team for their feedback on improving the targeted metrics.</em></p> <div class="wp-block-spacer" style="height: 30px" aria-hidden="true"></div> <div style="text-align: center"><strong>Building something awesome?&lt;br/ &gt;<a href="https://www.couchbase.com/downloads/?ref=blog" target="_blank" rel="noopener">Why not build it on Couchbase?</a></strong></div> <div class="wp-block-spacer" style="height: 15px" aria-hidden="true"></div> <p>&nbsp;</p> <!--begin code --> <div class="pp-multiple-authors-boxes-wrapper pp-multiple-authors-wrapper pp-multiple-authors-layout-simple_list multiple-authors-target-the-content box-post-id-14469 box-instance-id-1 ppma_boxes_14469" data-post_id="14469" data-instance_id="1" data-additional_class="pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content" data-original_class="pp-multiple-authors-boxes-wrapper pp-multiple-authors-wrapper box-post-id-14469 box-instance-id-1"> <span class="ppma-layout-prefix"></span> <div class="ppma-author-category-wrap"> <span class="ppma-category-group ppma-category-group-1 category-index-0"> <ul class="pp-multiple-authors-boxes-ul author-ul-0"> <li class="pp-multiple-authors-boxes-li author_index_0 author_jake-and-jagadesh has-avatar"> <div class="pp-author-boxes-avatar"> <div class="avatar-image"> <img alt='Jake Rawsthorne and Jagadesh Munta, Couchbase Engineers' src='https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/jake-rawsthorne-jagadesh-munta-couchbase.png' srcset='https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/jake-rawsthorne-jagadesh-munta-couchbase.png' class='multiple_authors_guest_author_avatar avatar' height='35' width='35'/> </div> </div> <div class="pp-author-boxes-avatar-details"> <div class="pp-author-boxes-name multiple-authors-name"><a href="https://www.couchbase.com/blog/author/jake-and-jagadesh/" rel="author" title="Jake Rawsthorne &amp; Jagadesh Munta" class="author url fn">Jake Rawsthorne &amp; Jagadesh Munta</a></div> </div> </li> </ul> </span> </div> <span class="ppma-layout-suffix"></span> </div> <!--end code --> <style> .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .pp-author-boxes-avatar img { width: 35px !important; height: 35px !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .pp-author-boxes-avatar img { border-radius: 0% !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .pp-author-boxes-meta a { background-color: #655997 !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .pp-author-boxes-meta a { color: #ffffff !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .pp-author-boxes-meta a:hover { color: #ffffff !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .ppma-author-user_email-profile-data { background-color: #655997 !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .ppma-author-user_email-profile-data { border-radius: 100% !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .ppma-author-user_email-profile-data { color: #ffffff !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .ppma-author-user_email-profile-data:hover { color: #ffffff !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .ppma-author-user_url-profile-data { background-color: #655997 !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .ppma-author-user_url-profile-data { border-radius: 100% !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .ppma-author-user_url-profile-data { color: #ffffff !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .ppma-author-user_url-profile-data:hover { color: #ffffff !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .pp-author-boxes-recent-posts-title { border-bottom-style: dotted !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .pp-author-boxes-recent-posts-item { text-align: left !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .pp-multiple-authors-boxes-li { border-style: solid !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .pp-multiple-authors-boxes-li { border-color: #999999 !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .pp-multiple-authors-boxes-li { color: #3c434a !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .ppma-author-category-wrap .ppma-category-group { margin-bottom: px !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .ppma-author-category-wrap .ppma-category-group { margin-right: px !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .ppma-author-category-wrap { font-size: px !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list.multiple-authors-target-the-content .ppma-author-category-wrap .ppma-category-group-title { font-weight: !important; } .pp-multiple-authors-boxes-wrapper.pp-multiple-authors-layout-simple_list .pp-multiple-authors-boxes-ul li { border-left: none !important; border-right: none !important; } </style> <div class='heateor_sss_sharing_container heateor_sss_vertical_sharing heateor_sss_bottom_sharing' style='width:44px;right: -10px;top: 190px;-webkit-box-shadow:none;box-shadow:none;' data-heateor-sss-href='https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/'><div class="heateor_sss_sharing_ul"><a aria-label="X" class="heateor_sss_button_x" href="https://twitter.com/intent/tweet?text=How%20to%20Build%20Observability%20Dashboards%20with%20Prometheus%2C%20Grafana%20%26%20Couchbase&url=https%3A%2F%2Fwww.couchbase.com%2Fblog%2Fhow-to-build-observability-dashboards-prometheus-grafana-couchbase%2F" title="X" rel="nofollow noopener" target="_blank" style="font-size:32px!important;box-shadow:none;display:inline-block;vertical-align:middle"><span class="heateor_sss_svg heateor_sss_s__default heateor_sss_s_x" style="background-color:#2a2a2a;width:40px;height:40px;margin:0;display:inline-block;opacity:1;float:left;font-size:32px;box-shadow:none;display:inline-block;font-size:16px;padding:0 4px;vertical-align:middle;background-repeat:repeat;overflow:hidden;padding:0;cursor:pointer;box-sizing:content-box"><svg width="100%" height="100%" style="display:block;" focusable="false" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path fill="#fff" d="M21.751 7h3.067l-6.7 7.658L26 25.078h-6.172l-4.833-6.32-5.531 6.32h-3.07l7.167-8.19L6 7h6.328l4.37 5.777L21.75 7Zm-1.076 16.242h1.7L11.404 8.74H9.58l11.094 14.503Z"></path></svg></span></a><a aria-label="Linkedin" class="heateor_sss_button_linkedin" href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fwww.couchbase.com%2Fblog%2Fhow-to-build-observability-dashboards-prometheus-grafana-couchbase%2F" title="Linkedin" rel="nofollow noopener" target="_blank" style="font-size:32px!important;box-shadow:none;display:inline-block;vertical-align:middle"><span class="heateor_sss_svg heateor_sss_s__default heateor_sss_s_linkedin" style="background-color:#0077b5;width:40px;height:40px;margin:0;display:inline-block;opacity:1;float:left;font-size:32px;box-shadow:none;display:inline-block;font-size:16px;padding:0 4px;vertical-align:middle;background-repeat:repeat;overflow:hidden;padding:0;cursor:pointer;box-sizing:content-box"><svg style="display:block;" focusable="false" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 32 32"><path d="M6.227 12.61h4.19v13.48h-4.19V12.61zm2.095-6.7a2.43 2.43 0 0 1 0 4.86c-1.344 0-2.428-1.09-2.428-2.43s1.084-2.43 2.428-2.43m4.72 6.7h4.02v1.84h.058c.56-1.058 1.927-2.176 3.965-2.176 4.238 0 5.02 2.792 5.02 6.42v7.395h-4.183v-6.56c0-1.564-.03-3.574-2.178-3.574-2.18 0-2.514 1.7-2.514 3.46v6.668h-4.187V12.61z" fill="#fff"></path></svg></span></a><a aria-label="Facebook" class="heateor_sss_facebook" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.couchbase.com%2Fblog%2Fhow-to-build-observability-dashboards-prometheus-grafana-couchbase%2F" title="Facebook" rel="nofollow noopener" target="_blank" style="font-size:32px!important;box-shadow:none;display:inline-block;vertical-align:middle"><span class="heateor_sss_svg" style="background-color:#0765FE;width:40px;height:40px;margin:0;display:inline-block;opacity:1;float:left;font-size:32px;box-shadow:none;display:inline-block;font-size:16px;padding:0 4px;vertical-align:middle;background-repeat:repeat;overflow:hidden;padding:0;cursor:pointer;box-sizing:content-box"><svg style="display:block;" focusable="false" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 32 32"><path fill="#fff" d="M28 16c0-6.627-5.373-12-12-12S4 9.373 4 16c0 5.628 3.875 10.35 9.101 11.647v-7.98h-2.474V16H13.1v-1.58c0-4.085 1.849-5.978 5.859-5.978.76 0 2.072.15 2.608.298v3.325c-.283-.03-.775-.045-1.386-.045-1.967 0-2.728.745-2.728 2.683V16h3.92l-.673 3.667h-3.247v8.245C23.395 27.195 28 22.135 28 16Z"></path></svg></span></a><a aria-label="Copy Link" class="heateor_sss_button_copy_link" title="Copy Link" rel="noopener" href="https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/" onclick="event.preventDefault()" style="font-size:32px!important;box-shadow:none;display:inline-block;vertical-align:middle"><span class="heateor_sss_svg heateor_sss_s__default heateor_sss_s_copy_link" style="background-color:#ffc112;width:40px;height:40px;margin:0;display:inline-block;opacity:1;float:left;font-size:32px;box-shadow:none;display:inline-block;font-size:16px;padding:0 4px;vertical-align:middle;background-repeat:repeat;overflow:hidden;padding:0;cursor:pointer;box-sizing:content-box"><svg style="display:block;" focusable="false" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="-4 -4 40 40"><path fill="#fff" d="M24.412 21.177c0-.36-.126-.665-.377-.917l-2.804-2.804a1.235 1.235 0 0 0-.913-.378c-.377 0-.7.144-.97.43.026.028.11.11.255.25.144.14.24.236.29.29s.117.14.2.256c.087.117.146.232.177.344.03.112.046.236.046.37 0 .36-.126.666-.377.918a1.25 1.25 0 0 1-.918.377 1.4 1.4 0 0 1-.373-.047 1.062 1.062 0 0 1-.345-.175 2.268 2.268 0 0 1-.256-.2 6.815 6.815 0 0 1-.29-.29c-.14-.142-.223-.23-.25-.254-.297.28-.445.607-.445.984 0 .36.126.664.377.916l2.778 2.79c.243.243.548.364.917.364.36 0 .665-.118.917-.35l1.982-1.97c.252-.25.378-.55.378-.9zm-9.477-9.504c0-.36-.126-.665-.377-.917l-2.777-2.79a1.235 1.235 0 0 0-.913-.378c-.35 0-.656.12-.917.364L7.967 9.92c-.254.252-.38.553-.38.903 0 .36.126.665.38.917l2.802 2.804c.242.243.547.364.916.364.377 0 .7-.14.97-.418-.026-.027-.11-.11-.255-.25s-.24-.235-.29-.29a2.675 2.675 0 0 1-.2-.255 1.052 1.052 0 0 1-.176-.344 1.396 1.396 0 0 1-.047-.37c0-.36.126-.662.377-.914.252-.252.557-.377.917-.377.136 0 .26.015.37.046.114.03.23.09.346.175.117.085.202.153.256.2.054.05.15.148.29.29.14.146.222.23.25.258.294-.278.442-.606.442-.983zM27 21.177c0 1.078-.382 1.99-1.146 2.736l-1.982 1.968c-.745.75-1.658 1.12-2.736 1.12-1.087 0-2.004-.38-2.75-1.143l-2.777-2.79c-.75-.747-1.12-1.66-1.12-2.737 0-1.106.392-2.046 1.183-2.818l-1.186-1.185c-.774.79-1.708 1.186-2.805 1.186-1.078 0-1.995-.376-2.75-1.13l-2.803-2.81C5.377 12.82 5 11.903 5 10.826c0-1.08.382-1.993 1.146-2.738L8.128 6.12C8.873 5.372 9.785 5 10.864 5c1.087 0 2.004.382 2.75 1.146l2.777 2.79c.75.747 1.12 1.66 1.12 2.737 0 1.105-.392 2.045-1.183 2.817l1.186 1.186c.774-.79 1.708-1.186 2.805-1.186 1.078 0 1.995.377 2.75 1.132l2.804 2.804c.754.755 1.13 1.672 1.13 2.75z"/></svg></span></a></div><div class="heateorSssClear"></div></div> </div><!-- .entry-content --> <div class="entry-meta"> <ul class="meta-list"> <!-- Categories --> <li class="meta-cat"> <span>Posted in:</span> <a href="https://www.couchbase.com/blog/category/best-practices-and-tutorials/" rel="category tag">Best Practices and Tutorials</a>, <a href="https://www.couchbase.com/blog/category/community/" rel="category tag">Community</a>, <a href="https://www.couchbase.com/blog/category/couchbase-sdk/" rel="category tag">Couchbase SDK</a>, <a href="https://www.couchbase.com/blog/category/couchbase-server/" rel="category tag">Couchbase Server</a>, <a href="https://www.couchbase.com/blog/category/javascript/" rel="category tag">JavaScript</a>, <a href="https://www.couchbase.com/blog/category/monitoring/" rel="category tag">Monitoring</a>, <a href="https://www.couchbase.com/blog/category/python/" rel="category tag">Python</a>, <a href="https://www.couchbase.com/blog/category/n1ql-query/" rel="category tag">SQL++ / N1QL Query</a> </li> <!-- Tags --> <li class="meta-tag"> <span>Tagged in:</span> <a href="https://www.couchbase.com/blog/tag/data-visualization/" rel="tag">data visualization</a>, <a href="https://www.couchbase.com/blog/tag/grafana/" rel="tag">Grafana</a>, <a href="https://www.couchbase.com/blog/tag/json/" rel="tag">JSON</a>, <a href="https://www.couchbase.com/blog/tag/key-value/" rel="tag">key value</a>, <a href="https://www.couchbase.com/blog/tag/n1ql/" rel="tag">N1QL</a>, <a href="https://www.couchbase.com/blog/tag/prometheus/" rel="tag">Prometheus</a>, <a href="https://www.couchbase.com/blog/tag/python/" rel="tag">python</a> </li> </ul><!-- .meta-list --> </div><!-- .entry-meta --> </article><!-- #post-## --> <h2 class="widget-title">Author</h2> <div class="author-profile"> <a class="author-profile-avatar" href="https://www.couchbase.com/blog/author/jake-and-jagadesh/" title="Posts by Jake Rawsthorne &amp; Jagadesh Munta"><img alt='' src='https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/jake-rawsthorne-jagadesh-munta-couchbase.png' srcset='https://www.couchbase.com/blog/wp-content/uploads/sites/1/2021/09/jake-rawsthorne-jagadesh-munta-couchbase.png 2x' class='avatar avatar-65 photo avatar-default' height='65' width='65' loading='lazy' decoding='async'/></a> <div class="author-profile-info"> <h3 class="author-profile-title"> Posted by Jake Rawsthorne &amp; Jagadesh Munta</h3> <div class="author-profile-links"> <a href="https://www.couchbase.com/blog/author/jake-and-jagadesh/"><i class="fa fa-pencil-square"></i> All Posts</a> </div> </div><!-- .author-drawer-text --> </div><!-- .author-profile --> <!-- Comment toggle and share buttons --> <div class="share-comment show"> <a class="comments-toggle button" href="#"> <span><i class="fa fa-comments"></i> Show comments </span> <span><i class="fa fa-times"></i> Hide comments</span> </a> </div> <div id="comments" class="comments-area show"> <h3 class="comments-title"> <span>One Comment</span> </h3> <ol class="comment-list"> <li class="comment even thread-even depth-1 clearfix" id="li-comment-20718"> <div class="comment-block" id="comment-20718"> <div class="comment-wrap"> <img alt='' src='https://secure.gravatar.com/avatar/7709dc5f71f1cff03af1166cae6d67c1?s=75&#038;d=mm&#038;r=g' srcset='https://secure.gravatar.com/avatar/7709dc5f71f1cff03af1166cae6d67c1?s=150&#038;d=mm&#038;r=g 2x' class='avatar avatar-75 photo' height='75' width='75' loading='lazy' decoding='async'/> <div class="comment-info"> <cite class="comment-cite"> tvirmani </cite> <a class="comment-time" href="https://www.couchbase.com/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/#comment-20718">April 14, 2023 at 11:47 am</a> </div> <div class="comment-content"> <p>Hi this is a very good blog but seems its incomplete at many stages like how to run . Please help me with git code as i want to try this execution .very less information on how to use couchbase and what form is used for post in your code . Please help or suggest if you have git code at some repository and full instrctions</p> <p class="reply"> <a rel="nofollow" class="comment-reply-login" href="https://www.couchbase.com/blog/wp-login.php?redirect_to=https%3A%2F%2Fwww.couchbase.com%2Fblog%2Fhow-to-build-observability-dashboards-prometheus-grafana-couchbase%2F">Log in to Reply</a> </p> </div> </div> </div> </li><!-- #comment-## --> </ol><!-- .comment-list --> <div id="respond" class="comment-respond"> <h3 id="reply-title" class="comment-reply-title"><span>Leave a reply</span> <small><a rel="nofollow" id="cancel-comment-reply-link" href="/blog/how-to-build-observability-dashboards-prometheus-grafana-couchbase/#respond" style="display:none;">Cancel reply</a></small></h3><p class="must-log-in">You must be <a href="https://www.couchbase.com/blog/wp-login.php?redirect_to=https%3A%2F%2Fwww.couchbase.com%2Fblog%2Fhow-to-build-observability-dashboards-prometheus-grafana-couchbase%2F">logged in</a> to post a comment.</p><div class="heateor_sl_outer_login_container"><div class="heateor_sl_title">Login with your Social ID</div><div class="heateor_sl_login_container"><ul class="heateor_sl_login_ul"><li><i class="heateorSlLogin heateorSlFacebookBackground heateorSlFacebookLogin" alt="Login with Facebook" title="Login with Facebook" onclick="heateorSlCommentFormLogin = true;heateorSlInitiateLogin( this, 'facebook' )" ><div class="heateorSlFacebookLogoContainer"><ss style="display:block" class="heateorSlLoginSvg heateorSlFacebookLoginSvg"></ss></div></i></li><li><i class="heateorSlLogin heateorSlXBackground heateorSlXLogin" alt="Login with X" title="Login with X" onclick="heateorSlCommentFormLogin = true;heateorSlInitiateLogin( this, 'x' )" ><ss style="display:block" class="heateorSlLoginSvg heateorSlXLoginSvg"></ss></i></li><li><i class="heateorSlLogin heateorSlLinkedinBackground heateorSlLinkedinLogin" alt="Login with Linkedin" title="Login with Linkedin" onclick="heateorSlCommentFormLogin = true;heateorSlInitiateLogin( this, 'linkedin' )" ><ss style="display:block" class="heateorSlLoginSvg heateorSlLinkedinLoginSvg"></ss></i></li><li><i id="heateorSlGoogleButton" class="heateorSlLogin heateorSlGoogleBackground heateorSlGoogleLogin" alt="Login with Google" title="Login with Google" onclick="heateorSlCommentFormLogin = true;heateorSlInitiateLogin( this, 'google' )" ><ss style="display:block" class="heateorSlLoginSvg heateorSlGoogleLoginSvg"></ss></i></li><li><i class="heateorSlLogin heateorSlGithubBackground heateorSlGithubLogin" alt="Login with Github" title="Login with Github" onclick="heateorSlCommentFormLogin = true;heateorSlInitiateLogin( this, 'github' )" ><ss style="display:block" class="heateorSlLoginSvg heateorSlGithubLoginSvg"></ss></i></li></ul></div></div><div style="clear:both; margin-bottom: 6px"></div> </div><!-- #respond --> </div><!-- #comments --> </main><!-- #main --> </div><!-- #primary --> <div id="secondary" class="widget-area"> <aside id="search-3" class="widget widget_search"><h2 class="widget-title">Search our blog</h2> <form role="search" method="get" id="searchform" class="searchform" action="https://www.couchbase.com/blog/"> <div> <label class="screen-reader-text" for="s">Search for:</label> <input type="text" value="" name="s" id="s" class="search-input" placeholder="Search here..." /> <button type="submit" id="searchsubmit"> <i class="fa fa-search"></i> <span>Search</span> </button> </div> </form></aside><aside id="media_image-6" class="widget widget_media_image"><a href="https://info.couchbase.com/sql-for-json-simplifying-data-access-across-models-2025february"><img width="732" height="1138" src="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2025/02/Webcast-Promotional-Blog-Pre-v2.jpg" class="image wp-image-16849 attachment-full size-full" alt="" style="max-width: 100%; height: auto;" decoding="async" loading="lazy" srcset="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2025/02/Webcast-Promotional-Blog-Pre-v2.jpg 732w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2025/02/Webcast-Promotional-Blog-Pre-v2-193x300.jpg 193w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2025/02/Webcast-Promotional-Blog-Pre-v2-659x1024.jpg 659w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2025/02/Webcast-Promotional-Blog-Pre-v2-300x466.jpg 300w" sizes="auto, (max-width: 732px) 100vw, 732px" /></a></aside><aside id="media_image-5" class="widget widget_media_image"><a href="https://info.couchbase.com/a-roadmap-for-the-new-age-of-ai-agents-2025january"><img width="732" height="1138" src="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2025/01/AI-Services-Webcast-03.png" class="image wp-image-16800 attachment-full size-full" alt="" style="max-width: 100%; height: auto;" decoding="async" loading="lazy" srcset="https://www.couchbase.com/blog/wp-content/uploads/sites/1/2025/01/AI-Services-Webcast-03.png 732w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2025/01/AI-Services-Webcast-03-193x300.png 193w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2025/01/AI-Services-Webcast-03-659x1024.png 659w, https://www.couchbase.com/blog/wp-content/uploads/sites/1/2025/01/AI-Services-Webcast-03-300x466.png 300w" sizes="auto, (max-width: 732px) 100vw, 732px" /></a></aside> <aside id="recent-posts-2" class="widget widget_recent_entries"> <h2 class="widget-title">Recent Posts</h2> <ul> <li> <a href="https://www.couchbase.com/blog/couchbase-capella-columnar-on-google-cloud/">Couchbase Capella Columnar Coming Soon on Google Cloud</a> </li> <li> <a href="https://www.couchbase.com/blog/nvidia-enterprise-ai-in-capella-ai-services/">Couchbase and NVIDIA Team Up to Help Accelerate Agentic Application Development</a> </li> <li> <a href="https://www.couchbase.com/blog/conversational-analytics/">What is Conversational Analytics? Plus Examples and Tools</a> </li> <li> <a href="https://www.couchbase.com/blog/capella-vectorization-ai-embeddings-service/">AI-Ready Data: Automate Embeddings with Capella&#8217;s Vectorization Service</a> </li> <li> <a href="https://www.couchbase.com/blog/deepseek-models-in-capella-ai-services/">DeepSeek Models Now Available in Capella AI Services</a> </li> </ul> </aside><aside id="custom_html-12" class="widget_text widget widget_custom_html"><h2 class="widget-title">Top Posts</h2><div class="textwidget custom-html-widget"><ul class="wpp-list"> <li class=""> <a href="https://www.couchbase.com/blog/conceptual-physical-logical-data-models/" class="wpp-post-title" target="_self">Data Modeling Explained: Conceptual, Physical, Logical</a> <span class="wpp-meta post-stats"></span></li> <li class=""> <a href="https://www.couchbase.com/blog/app-development-costs/" class="wpp-post-title" target="_self">App Development Costs (A Breakdown)</a> <span class="wpp-meta post-stats"></span></li> <li class=""> <a href="https://www.couchbase.com/blog/what-is-data-analysis/" class="wpp-post-title" target="_self">What Is Data Analysis? Types, Methods, and Tools for Research</a> <span class="wpp-meta post-stats"></span></li> <li class=""> <a href="https://www.couchbase.com/blog/data-analysis-methods/" class="wpp-post-title" target="_self">Data Analysis Methods: Qualitative vs. Quantitative Techniques</a> <span class="wpp-meta post-stats"></span></li> <li class=""> <a href="https://www.couchbase.com/blog/application-development-life-cycle/" class="wpp-post-title" target="_self">Application Development Life Cycle (Phases and Management Models)</a> <span class="wpp-meta post-stats"></span></li> </ul></div></aside><aside id="categories-2" class="widget widget_categories"><h2 class="widget-title">Blog Topics</h2><form action="https://www.couchbase.com/blog" method="get"><label class="screen-reader-text" for="cat">Blog Topics</label><select name='cat' id='cat' class='postform'> <option value='-1'>Select Topic</option> <option class="level-0" value="1811">.NET</option> <option class="level-0" value="10092">AI Services</option> <option class="level-0" value="2294">Analytics</option> <option class="level-0" value="2370">Android</option> <option class="level-0" value="1814">Application Design</option> <option class="level-0" value="9416">Backup</option> <option class="level-0" value="1815">Best Practices and Tutorials</option> <option class="level-0" value="9986">C++</option> <option class="level-0" value="2381">Community</option> <option class="level-0" value="3917">Company</option> <option class="level-0" value="2242">Connectors</option> <option class="level-0" value="1821">Couchbase Architecture</option> <option class="level-0" value="9284">Couchbase Autonomous Operator</option> <option class="level-0" value="2225">Couchbase Capella</option> <option class="level-0" value="9385">Couchbase Connect</option> <option class="level-0" value="8905">Couchbase Global Secondary Index</option> <option class="level-0" value="7667">Couchbase Lite</option> <option class="level-0" value="1810">Couchbase Mobile</option> <option class="level-0" value="2201">Couchbase SDK</option> <option class="level-0" value="1816">Couchbase Server</option> <option class="level-0" value="3918">Culture</option> <option class="level-0" value="6319">Customers</option> <option class="level-0" value="1819">Data Modeling</option> <option class="level-0" value="7666">Edge computing</option> <option class="level-0" value="2273">Eventing</option> <option class="level-0" value="3919">Executive</option> <option class="level-0" value="2371">Flutter</option> <option class="level-0" value="2165">Full-Text Search</option> <option class="level-0" value="9973">Generative AI (GenAI)</option> <option class="level-0" value="8683">Geospatial</option> <option class="level-0" value="2453">Global Secondary Index</option> <option class="level-0" value="1820">GoLang</option> <option class="level-0" value="9381">Indexing</option> <option class="level-0" value="1818">Java</option> <option class="level-0" value="9327">JavaScript</option> <option class="level-0" value="9593">Kotlin</option> <option class="level-0" value="2322">Kubernetes</option> <option class="level-0" value="9374">License</option> <option class="level-0" value="2334">Monitoring</option> <option class="level-0" value="9411">Multi-Dimensional Scaling</option> <option class="level-0" value="1822">Node.js</option> <option class="level-0" value="9410">Objective-C</option> <option class="level-0" value="9921">Partners</option> <option class="level-0" value="9417">Performance</option> <option class="level-0" value="9408">PHP</option> <option class="level-0" value="9139">Python</option> <option class="level-0" value="9407">Ruby</option> <option class="level-0" value="9140">Rust</option> <option class="level-0" value="9141">Scala</option> <option class="level-0" value="9336">Scopes and Collections</option> <option class="level-0" value="9936">Search</option> <option class="level-0" value="1813">Security</option> <option class="level-0" value="2389">Solutions</option> <option class="level-0" value="6342">Spring</option> <option class="level-0" value="6343">Spring Boot</option> <option class="level-0" value="1812">SQL++ / N1QL Query</option> <option class="level-0" value="9409">Swift</option> <option class="level-0" value="2366">Sync Gateway</option> <option class="level-0" value="7277">Text Analysis</option> <option class="level-0" value="2396">Transactions</option> <option class="level-0" value="1">Uncategorized</option> <option class="level-0" value="9375">Upgrades</option> <option class="level-0" value="9937">Vector Search</option> <option class="level-0" value="2351">Xamarin</option> <option class="level-0" value="9415">XDCR</option> </select> </form><script type="rocketlazyloadscript" data-rocket-type="text/javascript"> /* <![CDATA[ */ (function() { var dropdown = document.getElementById( "cat" ); function onCatChange() { if ( dropdown.options[ dropdown.selectedIndex ].value > 0 ) { dropdown.parentNode.submit(); } } dropdown.onchange = onCatChange; })(); /* ]]> */ </script> </aside> </div><!-- #secondary .widget-area --> </div> </div> <!-- Promotion banner --> <section data-wpr-lazyrender="1" class="promotion-banner promotion-banner-blue"> <div class="container"> <div class="flex justify-center align-center flex-wrap flex-coloumn"> <div class='promotion-banner-title'>Stay informed about Couchbase Blogs</div> <!-- <a href='https://cloud.couchbase.com/sign-up' target="_blank" class='promotion-banner-btn'>Get Started</a> --> <div class=" mailpoet_form_popup_overlay "></div> <div id="mailpoet_form_3" class=" mailpoet_form mailpoet_form_shortcode mailpoet_form_position_ mailpoet_form_animation_ " > <style type="text/css"> #mailpoet_form_3 .mailpoet_form { } #mailpoet_form_3 .mailpoet_column_with_background { padding: 10px; } #mailpoet_form_3 .mailpoet_form_column:not(:first-child) { margin-left: 20px; } #mailpoet_form_3 .mailpoet_paragraph { line-height: 20px; margin-bottom: 20px; } #mailpoet_form_3 .mailpoet_segment_label, #mailpoet_form_3 .mailpoet_text_label, #mailpoet_form_3 .mailpoet_textarea_label, #mailpoet_form_3 .mailpoet_select_label, #mailpoet_form_3 .mailpoet_radio_label, #mailpoet_form_3 .mailpoet_checkbox_label, #mailpoet_form_3 .mailpoet_list_label, #mailpoet_form_3 .mailpoet_date_label { display: block; font-weight: normal; } #mailpoet_form_3 .mailpoet_text, #mailpoet_form_3 .mailpoet_textarea, #mailpoet_form_3 .mailpoet_select, #mailpoet_form_3 .mailpoet_date_month, #mailpoet_form_3 .mailpoet_date_day, #mailpoet_form_3 .mailpoet_date_year, #mailpoet_form_3 .mailpoet_date { display: block; } #mailpoet_form_3 .mailpoet_text, #mailpoet_form_3 .mailpoet_textarea { width: 200px; } #mailpoet_form_3 .mailpoet_checkbox { } #mailpoet_form_3 .mailpoet_submit { } #mailpoet_form_3 .mailpoet_divider { } #mailpoet_form_3 .mailpoet_message { } #mailpoet_form_3 .mailpoet_form_loading { width: 30px; text-align: center; line-height: normal; } #mailpoet_form_3 .mailpoet_form_loading > span { width: 5px; height: 5px; background-color: #5b5b5b; }#mailpoet_form_3{border-radius: 0px;text-align: left;}#mailpoet_form_3 form.mailpoet_form {padding: 20px;}#mailpoet_form_3{width: 100%;}#mailpoet_form_3 .mailpoet_message {margin: 0; padding: 0 20px;}#mailpoet_form_3 .mailpoet_paragraph.last {margin-bottom: 0} @media (max-width: 500px) {#mailpoet_form_3 {background-image: none;}} @media (min-width: 500px) {#mailpoet_form_3 .last .mailpoet_paragraph:last-child {margin-bottom: 0}} @media (max-width: 500px) {#mailpoet_form_3 .mailpoet_form_column:last-child .mailpoet_paragraph:last-child {margin-bottom: 0}} </style> <form target="_self" method="post" action="https://www.couchbase.com/blog/wp-admin/admin-post.php?action=mailpoet_subscription_form" class="mailpoet_form mailpoet_form_form mailpoet_form_shortcode" novalidate data-delay="" data-exit-intent-enabled="" data-font-family="" data-cookie-expiration-time="" > <input type="hidden" name="data[form_id]" value="3" /> <input type="hidden" name="token" value="1e7f1e336b" /> <input type="hidden" name="api_version" value="v1" /> <input type="hidden" name="endpoint" value="subscribers" /> <input type="hidden" name="mailpoet_method" value="subscribe" /> <label class="mailpoet_hp_email_label" style="display: none !important;">Please leave this field empty<input type="email" name="data[email]"/></label><div class='mailpoet_form_columns_container'><div class="mailpoet_form_columns mailpoet_paragraph mailpoet_stack_on_mobile"><div class="mailpoet_form_column" style="flex-basis:100%;"><div class="mailpoet_paragraph "><label for="form_email_3" class="mailpoet_text_label" data-automation-id="form_email_label" >Email <span class="mailpoet_required" aria-hidden="true">*</span></label><input type="email" autocomplete="email" class="mailpoet_text" id="form_email_3" name="data[form_field_NWQ2NjcyODkxZWY1X2VtYWls]" title="Email" value="" style="width:100%;box-sizing:border-box;padding:5px;margin: 0 auto 0 0;" data-automation-id="form_email" data-parsley-errors-container=".mailpoet_error_4ce8f" data-parsley-required="true" required aria-required="true" data-parsley-minlength="6" data-parsley-maxlength="150" data-parsley-type-message="This value should be a valid email." data-parsley-required-message="This field is required."/><span class="mailpoet_error_4ce8f"></span></div> <div class="mailpoet_paragraph "><fieldset><input type="hidden" value="1" name="data[cf_1]" /><label class="mailpoet_checkbox_label" for="mailpoet_checkbox_1" ><input type="checkbox" class="mailpoet_checkbox" id="mailpoet_checkbox_1" name="data[cf_1]" value="1" data-parsley-errors-container=".mailpoet_error_193c6" data-parsley-required="true" required aria-required="true" data-parsley-required-message="This field is required." data-parsley-group="custom_field_1" /> By checking this box, you acknowledge our <a href="https://www.couchbase.com/privacy-policy/" target="_blank">Privacy Policy</a>. You may unsubscribe at any time.</label></fieldset><span class="mailpoet_error_193c6"></span></div> </div> </div></div> <div class="mailpoet_recaptcha" data-sitekey="6Le6oqUhAAAAAMLYrNBqdvBFuynXWkoDTMjTu5Tt" > <div class="mailpoet_recaptcha_container"></div> <noscript> <div> <div class="mailpoet_recaptcha_noscript_container"> <div> <iframe src="https://www.google.com/recaptcha/api/fallback?k=6Le6oqUhAAAAAMLYrNBqdvBFuynXWkoDTMjTu5Tt" frameborder="0" scrolling="no"> </iframe> </div> </div> <div class="mailpoet_recaptcha_noscript_input"> <textarea id="g-recaptcha-response" name="data[recaptcha]" class="g-recaptcha-response"> </textarea> </div> </div> </noscript> <input class="mailpoet_recaptcha_field" type="hidden" name="recaptchaWidgetId"> </div><div class="parsley-errors-list parsley-required mailpoet_error_recaptcha">This field is required.</div><div class="mailpoet_paragraph "><input type="submit" class="mailpoet_submit" value="Subscribe!" data-automation-id="subscribe-submit-button" style="width:100%;box-sizing:border-box;padding:5px;margin: 0 auto 0 0;border-color:transparent;" /><span class="mailpoet_form_loading"><span class="mailpoet_bounce1"></span><span class="mailpoet_bounce2"></span><span class="mailpoet_bounce3"></span></span></div> <div class="mailpoet_message"> <p class="mailpoet_validate_success" style="display:none;" >Check your inbox or spam folder to confirm your subscription. </p> <p class="mailpoet_validate_error" style="display:none;" > </p> </div> </form> </div> </div> </div> </section> <footer data-wpr-lazyrender="1" id="colophon" class="site-footer dev-cb-footer" role="contentinfo"> <!-- Footer design as developer couchbase --> <div class="wrapper"> <div class="footer-links flex flex-wrap"> <div class="footer-logo w-full md:w-1/4 mb-4"> <a href="https://www.couchbase.com/"> <img src="https://www.couchbase.com/blog/wp-content/themes/couchbase/images/Couchbase-R-B.svg" alt="Couchbase" width="203" height="47"> </a> </div> <aside id="nav_menu-6" class="widget w-1/2 md:w-1/4 mb-4 widget_nav_menu"><div class="menu-footercol-1-container"><ul id="menu-footercol-1" class="menu"><li id="menu-item-11108" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11108"><a target="_blank" href="https://docs.couchbase.com/home/index.html">Documentation</a></li> <li id="menu-item-11109" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11109"><a href="https://www.couchbase.com/downloads/">Downloads</a></li> <li id="menu-item-11110" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11110"><a target="_blank" href="https://www.couchbase.com/forums/">Forums</a></li> <li id="menu-item-11111" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-11111"><a href="https://www.couchbase.com/blog/">Blog</a></li> <li id="menu-item-11112" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11112"><a href="https://www.couchbase.com/resources/">Resources</a></li> </ul></div></aside><aside id="nav_menu-3" class="widget w-1/2 md:w-1/4 mb-4 widget_nav_menu"><div class="menu-footercol-2-container"><ul id="menu-footercol-2" class="menu"><li id="menu-item-11103" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11103"><a target="_blank" href="https://support.couchbase.com/hc/en-us">Support Login</a></li> <li id="menu-item-11104" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11104"><a target="_blank" href="https://learn.couchbase.com/store/?utf8=%E2%9C%93&#038;ss=1&#038;ct=78327&#038;commit=Filter">Training</a></li> <li id="menu-item-11105" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11105"><a href="https://www.couchbase.com/careers/">Careers</a></li> <li id="menu-item-11106" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11106"><a href="https://www.couchbase.com/resources/webcasts-and-events/">Events</a></li> <li id="menu-item-11107" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11107"><a target="_blank" href="https://docs.couchbase.com/home/sdk.html">SDKs</a></li> </ul></div></aside><aside id="nav_menu-5" class="widget w-1/2 md:w-1/4 mb-4 widget_nav_menu"><div class="menu-footercol-3-container"><ul id="menu-footercol-3" class="menu"><li id="menu-item-11101" class="fa fa-twitter menu-item menu-item-type-custom menu-item-object-custom menu-item-11101"><a target="_blank" href="https://twitter.com/couchbase/">Twitter</a></li> <li id="menu-item-11102" class="fa fa-linkedin-square menu-item menu-item-type-custom menu-item-object-custom menu-item-11102"><a target="_blank" href="https://www.linkedin.com/company/couchbase/">LinkedIn</a></li> <li id="menu-item-11100" class="fa fa-github menu-item menu-item-type-custom menu-item-object-custom menu-item-11100"><a target="_blank" href="https://github.com/couchbase/">Github</a></li> <li id="menu-item-11099" class="fa fa-stack-overflow menu-item menu-item-type-custom menu-item-object-custom menu-item-11099"><a target="_blank" href="https://stackoverflow.com/tags/couchbase/info/">StackOverflow</a></li> </ul></div></aside> </div> <div class="footer-terms"> <div class='text-sm'> &copy; 2025 Couchbase, Inc. Couchbase and the Couchbase logo are registered trademarks of Couchbase, Inc. All third party trademarks (including logos and icons) referenced by Couchbase, Inc. remain the property of their respective owners. </div> <nav class="footer-terms-menu" role="navigation"> <div class="menu-footer-container"><ul id="menu-footer" class="menu"><li id="menu-item-1111" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1111"><a href="https://www.couchbase.com/terms-of-use/">Terms of Use</a></li> <li id="menu-item-1112" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1112"><a href="https://www.couchbase.com/privacy-policy/">Privacy Policy</a></li> <li id="menu-item-5199" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-5199"><a href="https://www.couchbase.com/cookie-policy/">Cookie Policy</a></li> <li id="menu-item-11118" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-11118"><a href="https://www.couchbase.com/support-policy/">Support Policy</a></li> <li id="menu-item-5200" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-5200"><a target="_blank" href="https://info.couchbase.com/unsubscribe-or-manage-preferences.html">Marketing Preference Center</a></li> </ul></div> </nav><!-- .footer-navigation --> </div> </div> </footer><!-- #colophon --> <span class="scroll-top show"></span> <!-- GTM Container placement set to footer --> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://metrics.couchbase.com/ns.html?id=GTM-MVPNN2" height="0" width="0" style="display:none;visibility:hidden" aria-hidden="true"></iframe></noscript> <!-- End Google Tag Manager (noscript) --><script type="rocketlazyloadscript" data-rocket-type="text/javascript">var algolia = {"debug":false,"application_id":"NI1G57N08Q","search_api_key":"4b05a6fa0de7ca588c885b058f20130b","powered_by_enabled":false,"query":"","autocomplete":{"sources":[{"admin_name":"All posts","index_id":"searchable_posts","index_name":"newprod_searchable_posts","label":"All posts","max_suggestions":5,"position":1,"tmpl_suggestion":"autocomplete-post-suggestion","enabled":true}],"input_selector":"input[name='s']:not(.no-autocomplete):not(#adminbar-search)"},"indices":{"searchable_posts":{"name":"newprod_searchable_posts","id":"searchable_posts","enabled":true,"replicas":[]}}};</script> <script type="text/html" id="tmpl-autocomplete-header"> <div class="autocomplete-header"> <div class="autocomplete-header-title">{{{ data.label }}}</div> <div class="clear"></div> </div> </script> <script type="text/html" id="tmpl-autocomplete-post-suggestion"> <a class="suggestion-link" href="{{ data.permalink }}" title="{{ data.post_title }}"> <# if ( data.images.thumbnail ) { #> <img class="suggestion-post-thumbnail" src="{{ data.images.thumbnail.url }}" alt="{{ data.post_title }}"> <# } #> <div class="suggestion-post-attributes"> <span class="suggestion-post-title">{{{ data._highlightResult.post_title.value }}}</span> <# if ( data._snippetResult['content'] ) { #> <span class="suggestion-post-content">{{{ data._snippetResult['content'].value }}}</span> <# } #> </div> </a> </script> <script type="text/html" id="tmpl-autocomplete-term-suggestion"> <a class="suggestion-link" href="{{ data.permalink }}" title="{{ data.name }}"> <svg viewBox="0 0 21 21" width="21" height="21"> <svg width="21" height="21" viewBox="0 0 21 21"> <path d="M4.662 8.72l-1.23 1.23c-.682.682-.68 1.792.004 2.477l5.135 5.135c.7.693 1.8.688 2.48.005l1.23-1.23 5.35-5.346c.31-.31.54-.92.51-1.36l-.32-4.29c-.09-1.09-1.05-2.06-2.15-2.14l-4.3-.33c-.43-.03-1.05.2-1.36.51l-.79.8-2.27 2.28-2.28 2.27zm9.826-.98c.69 0 1.25-.56 1.25-1.25s-.56-1.25-1.25-1.25-1.25.56-1.25 1.25.56 1.25 1.25 1.25z" fill-rule="evenodd"></path> </svg> </svg> <span class="suggestion-post-title">{{{ data._highlightResult.name.value }}}</span> </a> </script> <script type="text/html" id="tmpl-autocomplete-user-suggestion"> <a class="suggestion-link user-suggestion-link" href="{{ data.posts_url }}" title="{{ data.display_name }}"> <# if ( data.avatar_url ) { #> <img class="suggestion-user-thumbnail" src="{{ data.avatar_url }}" alt="{{ data.display_name }}"> <# } #> <span class="suggestion-post-title">{{{ data._highlightResult.display_name.value }}}</span> </a> </script> <script type="text/html" id="tmpl-autocomplete-footer"> <div class="autocomplete-footer"> <div class="autocomplete-footer-branding"> <a href="#" class="algolia-powered-by-link" title="Algolia"> <svg width="150px" height="25px" viewBox="0 0 572 64"><path fill="#36395A" d="M16 48.3c-3.4 0-6.3-.6-8.7-1.7A12.4 12.4 0 0 1 1.9 42C.6 40 0 38 0 35.4h6.5a6.7 6.7 0 0 0 3.9 6c1.4.7 3.3 1.1 5.6 1.1 2.2 0 4-.3 5.4-1a7 7 0 0 0 3-2.4 6 6 0 0 0 1-3.4c0-1.5-.6-2.8-1.9-3.7-1.3-1-3.3-1.6-5.9-1.8l-4-.4c-3.7-.3-6.6-1.4-8.8-3.4a10 10 0 0 1-3.3-7.9c0-2.4.6-4.6 1.8-6.4a12 12 0 0 1 5-4.3c2.2-1 4.7-1.6 7.5-1.6s5.5.5 7.6 1.6a12 12 0 0 1 5 4.4c1.2 1.8 1.8 4 1.8 6.7h-6.5a6.4 6.4 0 0 0-3.5-5.9c-1-.6-2.6-1-4.4-1s-3.2.3-4.4 1c-1.1.6-2 1.4-2.6 2.4-.5 1-.8 2-.8 3.1a5 5 0 0 0 1.5 3.6c1 1 2.6 1.7 4.7 1.9l4 .3c2.8.2 5.2.8 7.2 1.8 2.1 1 3.7 2.2 4.9 3.8a9.7 9.7 0 0 1 1.7 5.8c0 2.5-.7 4.7-2 6.6a13 13 0 0 1-5.6 4.4c-2.4 1-5.2 1.6-8.4 1.6Zm35.6 0c-2.6 0-4.8-.4-6.7-1.3a13 13 0 0 1-4.7-3.5 17.1 17.1 0 0 1-3.6-10.4v-1c0-2 .3-3.8 1-5.6a13 13 0 0 1 7.3-8.3 15 15 0 0 1 6.3-1.4A13.2 13.2 0 0 1 64 24.3c1 2.2 1.6 4.6 1.6 7.2V34H39.4v-4.3h21.8l-1.8 2.2c0-2-.3-3.7-.9-5.1a7.3 7.3 0 0 0-2.7-3.4c-1.2-.7-2.7-1.1-4.6-1.1s-3.4.4-4.7 1.3a8 8 0 0 0-2.9 3.6c-.6 1.5-.9 3.3-.9 5.4 0 2 .3 3.7 1 5.3a7.9 7.9 0 0 0 2.8 3.7c1.3.8 3 1.3 5 1.3s3.8-.5 5.1-1.3c1.3-1 2.1-2 2.4-3.2h6a11.8 11.8 0 0 1-7 8.7 16 16 0 0 1-6.4 1.2ZM80 48c-2.2 0-4-.3-5.7-1a8.4 8.4 0 0 1-3.7-3.3 9.7 9.7 0 0 1-1.3-5.2c0-2 .5-3.8 1.5-5.2a9 9 0 0 1 4.3-3.1c1.8-.7 4-1 6.7-1H89v4.1h-7.5c-2 0-3.4.5-4.4 1.4-1 1-1.6 2.1-1.6 3.6s.5 2.7 1.6 3.6c1 1 2.5 1.4 4.4 1.4 1.1 0 2.2-.2 3.2-.7 1-.4 1.9-1 2.6-2 .6-1 1-2.4 1-4.2l1.7 2.1c-.2 2-.7 3.8-1.5 5.2a9 9 0 0 1-3.4 3.3 12 12 0 0 1-5.3 1Zm9.5-.7v-8.8h-1v-10c0-1.8-.5-3.2-1.4-4.1-1-1-2.4-1.4-4.2-1.4a142.9 142.9 0 0 0-10.2.4v-5.6a74.8 74.8 0 0 1 8.6-.4c3 0 5.5.4 7.5 1.2s3.4 2 4.4 3.6c1 1.7 1.4 4 1.4 6.7v18.4h-5Zm12.9 0V17.8h5v12.3h-.2c0-4.2 1-7.4 2.8-9.5a11 11 0 0 1 8.3-3.1h1v5.6h-2a9 9 0 0 0-6.3 2.2c-1.5 1.5-2.2 3.6-2.2 6.4v15.6h-6.4Zm34.4 1a15 15 0 0 1-6.6-1.3c-1.9-.9-3.4-2-4.7-3.5a15.5 15.5 0 0 1-2.7-5c-.6-1.7-1-3.6-1-5.4v-1c0-2 .4-3.8 1-5.6a15 15 0 0 1 2.8-4.9c1.3-1.5 2.8-2.6 4.6-3.5a16.4 16.4 0 0 1 13.3.2c2 1 3.5 2.3 4.8 4a12 12 0 0 1 2 6H144c-.2-1.6-1-3-2.2-4.1a7.5 7.5 0 0 0-5.2-1.7 8 8 0 0 0-4.7 1.3 8 8 0 0 0-2.8 3.6 13.8 13.8 0 0 0 0 10.3c.6 1.5 1.5 2.7 2.8 3.6s2.8 1.3 4.8 1.3c1.5 0 2.7-.2 3.8-.8a7 7 0 0 0 2.6-2c.7-1 1-2 1.2-3.2h6.2a11 11 0 0 1-2 6.2 15.1 15.1 0 0 1-11.8 5.5Zm19.7-1v-40h6.4V31h-1.3c0-3 .4-5.5 1.1-7.6a9.7 9.7 0 0 1 3.5-4.8A9.9 9.9 0 0 1 172 17h.3c3.5 0 6 1.1 7.9 3.5 1.7 2.3 2.6 5.7 2.6 10v16.8h-6.4V29.6c0-2.1-.6-3.8-1.8-5a6.4 6.4 0 0 0-4.8-1.8c-2 0-3.7.7-5 2a7.8 7.8 0 0 0-1.9 5.5v17h-6.4Zm63.8 1a12.2 12.2 0 0 1-10.9-6.2 19 19 0 0 1-1.8-7.3h1.4v12.5h-5.1v-40h6.4v19.8l-2 3.5c.2-3.1.8-5.7 1.9-7.7a11 11 0 0 1 4.4-4.5c1.8-1 3.9-1.5 6.1-1.5a13.4 13.4 0 0 1 12.8 9.1c.7 1.9 1 3.8 1 6v1c0 2.2-.3 4.1-1 6a13.6 13.6 0 0 1-13.2 9.4Zm-1.2-5.5a8.4 8.4 0 0 0 7.9-5c.7-1.5 1.1-3.3 1.1-5.3s-.4-3.8-1.1-5.3a8.7 8.7 0 0 0-3.2-3.6 9.6 9.6 0 0 0-9.2-.2 8.5 8.5 0 0 0-3.3 3.2c-.8 1.4-1.3 3-1.3 5v2.3a9 9 0 0 0 1.3 4.8 9 9 0 0 0 3.4 3c1.4.7 2.8 1 4.4 1Zm27.3 3.9-10-28.9h6.5l9.5 28.9h-6Zm-7.5 12.2v-5.7h4.9c1 0 2-.1 2.9-.4a4 4 0 0 0 2-1.4c.4-.7.9-1.6 1.2-2.7l8.6-30.9h6.2l-9.3 32.4a14 14 0 0 1-2.5 5 8.9 8.9 0 0 1-4 2.8c-1.5.6-3.4.9-5.6.9h-4.4Zm9-12.2v-5.2h6.4v5.2H248Z"></path><path fill="#003DFF" d="M534.4 9.1H528a.8.8 0 0 1-.7-.7V1.8c0-.4.2-.7.6-.8l6.5-1c.4 0 .8.2.9.6v7.8c0 .4-.4.7-.8.7zM428 35.2V.8c0-.5-.3-.8-.7-.8h-.2l-6.4 1c-.4 0-.7.4-.7.8v35c0 1.6 0 11.8 12.3 12.2.5 0 .8-.4.8-.8V43c0-.4-.3-.7-.6-.8-4.5-.5-4.5-6-4.5-7zm106.5-21.8H528c-.4 0-.7.4-.7.8v34c0 .4.3.8.7.8h6.5c.4 0 .8-.4.8-.8v-34c0-.5-.4-.8-.8-.8zm-17.7 21.8V.8c0-.5-.3-.8-.8-.8l-6.5 1c-.4 0-.7.4-.7.8v35c0 1.6 0 11.8 12.3 12.2.4 0 .8-.4.8-.8V43c0-.4-.3-.7-.7-.8-4.4-.5-4.4-6-4.4-7zm-22.2-20.6a16.5 16.5 0 0 1 8.6 9.3c.8 2.2 1.3 4.8 1.3 7.5a19.4 19.4 0 0 1-4.6 12.6 14.8 14.8 0 0 1-5.2 3.6c-2 .9-5.2 1.4-6.8 1.4a21 21 0 0 1-6.7-1.4 15.4 15.4 0 0 1-8.6-9.3 21.3 21.3 0 0 1 0-14.4 15.2 15.2 0 0 1 8.6-9.3c2-.8 4.3-1.2 6.7-1.2s4.6.4 6.7 1.2zm-6.7 27.6c2.7 0 4.7-1 6.2-3s2.2-4.3 2.2-7.8-.7-6.3-2.2-8.3-3.5-3-6.2-3-4.7 1-6.1 3c-1.5 2-2.2 4.8-2.2 8.3s.7 5.8 2.2 7.8 3.5 3 6.2 3zm-88.8-28.8c-6.2 0-11.7 3.3-14.8 8.2a18.6 18.6 0 0 0 4.8 25.2c1.8 1.2 4 1.8 6.2 1.7s.1 0 .1 0h.9c4.2-.7 8-4 9.1-8.1v7.4c0 .4.3.7.8.7h6.4a.7.7 0 0 0 .7-.7V14.2c0-.5-.3-.8-.7-.8h-13.5zm6.3 26.5a9.8 9.8 0 0 1-5.7 2h-.5a10 10 0 0 1-9.2-14c1.4-3.7 5-6.3 9-6.3h6.4v18.3zm152.3-26.5h13.5c.5 0 .8.3.8.7v33.7c0 .4-.3.7-.8.7h-6.4a.7.7 0 0 1-.8-.7v-7.4c-1.2 4-4.8 7.4-9 8h-.1a4.2 4.2 0 0 1-.5.1h-.9a10.3 10.3 0 0 1-7-2.6c-4-3.3-6.5-8.4-6.5-14.2 0-3.7 1-7.2 3-10 3-5 8.5-8.3 14.7-8.3zm.6 28.4c2.2-.1 4.2-.6 5.7-2V21.7h-6.3a9.8 9.8 0 0 0-9 6.4 10.2 10.2 0 0 0 9.1 13.9h.5zM452.8 13.4c-6.2 0-11.7 3.3-14.8 8.2a18.5 18.5 0 0 0 3.6 24.3 10.4 10.4 0 0 0 13 .6c2.2-1.5 3.8-3.7 4.5-6.1v7.8c0 2.8-.8 5-2.2 6.3-1.5 1.5-4 2.2-7.5 2.2l-6-.3c-.3 0-.7.2-.8.5l-1.6 5.5c-.1.4.1.8.5 1h.1c2.8.4 5.5.6 7 .6 6.3 0 11-1.4 14-4.1 2.7-2.5 4.2-6.3 4.5-11.4V14.2c0-.5-.4-.8-.8-.8h-13.5zm6.3 8.2v18.3a9.6 9.6 0 0 1-5.6 2h-1a10.3 10.3 0 0 1-8.8-14c1.4-3.7 5-6.3 9-6.3h6.4zM291 31.5A32 32 0 0 1 322.8 0h30.8c.6 0 1.2.5 1.2 1.2v61.5c0 1.1-1.3 1.7-2.2 1l-19.2-17a18 18 0 0 1-11 3.4 18.1 18.1 0 1 1 18.2-14.8c-.1.4-.5.7-.9.6-.1 0-.3 0-.4-.2l-3.8-3.4c-.4-.3-.6-.8-.7-1.4a12 12 0 1 0-2.4 8.3c.4-.4 1-.5 1.6-.2l14.7 13.1v-46H323a26 26 0 1 0 10 49.7c.8-.4 1.6-.2 2.3.3l3 2.7c.3.2.3.7 0 1l-.2.2a32 32 0 0 1-47.2-28.6z"></path></svg> </a> </div> </div> </script> <script type="text/html" id="tmpl-autocomplete-empty"> <div class="autocomplete-empty"> No results matched your query <span class="empty-query">"{{ data.query }}"</span> </div> </script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript"> window.addEventListener('load', function () { /* Initialize Algolia client */ var client = algoliasearch( algolia.application_id, algolia.search_api_key ); /** * Algolia hits source method. * * This method defines a custom source to use with autocomplete.js. * * @param object $index Algolia index object. * @param object $params Options object to use in search. */ var algoliaHitsSource = function( index, params ) { return function( query, callback ) { index .search( query, params ) .then( function( response ) { callback( response.hits, response ); }) .catch( function( error ) { callback( [] ); }); } } /* Setup autocomplete.js sources */ var sources = []; algolia.autocomplete.sources.forEach( function( config, i ) { var suggestion_template = wp.template( config[ 'tmpl_suggestion' ] ); sources.push( { source: algoliaHitsSource( client.initIndex( config[ 'index_name' ] ), { hitsPerPage: config[ 'max_suggestions' ], attributesToSnippet: [ 'content:10' ], highlightPreTag: '__ais-highlight__', highlightPostTag: '__/ais-highlight__' } ), templates: { header: function () { return wp.template( 'autocomplete-header' )( { label: _.escape( config[ 'label' ] ) } ); }, suggestion: function ( hit ) { if ( hit.escaped === true ) { return suggestion_template( hit ); } hit.escaped = true; for ( var key in hit._highlightResult ) { /* We do not deal with arrays. */ if ( typeof hit._highlightResult[ key ].value !== 'string' ) { continue; } hit._highlightResult[ key ].value = _.escape( hit._highlightResult[ key ].value ); hit._highlightResult[ key ].value = hit._highlightResult[ key ].value.replace( /__ais-highlight__/g, '<em>' ).replace( /__\/ais-highlight__/g, '</em>' ); } for ( var key in hit._snippetResult ) { /* We do not deal with arrays. */ if ( typeof hit._snippetResult[ key ].value !== 'string' ) { continue; } hit._snippetResult[ key ].value = _.escape( hit._snippetResult[ key ].value ); hit._snippetResult[ key ].value = hit._snippetResult[ key ].value.replace( /__ais-highlight__/g, '<em>' ).replace( /__\/ais-highlight__/g, '</em>' ); } return suggestion_template( hit ); } } } ); } ); /* Setup dropdown menus */ document.querySelectorAll( algolia.autocomplete.input_selector ).forEach( function( element ) { var config = { debug: algolia.debug, hint: false, openOnFocus: true, appendTo: 'body', templates: { empty: wp.template( 'autocomplete-empty' ) } }; if ( algolia.powered_by_enabled ) { config.templates.footer = wp.template( 'autocomplete-footer' ); } /* Instantiate autocomplete.js */ var autocomplete = algoliaAutocomplete( element, config, sources ) .on( 'autocomplete:selected', function ( e, suggestion ) { /* Redirect the user when we detect a suggestion selection. */ window.location.href = suggestion.permalink ?? suggestion.posts_url; // Users use the `posts_url` property instead of `permalink`. } ); /* Force the dropdown to be re-drawn on scroll to handle fixed containers. */ window.addEventListener( 'scroll', function() { if ( autocomplete.autocomplete.getWrapper().style.display === "block" ) { autocomplete.autocomplete.close(); autocomplete.autocomplete.open(); } } ); } ); var algoliaPoweredLink = document.querySelector( '.algolia-powered-by-link' ); if ( algoliaPoweredLink ) { algoliaPoweredLink.addEventListener( 'click', function( e ) { e.preventDefault(); window.location = "https://www.algolia.com/?utm_source=WordPress&utm_medium=extension&utm_content=" + window.location.hostname + "&utm_campaign=poweredby"; } ); } }); </script> <link data-minify="1" rel='stylesheet' id='multiple-authors-widget-css-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/plugins/publishpress-authors-pro/lib/vendor/publishpress/publishpress-authors/src/assets/css/multiple-authors-widget.css?ver=1738056970' type='text/css' media='all' /> <style id='multiple-authors-widget-css-inline-css' type='text/css'> :root { --ppa-color-scheme: #655997; --ppa-color-scheme-active: #514779; } </style> <link data-minify="1" rel='stylesheet' id='mailpoet_public-css' href='https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/plugins/mailpoet/assets/dist/css/mailpoet-public.b1f0906e.css?ver=1738056957' type='text/css' media='all' /> <script type="rocketlazyloadscript" data-minify="1" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/plugins/duracelltomi-google-tag-manager/dist/js/gtm4wp-form-move-tracker.js?ver=1738056957" id="gtm4wp-form-move-tracker-js"></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" id="rocket-browser-checker-js-after"> /* <![CDATA[ */ "use strict";var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||!1,descriptor.configurable=!0,"value"in descriptor&&(descriptor.writable=!0),Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){return protoProps&&defineProperties(Constructor.prototype,protoProps),staticProps&&defineProperties(Constructor,staticProps),Constructor}}();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor))throw new TypeError("Cannot call a class as a function")}var RocketBrowserCompatibilityChecker=function(){function RocketBrowserCompatibilityChecker(options){_classCallCheck(this,RocketBrowserCompatibilityChecker),this.passiveSupported=!1,this._checkPassiveOption(this),this.options=!!this.passiveSupported&&options}return _createClass(RocketBrowserCompatibilityChecker,[{key:"_checkPassiveOption",value:function(self){try{var options={get passive(){return!(self.passiveSupported=!0)}};window.addEventListener("test",null,options),window.removeEventListener("test",null,options)}catch(err){self.passiveSupported=!1}}},{key:"initRequestIdleCallback",value:function(){!1 in window&&(window.requestIdleCallback=function(cb){var start=Date.now();return setTimeout(function(){cb({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-start))}})},1)}),!1 in window&&(window.cancelIdleCallback=function(id){return clearTimeout(id)})}},{key:"isDataSaverModeOn",value:function(){return"connection"in navigator&&!0===navigator.connection.saveData}},{key:"supportsLinkPrefetch",value:function(){var elem=document.createElement("link");return elem.relList&&elem.relList.supports&&elem.relList.supports("prefetch")&&window.IntersectionObserver&&"isIntersecting"in IntersectionObserverEntry.prototype}},{key:"isSlowConnection",value:function(){return"connection"in navigator&&"effectiveType"in navigator.connection&&("2g"===navigator.connection.effectiveType||"slow-2g"===navigator.connection.effectiveType)}}]),RocketBrowserCompatibilityChecker}(); /* ]]> */ </script> <script type="text/javascript" id="rocket-preload-links-js-extra"> /* <![CDATA[ */ var RocketPreloadLinksConfig = {"excludeUris":"\/(?:.+\/)?feed(?:\/(?:.+\/?)?)?$|\/(?:.+\/)?embed\/|http:\/\/(\/%5B\/%5D+)?\/(index.php\/)?(.*)wp-json(\/.*|$)|\/refer\/|\/go\/|\/recommend\/|\/recommends\/","usesTrailingSlash":"1","imageExt":"jpg|jpeg|gif|png|tiff|bmp|webp|avif|pdf|doc|docx|xls|xlsx|php","fileExt":"jpg|jpeg|gif|png|tiff|bmp|webp|avif|pdf|doc|docx|xls|xlsx|php|html|htm","siteUrl":"https:\/\/www.couchbase.com\/blog","onHoverDelay":"100","rateThrottle":"3"}; /* ]]> */ </script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" id="rocket-preload-links-js-after"> /* <![CDATA[ */ (function() { "use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e=function(){function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}return function(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),e}}();function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var t=function(){function n(e,t){i(this,n),this.browser=e,this.config=t,this.options=this.browser.options,this.prefetched=new Set,this.eventTime=null,this.threshold=1111,this.numOnHover=0}return e(n,[{key:"init",value:function(){!this.browser.supportsLinkPrefetch()||this.browser.isDataSaverModeOn()||this.browser.isSlowConnection()||(this.regex={excludeUris:RegExp(this.config.excludeUris,"i"),images:RegExp(".("+this.config.imageExt+")$","i"),fileExt:RegExp(".("+this.config.fileExt+")$","i")},this._initListeners(this))}},{key:"_initListeners",value:function(e){-1<this.config.onHoverDelay&&document.addEventListener("mouseover",e.listener.bind(e),e.listenerOptions),document.addEventListener("mousedown",e.listener.bind(e),e.listenerOptions),document.addEventListener("touchstart",e.listener.bind(e),e.listenerOptions)}},{key:"listener",value:function(e){var t=e.target.closest("a"),n=this._prepareUrl(t);if(null!==n)switch(e.type){case"mousedown":case"touchstart":this._addPrefetchLink(n);break;case"mouseover":this._earlyPrefetch(t,n,"mouseout")}}},{key:"_earlyPrefetch",value:function(t,e,n){var i=this,r=setTimeout(function(){if(r=null,0===i.numOnHover)setTimeout(function(){return i.numOnHover=0},1e3);else if(i.numOnHover>i.config.rateThrottle)return;i.numOnHover++,i._addPrefetchLink(e)},this.config.onHoverDelay);t.addEventListener(n,function e(){t.removeEventListener(n,e,{passive:!0}),null!==r&&(clearTimeout(r),r=null)},{passive:!0})}},{key:"_addPrefetchLink",value:function(i){return this.prefetched.add(i.href),new Promise(function(e,t){var n=document.createElement("link");n.rel="prefetch",n.href=i.href,n.onload=e,n.onerror=t,document.head.appendChild(n)}).catch(function(){})}},{key:"_prepareUrl",value:function(e){if(null===e||"object"!==(void 0===e?"undefined":r(e))||!1 in e||-1===["http:","https:"].indexOf(e.protocol))return null;var t=e.href.substring(0,this.config.siteUrl.length),n=this._getPathname(e.href,t),i={original:e.href,protocol:e.protocol,origin:t,pathname:n,href:t+n};return this._isLinkOk(i)?i:null}},{key:"_getPathname",value:function(e,t){var n=t?e.substring(this.config.siteUrl.length):e;return n.startsWith("/")||(n="/"+n),this._shouldAddTrailingSlash(n)?n+"/":n}},{key:"_shouldAddTrailingSlash",value:function(e){return this.config.usesTrailingSlash&&!e.endsWith("/")&&!this.regex.fileExt.test(e)}},{key:"_isLinkOk",value:function(e){return null!==e&&"object"===(void 0===e?"undefined":r(e))&&(!this.prefetched.has(e.href)&&e.origin===this.config.siteUrl&&-1===e.href.indexOf("?")&&-1===e.href.indexOf("#")&&!this.regex.excludeUris.test(e.href)&&!this.regex.images.test(e.href))}}],[{key:"run",value:function(){"undefined"!=typeof RocketPreloadLinksConfig&&new n(new RocketBrowserCompatibilityChecker({capture:!0,passive:!0}),RocketPreloadLinksConfig).init()}}]),n}();t.run(); }()); /* ]]> */ </script> <script type="rocketlazyloadscript" data-minify="1" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/js/lib/hoverIntent.js?ver=1738056957" id="hoverintent-plugin-js-js"></script> <script type="rocketlazyloadscript" data-minify="1" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/js/lib/megamenu-plugin.js?ver=1738056957" id="megamenu-plugin-js-js"></script> <script type="text/javascript" id="couchbase-scripts-widgets-js-extra"> /* <![CDATA[ */ var cbWidgets = {"showMore":"Show More","showLess":"Show Less","baseUrlweb":"https:\/\/www.couchbase.com\/blog\/wp-content\/themes\/couchbase","ajaxurl":"https:\/\/www.couchbase.com\/blog\/wp-admin\/admin-ajax.php","algoliaprefix":"newprod_","algoliaAppID":"NI1G57N08Q","algoliaApiKEY":"bb034b12a2bc82fa014ed7e697159e3f","homeUrl":"","load_fixed":"true","website":"searchable_posts"}; /* ]]> */ </script> <script data-minify="1" type="text/javascript" src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/js/widgets.js?ver=1738056957" id="couchbase-scripts-widgets-js"></script> <script type="rocketlazyloadscript" data-minify="1" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/paperback/js/jquery.fitvids.js?ver=1738056957" id="fitVids-js"></script> <script type="rocketlazyloadscript" data-minify="1" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/paperback/js/jquery.touchSwipe.js?ver=1738056957" id="touchSwipe-js"></script> <script type="rocketlazyloadscript" data-minify="1" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/paperback/js/headroom.js?ver=1738056957" id="headroom-js"></script> <script type="rocketlazyloadscript" data-minify="1" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/paperback/js/jQuery.headroom.js?ver=1738056957" id="headroom-jquery-js"></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-includes/js/comment-reply.min.js?ver=6.7.1" id="comment-reply-js" async="async" data-wp-strategy="async"></script> <script type="text/javascript" id="thickbox-js-extra"> /* <![CDATA[ */ var thickboxL10n = {"next":"Next >","prev":"< Prev","image":"Image","of":"of","close":"Close","noiframes":"This feature requires inline frames. You have iframes disabled or your browser does not support them.","loadingAnimation":"https:\/\/www.couchbase.com\/blog\/wp-includes\/js\/thickbox\/loadingAnimation.gif"}; /* ]]> */ </script> <script type="rocketlazyloadscript" data-minify="1" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-includes/js/thickbox/thickbox.js?ver=1738056957" id="thickbox-js"></script> <script type="rocketlazyloadscript" data-minify="1" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/plugins/heateor-social-login/public/js/heateor-social-login-public.js?ver=1738056957" id="heateor-social-login-public-js"></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" id="heateor_sss_sharing_js-js-before"> /* <![CDATA[ */ function heateorSssLoadEvent(e) {var t=window.onload;if (typeof window.onload!="function") {window.onload=e}else{window.onload=function() {t();e()}}}; var heateorSssSharingAjaxUrl = 'https://www.couchbase.com/blog/wp-admin/admin-ajax.php', heateorSssCloseIconPath = 'https://www.couchbase.com/blog/wp-content/plugins/sassy-social-share/public/../images/close.png', heateorSssPluginIconPath = 'https://www.couchbase.com/blog/wp-content/plugins/sassy-social-share/public/../images/logo.png', heateorSssHorizontalSharingCountEnable = 0, heateorSssVerticalSharingCountEnable = 0, heateorSssSharingOffset = -10; var heateorSssMobileStickySharingEnabled = 1;var heateorSssCopyLinkMessage = "Link copied.";var heateorSssUrlCountFetched = [], heateorSssSharesText = 'Shares', heateorSssShareText = 'Share';function heateorSssPopup(e) {window.open(e,"popUpWindow","height=400,width=600,left=400,top=100,resizable,scrollbars,toolbar=0,personalbar=0,menubar=no,location=no,directories=no,status")} /* ]]> */ </script> <script type="rocketlazyloadscript" data-minify="1" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/plugins/sassy-social-share/public/js/sassy-social-share-public.js?ver=1738056957" id="heateor_sss_sharing_js-js"></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-includes/js/underscore.min.js?ver=1.13.7" id="underscore-js"></script> <script type="text/javascript" id="wp-util-js-extra"> /* <![CDATA[ */ var _wpUtilSettings = {"ajax":{"url":"\/blog\/wp-admin\/admin-ajax.php"}}; /* ]]> */ </script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-includes/js/wp-util.min.js?ver=6.7.1" id="wp-util-js"></script> <script data-minify="1" type="text/javascript" src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/plugins/wp-search-with-algolia/js/algoliasearch/dist/algoliasearch-lite.umd.js?ver=1738056957" id="algolia-search-js"></script> <script type="text/javascript" src="https://www.couchbase.com/blog/wp-content/plugins/wp-search-with-algolia/js/autocomplete.js/dist/autocomplete.min.js?ver=2.8.2" id="algolia-autocomplete-js"></script> <script type="rocketlazyloadscript" data-minify="1" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/plugins/wp-search-with-algolia/js/autocomplete-noconflict.js?ver=1738056957" id="algolia-autocomplete-noconflict-js"></script> <script type="rocketlazyloadscript" data-rocket-type="text/javascript" data-rocket-src="https://www.google.com/recaptcha/api.js?render=explicit&amp;ver=6.7.1" id="mailpoet_recaptcha-js"></script> <script type="text/javascript" id="mailpoet_public-js-extra"> /* <![CDATA[ */ var MailPoetForm = {"ajax_url":"https:\/\/www.couchbase.com\/blog\/wp-admin\/admin-ajax.php","is_rtl":"","ajax_common_error_message":"An error has happened while performing a request, please try again later."}; /* ]]> */ </script> <script type="rocketlazyloadscript" data-minify="1" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/plugins/mailpoet/assets/dist/js/public.js?ver=1738056957" id="mailpoet_public-js" defer="defer" data-wp-strategy="defer"></script> <script type="rocketlazyloadscript" data-minify="1" data-rocket-type="text/javascript" data-rocket-src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/js/override_custom.js?ver=1738056957" id="override-script-js"></script> <script data-minify="1" src="https://www.couchbase.com/blog/wp-content/cache/min/1/npm/algoliasearch@4.22.1/dist/algoliasearch-lite.umd.js?ver=1738056957"></script> <script data-minify="1" src="https://www.couchbase.com/blog/wp-content/cache/min/1/npm/instantsearch.js@4.64.0/dist/instantsearch.production.min.js?ver=1738056957"></script> <script src="https://cdn.jsdelivr.net/npm/@algolia/autocomplete-js"></script> <script> const { autocomplete,getAlgoliaResults, getAlgoliaFacets } = window['@algolia/autocomplete-js']; </script> <script data-minify="1" src="https://www.couchbase.com/blog/wp-content/cache/min/1/blog/wp-content/themes/couchbase/js/algo-search.js?ver=1738056957"></script> </body> </html> <!-- This website is like a Rocket, isn't it? Performance optimized by WP Rocket. Learn more: https://wp-rocket.me -->

Pages: 1 2 3 4 5 6 7 8 9 10