{"id":15412,"date":"2024-03-13T08:58:00","date_gmt":"2024-03-13T15:58:00","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=15412"},"modified":"2025-06-13T22:40:14","modified_gmt":"2025-06-14T05:40:14","slug":"maximizing-couchbase-capella-eventing-observability","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/","title":{"rendered":"Maximizing Couchbase Capella Eventing Observability"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">In this blog post, we&#8217;ll show how to use Couchbase Capella in conjunction with ElasticSearch and AWS services for efficient Eventing application log shipping and analytics.<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/products\/capella\/\"><span style=\"font-weight: 400;\">Couchbase Capella<\/span><\/a><span style=\"font-weight: 400;\"> is a multi-model NoSQL cloud data platform. It delivers millisecond data response at scale, with the best price-performance of any document Database-as-a-Service. Capella <\/span><a href=\"https:\/\/www.couchbase.com\/products\/eventing\/\"><span style=\"font-weight: 400;\">Eventing Service<\/span><\/a><span style=\"font-weight: 400;\">, enables user-defined business logic to be triggered in real-time when there are changes to data in Capella. Typical use cases include enriching documents, cascade deletes, propagating data changes inside a database, and more.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Elastic stack (also known as the ELK Stack) offers a powerful centralized logging solution to create insights, set alerts based on KPIs, and keep track of application behavior.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Capella Eventing functions are easy to create using the Data Tools Eventing editor in the UI. Eventing application logs allow users to identify and capture various business logic-related activities and errors via user-defined messages specific to each Eventing function. While the application logs can be viewed in the Capella UI, centralized log management and analytics using specialized logging solutions could be helpful in many scenarios. This blog shows you step-by-step instructions on how to bring Eventing application logs to Elastic and help with centralized log storage and analytics.<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/03\/image_2024-03-12_131411906.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-15418 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/03\/image_2024-03-12_131411906-1024x540.png\" alt=\"\" width=\"900\" height=\"475\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_131411906-1024x540.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_131411906-300x158.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_131411906-768x405.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_131411906.png 1100w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<h2>Prerequisite<\/h2>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Couchbase Capella Deployment with Data and Eventing services. <\/span><a href=\"https:\/\/cloud.couchbase.com\/sign-up\"><span style=\"font-weight: 400;\">Sign up<\/span><\/a><span style=\"font-weight: 400;\"> for a trial account.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">ElasticSearch Cloud Deployment. <\/span><a href=\"https:\/\/cloud.elastic.co\/registration\"><span style=\"font-weight: 400;\">Sign up<\/span><\/a><span style=\"font-weight: 400;\"> for a trial account.<\/span><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/aws.amazon.com\/free\"><span style=\"font-weight: 400;\">AWS account<\/span><\/a><span style=\"font-weight: 400;\"> with an EC2 instance for running <\/span><a href=\"https:\/\/docs.couchbase.com\/elasticsearch-connector\/current\/index.html\"><span style=\"font-weight: 400;\">Couchbase ElasticSearch Connector<\/span><\/a><span style=\"font-weight: 400;\"> that can be downloaded <\/span><a href=\"https:\/\/docs.couchbase.com\/elasticsearch-connector\/current\/release-notes.html\"><span style=\"font-weight: 400;\">here<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Overview of the necessary steps<\/h2>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\"><strong>Setting Up Capella Cluster<\/strong>: Start by creating a Capella Cluster with data and eventing services. <\/span><span style=\"font-weight: 400;\">A quick guide can be found on <\/span><a href=\"https:\/\/docs.couchbase.com\/cloud\/get-started\/create-account.html\"><span style=\"font-weight: 400;\">Couchbase Capella documentation<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\"><strong>Bucket\/Scope\/Collection Creation<\/strong>: Create the necessary buckets, scopes, and collections in Couchbase. This includes &#8216;data&#8217;, &#8216;eventing-logs&#8217;, and their respective scopes and collections.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\"><strong>Eventing Functions Preparation<\/strong>: Prepare the eventing functions for data population and transformation. This involves creating synthetic datasets and modifying them to create logs.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\"><strong>ElasticSearch Cluster and Index Creation<\/strong>: Set up your ElasticSearch cluster and create an index for efficient data handling.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\"><strong>VPC and Private Link Setup<\/strong>: Create a new VPC for the Elastic Connector and establish a private link from Couchbase Capella to the VPC.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\"><strong>ElasticSearch Traffic Filter<\/strong>: Implement traffic filtering for secure data transfer.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\"><strong>Install and Run Couchbase ElasticSearch Connector<\/strong>: Install the Couchbase ElasticSearch Connector on an EC2 machine and configure it for log shipping.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\"><strong>Data Visualization and Analysis<\/strong>: Use the collected data source to visualize and analyze logs, exploring the insights they provide.<\/span><\/p>\n<h2>Detailed Configuration<\/h2>\n<h3>Couchbase Environment<\/h3>\n<p><span style=\"font-weight: 400;\">We need to create two buckets and their scopes and collection. On one side we will create all we need to manage data and eventing functions. On the other one we will create a second one dedicated to the logs generated by the eventing functions.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The foundations of this simple activity can be found on the <\/span><a href=\"https:\/\/docs.couchbase.com\/cloud\/clusters\/data-service\/about-buckets-scopes-collections.html\"><span style=\"font-weight: 400;\">Couchbase Capella documentation<\/span><\/a><span style=\"font-weight: 400;\"> which illustrates the principles and the actions involved. Note that bucket creation involves the configuration of several settings, of which the most prominent is Memory Quota. For testing purposes you can choose 100 MB, otherwise an <\/span><a href=\"https:\/\/docs.couchbase.com\/server\/current\/learn\/buckets-memory-and-storage\/storage-engines.html#couchstore-and-magma-at-a-glance\"><span style=\"font-weight: 400;\">accurate evaluation<\/span><\/a><span style=\"font-weight: 400;\"> will be necessary.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Create two buckets with the following structure:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Name: \u201c<\/span><b>data<\/b><span style=\"font-weight: 400;\">\u201d<\/span>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Scope Name: \u201c<\/span><b>eventing<\/b><span style=\"font-weight: 400;\">\u201d<\/span>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Collection Name: \u201c<\/span><b>meta<\/b><span style=\"font-weight: 400;\">\u201d<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><i><span style=\"font-weight: 400;\">Storage for eventing functions checkpoints<\/span><\/i><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Scope Name: \u201c<\/span><b>inventory<\/b><span style=\"font-weight: 400;\">\u201d<\/span>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Collection Name: \u201c<\/span><b>data<\/b><span style=\"font-weight: 400;\">\u201d<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><i><span style=\"font-weight: 400;\">Storage for actual data<\/span><\/i><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Name: \u201c<\/span><b>eventing-logs<\/b><span style=\"font-weight: 400;\">\u201d<\/span>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Scope Name: \u201c<\/span><b>eventing<\/b><span style=\"font-weight: 400;\">\u201d<\/span>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Collection Name: \u201c<\/span><b>logs<\/b><span style=\"font-weight: 400;\">\u201d<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><i><span style=\"font-weight: 400;\">Storage for logs. Optionally we can set a TTL to reduce the amount of storage.<\/span><\/i><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Scope Name: \u201c<\/span><b>elastic-checkpoints<\/b><span style=\"font-weight: 400;\">\u201d<\/span>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Collection Name: \u201c<\/span><b>connector<\/b><span style=\"font-weight: 400;\">\u201d<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><i><span style=\"font-weight: 400;\">Storage for Couchbase-Elasticsearch Connector checkpoints<\/span><\/i><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Data population<\/h3>\n<p><span style=\"font-weight: 400;\">We will now create two eventing functions. If this is the first time you create an eventing function, you can familiarize yourself with the environment <\/span><a href=\"https:\/\/docs.couchbase.com\/cloud\/clusters\/eventing-service\/manage-eventing-functions.html\"><span style=\"font-weight: 400;\">following this guide<\/span><\/a><span style=\"font-weight: 400;\">.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The purpose of these functions is to:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\"><i><span style=\"font-weight: 400;\">First Function<\/span><\/i><span style=\"font-weight: 400;\">: create data we can work on. A dataset representing a product catalog.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">This function creates simple json documents, introducing some variability across 100000 iterations. While this is not a realistic product catalog, it sets a good ground for experimenting eventing functions that need to log the way it is performing. Note that the function is triggered the first time by creating an empty document.<\/span><\/li>\n<li style=\"font-weight: 400;\"><i><span style=\"font-weight: 400;\">Second Function<\/span><\/i><span style=\"font-weight: 400;\">: the actual eventing function with some business logic we would like to observe through ELK stack.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">While the eventing function runs unbounded across all the new dataset, it substitutes the property <\/span><span style=\"font-weight: 400;\">category<\/span><span style=\"font-weight: 400;\"> whenever it matches the value \u201c<\/span><span style=\"font-weight: 400;\">Category 3<\/span><span style=\"font-weight: 400;\">\u201d and it changes this value to \u201c<\/span><span style=\"font-weight: 400;\">jeans<\/span><span style=\"font-weight: 400;\">\u201d. In several parts of the function we can observe that it is conveniently called a function called <\/span><b>logStuff<\/b><span style=\"font-weight: 400;\">: Its purpose is to save a log line in a dedicated collection that will be later on replicated to ElasticSearch and indexed.<\/span><\/p>\n<h3>Data population function<\/h3>\n<p><span style=\"font-weight: 400;\">Create an eventing function with the following configurations:<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/03\/image_2024-03-12_130932355.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-15414 size-large\" style=\"border: solid black 1px;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/03\/image_2024-03-12_130932355-1024x797.png\" alt=\"\" width=\"900\" height=\"700\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_130932355-1024x797.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_130932355-300x234.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_130932355-768x598.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_130932355.png 1256w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">And the following bucket binding:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-15415\" style=\"border: solid black 1px;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/03\/image_2024-03-12_131012849-1024x400.png\" alt=\"\" width=\"900\" height=\"352\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_131012849-1024x400.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_131012849-300x117.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_131012849-768x300.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_131012849.png 1267w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Here is the function:<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">function OnUpdate(doc, meta) {\r\n\u00a0\u00a0\u00a0\u00a0\/\/ Placeholder function for handling document updates\r\n\u00a0\u00a0\u00a0\u00a0if(meta.id == 'start') {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0for(let i = 1; i &lt;= 100000; i++) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var item = {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"type\": \"inventoryItem\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"itemId\": i,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"name\": \"Item \" + i,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"price\": Math.random() * 100, \/\/ Random price between 0 and 100\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"inStock\": true,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"category\": \"Category \" + (i % 10) \/\/ 10 different categories\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0};\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var key = \"item_\" + i;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0dst[key] = item;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0}\r\n}\r\n\r\nfunction OnDelete(meta) {\r\n\u00a0\u00a0\u00a0\u00a0\/\/ Placeholder function for handling document deletions\r\n}<\/pre>\n<p>The moment the function gets a document in <em>data.inventory.data<\/em> with the ID <em>start<\/em>, it will generate 100000 random documents.<\/p>\n<p><span style=\"font-weight: 400;\">Note: to generate this document you just need to go to the <\/span><b>Data Tools<\/b><span style=\"font-weight: 400;\"> tab, select <\/span><b>Documents<\/b><span style=\"font-weight: 400;\"> and then click on the <\/span><b>Create New Document <\/b><span style=\"font-weight: 400;\">button (remember to select the right collection! <\/span><span style=\"font-weight: 400;\">Data -&gt; Inventory -&gt; Data<\/span><span style=\"font-weight: 400;\">).\u00a0<\/span><\/p>\n<h3>Data Transformation function<\/h3>\n<p><span style=\"font-weight: 400;\">This second function will demonstrate how to persist logs on temporary storage to be used later on the ELK Stack. While performing its business logic on the <\/span><em>data.inventory.data<\/em><span style=\"font-weight: 400;\"> collection, it will save some application logs on the <\/span><em>eventing-logs.eventing.logs<\/em> <span style=\"font-weight: 400;\">so that it will be able to later on export them to ElasticSearch.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The configuration:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-15416\" style=\"border: solid black 1px;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/03\/image_2024-03-12_131106111.png\" alt=\"\" width=\"932\" height=\"769\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_131106111.png 932w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_131106111-300x248.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_131106111-768x634.png 768w\" sizes=\"auto, (max-width: 932px) 100vw, 932px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">The bindings:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-15417\" style=\"border: solid black 1px;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/03\/image_2024-03-12_131126299.png\" alt=\"\" width=\"909\" height=\"626\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_131126299.png 909w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_131126299-300x207.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_131126299-768x529.png 768w\" sizes=\"auto, (max-width: 909px) 100vw, 909px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">The function:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">function OnUpdate(doc, meta) {\r\n\u00a0\u00a0\u00a0\u00a0logStuff(\"debug\", \"start evaluating \" + meta.id);\r\n\u00a0\u00a0\u00a0\u00a0if(doc.category == \"Category 3\") {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logStuff(\"info\", \"start modifying \" + meta.id);\r\n \u00a0\u00a0\u00a0\u00a0\u00a0doc.category = \"jeans\";\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0inventoryScope[meta.id] = doc;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0logStuff(\"info\", \"end modifying \" + meta.id);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0logStuff(\"debug\", \"end evaluating \" + meta.id);\r\n}\r\n\r\nfunction OnDelete(meta, options) {\r\n}\r\n\r\nfunction simpleHash(str) {\r\n\u00a0\u00a0let hash = 0;\r\n\u00a0\u00a0for (let i = 0; i &lt; str.length; i++) {\r\n\u00a0\u00a0\u00a0\u00a0const char = str.charCodeAt(i);\r\n\u00a0\u00a0\u00a0\u00a0hash = (hash &lt;&lt; 5) - hash + char;\r\n\u00a0\u00a0\u00a0\u00a0hash &amp;= hash; \/\/ Convert to 32bit integer\r\n\u00a0\u00a0}\r\n\u00a0\u00a0return new Uint32Array([hash])[0].toString(36);\r\n}\r\n\r\nfunction logStuff(level, message) {\r\n\u00a0\u00a0var date = new Date();\r\n\u00a0\u00a0date.toISOString();\r\n\u00a0\u00a0var logLine = {\r\n\u00a0\u00a0\u00a0\u00a0\"@timestamp\": date,\r\n\u00a0\u00a0\u00a0\u00a0\"log\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"level\": level,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"logger\": \"couchbase.eventing\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"origin\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"function\": \"data-transformation-cat-3-to-tee\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"original\": message\r\n\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\"message\": message,\r\n\u00a0\u00a0\u00a0\u00a0\"ecs\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"version\": \"1.6.0\"\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0}\r\n\u00a0\u00a0var logEntryId = \"data-transformation-\" + Math.floor(Math.random() * 10000000) + date;\r\n\u00a0\u00a0logCollectionScope[simpleHash(logEntryId)] = logLine;\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">The function is responsible for modifying a certain category of data and transforming its label. In doing so, we need to keep track of how the function is performing through logs that will be later on analyzed with the ELK stack.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The <\/span><em>logStuff<\/em><span style=\"font-weight: 400;\"> function creates a JSON document with an ECS compliant format and persists it on a separate bucket.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Once the eventing function is created, remember to <\/span><a href=\"https:\/\/docs.couchbase.com\/cloud\/clusters\/eventing-service\/deploy-eventing-functions.html\"><b>deploy<\/b><\/a><span style=\"font-weight: 400;\"> it.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Once the dataset is created and the transformation function executed we should have a populated bucket of logs ready to be shipped to ElasticSearch.<\/span><\/p>\n<p><em><span style=\"font-weight: 400;\">Note: In order to avoid collisions, logs lines are created with timestamps and random numbers later on hashed to save space.<\/span><\/em><\/p>\n<h3>Elastic Cloud configuration<\/h3>\n<p><span style=\"font-weight: 400;\">Before starting synchronizing the data we need to create an index in ElasticSearch. Make sure to modify the Elasticsearch <\/span><a href=\"https:\/\/www.elastic.co\/guide\/en\/cloud-enterprise\/current\/ece-connect.html\"><span style=\"font-weight: 400;\">endpoint URL<\/span><\/a><span style=\"font-weight: 400;\"> and to create an <\/span><a href=\"https:\/\/www.elastic.co\/guide\/en\/kibana\/current\/api-keys.html\"><span style=\"font-weight: 400;\">API Key<\/span><\/a><span style=\"font-weight: 400;\"> with administrative rights.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Here is a CURL example:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">curl -X PUT \"https:\/\/&lt;your ElasticSearch endpoint here&gt;:443\/couchbase-ecs\" \\\r\n-H \"Authorization: ApiKey \"&lt;your API key&gt;\"\" \\\r\n-H \"Content-Type: application\/json\" \\\r\n-d '\r\n{\r\n\u00a0\u00a0\"settings\": {\r\n\u00a0\u00a0\u00a0\u00a0\"number_of_shards\": 1,\r\n\u00a0\u00a0\u00a0\u00a0\"number_of_replicas\": 1\r\n\u00a0\u00a0},\r\n\u00a0\u00a0\"mappings\": {\r\n\u00a0\u00a0\u00a0\u00a0\"properties\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"@timestamp\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"type\": \"date\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"log\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"properties\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"level\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"type\": \"keyword\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"logger\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"type\": \"keyword\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"origin\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"properties\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"function\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"type\": \"keyword\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"original\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"type\": \"text\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"message\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"type\": \"text\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"ecs\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"properties\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"version\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"type\": \"keyword\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0}\r\n}'<\/pre>\n<p><span style=\"font-weight: 400;\">The index maps the data type of the logger so that it can be searched efficiently.<\/span><\/p>\n<h3>ElasticSearch Connector<\/h3>\n<h4>Network configuration<\/h4>\n<p><span style=\"font-weight: 400;\">We need to create a VPC with an EC2 machine <\/span><span style=\"font-weight: 400;\">with a public IP address<\/span><span style=\"font-weight: 400;\"> that will host the ElasticSearch connector. A regular EC2 instance with a 2-4 cpus will do the job for this test (we used a t2.medium). Of course, if this is going to be a production environment, an evaluation of the sizing of this machine would be an important step for this deployment.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Next step is to secure the connectivity between the newly create VPC and:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Couchbase Capella, and<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Elastic Cloud<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">The most practical way (testing purpose only!) is through public connectivity. On the Capella cluster settings we need to <\/span><a href=\"https:\/\/docs.couchbase.com\/cloud\/clusters\/allow-ip-address.html\"><span style=\"font-weight: 400;\">whitelist the public IP of the EC2 instance<\/span><\/a><span style=\"font-weight: 400;\"> so that the Elasticsearch Connector can establish a connection to the database. For Elastic Cloud, instead, we need to create an <\/span><a href=\"https:\/\/www.elastic.co\/guide\/en\/cloud\/current\/ec-api-keys.html\"><span style=\"font-weight: 400;\">API key<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">There is also the alternative to go through private links and extensive documentation can be found here:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\"><a href=\"https:\/\/docs.couchbase.com\/cloud\/security\/add-aws-private-link.html\">Couchbase Capella<\/a><\/span><\/li>\n<li style=\"font-weight: 400;\"><a href=\"https:\/\/www.elastic.co\/blog\/secure-elastic-cloud-deployment-aws-privatelink-traffic-filter\"><span style=\"font-weight: 400;\">Elastic Cloud<\/span><\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h4>Couchbase-ElasticSearch connector<\/h4>\n<p><span style=\"font-weight: 400;\">After having provisioned the EC2 instance we need to download the executables from the Couchbase website. Before that, please have a look <a href=\"https:\/\/docs.couchbase.com\/elasticsearch-connector\/current\/index.html\">at the requirements, here<\/a> and <a href=\"https:\/\/docs.couchbase.com\/elasticsearch-connector\/current\/release-notes.html\">download here<\/a>.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">We need now to configure it modifying the <\/span><em><span style=\"font-weight: 400;\">$CBES_HOME\/config\/default-connector.toml <\/span><\/em><span style=\"font-weight: 400;\">file.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Here are a few sections that will resonate with you, some sections removed to keep it brief:<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">[group]\r\nname = 'example-group'\r\n\r\n[group.static]\r\nmemberNumber = 1 # A value from 1 to 'totalMembers', inclusive.\r\ntotalMembers = 1\r\n\r\n[...]\r\n\r\n[couchbase]\r\nhosts = ['&lt;your Capella private endpoint&gt;']\r\nnetwork = 'auto'\r\nbucket = 'eventing-logs'\r\nmetadataBucket = 'eventing-logs'\r\nmetadataCollection = 'elastic-checkpoints.connector'\r\n\r\n# your Capella username\r\nusername = 'hello'\r\n\r\n# Remember to go to modify this file with the password\r\npathToPassword = 'secrets\/couchbase-password.toml'\r\n\r\n#Capella environment is always secured\r\nsecureConnection = true\r\n\r\n[...]\r\n\r\n[elasticsearch]\r\nhosts = ['https:\/\/&lt;your ElasticSearch endpoint here&gt;:443']\r\nusername = 'elastic'\r\n\r\n# Remember to go to modify this file with your ElasticSearch ApiKey\r\npathToPassword = 'secrets\/elasticsearch-password.toml'\r\nsecureConnection = true\r\n\r\n[...]\r\n\r\n[elasticsearch.elasticCloud]\r\nenabled = true\r\n\r\n[...]\r\n\r\n# If true, never delete matching documents from Elasticsearch.\r\nignoreDeletes = true\r\n[[elasticsearch.type]]\r\nmatchOnQualifiedKey = true\r\nprefix = 'eventing.logs.'\r\nindex = 'couchbase-ecs'\r\n\r\n[...]<\/pre>\n<h2>Best Practices and Tips<\/h2>\n<p><span style=\"font-weight: 400;\">Here are a few things might be useful to keep in mind:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Couchbase ElasticSearch connector &#8211; <\/span>Make sure that you get your data type right, <em><span style=\"font-weight: 400;\">[[elasticsearch.type]]<\/span>. <\/em><span style=\"font-weight: 400;\">Your connector won\u2019t feed data unless this is done properly.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Couchbase Capella &#8211; <\/span><span style=\"font-weight: 400;\">Don\u2019t forget to create the database credentials for the Connector!\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">ElasticSearch<\/span>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Once an index is created you can create a datasource from which you will be able to build your insights.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">ApiKeys can be created for administrative purpose (e.g., creating indexes) or applications (e.g., sending the data through the Connector). Make sure that you are using the right ones.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Data Retention<\/span>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Saving logs can be very disk consuming. Avoid this by:<\/span>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Excluding delete notifications from the ElasticSearch Connector with the <\/span><em><span style=\"font-weight: 400;\">ignoreDeletes = true<\/span><\/em> <span style=\"font-weight: 400;\">flag<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Setting a TTL for the collection that contains your logs, so that Couchbase Capella will clean up logs automatically that are too old<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-15421\" style=\"border: solid black 1px;\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/03\/image_2024-03-13_095458683-1024x621.png\" alt=\"\" width=\"900\" height=\"546\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-13_095458683-1024x621.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-13_095458683-300x182.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-13_095458683-768x466.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-13_095458683-1320x801.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-13_095458683.png 1380w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<h2>Conclusion<\/h2>\n<p><span style=\"font-weight: 400;\">Through this tutorial we have seen how to implement observability for our Eventing Functions deployed in Capella. As a next step you can <\/span><a href=\"https:\/\/cloud.couchbase.com\/sign-up\"><span style=\"font-weight: 400;\">sign up<\/span><\/a><span style=\"font-weight: 400;\"> for a Capella trial and experiment for yourself the many features provided with the most powerful NoSQL database out there. To help you orient, you can also use <\/span><a href=\"https:\/\/cloud.couchbase.com\/sign-up\"><span style=\"font-weight: 400;\">our playground<\/span><\/a><span style=\"font-weight: 400;\"> and our <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-capella-iq\/\"><span style=\"font-weight: 400;\">Capella iQ<\/span><\/a><span style=\"font-weight: 400;\">, our generative AI assistant, for learning how to develop and experiment in a safe environment. <\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this blog post, we&#8217;ll show how to use Couchbase Capella in conjunction with ElasticSearch and AWS services for efficient Eventing application log shipping and analytics. Couchbase Capella is a multi-model NoSQL cloud data platform. It delivers millisecond data response [&hellip;]<\/p>\n","protected":false},"author":85143,"featured_media":15413,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[2242,2225,2273],"tags":[8622,1292],"ppma_author":[9933,9932],"class_list":["post-15412","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-connectors","category-cloud","category-eventing","tag-distributed-search","tag-elasticsearch"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Couchbase Capella &amp; AWS Services for Eventing Tutorial<\/title>\n<meta name=\"description\" content=\"Learn how to use Couchbase Capella in conjunction with ElasticSearch and AWS services for efficient Eventing application log shipping and analytics here.\" \/>\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\/maximizing-couchbase-capella-eventing-observability\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Maximizing Couchbase Capella Eventing Observability\" \/>\n<meta property=\"og:description\" content=\"Learn how to use Couchbase Capella in conjunction with ElasticSearch and AWS services for efficient Eventing application log shipping and analytics here.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-13T15:58:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T05:40:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_130813634.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"380\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Davide Pellegatta, Senior Solutions Engineer, Ravi Kesarwani, Principal Product Manager\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Davide Pellegatta, Senior Solutions Engineer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/\"},\"author\":{\"name\":\"Davide Pellegatta, Senior Solutions Engineer\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/569b58d05762e8b34ede47f1f9f218d4\"},\"headline\":\"Maximizing Couchbase Capella Eventing Observability\",\"datePublished\":\"2024-03-13T15:58:00+00:00\",\"dateModified\":\"2025-06-14T05:40:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/\"},\"wordCount\":1536,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_130813634.png\",\"keywords\":[\"distributed search\",\"elasticsearch\"],\"articleSection\":[\"Connectors\",\"Couchbase Capella\",\"Eventing\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/\",\"name\":\"Couchbase Capella & AWS Services for Eventing Tutorial\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_130813634.png\",\"datePublished\":\"2024-03-13T15:58:00+00:00\",\"dateModified\":\"2025-06-14T05:40:14+00:00\",\"description\":\"Learn how to use Couchbase Capella in conjunction with ElasticSearch and AWS services for efficient Eventing application log shipping and analytics here.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_130813634.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_130813634.png\",\"width\":720,\"height\":380},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Maximizing Couchbase Capella Eventing Observability\"}]},{\"@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\/569b58d05762e8b34ede47f1f9f218d4\",\"name\":\"Davide Pellegatta, Senior Solutions Engineer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/329400f1c06c79fd4b18acdd262be436\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_132345390.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_132345390.png\",\"caption\":\"Davide Pellegatta, Senior Solutions Engineer\"},\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/davidepellegatta\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Couchbase Capella & AWS Services for Eventing Tutorial","description":"Learn how to use Couchbase Capella in conjunction with ElasticSearch and AWS services for efficient Eventing application log shipping and analytics here.","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\/maximizing-couchbase-capella-eventing-observability\/","og_locale":"en_US","og_type":"article","og_title":"Maximizing Couchbase Capella Eventing Observability","og_description":"Learn how to use Couchbase Capella in conjunction with ElasticSearch and AWS services for efficient Eventing application log shipping and analytics here.","og_url":"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/","og_site_name":"The Couchbase Blog","article_published_time":"2024-03-13T15:58:00+00:00","article_modified_time":"2025-06-14T05:40:14+00:00","og_image":[{"width":720,"height":380,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_130813634.png","type":"image\/png"}],"author":"Davide Pellegatta, Senior Solutions Engineer, Ravi Kesarwani, Principal Product Manager","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Davide Pellegatta, Senior Solutions Engineer","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/"},"author":{"name":"Davide Pellegatta, Senior Solutions Engineer","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/569b58d05762e8b34ede47f1f9f218d4"},"headline":"Maximizing Couchbase Capella Eventing Observability","datePublished":"2024-03-13T15:58:00+00:00","dateModified":"2025-06-14T05:40:14+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/"},"wordCount":1536,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_130813634.png","keywords":["distributed search","elasticsearch"],"articleSection":["Connectors","Couchbase Capella","Eventing"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/","url":"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/","name":"Couchbase Capella & AWS Services for Eventing Tutorial","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_130813634.png","datePublished":"2024-03-13T15:58:00+00:00","dateModified":"2025-06-14T05:40:14+00:00","description":"Learn how to use Couchbase Capella in conjunction with ElasticSearch and AWS services for efficient Eventing application log shipping and analytics here.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_130813634.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_130813634.png","width":720,"height":380},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/maximizing-couchbase-capella-eventing-observability\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Maximizing Couchbase Capella Eventing Observability"}]},{"@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\/569b58d05762e8b34ede47f1f9f218d4","name":"Davide Pellegatta, Senior Solutions Engineer","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/329400f1c06c79fd4b18acdd262be436","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_132345390.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_132345390.png","caption":"Davide Pellegatta, Senior Solutions Engineer"},"url":"https:\/\/www.couchbase.com\/blog\/author\/davidepellegatta\/"}]}},"authors":[{"term_id":9933,"user_id":85143,"is_guest":0,"slug":"davidepellegatta","display_name":"Davide Pellegatta, Senior Solutions Engineer","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_132345390.png","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_132345390.png"},"author_category":"","last_name":"Pellegatta, Senior Solutions Engineer","first_name":"Davide","job_title":"","user_url":"","description":""},{"term_id":9932,"user_id":85142,"is_guest":0,"slug":"ravikesarwani","display_name":"Ravi Kesarwani, Principal Product Manager","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_132216963.png","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/03\/image_2024-03-12_132216963.png"},"author_category":"","last_name":"Kesarwani, Principal Product Manager","first_name":"Ravi","job_title":"","user_url":"","description":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/15412","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\/85143"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=15412"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/15412\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/15413"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=15412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=15412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=15412"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=15412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}