{"id":2694,"date":"2017-02-20T11:07:56","date_gmt":"2017-02-20T19:07:56","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2694"},"modified":"2025-06-13T19:29:21","modified_gmt":"2025-06-14T02:29:21","slug":"new-profiling-monitoring-couchbase-server-4-6","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/","title":{"rendered":"New Profiling and Monitoring in Couchbase Server 5.0 Preview"},"content":{"rendered":"<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>N1QL query monitoring and profiling updates are just some of goodness you can find in February\u2019s developer preview release of Couchbase Server 5.0.0.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Go <a href=\"https:\/\/couchbase.com\/downloads\/\">download the February 5.0.0 developer release of Couchbase Server<\/a> today, click the &#8220;Developer&#8221; tab, and check it out. You still have time to give us some feedback before the official release.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><em>As always, keep in mind that I\u2019m writing this blog post on early builds, and some things may change in minor ways by the time you get the release.<\/em><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_what_is_profiling_and_monitoring_for\">What is profiling and monitoring for?<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>When I\u2019m writing N1QL queries, I need to be able to understand how well (or how badly) my query (and my cluster) is performing in order to make improvements and diagnose issues.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>With this latest developer version of Couchbase Server 5.0, some new tools have been added to your N1QL-writing toolbox.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_n1ql_writing_review\">N1QL Writing Review<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>First, some review.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>There are multiple ways for a developer to execute N1QL queries.<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>Use the <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/sdk\/dotnet\/n1ql-queries-with-sdk.html\">SDK of your choice<\/a>.<\/li>\n<li>Use the <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/cli\/cbq-tool.html\">cbq command line tool<\/a>.<\/li>\n<li>Use the <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/tools\/query-workbench.html\">Query Workbench<\/a> in Couchbase Web Console<\/li>\n<li>Use the <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/n1ql\/n1ql-rest-api\/index.html\">REST API N1QL endpoints<\/a><\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>In this post, I\u2019ll be mainly using Query Workbench.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>There are two <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/tools\/query-monitoring.html\">system catalogs<\/a> that are already available to you in Couchbase Server 4.5 that I\u2019ll be talking about today.<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><strong>system:active_request<\/strong> &#8211; This catalog lists all the currently executing active requests or queries. You can execute the N1QL query <code>SELECT * FROM system:active_requests;<\/code> and it will list all those results.<\/li>\n<li><strong>system:completed_requests<\/strong> &#8211; This catalog lists all the recent completed requests (that have run longer than some threshold of time, default of 1 second). You can execute <code>SELECT * FROM system:completed_requests;<\/code> and it will list these queries.<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_new_to_n1ql_meta_plan\">New to N1QL: META().plan<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Both <code>active_requests<\/code> and <code>completed_requests<\/code> return not only the original N1QL query text, but also related information: request time, request id, execution time, scan consistency, and so on. This can be useful information. Here\u2019s an example that looks at a simple query (<code>select * from `travel-sample`<\/code>) while it\u2019s running by executing <code>select * from system:active_requests;<\/code><\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-JavaScript\">{\r\n\t\"active_requests\": {\r\n\t  \"clientContextID\": \"805f519d-0ffb-4adf-bd19-15238c95900a\",\r\n\t  \"elapsedTime\": \"645.4333ms\",\r\n\t  \"executionTime\": \"645.4333ms\",\r\n\t  \"node\": \"10.0.75.1\",\r\n\t  \"phaseCounts\": {\r\n\t\t\"fetch\": 6672,\r\n\t\t\"primaryScan\": 7171\r\n\t  },\r\n\t  \"phaseOperators\": {\r\n\t\t\"fetch\": 1,\r\n\t\t\"primaryScan\": 1\r\n\t  },\r\n\t  \"phaseTimes\": {\r\n\t\t\"authorize\": \"500.3\u00b5s\",\r\n\t\t\"fetch\": \"365.7758ms\",\r\n\t\t\"parse\": \"500\u00b5s\",\r\n\t\t\"primaryScan\": \"107.3891ms\"\r\n\t  },\r\n\t  \"requestId\": \"80787238-f4cb-4d2d-999f-7faff9b081e4\",\r\n\t  \"requestTime\": \"2017-02-10 09:06:18.3526802 -0500 EST\",\r\n\t  \"scanConsistency\": \"unbounded\",\r\n\t  \"state\": \"running\",\r\n\t  \"statement\": \"select * from `travel-sample`;\"\r\n\t}\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>First, I want to point out that <strong>phaseTimes<\/strong> is a new addition to the results. It\u2019s a quick and dirty way to get a sense of the query cost without looking at the whole profile. It gives you the overall cost of each request phase without going into detail of each operator. In the above example, for instance, you can see that <code>parse<\/code> took 500\u00b5s and <code>primaryScan<\/code> took 107.3891ms. This might be enough information for you to go on without diving into <code>META().plan<\/code>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>However, with the new <code>META().plan<\/code>, you can get very detailed information about the query plan. This time, I\u2019ll execute <code>SELECT *, META().plan FROM system:active_requests<\/code>;<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-JavaScript\">[\r\n  {\r\n    \"active_requests\": {\r\n      \"clientContextID\": \"75f0f401-6e87-48ae-bca8-d7f39a6d029f\",\r\n      \"elapsedTime\": \"1.4232754s\",\r\n      \"executionTime\": \"1.4232754s\",\r\n      \"node\": \"10.0.75.1\",\r\n      \"phaseCounts\": {\r\n        \"fetch\": 12816,\r\n        \"primaryScan\": 13231\r\n      },\r\n      \"phaseOperators\": {\r\n        \"fetch\": 1,\r\n        \"primaryScan\": 1\r\n      },\r\n      \"phaseTimes\": {\r\n        \"authorize\": \"998.7\u00b5s\",\r\n        \"fetch\": \"620.704ms\",\r\n        \"primaryScan\": \"48.0042ms\"\r\n      },\r\n      \"requestId\": \"42f50724-6893-479a-bac0-98ebb1595380\",\r\n      \"requestTime\": \"2017-02-15 14:44:23.8560282 -0500 EST\",\r\n      \"scanConsistency\": \"unbounded\",\r\n      \"state\": \"running\",\r\n      \"statement\": \"select * from `travel-sample`;\"\r\n    },\r\n    \"plan\": {\r\n      \"#operator\": \"Sequence\",\r\n      \"#stats\": {\r\n        \"#phaseSwitches\": 1,\r\n        \"kernTime\": \"1.4232754s\",\r\n        \"state\": \"kernel\"\r\n      },\r\n      \"~children\": [\r\n        {\r\n          \"#operator\": \"Authorize\",\r\n          \"#stats\": {\r\n            \"#phaseSwitches\": 3,\r\n            \"kernTime\": \"1.4222767s\",\r\n            \"servTime\": \"998.7\u00b5s\",\r\n            \"state\": \"kernel\"\r\n          },\r\n          \"privileges\": {\r\n            \"default:travel-sample\": 1\r\n          },\r\n          \"~child\": {\r\n            \"#operator\": \"Sequence\",\r\n            \"#stats\": {\r\n              \"#phaseSwitches\": 1,\r\n              \"kernTime\": \"1.4222767s\",\r\n              \"state\": \"kernel\"\r\n            },\r\n            \"~children\": [\r\n              {\r\n                \"#operator\": \"PrimaryScan\",\r\n                \"#stats\": {\r\n                  \"#itemsOut\": 13329,\r\n                  \"#phaseSwitches\": 53319,\r\n                  \"execTime\": \"26.0024ms\",\r\n                  \"kernTime\": \"1.3742725s\",\r\n                  \"servTime\": \"22.0018ms\",\r\n                  \"state\": \"kernel\"\r\n                },\r\n                \"index\": \"def_primary\",\r\n                \"keyspace\": \"travel-sample\",\r\n                \"namespace\": \"default\",\r\n                \"using\": \"gsi\"\r\n              },\r\n              {\r\n                \"#operator\": \"Fetch\",\r\n                \"#stats\": {\r\n                  \"#itemsIn\": 12817,\r\n                  \"#itemsOut\": 12304,\r\n                  \"#phaseSwitches\": 50293,\r\n                  \"execTime\": \"18.5117ms\",\r\n                  \"kernTime\": \"787.9722ms\",\r\n                  \"servTime\": \"615.7928ms\",\r\n                  \"state\": \"services\"\r\n                },\r\n                \"keyspace\": \"travel-sample\",\r\n                \"namespace\": \"default\"\r\n              },\r\n              {\r\n                \"#operator\": \"Sequence\",\r\n                \"#stats\": {\r\n                  \"#phaseSwitches\": 1,\r\n                  \"kernTime\": \"1.4222767s\",\r\n                  \"state\": \"kernel\"\r\n                },\r\n                \"~children\": [\r\n                  {\r\n                    \"#operator\": \"InitialProject\",\r\n                    \"#stats\": {\r\n                      \"#itemsIn\": 11849,\r\n                      \"#itemsOut\": 11848,\r\n                      \"#phaseSwitches\": 47395,\r\n                      \"execTime\": \"5.4964ms\",\r\n                      \"kernTime\": \"1.4167803s\",\r\n                      \"state\": \"kernel\"\r\n                    },\r\n                    \"result_terms\": [\r\n                      {\r\n                        \"expr\": \"self\",\r\n                        \"star\": true\r\n                      }\r\n                    ]\r\n                  },\r\n                  {\r\n                    \"#operator\": \"FinalProject\",\r\n                    \"#stats\": {\r\n                      \"#itemsIn\": 11336,\r\n                      \"#itemsOut\": 11335,\r\n                      \"#phaseSwitches\": 45343,\r\n                      \"execTime\": \"6.5002ms\",\r\n                      \"kernTime\": \"1.4157765s\",\r\n                      \"state\": \"kernel\"\r\n                    }\r\n                  }\r\n                ]\r\n              }\r\n            ]\r\n          }\r\n        },\r\n        {\r\n          \"#operator\": \"Stream\",\r\n          \"#stats\": {\r\n            \"#itemsIn\": 10824,\r\n            \"#itemsOut\": 10823,\r\n            \"#phaseSwitches\": 21649,\r\n            \"kernTime\": \"1.4232754s\",\r\n            \"state\": \"kernel\"\r\n          }\r\n        }\r\n      ]\r\n    }\r\n  }, ...\r\n]<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>The above output comes from the Query Workbench.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Note the new &#8220;plan&#8221; part. It contains a tree of operators that combine to execute the N1QL query. The root operator is a Sequence, which itself has a collection of child operators like Authorize, PrimaryScan, Fetch, and possibly even more Sequences.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_enabling_the_profile_feature\">Enabling the profile feature<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>To get this information when using cbq or the REST API, you\u2019ll need to turn on the &#8220;profile&#8221; feature.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>You can do this in <code>cbq<\/code> by entering <code>set -profile timings;<\/code> and then running your query.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>You can also do this with the REST API on a per request basis (using the <code>\/query\/service<\/code> endpoint and passing a querystring parameter of <code>profile=timings<\/code>, for instance).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>You can turn on the setting for the entire node by making a POST request to https:\/\/localhost:8093\/admin\/settings, using Basic authentication, and a JSON body like:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-JavaScript\">{\r\n  \"completed-limit\": 4000,\r\n  \"completed-threshold\": 1000,\r\n  \"controls\": false,\r\n  \"cpuprofile\": \"\",\r\n  \"debug\": false,\r\n  \"keep-alive-length\": 16384,\r\n  \"loglevel\": \"INFO\",\r\n  \"max-parallelism\": 1,\r\n  \"memprofile\": \"\",\r\n  \"pipeline-batch\": 16,\r\n  \"pipeline-cap\": 512,\r\n  \"pretty\": true,\r\n  \"profile\": \"timings\",\r\n  \"request-size-cap\": 67108864,\r\n  \"scan-cap\": 0,\r\n  \"servicers\": 32,\r\n  \"timeout\": 0\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Notice the <strong>profile<\/strong> setting. It was previously set to off, but I set it to &#8220;timings&#8221;.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>You may not want to do that, especially on nodes being used by other people and programs, because it will affect other queries running on the node. It\u2019s better to do this on a per-request basis.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>It\u2019s also what Query Workbench does by default.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_using_the_query_workbench\">Using the Query Workbench<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>There\u2019s a lot of information in <code>META().plan<\/code> about how the plan is executed. Personally, I prefer to look at a simplified graphical version of it in Query Workbench by clicking the &#8220;Plan&#8221; icon (which I briefly mentioned in a <a href=\"https:\/\/www.couchbase.com\/blog\/a-tour-of-the-new-couchbase-web-console\/\">previous post about the new Couchbase Web Console<\/a> UI).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/054_01_Plan_Query_Workbench.jpg\" alt=\"Query Workbench plan results\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Let\u2019s look at a slightly more complex example. For this exercise, I\u2019m using the travel-sample bucket, but I have removed one of the indexes (<code>DROP INDEX `travel-sample<\/code>.<code>def_sourceairport<\/code>;`).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>I then execute a N1QL query to find flights between San Francisco and Miami:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-SQL\">SELECT r.id, a.name, s.flight, s.utc, r.sourceairport, r.destinationairport, r.equipment\r\nFROM `travel-sample` r\r\nUNNEST r.schedule s\r\nJOIN `travel-sample` a ON KEYS r.airlineid\r\nWHERE r.sourceairport = 'SFO'\r\nAND r.destinationairport = 'MIA'\r\nAND s.day = 0\r\nORDER BY a.name;<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Executing this query (on my single-node local machine) takes about 10 seconds. That\u2019s definitely not an acceptable amount of time, so let\u2019s look at the plan to see what the problem might be (I broke it into two lines so the screenshots will fit in the blog post).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/054_02_Plan_1.jpg\" alt=\"Query Workbench plan part 1\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/054_03_Plan_2.jpg\" alt=\"Query Workbench plan part 2\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Looking at that plan, it seems like the costliest parts of the query are the <strong>Filter<\/strong> and the <strong>Join<\/strong>. <code>JOIN<\/code> operations work on keys, so they should normally be very quick. But it looks like there are a <em>lot<\/em> of documents being joined.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>The Filter (the <code>WHERE<\/code> part of the query) is also taking a lot of time. It\u2019s looking at the <code>sourceairport<\/code> and <code>destinationairport<\/code> fields. Looking elsewhere in the plan, I see that there is a <strong>PrimaryScan<\/strong>. This should be a red flag when you are trying to write performant queries. PrimaryScan means that the query couldn\u2019t find an index other than the primary index. This is roughly the equivalent of a &#8220;table scan&#8221; in relational database terms. (You may want to drop the primary index so that these issues get bubbled-up faster, but that\u2019s a topic for another time).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Let\u2019s add an index on the <code>sourceairport<\/code> field and see if that helps.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-SQL\">CREATE INDEX `def_sourceairport` ON `travel-sample`(`sourceairport`);<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Now, running the same query as above, I get the following plan:<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/054_04_Plan_improved_1.jpg\" alt=\"Query Workbench improved plan part 1\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/054_05_Plan_improved_2.jpg\" alt=\"Query Workbench improved plan part 2\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>This query took ~100ms (on my single-node local machine) which is much more acceptable. The <strong>Filter<\/strong> and the <strong>Join<\/strong> still take up a large percentage of the time, but thanks to the <strong>IndexScan<\/strong> replacing the <strong>PrimaryScan<\/strong>, there are many fewer documents that those operators have to deal with. Perhaps the query could be improved even more with an additional index on the <code>destinationairport<\/code> field.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_beyond_tweaking_queries\">Beyond Tweaking Queries<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>The answer to performance problems is not always in tweaking queries. Sometimes you might need to add more nodes to your cluster to address the underlying problem.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Look at the <code>PrimaryScan<\/code> information in <code>META().plan<\/code>. Here\u2019s a snippet:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-JavaScript\">\"~children\": [\r\n  {\r\n    \"#operator\": \"PrimaryScan\",\r\n    \"#stats\": {\r\n      \"#itemsOut\": 13329,\r\n      \"#phaseSwitches\": 53319,\r\n      \"execTime\": \"26.0024ms\",\r\n      \"kernTime\": \"1.3742725s\",\r\n      \"servTime\": \"22.0018ms\",\r\n      \"state\": \"kernel\"\r\n    },\r\n    \"index\": \"def_primary\",\r\n    \"keyspace\": \"travel-sample\",\r\n    \"namespace\": \"default\",\r\n    \"using\": \"gsi\"\r\n  }, ... ]<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>The <code>servTime<\/code> value indicates how much time is spent by the Query service to wait on the Key\/Value data storage. If the <code>servTime<\/code> is very high, but there is a small number of documents being processed, that indicates that the indexer (or the key\/value service) can\u2019t keep up. Perhaps they have too much load coming from somewhere else. So this means that something weird is running someplace else <strong>or<\/strong> that your cluster is trying to handle too much load. Might be time to add some more nodes.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Similarly, the <code>kernTime<\/code> is how much time is spent waiting on other N1QL routines. This might mean that something else downstream in the query plan has a problem, or that the query node is overrun with requests and is having to wait a lot.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_we_want_your_feedback\">We want your feedback!<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>The new <code>META().plan<\/code> functionality and the new Plan UI combine in Couchbase Server 5.0 to improve the N1QL writing and profiling process.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Stay tuned to the <a href=\"https:\/\/www.couchbase.com\/blog\/\">Couchbase Blog<\/a> for information about what\u2019s coming in the next developer build.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Interested in trying out some of these new features? <a href=\"https:\/\/couchbase.com\/download\/\">Download Couchbase Server 5.0<\/a> today!<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>We want feedback! Developer releases are coming every month, so you have a chance to make a difference in what we are building.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><strong>Bugs<\/strong>: If you find a bug (something that is broken or doesn\u2019t work how you\u2019d expect), please file an issue in our <a href=\"https:\/\/issues.couchbase.com\">JIRA system at issues.couchbase.com<\/a> or submit a question on the <a href=\"https:\/\/www.couchbase.com\/forums\/\">Couchbase Forums<\/a>. Or, contact me with a description of the issue. I would be happy to help you or submit the bug for you (my Couchbase handlers high-five me every time I submit a good bug).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><strong>Feedback<\/strong>: Let me know what you think. Something you don\u2019t like? Something you really like? Something missing? Now you can give feedback directly from within the Couchbase Web Console. Look for the <span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/054_06_feedback_icon.png\" alt=\"feedback icon\" \/><\/span> icon at the bottom right of the screen.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>In some cases, it may be tricky to decide if your feedback is a bug or a suggestion. Use your best judgment, or again, feel free to contact me for help. I want to hear from you. The best way to contact me is either <a href=\"https:\/\/twitter.com\/mgroves\">Twitter @mgroves<\/a> or email me <a href=\"mailto:matthew.groves@couchbase.com\">matthew.groves@couchbase.com<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>N1QL query monitoring and profiling updates are just some of goodness you can find in February\u2019s developer preview release of Couchbase Server 5.0.0. Go download the February 5.0.0 developer release of Couchbase Server today, click the &#8220;Developer&#8221; tab, and check [&hellip;]<\/p>\n","protected":false},"author":71,"featured_media":2695,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,1812],"tags":[1855,1335,1854],"ppma_author":[8937],"class_list":["post-2694","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-n1ql-query","tag-developer-build","tag-monitoring","tag-profiling"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>New Profiling and Monitoring in Couchbase Server 5.0 Preview<\/title>\n<meta name=\"description\" content=\"I&#039;m going to show you the N1QL query monitoring and profiling tools and some of the new features in this latest developer preview release\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"New Profiling and Monitoring in Couchbase Server 5.0 Preview\" \/>\n<meta property=\"og:description\" content=\"I&#039;m going to show you the N1QL query monitoring and profiling tools and some of the new features in this latest developer preview release\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-02-20T19:07:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T02:29:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/054_monitoring_profiling_health_featured.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Matthew Groves\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mgroves\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthew Groves\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"New Profiling and Monitoring in Couchbase Server 5.0 Preview\",\"datePublished\":\"2017-02-20T19:07:56+00:00\",\"dateModified\":\"2025-06-14T02:29:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/\"},\"wordCount\":1431,\"commentCount\":8,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/054_monitoring_profiling_health_featured.jpg\",\"keywords\":[\"Developer Build\",\"monitoring\",\"profiling\"],\"articleSection\":[\"Couchbase Server\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/\",\"name\":\"New Profiling and Monitoring in Couchbase Server 5.0 Preview\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/054_monitoring_profiling_health_featured.jpg\",\"datePublished\":\"2017-02-20T19:07:56+00:00\",\"dateModified\":\"2025-06-14T02:29:21+00:00\",\"description\":\"I'm going to show you the N1QL query monitoring and profiling tools and some of the new features in this latest developer preview release\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/054_monitoring_profiling_health_featured.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/054_monitoring_profiling_health_featured.jpg\",\"width\":960,\"height\":540,\"caption\":\"Monitoring and profiling\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"New Profiling and Monitoring in Couchbase Server 5.0 Preview\"}]},{\"@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\/3929663e372020321b0152dc4fa65a58\",\"name\":\"Matthew Groves\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"caption\":\"Matthew Groves\"},\"description\":\"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.\",\"sameAs\":[\"https:\/\/crosscuttingconcerns.com\",\"https:\/\/x.com\/mgroves\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/matthew-groves\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"New Profiling and Monitoring in Couchbase Server 5.0 Preview","description":"I'm going to show you the N1QL query monitoring and profiling tools and some of the new features in this latest developer preview release","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/","og_locale":"en_US","og_type":"article","og_title":"New Profiling and Monitoring in Couchbase Server 5.0 Preview","og_description":"I'm going to show you the N1QL query monitoring and profiling tools and some of the new features in this latest developer preview release","og_url":"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-02-20T19:07:56+00:00","article_modified_time":"2025-06-14T02:29:21+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/054_monitoring_profiling_health_featured.jpg","type":"image\/jpeg"}],"author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"New Profiling and Monitoring in Couchbase Server 5.0 Preview","datePublished":"2017-02-20T19:07:56+00:00","dateModified":"2025-06-14T02:29:21+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/"},"wordCount":1431,"commentCount":8,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/054_monitoring_profiling_health_featured.jpg","keywords":["Developer Build","monitoring","profiling"],"articleSection":["Couchbase Server","SQL++ \/ N1QL Query"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/","url":"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/","name":"New Profiling and Monitoring in Couchbase Server 5.0 Preview","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/054_monitoring_profiling_health_featured.jpg","datePublished":"2017-02-20T19:07:56+00:00","dateModified":"2025-06-14T02:29:21+00:00","description":"I'm going to show you the N1QL query monitoring and profiling tools and some of the new features in this latest developer preview release","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/054_monitoring_profiling_health_featured.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/054_monitoring_profiling_health_featured.jpg","width":960,"height":540,"caption":"Monitoring and profiling"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/new-profiling-monitoring-couchbase-server-4-6\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"New Profiling and Monitoring in Couchbase Server 5.0 Preview"}]},{"@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\/3929663e372020321b0152dc4fa65a58","name":"Matthew Groves","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54","url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","caption":"Matthew Groves"},"description":"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/author\/matthew-groves\/"}]}},"authors":[{"term_id":8937,"user_id":71,"is_guest":0,"slug":"matthew-groves","display_name":"Matthew Groves","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","author_category":"","last_name":"Groves","first_name":"Matthew","job_title":"","user_url":"https:\/\/crosscuttingconcerns.com","description":"Matthew D. Groves is a guy who loves to code.  It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything.  He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s.  He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community.  He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/2694","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=2694"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/2694\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/2695"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=2694"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=2694"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=2694"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=2694"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}