{"status":200,"article":{"url":"https://hackernoon.com/debugging-serverless-applications-with-dashbird-82a2ed86d757","publish_datetime":null,"title":"","text":{"full":"With AWS Lambda, we get scalability and resilience out-of-the-box. What\u2019s more, AWS also provides built-in monitoring, logging and tracing support through CloudWatch and X-Ray. These built-in tools provide a good starting point but many developers eventually outgrow them as their serverless application becomes more complex.\n\nIn this post, let\u2019s take a serverless application and see how Dashbird can help you debug the application.\n\nChallenges with serverless observability\n\nWhen it comes to observability, serverless has introduced some interesting challenges. For so long, we have relied on the use of agents and daemons to collect metrics and logs. They run silently in the background, away from our critical paths where we are concerned with minimizing user-facing latencies. They collect, buffer and publish these observability data in batches to improve efficiency. As a practice, they are so deeply ingrained into how we monitor our applications, until now.\n\nWhen it comes to serverless, specifically with managed platforms such as AWS Lambda, there\u2019s simply nowhere for us to install these agents!\n\nTo collect metrics and logs as part of your function\u2019s invocation would understandably add overhead to its invocation time. Since AWS is collecting logs from your function asynchronously already, and publishing them to CloudWatch Logs. A common workaround is to subscribe to these logs and perform post-processing on them.\n\nIndeed, that is how Dashbird collects data about your function\u2019s execution. It subscribes the CloudWatch Logs log groups to a Kinesis stream and then processes the events from there. You can read about the advantages of this approach in this article.\n\nAs our serverless applications become more complex, it\u2019s important for us to be able to trace executions across multiple functions. As the demo app demonstrates, even a simple user transaction can span across multiple event sources as well as Lambda functions.\n\nThe demo app\n\nImagine you\u2019re building a Twitter clone. One of the core features of the system is to distribute a user\u2019s post to his followers\u2019 feeds. To implement this feature, imagine we have two separate API endpoints:\n\nPOST posts/create : to create a new post for the current user\n\nGET followers/{userId} : to fetch a user\u2019s followers\n\nEach endpoint is handled by a separate Lambda function \u2014 create-post and get-followers respectively.\n\nWhen a user publishes a new post, the create-post function would save the post in the posts DynamoDB table and also publish a post-created event into a Kinesis stream. This event then triggers a distribute-post function. This function would query the GET followers/{userId} endpoint and then add the post to the followers\u2019 feeds. The get-followers function would query the followers DynamoDB table to return the IDs of the user\u2019s followers.\n\nFor brevity sake I have omitted the logic for actually distributing the posts. So the overall architecture for our demo app looks like the following.\n\nTo make things more interesting, each of the Lambda functions are hardwired to error or timeout based on a configurable probability. The source code for the demo app is available on Github, so feel free to try it out yourself.\n\nIntroducing Dashbird\n\nEven with a simple serverless application like the one outlined above, we have quite a few functions to look after. Let\u2019s see how we can use Dashbird to help us monitor this application and debug issues.\n\nAs soon as I log in, I have a high level dashboard for my account.\n\nIn addition to the data I get in the AWS Lambda console (see below), the Dashbird dashboard has two useful data points:\n\nAverage memory utilization for the functions\n\nCost for the Lambda invocations\n\nNext, in Dashbird\u2019s Lambda console, I can see a high level summary of my functions and their activities over the last 24 hours.\n\nWhat I find very useful here is the fact that it highlights functions that have been idle for 10 days as inactive. As your serverless architecture expands and you end up with hundreds of functions, maintained by different teams, it\u2019s very difficult to track which functions are no longer needed. Having redundant functions lying around is a security risk as they remain an attack surface that can be exploited.\n\nWhile this view alone cannot tell you definitively which functions are no longer used. Many functions are not run on a regular basis. Maybe they are part of a cron job that only runs once a month. Or maybe they are only used during disaster recovery scenarios. Nonetheless, being aware of which functions are inactive encourages teams to ask the question \u201cIs this function still needed?\u201d. From here, maybe better practices can emerge. For example, use tags to mark functions that are expected to be used sparingly so they are not flagged by these checks.\n\nIf I navigate to one of the functions, then I have a function-centric view of invocation time, error, cost and memory utilization. In addition, I can also see a list of the recent invocations. What\u2019s really useful here is that cold starts and retries are clearly labelled. When debugging live issues this lets me quickly narrow down the invocations that I need to pay attention to.\n\nStraight away, I can see that 3 of the invocations timed out after 6 seconds. What\u2019s more, the original Kinesis event was retried 3 times and finally succeeded on the third retry.\n\nIf I click on the \u201c+\u201d button next to an invocation then I can drill down to the invocation itself. Here I can see the logs and X-Ray trace for this invocation in one screen. This is great as it saves me from having to constantly jump between different AWS console.\n\nDebugging with Dashbird\n\nAs mentioned before, the demo app is hardwired to error and timeout. And sure enough, when these failure cases happen, Dashbird\u2019s built-in alerting kicks in and I promptly received emails notifying me that something went wrong.\n\nWhile this built-in alerting is great, I couldn\u2019t see any settings to adjust the alert sensitivity.\n\nAs I followed the links in the emails, to the function, then the failed invocation. Dashbird neatly groups the related invocations \u2014 the initial timeout, and the subsequent retries \u2014 together. I can quickly see that the failed Kinesis event was successfully processed on the 3rd retry.\n\nDashbird also tracks the open issues in the Errors console. Now that I know the problem has resolved itself I can go ahead and resolve the error.\n\nTailing function logs\n\nAnother nice feature of Dashbird is that it\u2019s able to tail the logs for multiple functions at the same time. For the demo app, I want to see the logs for both the create-post and distribute-post functions as I curl the POST posts/create endpoint.\n\nThat way, I can see that the event was successfully published into the Kinesis stream, and was subsequently received by the distribute-post function.\n\nConclusion\n\nOverall I was impressed with what Dashbird has to offer, and it\u2019s clear that a lot of thought has gone into the product. It has many nice touches that makes debugging much easier. For example, grouping retries together, and integrating X-Ray traces and logs in one screen. These might seem like trivial niceties, but they can make a big difference under the high-pressure scenarios of dealing with a live issue.\n\nFrom what I have been able to see, I think Dashbird is a really great tool. The main thing missing for me is the ability to trace executions end-to-end. Personally, I\u2019d really like to see the entire execution traced from the API call to create a post, all the way to the get-followers function performing a Query against the followers DynamoDB table.\n\nIf you\u2019re solely relying on the built-in AWS tools (CloudWatch, CloudWatch Logs, and X-Ray) then you should give Dashbird a try. Why not sign up for a free trial, and deploy the demo app to your environment so you can see how Dashbird can help you debug your serverless application?\n\nOriginally published at dashbird.io on January 25, 2019.","keywords":["function","logs","serverless","invocation","lambda","demo","post","aws","functions","dashbird"],"summary":""},"authors":[],"media":{"images":["https://hackernoon.imgix.net/hn-images/0*3wx05u1keXGMJAij.png?auto=format%2Ccompress&w=3840","https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&w=3840","https://hackernoon.imgix.net/computer.png?auto=format%2Ccompress&w=48","https://hackernoon.imgix.net/hn-images/0*unPiVL0E6QC057iS.png?auto=format%2Ccompress&w=3840","https://hackernoon.imgix.net/hn-images/0*8_jid1Y_sG_cbTJn.png?auto=format%2Ccompress&w=3840","https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&w=96","https://hackernoon.imgix.net/hn-images/0*9-VOw-xsrF3mB5nQ.png?auto=format%2Ccompress&w=3840","https://hackernoon.imgix.net/hn-images/0*J7SEZ_EK1aWK6o3A.png?auto=format%2Ccompress&w=3840","https://hackernoon.imgix.net/images/Lite%20Icon%20%4025px.png?auto=format%2Ccompress&w=48","https://hackernoon.imgix.net/hn-images/0*nq_eP-14T_YcL3ps.png?auto=format%2Ccompress&w=3840","https://hackernoon.imgix.net/hn-images/0*OKovmxFYKL4pGPmG.png?auto=format%2Ccompress&w=3840","https://hackernoon.imgix.net/hn-images/0*-RRtkvYI3B7LvFeT.png?auto=format%2Ccompress&w=3840","https://hackernoon.imgix.net/hn-images/0*Tjx1XgwC9lZZgtCP.png?auto=format%2Ccompress&w=3840","https://hackernoon.imgix.net/hn-images/0*z21gtl_jfN-kE-nn.png?auto=format%2Ccompress&w=3840","https://hackernoon.imgix.net/hn-images/0*NoHAE22yc7RxaT9V.png?auto=format%2Ccompress&w=1920","https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png","https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&w=3840","https://hackernoon.imgix.net/images/Print%20Icon%20%4025px.png?auto=format%2Ccompress&w=48","https://hackernoon.imgix.net/hn-images/0*TDIcxxsnG-n_eap0.png?auto=format%2Ccompress&w=3840","https://hackernoon.imgix.net/hn-images/0*P8P9xvKvn_-IdQzv.png?auto=format%2Ccompress&w=3840","https://hackernoon.imgix.net/hn-images/0*CsuMFbXUfo4gUeLy.png?auto=format%2Ccompress&w=3840"],"movies":[]},"html":"<!DOCTYPE html><html lang=\"en\"><head><meta charSet=\"utf-8\" data-next-head=\"\"/><meta name=\"viewport\" content=\"width=device-width\" data-next-head=\"\"/><script async=\"\" src=\"https://www.googletagmanager.com/gtag/js?id=G-ECJJ2Q2SJQ\"></script><title data-next-head=\"\"></title><link rel=\"preconnect\" href=\"https://bridge.hackernoon.com\" data-next-head=\"\"/><link rel=\"preconnect\" href=\"https://cdn.hackernoon.com\" data-next-head=\"\"/><link rel=\"preconnect\" href=\"https://hackernoon.imgix.net\" data-next-head=\"\"/><link rel=\"dns-prefetch\" href=\"https://cdn.hackernoon.com\" data-next-head=\"\"/><meta name=\"description\" content=\"With AWS Lambda, we get scalability and resilience out-of-the-box. What\u2019s more, AWS also provides built-in monitoring, logging and tracing support through CloudWatch and X-Ray. These built-in tools provide a good starting point but many developers eventually outgrow them as their serverless application becomes more complex.\" data-next-head=\"\"/><meta property=\"og:title\" content=\"Debugging Serverless Applications with Dashbird | HackerNoon\" data-next-head=\"\"/><meta property=\"og:description\" content=\"With AWS Lambda, we get scalability and resilience out-of-the-box. What\u2019s more, AWS also provides built-in monitoring, logging and tracing support through CloudWatch and X-Ray. These built-in tools provide a good starting point but many developers eventually outgrow them as their serverless application becomes more complex.\" data-next-head=\"\"/><meta name=\"image\" property=\"og:image\" content=\"https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png\" data-next-head=\"\"/><meta property=\"twitter:title\" content=\"Debugging Serverless Applications with Dashbird | HackerNoon\" data-next-head=\"\"/><meta property=\"twitter:description\" content=\"With AWS Lambda, we get scalability and resilience out-of-the-box. What\u2019s more, AWS also provides built-in monitoring, logging and tracing support through CloudWatch and X-Ray. These built-in tools provide a good starting point but many developers eventually outgrow them as their serverless application becomes more complex.\" data-next-head=\"\"/><meta property=\"twitter:image\" content=\"https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png\" data-next-head=\"\"/><meta name=\"twitter:card\" content=\"summary_large_image\" data-next-head=\"\"/><meta name=\"twitter:site\" content=\"@hackernoon\" data-next-head=\"\"/><link rel=\"canonical\" href=\"https://hackernoon.com/debugging-serverless-applications-with-dashbird-82a2ed86d757\" data-next-head=\"\"/><link rel=\"preload\" as=\"font\" href=\"/fonts/HackerNoonFont/hackernoonv1-regular-webfont.woff2\" type=\"font/woff2\" crossorigin=\"anonymous\"/><link rel=\"preconnect\" href=\"https://fonts.googleapis.com\"/><link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin=\"anonymous\"/><link data-next-font=\"\" rel=\"preconnect\" href=\"/\" crossorigin=\"anonymous\"/><link rel=\"preload\" href=\"/_next/static/css/18f5dc2e2a9297b5.css\" as=\"style\"/><link rel=\"preload\" href=\"/_next/static/css/6d530d6069fd563f.css\" as=\"style\"/><link rel=\"preload\" as=\"image\" imageSrcSet=\"https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=640 640w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=750 750w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=828 828w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=1080 1080w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=1200 1200w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=1920 1920w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=2048 2048w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=3840 3840w\" imageSizes=\"(max-width: 768px) 100vw, 900px\" data-next-head=\"\"/><script type=\"application/ld+json\" data-next-head=\"\">{\"@context\":\"http://schema.org\",\"@type\":\"Article\",\"name\":\"Debugging Serverless Applications with Dashbird\",\"headline\":\"Debugging Serverless Applications with Dashbird\",\"author\":{\"@type\":\"Person\",\"name\":\"Yan Cui\"},\"datePublished\":\"2019-01-29\",\"image\":\"https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png\",\"articleSection\":\"aws\",\"articleBody\":\"With AWS Lambda, we get scalability and resilience out-of-the-box. What\u2019s more, AWS also provides built-in monitoring, logging and tracing support through CloudWatch and X-Ray. These built-in tools provide a good starting point but many developers eventually outgrow them as their serverless application becomes more complex. In this post, let\u2019s take a serverless application and see how can help you debug the application. Dashbird Challenges with serverless observability When it comes to observability, serverless has introduced some interesting challenges. For so long, we have relied on the use of agents and daemons to collect metrics and logs. They run silently in the background, away from our critical paths where we are concerned with minimizing user-facing latencies. They collect, buffer and publish these observability data in batches to improve efficiency. As a practice, they are so deeply ingrained into how we monitor our applications, until now. When it comes to serverless, specifically with managed platforms such as AWS Lambda, there\u2019s simply nowhere for us to install these agents! To collect metrics and logs as part of your function\u2019s invocation would understandably add overhead to its invocation time. Since AWS is collecting logs from your function asynchronously already, and publishing them to CloudWatch Logs. A common workaround is to subscribe to these logs and perform post-processing on them. Indeed, that is how Dashbird collects data about your function\u2019s execution. It subscribes the CloudWatch Logs log groups to a Kinesis stream and then processes the events from there. You can read about the advantages of this approach in . this article As our serverless applications become more complex, it\u2019s important for us to be able to trace executions across multiple functions. As the demo app demonstrates, even a simple user transaction can span across multiple event sources as well as Lambda functions. The demo\u00a0app Imagine you\u2019re building a Twitter clone. One of the core features of the system is to distribute a user\u2019s post to his followers\u2019 feeds. To implement this feature, imagine we have two separate API endpoints: POST posts/create\u00a0: to create a new post for the current user GET followers/{userId}\u00a0: to fetch a user\u2019s followers Each endpoint is handled by a separate Lambda function\u200a\u2014 and respectively. create-post get-followers When a user publishes a new post, the function would save the post in the DynamoDB table and also publish a event into a Kinesis stream. This event then triggers a function. This function would query the endpoint and then add the post to the followers\u2019 feeds. The function would query the DynamoDB table to return the IDs of the user\u2019s followers. create-post posts post-created distribute-post GET followers/{userId} get-followers followers For brevity sake I have omitted the logic for actually distributing the posts. So the overall architecture for our demo app looks like the following. To make things more interesting, each of the Lambda functions are hardwired to error or timeout based on a configurable probability. The source code for the demo app is , so feel free to try it out yourself. available on Github Introducing Dashbird Even with a simple serverless application like the one outlined above, we have quite a few functions to look after. Let\u2019s see how we can use Dashbird to help us monitor this application and debug issues. As soon as I log in, I have a high level dashboard for my account. In addition to the data I get in the AWS Lambda console (see below), the Dashbird dashboard has two useful data points: Average memory utilization for the functions Cost for the Lambda invocations Next, in Dashbird\u2019s Lambda console, I can see a high level summary of my functions and their activities over the last 24 hours. What I find very useful here is the fact that it highlights functions that have been idle for 10 days as inactive. As your serverless architecture expands and you end up with hundreds of functions, maintained by different teams, it\u2019s very difficult to track which functions are no longer needed. Having redundant functions lying around is a security risk as they remain an attack surface that can be exploited. While this view alone cannot tell you definitively which functions are no longer used. Many functions are not run on a regular basis. Maybe they are part of a cron job that only runs once a month. Or maybe they are only used during disaster recovery scenarios. Nonetheless, being aware of which functions are inactive encourages teams to ask the question \u201cIs this function still needed?\u201d. From here, maybe better practices can emerge. For example, use tags to mark functions that are expected to be used sparingly so they are not flagged by these checks. If I navigate to one of the functions, then I have a function-centric view of invocation time, error, cost and memory utilization. In addition, I can also see a list of the recent invocations. What\u2019s really useful here is that cold starts and retries are clearly labelled. When debugging live issues this lets me quickly narrow down the invocations that I need to pay attention to. Straight away, I can see that 3 of the invocations timed out after 6 seconds. What\u2019s more, the original Kinesis event was retried 3 times and finally succeeded on the third retry. If I click on the \u201c+\u201d button next to an invocation then I can drill down to the invocation itself. Here I can see the logs and X-Ray trace for this invocation in one screen. This is great as it saves me from having to constantly jump between different AWS console. Debugging with\u00a0Dashbird As mentioned before, the demo app is hardwired to error and timeout. And sure enough, when these failure cases happen, Dashbird\u2019s built-in alerting kicks in and I promptly received emails notifying me that something went wrong. While this built-in alerting is great, I couldn\u2019t see any settings to adjust the alert sensitivity. As I followed the links in the emails, to the function, then the failed invocation. Dashbird neatly groups the related invocations\u200a\u2014\u200athe initial timeout, and the subsequent retries\u200a\u2014\u200atogether. I can quickly see that the failed Kinesis event was successfully processed on the 3rd retry. Dashbird also tracks the open issues in the Errors console. Now that I know the problem has resolved itself I can go ahead and resolve the error. Tailing function\u00a0logs Another nice feature of Dashbird is that it\u2019s able to tail the logs for multiple functions at the same time. For the demo app, I want to see the logs for both the and functions as I curl the endpoint. create-post distribute-post POST posts/create That way, I can see that the event was successfully published into the Kinesis stream, and was subsequently received by the function. distribute-post Conclusion Overall I was impressed with what Dashbird has to offer, and it\u2019s clear that a lot of thought has gone into the product. It has many nice touches that makes debugging much easier. For example, grouping retries together, and integrating X-Ray traces and logs in one screen. These might seem like trivial niceties, but they can make a big difference under the high-pressure scenarios of dealing with a live issue. From what I have been able to see, I think Dashbird is a really great tool. The main thing missing for me is the ability to trace executions end-to-end. Personally, I\u2019d really like to see the entire execution traced from the API call to create a post, all the way to the function performing a Query against the DynamoDB table. get-followers followers If you\u2019re solely relying on the built-in AWS tools (CloudWatch, CloudWatch Logs, and X-Ray) then you should give Dashbird a try. Why not sign up for a free trial, and deploy the demo app to your environment so you can see how Dashbird can help you debug your serverless application? Originally published at dashbird.io on January 25, 2019.\"}</script><link href=\"https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;700&amp;family=IBM+Plex+Sans:wght@400;700&amp;family=Inter:wght@400;600;900&amp;family=Source+Code+Pro:wght@400;500;600;700&amp;display=swap\" rel=\"stylesheet\" media=\"print\"/><noscript><link href=\"https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;700&amp;family=IBM+Plex+Sans:wght@400;700&amp;family=Inter:wght@400;600;900&amp;family=Source+Code+Pro:wght@400;500;600;700&amp;display=swap\" rel=\"stylesheet\"/></noscript> <!-- --><script id=\"ga4-init\">\n                window.dataLayer = window.dataLayer || [];\n                function gtag(){dataLayer.push(arguments);}\n\n                // Consent Mode: default to denied\n                gtag('consent', 'default', {\n                  'ad_storage': 'denied',\n                  'analytics_storage': 'denied',\n                  'ad_user_data': 'denied',\n                  'ad_personalization': 'denied'\n                });\n\n                gtag('js', new Date());\n                gtag('config', 'G-ECJJ2Q2SJQ');\n              </script><script id=\"iubenda-init\">\n                function initIubenda() {\n                  (async function () {\n                    try {\n                      const res = await fetch(\"https://geolocation-db.com/json/\");\n                      const data = await res.json();\n                      const country = data && data.country_code;\n\n                      const GDPR_COUNTRIES = [\n                        \"AT\",\"BE\",\"BG\",\"HR\",\"CY\",\"CZ\",\"DK\",\"EE\",\"FI\",\"FR\",\"DE\",\"GR\",\"HU\",\n                        \"IE\",\"IT\",\"LV\",\"LT\",\"LU\",\"MT\",\"NL\",\"PL\",\"PT\",\"RO\",\"SK\",\"SI\",\"ES\",\n                        \"SE\",\"IS\",\"LI\",\"NO\",\"UK\",\"GB\"\n                      ];\n                      var isGdpr = GDPR_COUNTRIES.indexOf(country) > -1;\n\n                      window._iub = window._iub || [];\n                      window._iub.csConfiguration = {\n                        siteId: 1848357,\n                        cookiePolicyId: 18778700,\n                        lang: \"en\",\n                        enableTcf: false,\n                        googleAdditionalConsentMode: true,\n                        banner: {\n                          position: \"bottom\",\n                          rejectButtonDisplay: true,\n                          explicitWithdrawal: true,\n                          customizeButtonDisplay: true,\n                          acceptButtonDisplay: true,\n                          showTotalNumberOfProviders: false,\n                          display: isGdpr\n                        }\n                      };\n\n                      var iubScript = document.createElement(\"script\");\n                      iubScript.src = \"https://cdn.iubenda.com/cs/iubenda_cs.js\";\n                      iubScript.async = true;\n                      document.head.appendChild(iubScript);\n\n                      if (!isGdpr) {\n                        gtag('consent', 'update', {\n                          'ad_storage': 'granted',\n                          'analytics_storage': 'granted',\n                          'ad_user_data': 'granted',\n                          'ad_personalization': 'granted'\n                        });\n                      }\n                    } catch (e) {\n                      console.error(\"Iubenda geolocation failed\", e);\n                    }\n                  })();\n                }\n\n                // Defer until browser is idle \u2014 never blocks initial render\n                if (typeof requestIdleCallback !== 'undefined') {\n                  requestIdleCallback(initIubenda, { timeout: 3000 });\n                } else {\n                  setTimeout(initIubenda, 1000);\n                }\n              </script><script id=\"iubenda-consent-bridge\">\n                window.addEventListener(\"iubenda_consent_given\", function () {\n                  gtag('consent', 'update', {\n                    'ad_storage': 'granted',\n                    'analytics_storage': 'granted',\n                    'ad_user_data': 'granted',\n                    'ad_personalization': 'granted'\n                  });\n\n                  gtag('event', 'page_view', {\n                    page_title: document.title,\n                    page_location: location.href,\n                    page_path: location.pathname + location.search\n                  });\n                });\n              </script><link rel=\"stylesheet\" href=\"/_next/static/css/18f5dc2e2a9297b5.css\" data-n-g=\"\"/><link rel=\"stylesheet\" href=\"/_next/static/css/6d530d6069fd563f.css\" data-n-p=\"\"/><noscript data-n-css=\"\"></noscript><script defer=\"\" noModule=\"\" src=\"/_next/static/chunks/polyfills-42372ed130431b0a.js\"></script><script src=\"https://accounts.google.com/gsi/client\" defer=\"\" data-nscript=\"beforeInteractive\"></script><script defer=\"\" src=\"/_next/static/chunks/7618.b7c0d1c84368de01.js\"></script><script defer=\"\" src=\"/_next/static/chunks/3213.7a85381e883f5859.js\"></script><script defer=\"\" src=\"/_next/static/chunks/7127.9c425c4d3409a6ac.js\"></script><script defer=\"\" src=\"/_next/static/chunks/3304.7c3523eee5ba4042.js\"></script><script defer=\"\" src=\"/_next/static/chunks/1826.1ab3736f712279dc.js\"></script><script defer=\"\" src=\"/_next/static/chunks/b6790ad6-21a72b711b29c9a6.js\"></script><script defer=\"\" src=\"/_next/static/chunks/4829-32ed3fa27f9fba8a.js\"></script><script defer=\"\" src=\"/_next/static/chunks/8145-56bb137bc815feca.js\"></script><script defer=\"\" src=\"/_next/static/chunks/7878-038a9b85114cf28d.js\"></script><script defer=\"\" src=\"/_next/static/chunks/9407-02afcd7299ecf2e9.js\"></script><script defer=\"\" src=\"/_next/static/chunks/1866-36cbb79df614e742.js\"></script><script defer=\"\" src=\"/_next/static/chunks/997.043403d1cfb4d583.js\"></script><script defer=\"\" src=\"/_next/static/chunks/9997.0bcf115a883cf0c1.js\"></script><script defer=\"\" src=\"/_next/static/chunks/9752.3009abfbb03a92d6.js\"></script><script defer=\"\" src=\"/_next/static/chunks/1486.6875746f7e7b3bd6.js\"></script><script defer=\"\" src=\"/_next/static/chunks/2348.6ff1c8ab2b7f714e.js\"></script><script src=\"/_next/static/chunks/webpack-f960f9b73d3d2f68.js\" defer=\"\"></script><script src=\"/_next/static/chunks/framework-594babcea68f40f6.js\" defer=\"\"></script><script src=\"/_next/static/chunks/main-f4c6b80eccf8d9c3.js\" defer=\"\"></script><script src=\"/_next/static/chunks/pages/_app-b4763b9c6e60219d.js\" defer=\"\"></script><script src=\"/_next/static/chunks/4004-46cbf9060446c734.js\" defer=\"\"></script><script src=\"/_next/static/chunks/3363-3997af8403818196.js\" defer=\"\"></script><script src=\"/_next/static/chunks/8230-f743aded49f5ec53.js\" defer=\"\"></script><script src=\"/_next/static/chunks/5857-ec7c040b0c106d7c.js\" defer=\"\"></script><script src=\"/_next/static/chunks/7871-49db796a808d2c70.js\" defer=\"\"></script><script src=\"/_next/static/chunks/3261-28f7d7d5ddf137c8.js\" defer=\"\"></script><script src=\"/_next/static/chunks/1902-922299f711a16f76.js\" defer=\"\"></script><script src=\"/_next/static/chunks/8581-1c63d69fe79360dc.js\" defer=\"\"></script><script src=\"/_next/static/chunks/4680-486b209e44768b17.js\" defer=\"\"></script><script src=\"/_next/static/chunks/2562-5aa3cd1aa6e464a5.js\" defer=\"\"></script><script src=\"/_next/static/chunks/8373-1c61bad6a8e1fdcb.js\" defer=\"\"></script><script src=\"/_next/static/chunks/7701-92913481d8f90585.js\" defer=\"\"></script><script src=\"/_next/static/chunks/7225-bca2c081fcf5d008.js\" defer=\"\"></script><script src=\"/_next/static/chunks/pages/%5Bslug%5D-ef00a1d8cc6c5d79.js\" defer=\"\"></script><script src=\"/_next/static/pN9uscjfiBPXE13xRBm1c/_buildManifest.js\" defer=\"\"></script><script src=\"/_next/static/pN9uscjfiBPXE13xRBm1c/_ssgManifest.js\" defer=\"\"></script></head><body><link rel=\"preload\" as=\"image\" imageSrcSet=\"https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=640 640w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=750 750w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=828 828w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=1080 1080w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=1200 1200w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=1920 1920w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=2048 2048w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=3840 3840w\" imageSizes=\"(max-width: 768px) 100vw, 1200px\" fetchPriority=\"high\"/><div id=\"__next\"><div class=\"bg-light text-lightText font-[ibm-plex-mono]\"><main><header class=\"font-[ibm-plex-sans] fixed top-0 left-0 w-full z-50 transition-all duration-500 ease-in-out translate-y-0\"><div class=\"flex items-center justify-between bg-primary  lg:navbar h-[50px] sm:min-h-[75px] transition-all duration-100 shadow-md  w-full\"><div class=\"hidden lg:flex navbar-start h-full items-center ml-1\"><button class=\"flex items-center hover:scale-[1.01]  justify-center rounded-lg text-base px-4 font-bold py-2 border-none  bg-primary-content text-primaryContentText\">Discover Anything<i class=\"hn hn-search text-lg ml-4 text-primaryContentText \"></i></button></div><div class=\"nav-start lg:navbar-center ml-2 lg:ml-0 min-w-0 flex-shrink\"><a class=\"relative z-10 flex items-center space-x-2 hover:scale-[1.02]\" aria-label=\"HackerNoon Homepage\" href=\"/\"><svg class=\"w-[180px] xs:w-[200px] sm:w-[240px] lg:w-[260px] h-auto\" viewBox=\"0 0 2150 260\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMidYMid meet\" style=\"transition:fill 150ms ease\"><g style=\"transition:fill 150ms ease\"><path d=\"M269.997 20.0005V0H130V20.0005V40.0011V60.0016H150H169.995V40.0011H189.995H229.996V60.0016H249.997H269.997V40.0011V20.0005Z\" fill=\"transparent\"></path><path d=\"M130.006 80.003V60.0024H110.006V80.003V100.004H130.006V80.003Z\" fill=\"transparent\"></path><path d=\"M110 119.998V100.003H90V119.998V139.998V159.999H110V139.998V119.998Z\" fill=\"transparent\"></path><path d=\"M270 100.004H290V80.003V60.0024H270V80.003V100.004Z\" fill=\"transparent\"></path><path d=\"M310 119.997V100.002H290V119.997V139.998V159.998H310V139.998H330.001V119.997H310Z\" fill=\"transparent\"></path><path d=\"M130 159.998H110V179.998V199.999H130V179.998V159.998Z\" fill=\"transparent\"></path><path d=\"M270 179.998V199.999H290V179.998V159.998H270V179.998Z\" fill=\"transparent\"></path><path d=\"M130 260V240V219.999V199.999H150H169.995V219.999H189.995H209.996H229.996V199.999H249.997H269.997V219.999V240V260H130Z\" fill=\"transparent\"></path><path d=\"M210.415 39.74V59.7405V79.7411V99.7416V119.736V139.737H190.415V119.736V99.7416V79.7411V59.7405V39.74H210.415Z\" fill=\"transparent\"></path><path d=\"M390 200V60H417.801V116.676H501.206V60H530V200H501.206V144.517H417.801V200H390Z\" fill=\"transparent\"></path><path d=\"M672.199 116.676V88.8352H588.794V116.676H672.199ZM560 200V60H700V200H672.199V144.517H588.794V200H560Z\" fill=\"transparent\"></path><path d=\"M730 200V60H870V88.8352H758.794V172.159H870V200H730Z\" fill=\"transparent\"></path><path d=\"M900 200V60H928.794V116.276H984.397V143.724H928.794V200H900ZM1012.2 171.368H984.397V143.724H1012.2V171.368ZM1012.2 171.368H1040V199.013H1012.2V171.368ZM1012.2 88.6319V116.276H984.397V88.6319H1012.2ZM1012.2 88.6319V60H1040V88.6319H1012.2Z\" fill=\"transparent\"></path><path d=\"M1070 200V60H1210V88.8352H1098.79V116.676H1154.4V144.517H1098.79V172.159H1210V200H1070Z\" fill=\"transparent\"></path><path d=\"M1351.24 116.519V88.7589H1267.76V116.519H1351.24ZM1240 200V60H1380V144.479H1351.24V172.24H1380V200H1351.24V172.24H1323.48V144.479H1267.76V200H1240Z\" fill=\"transparent\"></path><path d=\"M1410 200V60H1550V200H1522.24V88.7589H1438.76V200H1410Z\" fill=\"transparent\"></path><path d=\"M1692.24 172.24V88.7589H1608.76V172.24H1692.24ZM1580 200V60H1720V200H1580Z\" fill=\"transparent\"></path><path d=\"M1862.04 172.24V88.7589H1778.97V172.24H1862.04ZM1750 200V60H1890V200H1750Z\" fill=\"transparent\"></path><path d=\"M1920 200V60H2060V200H2032.24V88.7589H1948.76V200H1920Z\" fill=\"transparent\"></path></g></svg></a></div><div class=\"navbar-end h-full flex items-center min-w-[100px] lg:min-w-[200px] space-x-4 mr-2\"><div class=\" h-[40px] flex items-center justify-center\"></div><div class=\"hidden sm:flex space-x-4   \"><button class=\"px-4 font-bold text-base py-1 sm:py-2 bg-primary-content text-primaryContentText rounded-md transition-all duration-300\">Signup</button><a class=\"px-4 hover:scale-105 font-bold text-base py-2  bg-primary-content text-primaryContentText rounded-md \" href=\"/new\">Write</a></div><button class=\"btn border-none p-0 m-0 lg:hidden bg-transparent hover:bg-transparent text-primary-content hover:scale-110\"><i class=\"hn hn-search text-xl mr-2 \"></i></button><button class=\"lg:flex hidden items-center hover:scale-110 text-primary-content\" aria-label=\"Notifications\"><i width=\"20\" class=\"hn hn-bell text-2xl w-4 h-4 sm:w-6 sm:h-6\"></i></button><button class=\"flex items-center hover:scale-110 text-primary-content\" aria-label=\"Menu\"><i class=\"hn hn-bars text-2xl text-primary-content\"></i></button></div></div><div class=\"z-20 hidden lg:block h-[52px] transition-all duration-500 ease-in-out\"><nav class=\"h-[52px] bg-secondary animate-pulse\"></nav></div><div class=\"flex items-center \"><div class=\"bg-accent text-accent-content flex items-center h-[62px] sm:min-h-[80px]  font-[ibm-plex-sans] w-full  relative z-10 opacity-100\"><div class=\"h-[62px] sm:h-[80px] bg-[transparent] animate-pulse\"></div></div></div></header><div class=\"transition-all duration-200 pt-[112px] sm:pt-[155px] lg:pt-[207px]\"><div data-rht-toaster=\"\" style=\"position:fixed;z-index:9999;top:16px;left:16px;right:16px;bottom:16px;pointer-events:none\"></div><div class=\"\"><div class=\"bg-light text-lightText  h-auto xl:mx-2 \"><div class=\"col-span-12\"><div class=\"max-w-[1200px] mx-auto px-2 xs:px-4  xl: xl:px-0 mt-10\"><div class=\"\"><div><div class=\"text-xs\"><div class=\"mb-4 flex gap-2\"><span class=\"bg-lightAlt p-2 rounded-lg inline-flex gap-2 items-center justify-start\"><i class=\"hn hn-star-solid\"></i> <!-- -->490<!-- --> <!-- -->reads</span></div><h1 class=\"font-bold line-clamp-4 leading-snug text-lightTextStrong \n              text-xl sm:text-2xl xl:text-3xl 3xl:text-4xl tracking-wide\n\n                \">Debugging Serverless Applications with Dashbird</h1><div class=\"flex flex-wrap border-y border-lightBorder my-4 sm:my-2 sm:border-t-0 py-2 items-center justify-between text-lightTextLight text-sm sm:text-base xl:text-xl \"><div class=\"flex flex-wrap justify-between w-full xs:w-auto  items-center gap-2\"><span class=\"flex items-center  flex-wrap gap-2 mr-10 sm:mr-0 \">by<div class=\"dropdown dropdown-hover \"><label tabindex=\"0\"><a aria-label=\"View profile of Yan Cui\" href=\"/u/theburningmonk\"><strong class=\"...\">Yan Cui</strong></a></label><div class=\"dropdown-content z-[1] pt-2 sm:pt-1 left-[-40px] w-[280px] xs:w-[320px] sm:w-[400px] bg-transparent menu rounded \"><div class=\"w-full   \"><div class=\" p-4 border border-lightBorder bg-light rounded-lg\"><a href=\"/u/theburningmonk\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"flex items-start text-sm rounded-lg group gap-2\"><div class=\"\"><img alt=\"Yan Cui\" loading=\"lazy\" width=\"40\" height=\"40\" decoding=\"async\" data-nimg=\"1\" class=\"w-10 h-9 border-solid border border-lightBorder rounded-full object-contain\" style=\"color:transparent\" srcSet=\"https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=48 1x, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=96 2x\" src=\"https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=96\"/></div><span class=\"flex flex-col min-w-0 w-full justify-center\"><span class=\"flex items-center gap-1 text-ellipsis overflow-hidden whitespace-nowrap\"><span class=\"font-bold group-hover:underline text-sm truncate\"><span class=\"text-xs font-light mr-1\">by</span>Yan Cui</span><span class=\"text-xs font-light opacity-50\">|</span><span class=\"text-sm false text-ellipsis overflow-hidden whitespace-nowrap\" title=\"@theburningmonk\">@<!-- -->theburningmonk</span></span></span></a><p class=\"text-sm overflow-x-auto mt-2 text-bodyTxtLight\">AWS Serverless Hero. Independent Consultant. Developer Advocate at Lumigo.</p><div class=\"mt-4\"><div class=\"w-full flex justify-start\"><div class=\"w-full\"><form class=\"w-full flex flex-col items-start gap-2 \"><div class=\"flex w-full\"><input class=\"p-2 flex-grow  border rounded-l-md text-lightText bg-light focus:outline-none focus:ring-0 focus:ring-transparent border-lightBorder w-full text-base px-2} \n                  }\" placeholder=\"name@company.com\" type=\"email\" required=\"\" name=\"email\" value=\"\"/><button type=\"submit\" class=\"text-base} \n                bg-lightAlt border border-l-0 border-lightBorder hover:bg-green-700 text-lightText hover:bg-dark hover:text-darkText  px-2 py-1 rounded-r-md  font-bold\">Subscribe</button></div></form></div></div></div></div></div></div></div></span><div class=\"flex gap-2 items-center cursor-pointer\"><span class=\"hidden sm:block w-1 h-1 bg-lightTextLight mx-4 rounded-full\"></span><a href=\"/archives/2019/01/29\"><span class=\"text-xs xs:text-sm lg:text-base\">January 29th, 2019</span></a></div></div><div class=\"hidden xl:block\"><div class=\" flex items-center gap-4 \"><span class=\"tooltip tooltip-left tooltip-left  w-7 h-7 flex items-center justify-center  cursor-pointer\" data-tip=\"Terminal Reader\"><img alt=\"Read on Terminal Reader\" loading=\"lazy\" width=\"20\" height=\"20\" decoding=\"async\" data-nimg=\"1\" style=\"color:transparent\" srcSet=\"https://hackernoon.imgix.net/computer.png?auto=format%2Ccompress&amp;w=32 1x, https://hackernoon.imgix.net/computer.png?auto=format%2Ccompress&amp;w=48 2x\" src=\"https://hackernoon.imgix.net/computer.png?auto=format%2Ccompress&amp;w=48\"/></span><span class=\"tooltip tooltip-left tooltip-left  w-7 h-7 flex items-center justify-center  cursor-pointer\" data-tip=\"Print this story\"><img alt=\"Print this story\" data-tip=\"true\" data-for=\"print-page\" loading=\"lazy\" width=\"20\" height=\"20\" decoding=\"async\" data-nimg=\"1\" style=\"color:transparent\" srcSet=\"https://hackernoon.imgix.net/images/Print%20Icon%20%4025px.png?auto=format%2Ccompress&amp;w=32 1x, https://hackernoon.imgix.net/images/Print%20Icon%20%4025px.png?auto=format%2Ccompress&amp;w=48 2x\" src=\"https://hackernoon.imgix.net/images/Print%20Icon%20%4025px.png?auto=format%2Ccompress&amp;w=48\"/></span><span class=\"tooltip tooltip-left tooltip-left   w-7 h-7 flex items-center justify-center cursor-pointer\" data-tip=\"Read this story w/o Javascript\"><img alt=\"Read this story w/o Javascript\" data-tip=\"true\" data-for=\"arweave-backup\" loading=\"lazy\" width=\"20\" height=\"20\" decoding=\"async\" data-nimg=\"1\" style=\"color:transparent\" srcSet=\"https://hackernoon.imgix.net/images/Lite%20Icon%20%4025px.png?auto=format%2Ccompress&amp;w=32 1x, https://hackernoon.imgix.net/images/Lite%20Icon%20%4025px.png?auto=format%2Ccompress&amp;w=48 2x\" src=\"https://hackernoon.imgix.net/images/Lite%20Icon%20%4025px.png?auto=format%2Ccompress&amp;w=48\"/></span></div></div></div></div><div class=\"mb-2 \"><div class=\"flex justify-between  \"><button class=\"flex m-1 px-2 xl:px-4 h-[40px] items-center font-[hackernoon2] bg-dark text-darkText  text-xs sm:text-sm rounded-lg border border-lightBorder\">TLDR <i class=\"hn hn-angle-right text-base ml-1 \"></i></button><div class=\"flex items-center gap-2\"><div class=\"hidden sm:block xl:hidden\"><div class=\" flex items-center gap-4 \"><span class=\"tooltip tooltip-left undefined  w-7 h-7 flex items-center justify-center  cursor-pointer\" data-tip=\"Terminal Reader\"><img alt=\"Read on Terminal Reader\" loading=\"lazy\" width=\"20\" height=\"20\" decoding=\"async\" data-nimg=\"1\" style=\"color:transparent\" srcSet=\"https://hackernoon.imgix.net/computer.png?auto=format%2Ccompress&amp;w=32 1x, https://hackernoon.imgix.net/computer.png?auto=format%2Ccompress&amp;w=48 2x\" src=\"https://hackernoon.imgix.net/computer.png?auto=format%2Ccompress&amp;w=48\"/></span><span class=\"tooltip tooltip-left undefined  w-7 h-7 flex items-center justify-center  cursor-pointer\" data-tip=\"Print this story\"><img alt=\"Print this story\" data-tip=\"true\" data-for=\"print-page\" loading=\"lazy\" width=\"20\" height=\"20\" decoding=\"async\" data-nimg=\"1\" style=\"color:transparent\" srcSet=\"https://hackernoon.imgix.net/images/Print%20Icon%20%4025px.png?auto=format%2Ccompress&amp;w=32 1x, https://hackernoon.imgix.net/images/Print%20Icon%20%4025px.png?auto=format%2Ccompress&amp;w=48 2x\" src=\"https://hackernoon.imgix.net/images/Print%20Icon%20%4025px.png?auto=format%2Ccompress&amp;w=48\"/></span><span class=\"tooltip tooltip-left undefined   w-7 h-7 flex items-center justify-center cursor-pointer\" data-tip=\"Read this story w/o Javascript\"><img alt=\"Read this story w/o Javascript\" data-tip=\"true\" data-for=\"arweave-backup\" loading=\"lazy\" width=\"20\" height=\"20\" decoding=\"async\" data-nimg=\"1\" style=\"color:transparent\" srcSet=\"https://hackernoon.imgix.net/images/Lite%20Icon%20%4025px.png?auto=format%2Ccompress&amp;w=32 1x, https://hackernoon.imgix.net/images/Lite%20Icon%20%4025px.png?auto=format%2Ccompress&amp;w=48 2x\" src=\"https://hackernoon.imgix.net/images/Lite%20Icon%20%4025px.png?auto=format%2Ccompress&amp;w=48\"/></span></div></div><div class=\"xl:hidden\"></div></div><div class=\"hidden xl:flex items-center flex-wrap gap-2\"></div></div></div></div></div></div><div class=\"max-w-[1200px] mx-auto\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto px-[14px] md:px-0 w-full\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"featured image - Debugging Serverless Applications with Dashbird\" fetchPriority=\"high\" loading=\"eager\" width=\"1600\" height=\"655\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 1600 655&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjY1NSIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJnIj4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMjIiIG9mZnNldD0iMjAlIiAvPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzBmMCIgb2Zmc2V0PSI1MCUiIC8+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyIiBvZmZzZXQ9IjgwJSIgLz4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0IHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjY1NSIgZmlsbD0iIzIyMiIgLz4KICAgICAgPHJlY3QgaWQ9InIiIHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjY1NSIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii0xNjAwIiB0bz0iMTYwMCIgZHVyPSIxcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiICAvPgogICAgPC9zdmc+&#x27;/%3E%3C/svg%3E&quot;)\" sizes=\"(max-width: 768px) 100vw, 1200px\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=640 640w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=750 750w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=828 828w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=1080 1080w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=1200 1200w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=1920 1920w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=2048 2048w, https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=3840 3840w\" src=\"https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png?auto=format%2Ccompress&amp;w=3840\"/></div></div></div><div class=\"px-2 xs:px-4 3xl:px-0 my-4 sm:mt-4 sm:mb-6 max-w-[1200px] 6xl:max-w-[1200px] mx-auto \"></div><div class=\" flex xl:hidden bg-light z-10 mx-auto  gap-4 items-center border-y sticky top-[62px] sm:top-[80px]  py-2 sm:py-0 \"><div class=\"w-full max-w-[1200px] mx-auto px-4 flex justify-between items-center\"><div class=\"6xl:hidden dropdown dropdown-bottom dropdown-hover\"><div tabindex=\"0\" role=\"button\" class=\"flex text-sm rounded-lg py-2\"><div class=\"mr-2 flex -space-x-2 items-center \"><div class=\"\"><img alt=\"Yan Cui\" loading=\"lazy\" width=\"48\" height=\"48\" decoding=\"async\" data-nimg=\"1\" class=\"w-10 h-10 sm:w-12 sm:h-12 bg-light relative border border-lightBorder rounded-full object-contain\" style=\"color:transparent;z-index:1\" srcSet=\"https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=48 1x, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=96 2x\" src=\"https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=96\"/></div></div><div class=\"flex-col hidden sm:flex flex-wrap\"><span class=\"font-bold mx-2 text-sm\"><span class=\"text-xs font-light mr-1\">by</span>Yan Cui</span><span class=\"text-sm ml-2\">@<!-- -->theburningmonk</span></div></div><ul tabindex=\"0\" class=\"dropdown-content menu w-[300px] py-1 left-[-20px] bg-light px-1  ml-4  rounded-b-lg 3xl:border-none rounded-boxabsolute z-50\"><div class=\"flex w-full flex-col gap-4\"><div><div class=\"w-full   \"><div class=\" p-4 border border-lightBorder bg-light rounded-lg\"><a href=\"/u/theburningmonk\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"flex items-start text-sm rounded-lg group gap-2\"><div class=\"\"><img alt=\"Yan Cui\" loading=\"lazy\" width=\"40\" height=\"40\" decoding=\"async\" data-nimg=\"1\" class=\"w-10 h-9 border-solid border border-lightBorder rounded-full object-contain\" style=\"color:transparent\" srcSet=\"https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=48 1x, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=96 2x\" src=\"https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=96\"/></div><span class=\"flex flex-col min-w-0 w-full justify-center\"><span class=\"flex items-center gap-1 text-ellipsis overflow-hidden whitespace-nowrap\"><span class=\"font-bold group-hover:underline text-sm truncate\"><span class=\"text-xs font-light mr-1\">by</span>Yan Cui</span><span class=\"text-xs font-light opacity-50\">|</span><span class=\"text-sm false text-ellipsis overflow-hidden whitespace-nowrap\" title=\"@theburningmonk\">@<!-- -->theburningmonk</span></span></span></a><p class=\"text-sm overflow-x-auto mt-2 text-bodyTxtLight\">AWS Serverless Hero. Independent Consultant. Developer Advocate at Lumigo.</p><div class=\"mt-4\"><div class=\"w-full flex justify-start\"><div class=\"w-full\"><form class=\"w-full flex flex-col items-start gap-2 \"><div class=\"flex w-full\"><input class=\"p-2 flex-grow  border rounded-l-md text-lightText bg-light focus:outline-none focus:ring-0 focus:ring-transparent border-lightBorder w-full text-base px-2} \n                  }\" placeholder=\"name@company.com\" type=\"email\" required=\"\" name=\"email\" value=\"\"/><button type=\"submit\" class=\"text-base} \n                bg-lightAlt border border-l-0 border-lightBorder hover:bg-green-700 text-lightText hover:bg-dark hover:text-darkText  px-2 py-1 rounded-r-md  font-bold\">Subscribe</button></div></form></div></div></div></div></div></div></div></ul></div><div class=\"w-[200px] 6xl:hidden\"><div class=\" flex flex-row  flex-row-reverse  items-start gap-4 \"><span class=\"tooltip tooltip-left cursor-pointer\" data-tip=\"Bookmark\"><button class=\"3xl:hover:bg-lightAlt hover:bg-light p-1 md:p-2 rounded h-[40px] w-[40px] flex items-center justify-center border border-lightBorder\"><i class=\"hn hn-bookmark text-lightText text-2xl\"></i></button></span><span class=\"tooltip tooltip-left   cursor-pointer\" data-tip=\"Comment\"><button class=\"3xl:hover:bg-lightAlt hover:bg-light p-1 md:p-2 rounded h-[40px] w-[40px] flex items-center justify-center border border-lightBorder\"><i class=\"hn hn-comment text-lightText text-2xl\"></i></button></span><div class=\"dropdown  dropdown-bottom dropdown-hover group  \"><label tabindex=\"0\" class=\"flex items-center  cursor-pointer justify-center border border-lightBorder  3xl:group-hover:bg-lightAlt group-hover:bg-light h-[40px] w-[40px] p-2 rounded \"><i class=\"hn hn-share text-2xl\"></i></label><ul tabindex=\"0\" class=\"dropdown-content bg-light z-[1] py-4 px-4 3xl:px-0  3xl:py-2 border 3xl:border-none flex flex-col items-center justify-center gap-2 \"><button class=\"border p-2 rounded hover:bg-lightAlt\"><i class=\" hn hn-copy text-lightText  text-2xl \"></i></button><button class=\"border p-2 rounded hover:bg-lightAlt\"><i class=\"hn hn-facebook-round text-lightText text-2xl\"></i></button><button class=\"border p-2 rounded hover:bg-lightAlt\"><i class=\"hn hn-x text-lightText text-2xl\"></i></button><button class=\"border p-2 rounded hover:bg-lightAlt\"><i class=\"hn hn-linkedin text-lightText text-2xl\"></i></button><a href=\"mailto:?subject=I&#x27;d like to share a link with you &amp;body=\" class=\"border p-2 rounded inline-block hover:bg-lightAlt\"><i class=\"hn hn-envelope text-lightText text-2xl\"></i></a></ul></div></div></div></div></div><div class=\"flex max-w-[1100px] 2xl:max-w-[1200px] mx-auto justify-center flex-row gap-4 items-start mt-10 px-4 xl:px-0\"><div class=\"hidden xl:flex xl:flex-col self-stretch\"><div class=\"sticky top-[99px] z-40\"><div class=\"dropdown z-25  dropdown-right dropdown-hover\"><div class=\"mr-2 flex  gap-2 flex-col justify-center flex-wrap  items-center \"><div class=\"relative h-12 w-12 bg-black rounded-full overflow-hidden flex-shrink-0\"><img alt=\"Yan Cui\" loading=\"lazy\" decoding=\"async\" data-nimg=\"fill\" class=\"rounded-full object-contain \" style=\"position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;color:transparent;z-index:1\" sizes=\"100vw\" srcSet=\"https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=640 640w, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=750 750w, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=828 828w, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=1080 1080w, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=1200 1200w, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=1920 1920w, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=2048 2048w, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=3840 3840w\" src=\"https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=3840\"/></div></div><ul tabindex=\"0\" class=\"dropdown-content w-[280px] xs:w-[320px] sm:w-[400px] rounded-lg z-[100] bg-light flex flex-col items-center justify-center gap-2\"><div class=\"flex w-full flex-col gap-4\"><div><div class=\"w-full   \"><div class=\" p-4 border border-lightBorder bg-light rounded-lg\"><a href=\"/u/theburningmonk\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"flex items-start text-sm rounded-lg group gap-2\"><div class=\"\"><img alt=\"Yan Cui\" loading=\"lazy\" width=\"40\" height=\"40\" decoding=\"async\" data-nimg=\"1\" class=\"w-10 h-9 border-solid border border-lightBorder rounded-full object-contain\" style=\"color:transparent\" srcSet=\"https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=48 1x, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=96 2x\" src=\"https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=96\"/></div><span class=\"flex flex-col min-w-0 w-full justify-center\"><span class=\"flex items-center gap-1 text-ellipsis overflow-hidden whitespace-nowrap\"><span class=\"font-bold group-hover:underline text-sm truncate\"><span class=\"text-xs font-light mr-1\">by</span>Yan Cui</span><span class=\"text-xs font-light opacity-50\">|</span><span class=\"text-sm false text-ellipsis overflow-hidden whitespace-nowrap\" title=\"@theburningmonk\">@<!-- -->theburningmonk</span></span></span></a><p class=\"text-sm overflow-x-auto mt-2 text-bodyTxtLight\">AWS Serverless Hero. Independent Consultant. Developer Advocate at Lumigo.</p><div class=\"mt-4\"><div class=\"w-full flex justify-start\"><div class=\"w-full\"><form class=\"w-full flex flex-col items-start gap-2 \"><div class=\"flex w-full\"><input class=\"p-2 flex-grow  border rounded-l-md text-lightText bg-light focus:outline-none focus:ring-0 focus:ring-transparent border-lightBorder w-full text-base px-2} \n                  }\" placeholder=\"name@company.com\" type=\"email\" required=\"\" name=\"email\" value=\"\"/><button type=\"submit\" class=\"text-base} \n                bg-lightAlt border border-l-0 border-lightBorder hover:bg-green-700 text-lightText hover:bg-dark hover:text-darkText  px-2 py-1 rounded-r-md  font-bold\">Subscribe</button></div></form></div></div></div></div></div></div></div></ul></div></div></div><div class=\"flex-1 flex flex-col justify-center \"><div class=\"\"><div class=\" story-body font-sans flex items-center  justify-center  \"><div class=\"prose  max-w-[1020px] min-w-[150px] xs:p-0  lg:px-0 prose-a:break-words prose-table:block prose-div:bg-transparent  prose-table:max-w-[900px]  xs:prose-table:mx-auto prose-table:overflow-x-auto prose-th:whitespace-wrap prose-td:whitespace-wrap  leading-relaxed tracking-wide  prose-p:text-lightTextLight prose-strong:text-lightTextStrong prose-strong:font-bold prose-small:text-lightTextLight prose-small:font-light prose-a:text-lightTextLight prose-p:mx-0 prose-p:my-2 prose [&amp;_.line-space]:my-0 prose-p:my-2 prose-p:text-base  sm:prose-p:text-lg  prose-blockquote:my-0 prose-blockquote:border-l-[5px] prose-blockquote:border-lightTextAccent prose-blockquote:pl-4 prose-blockquote:leading-relaxed prose-blockquote:text-lightText prose-h2:text-lightTextStrong prose-li:marker:text-lightText prose-h2:text-xl sm:prose-h2:text-3xl prose-h2:font-bold prose-h2:my-6 prose-h3:text-lightTextStrong prose-hr:m-2 prose-h3:text-xl sm:prose-h3:text-2xl prose-h3:font-bold prose-h3:my-5 prose-h4:text-xl prose-h4:font-bold prose-h4:my-4 prose-td:text-lightTextLight prose-td:border prose-td:border-lightBorder prose-td:px-2 prose-th:text-lightTextLight prose-th:border prose-th:border-lightBorder prose-th:px-2 prose-li:text-lg prose-li:text-lightTextLight prose-li:px-0 prose-li:mb-3 prose-li:ml-3 prose-li:leading-relaxed prose-ul:pl-2 prose-ul:sm:pl-8 prose-ol:pl-2 prose-ol:sm:pl-8  hover:prose-a:text-lightTextAccent prose-a:rounded prose-code:text-lightTextLight prose-code:break-all prose-pre:rounded-lg prose-pre:text-sm prose-pre:my-4 prose-pre:p-3 prose-pre:overflow-x-scroll prose-pre:whitespace-pre-wrap prose-pre:break-words \"><div class=\"w-full flex items-center justify-center \"><p>With AWS Lambda, we get scalability and resilience out-of-the-box. What\u2019s more, AWS also provides built-in monitoring, logging and tracing support through CloudWatch and X-Ray. These built-in tools provide a good starting point but many developers eventually outgrow them as their serverless application becomes more complex.</p>\n<p>In this post, let\u2019s take a serverless application and see how <a href=\"https://dashbird.io/?ref=hackernoon.com\" target=\"_blank\" rel=\"noopener noreferrer ugc\">Dashbird</a> can help you debug the application.</p>\n<h3>Challenges with serverless observability</h3>\n<p>When it comes to observability, serverless has introduced some interesting challenges. For so long, we have relied on the use of agents and daemons to collect metrics and logs. They run silently in the background, away from our critical paths where we are concerned with minimizing user-facing latencies. They collect, buffer and publish these observability data in batches to improve efficiency. As a practice, they are so deeply ingrained into how we monitor our applications, until now.</p>\n<p>When it comes to serverless, specifically with managed platforms such as AWS Lambda, there\u2019s simply nowhere for us to install these agents!</p>\n<p>To collect metrics and logs as part of your function\u2019s invocation would understandably add overhead to its invocation time. Since AWS is collecting logs from your function asynchronously already, and publishing them to CloudWatch Logs. A common workaround is to subscribe to these logs and perform post-processing on them.</p>\n<p>Indeed, that is how Dashbird collects data about your function\u2019s execution. It subscribes the CloudWatch Logs log groups to a Kinesis stream and then processes the events from there. You can read about the advantages of this approach in <a href=\"https://theburningmonk.com/2018/07/centralised-logging-for-aws-lambda-revised-2018/?ref=hackernoon.com\" target=\"_blank\" rel=\"noopener noreferrer ugc\">this article</a>.</p>\n<p>As our serverless applications become more complex, it\u2019s important for us to be able to trace executions across multiple functions. As the demo app demonstrates, even a simple user transaction can span across multiple event sources as well as Lambda functions.</p>\n<h3>The demo\u00a0app</h3>\n<p>Imagine you\u2019re building a Twitter clone. One of the core features of the system is to distribute a user\u2019s post to his followers\u2019 feeds. To implement this feature, imagine we have two separate API endpoints:</p>\n<ul>\n<li>POST posts/create\u00a0: to create a new post for the current user</li>\n<li>GET followers/{userId}\u00a0: to fetch a user\u2019s followers</li>\n</ul>\n<p>Each endpoint is handled by a separate Lambda function\u200a\u2014\u200a<strong><em>create-post</em></strong> and <strong><em>get-followers</em></strong> respectively.</p>\n<p>When a user publishes a new post, the <strong><em>create-post</em></strong> function would save the post in the <strong><em>posts</em></strong> DynamoDB table and also publish a <strong><em>post-created</em></strong> event into a Kinesis stream. This event then triggers a <strong><em>distribute-post</em></strong> function. This function would query the <em>GET followers/{userId}</em> endpoint and then add the post to the followers\u2019 feeds. The <strong><em>get-followers</em></strong> function would query the <strong><em>followers</em></strong> DynamoDB table to return the IDs of the user\u2019s followers.</p>\n<p>For brevity sake I have omitted the logic for actually distributing the posts. So the overall architecture for our demo app looks like the following.</p>\n<div><div class=\"w-full my-4\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto flex flex-col items-center\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"Yan Cui&#x27;s image-c46fc8\" fetchPriority=\"low\" loading=\"lazy\" width=\"902\" height=\"561\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 902 561&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSI5MDIiIGhlaWdodD0iNTYxIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgICA8ZGVmcz4KICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImciPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIyMiIgb2Zmc2V0PSIyMCUiIC8+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMGYwIiBvZmZzZXQ9IjUwJSIgLz4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMjIiIG9mZnNldD0iODAlIiAvPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgIDwvZGVmcz4KICAgICAgPHJlY3Qgd2lkdGg9IjkwMiIgaGVpZ2h0PSI1NjEiIGZpbGw9IiMyMjIiIC8+CiAgICAgIDxyZWN0IGlkPSJyIiB3aWR0aD0iOTAyIiBoZWlnaHQ9IjU2MSIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii05MDIiIHRvPSI5MDIiIGR1cj0iMXMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAgLz4KICAgIDwvc3ZnPg==&#x27;/%3E%3C/svg%3E&quot;)\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*NoHAE22yc7RxaT9V.png?auto=format%2Ccompress&amp;w=1080 1x, https://hackernoon.imgix.net/hn-images/0*NoHAE22yc7RxaT9V.png?auto=format%2Ccompress&amp;w=1920 2x\" src=\"https://hackernoon.imgix.net/hn-images/0*NoHAE22yc7RxaT9V.png?auto=format%2Ccompress&amp;w=1920\"/></div></div></div></div>\n<p>To make things more interesting, each of the Lambda functions are hardwired to error or timeout based on a configurable probability. The source code for the demo app is <a href=\"https://github.com/theburningmonk/dashbird-demo?ref=hackernoon.com\" target=\"_blank\" rel=\"noopener noreferrer ugc\">available on Github</a>, so feel free to try it out yourself.</p>\n<h3>Introducing Dashbird</h3>\n<p>Even with a simple serverless application like the one outlined above, we have quite a few functions to look after. Let\u2019s see how we can use Dashbird to help us monitor this application and debug issues.</p>\n<p>As soon as I log in, I have a high level dashboard for my account.</p>\n<div><div class=\"w-full my-4\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto flex flex-col items-center\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"Yan Cui&#x27;s image-0bd01\" fetchPriority=\"low\" loading=\"lazy\" width=\"1600\" height=\"910\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 1600 910&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjkxMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJnIj4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMjIiIG9mZnNldD0iMjAlIiAvPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzBmMCIgb2Zmc2V0PSI1MCUiIC8+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyIiBvZmZzZXQ9IjgwJSIgLz4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0IHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjkxMCIgZmlsbD0iIzIyMiIgLz4KICAgICAgPHJlY3QgaWQ9InIiIHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjkxMCIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii0xNjAwIiB0bz0iMTYwMCIgZHVyPSIxcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiICAvPgogICAgPC9zdmc+&#x27;/%3E%3C/svg%3E&quot;)\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*3wx05u1keXGMJAij.png?auto=format%2Ccompress&amp;w=1920 1x, https://hackernoon.imgix.net/hn-images/0*3wx05u1keXGMJAij.png?auto=format%2Ccompress&amp;w=3840 2x\" src=\"https://hackernoon.imgix.net/hn-images/0*3wx05u1keXGMJAij.png?auto=format%2Ccompress&amp;w=3840\"/></div></div></div></div>\n<p>In addition to the data I get in the AWS Lambda console (see below), the Dashbird dashboard has two useful data points:</p>\n<ul>\n<li>Average memory utilization for the functions</li>\n<li>Cost for the Lambda invocations</li>\n</ul>\n<div><div class=\"w-full my-4\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto flex flex-col items-center\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"Yan Cui&#x27;s image-3ff128\" fetchPriority=\"low\" loading=\"lazy\" width=\"1600\" height=\"871\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 1600 871&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSIxNjAwIiBoZWlnaHQ9Ijg3MSIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJnIj4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMjIiIG9mZnNldD0iMjAlIiAvPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzBmMCIgb2Zmc2V0PSI1MCUiIC8+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyIiBvZmZzZXQ9IjgwJSIgLz4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0IHdpZHRoPSIxNjAwIiBoZWlnaHQ9Ijg3MSIgZmlsbD0iIzIyMiIgLz4KICAgICAgPHJlY3QgaWQ9InIiIHdpZHRoPSIxNjAwIiBoZWlnaHQ9Ijg3MSIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii0xNjAwIiB0bz0iMTYwMCIgZHVyPSIxcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiICAvPgogICAgPC9zdmc+&#x27;/%3E%3C/svg%3E&quot;)\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*-RRtkvYI3B7LvFeT.png?auto=format%2Ccompress&amp;w=1920 1x, https://hackernoon.imgix.net/hn-images/0*-RRtkvYI3B7LvFeT.png?auto=format%2Ccompress&amp;w=3840 2x\" src=\"https://hackernoon.imgix.net/hn-images/0*-RRtkvYI3B7LvFeT.png?auto=format%2Ccompress&amp;w=3840\"/></div></div></div></div>\n<p>Next, in Dashbird\u2019s Lambda console, I can see a high level summary of my functions and their activities over the last 24 hours.</p>\n<div><div class=\"w-full my-4\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto flex flex-col items-center\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"Yan Cui&#x27;s image-0b79b8\" fetchPriority=\"low\" loading=\"lazy\" width=\"1600\" height=\"850\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 1600 850&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSIxNjAwIiBoZWlnaHQ9Ijg1MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJnIj4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMjIiIG9mZnNldD0iMjAlIiAvPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzBmMCIgb2Zmc2V0PSI1MCUiIC8+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyIiBvZmZzZXQ9IjgwJSIgLz4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0IHdpZHRoPSIxNjAwIiBoZWlnaHQ9Ijg1MCIgZmlsbD0iIzIyMiIgLz4KICAgICAgPHJlY3QgaWQ9InIiIHdpZHRoPSIxNjAwIiBoZWlnaHQ9Ijg1MCIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii0xNjAwIiB0bz0iMTYwMCIgZHVyPSIxcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiICAvPgogICAgPC9zdmc+&#x27;/%3E%3C/svg%3E&quot;)\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*z21gtl_jfN-kE-nn.png?auto=format%2Ccompress&amp;w=1920 1x, https://hackernoon.imgix.net/hn-images/0*z21gtl_jfN-kE-nn.png?auto=format%2Ccompress&amp;w=3840 2x\" src=\"https://hackernoon.imgix.net/hn-images/0*z21gtl_jfN-kE-nn.png?auto=format%2Ccompress&amp;w=3840\"/></div></div></div></div>\n<p>What I find very useful here is the fact that it highlights functions that have been idle for 10 days as inactive. As your serverless architecture expands and you end up with hundreds of functions, maintained by different teams, it\u2019s very difficult to track which functions are no longer needed. Having redundant functions lying around is a security risk as they remain an attack surface that can be exploited.</p>\n<p>While this view alone cannot tell you definitively which functions are no longer used. Many functions are not run on a regular basis. Maybe they are part of a cron job that only runs once a month. Or maybe they are only used during disaster recovery scenarios. Nonetheless, being aware of which functions are inactive encourages teams to ask the question \u201cIs this function still needed?\u201d. From here, maybe better practices can emerge. For example, use tags to mark functions that are expected to be used sparingly so they are not flagged by these checks.</p>\n<div><div class=\"w-full my-4\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto flex flex-col items-center\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"Yan Cui&#x27;s image-8b814\" fetchPriority=\"low\" loading=\"lazy\" width=\"1600\" height=\"507\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 1600 507&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjUwNyIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJnIj4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMjIiIG9mZnNldD0iMjAlIiAvPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzBmMCIgb2Zmc2V0PSI1MCUiIC8+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyIiBvZmZzZXQ9IjgwJSIgLz4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0IHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjUwNyIgZmlsbD0iIzIyMiIgLz4KICAgICAgPHJlY3QgaWQ9InIiIHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjUwNyIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii0xNjAwIiB0bz0iMTYwMCIgZHVyPSIxcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiICAvPgogICAgPC9zdmc+&#x27;/%3E%3C/svg%3E&quot;)\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*CsuMFbXUfo4gUeLy.png?auto=format%2Ccompress&amp;w=1920 1x, https://hackernoon.imgix.net/hn-images/0*CsuMFbXUfo4gUeLy.png?auto=format%2Ccompress&amp;w=3840 2x\" src=\"https://hackernoon.imgix.net/hn-images/0*CsuMFbXUfo4gUeLy.png?auto=format%2Ccompress&amp;w=3840\"/></div></div></div></div>\n<p>If I navigate to one of the functions, then I have a function-centric view of invocation time, error, cost and memory utilization. In addition, I can also see a list of the recent invocations. What\u2019s really useful here is that cold starts and retries are clearly labelled. When debugging live issues this lets me quickly narrow down the invocations that I need to pay attention to.</p>\n<div><div class=\"w-full my-4\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto flex flex-col items-center\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"Yan Cui&#x27;s image-e1f4f\" fetchPriority=\"low\" loading=\"lazy\" width=\"1600\" height=\"872\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 1600 872&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSIxNjAwIiBoZWlnaHQ9Ijg3MiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJnIj4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMjIiIG9mZnNldD0iMjAlIiAvPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzBmMCIgb2Zmc2V0PSI1MCUiIC8+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyIiBvZmZzZXQ9IjgwJSIgLz4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0IHdpZHRoPSIxNjAwIiBoZWlnaHQ9Ijg3MiIgZmlsbD0iIzIyMiIgLz4KICAgICAgPHJlY3QgaWQ9InIiIHdpZHRoPSIxNjAwIiBoZWlnaHQ9Ijg3MiIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii0xNjAwIiB0bz0iMTYwMCIgZHVyPSIxcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiICAvPgogICAgPC9zdmc+&#x27;/%3E%3C/svg%3E&quot;)\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*8_jid1Y_sG_cbTJn.png?auto=format%2Ccompress&amp;w=1920 1x, https://hackernoon.imgix.net/hn-images/0*8_jid1Y_sG_cbTJn.png?auto=format%2Ccompress&amp;w=3840 2x\" src=\"https://hackernoon.imgix.net/hn-images/0*8_jid1Y_sG_cbTJn.png?auto=format%2Ccompress&amp;w=3840\"/></div></div></div></div>\n<p>Straight away, I can see that 3 of the invocations timed out after 6 seconds. What\u2019s more, the original Kinesis event was retried 3 times and finally succeeded on the third retry.</p>\n<div><div class=\"w-full my-4\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto flex flex-col items-center\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"Yan Cui&#x27;s image-ed3d38\" fetchPriority=\"low\" loading=\"lazy\" width=\"1600\" height=\"701\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 1600 701&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjcwMSIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJnIj4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMjIiIG9mZnNldD0iMjAlIiAvPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzBmMCIgb2Zmc2V0PSI1MCUiIC8+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyIiBvZmZzZXQ9IjgwJSIgLz4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0IHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjcwMSIgZmlsbD0iIzIyMiIgLz4KICAgICAgPHJlY3QgaWQ9InIiIHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjcwMSIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii0xNjAwIiB0bz0iMTYwMCIgZHVyPSIxcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiICAvPgogICAgPC9zdmc+&#x27;/%3E%3C/svg%3E&quot;)\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*J7SEZ_EK1aWK6o3A.png?auto=format%2Ccompress&amp;w=1920 1x, https://hackernoon.imgix.net/hn-images/0*J7SEZ_EK1aWK6o3A.png?auto=format%2Ccompress&amp;w=3840 2x\" src=\"https://hackernoon.imgix.net/hn-images/0*J7SEZ_EK1aWK6o3A.png?auto=format%2Ccompress&amp;w=3840\"/></div></div></div></div>\n<p>If I click on the \u201c+\u201d button next to an invocation then I can drill down to the invocation itself. Here I can see the logs and X-Ray trace for this invocation in one screen. This is great as it saves me from having to constantly jump between different AWS console.</p>\n<div><div class=\"w-full my-4\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto flex flex-col items-center\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"Yan Cui&#x27;s image-981f8\" fetchPriority=\"low\" loading=\"lazy\" width=\"1600\" height=\"995\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 1600 995&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSIxNjAwIiBoZWlnaHQ9Ijk5NSIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJnIj4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMjIiIG9mZnNldD0iMjAlIiAvPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzBmMCIgb2Zmc2V0PSI1MCUiIC8+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyIiBvZmZzZXQ9IjgwJSIgLz4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0IHdpZHRoPSIxNjAwIiBoZWlnaHQ9Ijk5NSIgZmlsbD0iIzIyMiIgLz4KICAgICAgPHJlY3QgaWQ9InIiIHdpZHRoPSIxNjAwIiBoZWlnaHQ9Ijk5NSIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii0xNjAwIiB0bz0iMTYwMCIgZHVyPSIxcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiICAvPgogICAgPC9zdmc+&#x27;/%3E%3C/svg%3E&quot;)\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*9-VOw-xsrF3mB5nQ.png?auto=format%2Ccompress&amp;w=1920 1x, https://hackernoon.imgix.net/hn-images/0*9-VOw-xsrF3mB5nQ.png?auto=format%2Ccompress&amp;w=3840 2x\" src=\"https://hackernoon.imgix.net/hn-images/0*9-VOw-xsrF3mB5nQ.png?auto=format%2Ccompress&amp;w=3840\"/></div></div></div></div>\n<h3>Debugging with\u00a0Dashbird</h3>\n<p>As mentioned before, the demo app is hardwired to error and timeout. And sure enough, when these failure cases happen, Dashbird\u2019s built-in alerting kicks in and I promptly received emails notifying me that something went wrong.</p>\n<div><div class=\"w-full my-4\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto flex flex-col items-center\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"Yan Cui&#x27;s image-73f8d8\" fetchPriority=\"low\" loading=\"lazy\" width=\"1304\" height=\"1222\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 1304 1222&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSIxMzA0IiBoZWlnaHQ9IjEyMjIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICAgIDxkZWZzPgogICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZyI+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyIiBvZmZzZXQ9IjIwJSIgLz4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwZjAiIG9mZnNldD0iNTAlIiAvPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIyMiIgb2Zmc2V0PSI4MCUiIC8+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgPC9kZWZzPgogICAgICA8cmVjdCB3aWR0aD0iMTMwNCIgaGVpZ2h0PSIxMjIyIiBmaWxsPSIjMjIyIiAvPgogICAgICA8cmVjdCBpZD0iciIgd2lkdGg9IjEzMDQiIGhlaWdodD0iMTIyMiIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii0xMzA0IiB0bz0iMTMwNCIgZHVyPSIxcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiICAvPgogICAgPC9zdmc+&#x27;/%3E%3C/svg%3E&quot;)\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*TDIcxxsnG-n_eap0.png?auto=format%2Ccompress&amp;w=1920 1x, https://hackernoon.imgix.net/hn-images/0*TDIcxxsnG-n_eap0.png?auto=format%2Ccompress&amp;w=3840 2x\" src=\"https://hackernoon.imgix.net/hn-images/0*TDIcxxsnG-n_eap0.png?auto=format%2Ccompress&amp;w=3840\"/></div></div></div></div>\n<div><div class=\"w-full my-4\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto flex flex-col items-center\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"Yan Cui&#x27;s image-86cd28\" fetchPriority=\"low\" loading=\"lazy\" width=\"1286\" height=\"1182\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 1286 1182&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSIxMjg2IiBoZWlnaHQ9IjExODIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICAgIDxkZWZzPgogICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iZyI+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyIiBvZmZzZXQ9IjIwJSIgLz4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwZjAiIG9mZnNldD0iNTAlIiAvPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzIyMiIgb2Zmc2V0PSI4MCUiIC8+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgPC9kZWZzPgogICAgICA8cmVjdCB3aWR0aD0iMTI4NiIgaGVpZ2h0PSIxMTgyIiBmaWxsPSIjMjIyIiAvPgogICAgICA8cmVjdCBpZD0iciIgd2lkdGg9IjEyODYiIGhlaWdodD0iMTE4MiIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii0xMjg2IiB0bz0iMTI4NiIgZHVyPSIxcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiICAvPgogICAgPC9zdmc+&#x27;/%3E%3C/svg%3E&quot;)\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*unPiVL0E6QC057iS.png?auto=format%2Ccompress&amp;w=1920 1x, https://hackernoon.imgix.net/hn-images/0*unPiVL0E6QC057iS.png?auto=format%2Ccompress&amp;w=3840 2x\" src=\"https://hackernoon.imgix.net/hn-images/0*unPiVL0E6QC057iS.png?auto=format%2Ccompress&amp;w=3840\"/></div></div></div></div>\n<p>While this built-in alerting is great, I couldn\u2019t see any settings to adjust the alert sensitivity.</p>\n<p>As I followed the links in the emails, to the function, then the failed invocation. Dashbird neatly groups the related invocations\u200a\u2014\u200athe initial timeout, and the subsequent retries\u200a\u2014\u200atogether. I can quickly see that the failed Kinesis event was successfully processed on the 3rd retry.</p>\n<div><div class=\"w-full my-4\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto flex flex-col items-center\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"Yan Cui&#x27;s image-b41ad\" fetchPriority=\"low\" loading=\"lazy\" width=\"1514\" height=\"928\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 1514 928&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSIxNTE0IiBoZWlnaHQ9IjkyOCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJnIj4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMjIiIG9mZnNldD0iMjAlIiAvPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzBmMCIgb2Zmc2V0PSI1MCUiIC8+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyIiBvZmZzZXQ9IjgwJSIgLz4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0IHdpZHRoPSIxNTE0IiBoZWlnaHQ9IjkyOCIgZmlsbD0iIzIyMiIgLz4KICAgICAgPHJlY3QgaWQ9InIiIHdpZHRoPSIxNTE0IiBoZWlnaHQ9IjkyOCIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii0xNTE0IiB0bz0iMTUxNCIgZHVyPSIxcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiICAvPgogICAgPC9zdmc+&#x27;/%3E%3C/svg%3E&quot;)\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*P8P9xvKvn_-IdQzv.png?auto=format%2Ccompress&amp;w=1920 1x, https://hackernoon.imgix.net/hn-images/0*P8P9xvKvn_-IdQzv.png?auto=format%2Ccompress&amp;w=3840 2x\" src=\"https://hackernoon.imgix.net/hn-images/0*P8P9xvKvn_-IdQzv.png?auto=format%2Ccompress&amp;w=3840\"/></div></div></div></div>\n<p>Dashbird also tracks the open issues in the Errors console. Now that I know the problem has resolved itself I can go ahead and resolve the error.</p>\n<div><div class=\"w-full my-4\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto flex flex-col items-center\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"Yan Cui&#x27;s image-76722\" fetchPriority=\"low\" loading=\"lazy\" width=\"1600\" height=\"907\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 1600 907&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjkwNyIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJnIj4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMjIiIG9mZnNldD0iMjAlIiAvPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzBmMCIgb2Zmc2V0PSI1MCUiIC8+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyIiBvZmZzZXQ9IjgwJSIgLz4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0IHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjkwNyIgZmlsbD0iIzIyMiIgLz4KICAgICAgPHJlY3QgaWQ9InIiIHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjkwNyIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii0xNjAwIiB0bz0iMTYwMCIgZHVyPSIxcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiICAvPgogICAgPC9zdmc+&#x27;/%3E%3C/svg%3E&quot;)\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*OKovmxFYKL4pGPmG.png?auto=format%2Ccompress&amp;w=1920 1x, https://hackernoon.imgix.net/hn-images/0*OKovmxFYKL4pGPmG.png?auto=format%2Ccompress&amp;w=3840 2x\" src=\"https://hackernoon.imgix.net/hn-images/0*OKovmxFYKL4pGPmG.png?auto=format%2Ccompress&amp;w=3840\"/></div></div></div></div>\n<h3>Tailing function\u00a0logs</h3>\n<p>Another nice feature of Dashbird is that it\u2019s able to tail the logs for multiple functions at the same time. For the demo app, I want to see the logs for both the <em>create-post</em> and <em>distribute-post</em> functions as I curl the <em>POST posts/create</em> endpoint.</p>\n<p>That way, I can see that the event was successfully published into the Kinesis stream, and was subsequently received by the <em>distribute-post</em> function.</p>\n<div><div class=\"w-full my-4\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto flex flex-col items-center\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"Yan Cui&#x27;s image-0d82d8\" fetchPriority=\"low\" loading=\"lazy\" width=\"1600\" height=\"907\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 1600 907&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjkwNyIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJnIj4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMjIiIG9mZnNldD0iMjAlIiAvPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzBmMCIgb2Zmc2V0PSI1MCUiIC8+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyIiBvZmZzZXQ9IjgwJSIgLz4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0IHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjkwNyIgZmlsbD0iIzIyMiIgLz4KICAgICAgPHJlY3QgaWQ9InIiIHdpZHRoPSIxNjAwIiBoZWlnaHQ9IjkwNyIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii0xNjAwIiB0bz0iMTYwMCIgZHVyPSIxcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiICAvPgogICAgPC9zdmc+&#x27;/%3E%3C/svg%3E&quot;)\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*nq_eP-14T_YcL3ps.png?auto=format%2Ccompress&amp;w=1920 1x, https://hackernoon.imgix.net/hn-images/0*nq_eP-14T_YcL3ps.png?auto=format%2Ccompress&amp;w=3840 2x\" src=\"https://hackernoon.imgix.net/hn-images/0*nq_eP-14T_YcL3ps.png?auto=format%2Ccompress&amp;w=3840\"/></div></div></div></div>\n<h3>Conclusion</h3>\n<p>Overall I was impressed with what Dashbird has to offer, and it\u2019s clear that a lot of thought has gone into the product. It has many nice touches that makes debugging much easier. For example, grouping retries together, and integrating X-Ray traces and logs in one screen. These might seem like trivial niceties, but they can make a big difference under the high-pressure scenarios of dealing with a live issue.</p>\n<p>From what I have been able to see, I think Dashbird is a really great tool. The main thing missing for me is the ability to trace executions end-to-end. Personally, I\u2019d really like to see the entire execution traced from the API call to create a post, all the way to the <strong><em>get-followers</em></strong> function performing a Query against the <strong><em>followers</em></strong> DynamoDB table.</p>\n<div><div class=\"w-full my-4\"><div class=\"flex items-center justify-center w-full h-full\"><div class=\"relative group cursor-zoom-in transition-transform hover:scale-[1.01] max-w-full mx-auto flex flex-col items-center\"><button class=\"absolute top-2 right-5 z-10 w-6 h-6 rounded  flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity\"><i class=\"hn hn-download text-darkText bg-dark p-2 rounded-xl text-base\"></i></button><img alt=\"Yan Cui&#x27;s image-7ef4d\" fetchPriority=\"low\" loading=\"lazy\" width=\"1574\" height=\"966\" decoding=\"async\" data-nimg=\"1\" class=\"w-full h-auto object-contain rounded-lg shadow-lg my-0\" style=\"color:transparent;background-size:cover;background-position:50% 50%;background-repeat:no-repeat;background-image:url(&quot;data:image/svg+xml;charset=utf-8,%3Csvg xmlns=&#x27;http://www.w3.org/2000/svg&#x27; viewBox=&#x27;0 0 1574 966&#x27;%3E%3Cfilter id=&#x27;b&#x27; color-interpolation-filters=&#x27;sRGB&#x27;%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3CfeColorMatrix values=&#x27;1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1&#x27; result=&#x27;s&#x27;/%3E%3CfeFlood x=&#x27;0&#x27; y=&#x27;0&#x27; width=&#x27;100%25&#x27; height=&#x27;100%25&#x27;/%3E%3CfeComposite operator=&#x27;out&#x27; in=&#x27;s&#x27;/%3E%3CfeComposite in2=&#x27;SourceGraphic&#x27;/%3E%3CfeGaussianBlur stdDeviation=&#x27;20&#x27;/%3E%3C/filter%3E%3Cimage width=&#x27;100%25&#x27; height=&#x27;100%25&#x27; x=&#x27;0&#x27; y=&#x27;0&#x27; preserveAspectRatio=&#x27;none&#x27; style=&#x27;filter: url(%23b);&#x27; href=&#x27;data:image/svg+xml;base64,CiAgICA8c3ZnIHdpZHRoPSIxNTc0IiBoZWlnaHQ9Ijk2NiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJnIj4KICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMyMjIiIG9mZnNldD0iMjAlIiAvPgogICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iIzBmMCIgb2Zmc2V0PSI1MCUiIC8+CiAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMjIyIiBvZmZzZXQ9IjgwJSIgLz4KICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0IHdpZHRoPSIxNTc0IiBoZWlnaHQ9Ijk2NiIgZmlsbD0iIzIyMiIgLz4KICAgICAgPHJlY3QgaWQ9InIiIHdpZHRoPSIxNTc0IiBoZWlnaHQ9Ijk2NiIgZmlsbD0idXJsKCNnKSIgLz4KICAgICAgPGFuaW1hdGUgeGxpbms6aHJlZj0iI3IiIGF0dHJpYnV0ZU5hbWU9IngiIGZyb209Ii0xNTc0IiB0bz0iMTU3NCIgZHVyPSIxcyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiICAvPgogICAgPC9zdmc+&#x27;/%3E%3C/svg%3E&quot;)\" srcSet=\"https://hackernoon.imgix.net/hn-images/0*Tjx1XgwC9lZZgtCP.png?auto=format%2Ccompress&amp;w=1920 1x, https://hackernoon.imgix.net/hn-images/0*Tjx1XgwC9lZZgtCP.png?auto=format%2Ccompress&amp;w=3840 2x\" src=\"https://hackernoon.imgix.net/hn-images/0*Tjx1XgwC9lZZgtCP.png?auto=format%2Ccompress&amp;w=3840\"/></div></div></div></div>\n<p>If you\u2019re solely relying on the built-in AWS tools (CloudWatch, CloudWatch Logs, and X-Ray) then you should give Dashbird a try. Why not sign up for a free trial, and deploy the demo app to your environment so you can see how Dashbird can help you debug your serverless application?</p>\n<p><em>Originally published at</em> <a href=\"https://dashbird.io/blog/debugging-serverless-apps-with-dashbird/?ref=hackernoon.com\" target=\"_blank\" rel=\"noopener noreferrer ugc\"><em>dashbird.io</em></a> <em>on January 25, 2019.</em></p></div></div></div></div></div><div class=\"hidden xl:flex xl:flex-col self-stretch\"><div class=\"sticky top-[99px] px-3\"><div class=\" flex flex-col flex-row-reverse  items-start gap-4 \"><span class=\"tooltip tooltip-left cursor-pointer\" data-tip=\"Bookmark\"><button class=\"3xl:hover:bg-lightAlt hover:bg-light p-1 md:p-2 rounded h-[40px] w-[40px] flex items-center justify-center border border-lightBorder\"><i class=\"hn hn-bookmark text-lightText text-2xl\"></i></button></span><span class=\"tooltip tooltip-left   cursor-pointer\" data-tip=\"Comment\"><button class=\"3xl:hover:bg-lightAlt hover:bg-light p-1 md:p-2 rounded h-[40px] w-[40px] flex items-center justify-center border border-lightBorder\"><i class=\"hn hn-comment text-lightText text-2xl\"></i></button></span><div class=\"dropdown  dropdown-bottom dropdown-hover group  \"><label tabindex=\"0\" class=\"flex items-center  cursor-pointer justify-center border border-lightBorder  3xl:group-hover:bg-lightAlt group-hover:bg-light h-[40px] w-[40px] p-2 rounded \"><i class=\"hn hn-share text-2xl\"></i></label><ul tabindex=\"0\" class=\"dropdown-content bg-light z-[1] py-4 px-4 3xl:px-0  3xl:py-2 border 3xl:border-none flex flex-col items-center justify-center gap-2 \"><button class=\"border p-2 rounded hover:bg-lightAlt\"><i class=\" hn hn-copy text-lightText  text-2xl \"></i></button><button class=\"border p-2 rounded hover:bg-lightAlt\"><i class=\"hn hn-facebook-round text-lightText text-2xl\"></i></button><button class=\"border p-2 rounded hover:bg-lightAlt\"><i class=\"hn hn-x text-lightText text-2xl\"></i></button><button class=\"border p-2 rounded hover:bg-lightAlt\"><i class=\"hn hn-linkedin text-lightText text-2xl\"></i></button><a href=\"mailto:?subject=I&#x27;d like to share a link with you &amp;body=\" class=\"border p-2 rounded inline-block hover:bg-lightAlt\"><i class=\"hn hn-envelope text-lightText text-2xl\"></i></a></ul></div></div></div></div></div><div class=\"px-4 lg:px-0 mx-auto w-full lg:max-w-[1000px] flex-col flex items-center justify-center \"><div id=\"commentSection\" class=\" font-sans max-w-[1000px] mt-4 mb-10 px-4 sm:px-0 items-center rounded-xl w-full  flex flex-col\"><div class=\"flex w-full flex-col xs:flex-row items-stretch justify-between gap-5 \"><a href=\"/subscribe-sqs-to-a-sns-topic-in-another-aws-account-with-cloudformation-and-gotchas-b80f229d32e4\" rel=\"external\" class=\"flex xs:w-1/2 flex-col group justify-between no-underline border border-lightBorder rounded-[5px] transition-all duration-300 hover:scale-[1.03]\"><div class=\"flex-grow p-3 text-lightText\"><span class=\"font-bold hover:text-lightTextStrong\">\u2190 Previous</span><p class=\"mt-2 font-light  hover:underline\">Subscribe SQS to a SNS topic in another AWS account with CloudFormation, and gotchas!</p></div></a><a href=\"/lambda-optimization-tip-enable-http-keep-alive-6dc503f6f114\" rel=\"external\" class=\"flex w-full xs:w-1/2 flex-col group  justify-between no-underline border border-lightBorder rounded-[5px] transition-all duration-300 hover:scale-[1.03]\"><div class=\"flex-grow p-3 \"><span class=\"font-bold  hover:text-lightTextStrong\">Up Next \u2192</span><p class=\"mt-2 font-light hover:underline \">Lambda optimization tip\u200a\u2014\u200aenable HTTP keep-alive</p></div></a></div></div></div><div id=\"aboutCard\" class=\" max-w-[1000px] mx-auto flex flex-col items-center gap-6 \"><div class=\"w-full lg:border border-lightBorder rounded-2xl\"><div class=\" w-full  px-4 py-3 sm:px-8 sm:py-6   \"><h3 class=\"text-xl xs:text-2xl sm:text-3xl font-bold mb-6\">About Author</h3><div class=\"flex flex-col items-start\"><div class=\"flex gap-4 flex-row items-start w-full\"><div class=\"relative shadow-md rounded-full flex-shrink-0 min-w-[50px] w-[50px] h-[50px] sm:min-w-[75px] sm:h-[75px] ring-4 ring-gray-300\"><a href=\"/u/theburningmonk\"><img alt=\"Yan Cui HackerNoon profile picture\" loading=\"lazy\" decoding=\"async\" data-nimg=\"fill\" class=\"rounded-full\" style=\"position:absolute;height:100%;width:100%;left:0;top:0;right:0;bottom:0;object-fit:cover;color:transparent\" sizes=\"100vw\" srcSet=\"https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=640 640w, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=750 750w, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=828 828w, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=1080 1080w, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=1200 1200w, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=1920 1920w, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=2048 2048w, https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=3840 3840w\" src=\"https://hackernoon.imgix.net/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg?auto=format%2Ccompress&amp;w=3840\"/></a></div><div class=\"flex-1 min-w-0 flex flex-col justify-center\"><div class=\"flex flex-col\"><div class=\"flex flex-wrap items-center gap-1 sm:gap-2 text-base text-bodyTxtLight\"><span class=\"text-xs font-light mr-1\">by</span><a class=\"hover:underline\" href=\"/u/theburningmonk\"><strong class=\"font-bold text-lightTextStrong\">Yan Cui</strong></a><span class=\"text-xs font-light opacity-50\">|</span><a class=\"hover:underline text-sm sm:text-base text-bodyTxtLight\" href=\"/u/theburningmonk\">@<!-- -->theburningmonk</a></div></div></div></div><p class=\"text-sm text-bodyTxtLight break-words overflow-wrap mt-4 mb-4 w-full\">AWS Serverless Hero. Independent Consultant. Developer Advocate at Lumigo.</p><div class=\"w-full mb-4\"><div class=\"w-full flex justify-start\"><div class=\"w-full\"><form class=\"w-full flex flex-col items-start gap-2 \"><div class=\"flex w-full\"><input class=\"p-2 flex-grow  border rounded-l-md text-lightText bg-light focus:outline-none focus:ring-0 focus:ring-transparent border-lightBorder w-full text-base px-2} \n                  }\" placeholder=\"name@company.com\" type=\"email\" required=\"\" name=\"email\" value=\"\"/><button type=\"submit\" class=\"text-base} \n                bg-lightAlt border border-l-0 border-lightBorder hover:bg-green-700 text-lightText hover:bg-dark hover:text-darkText  px-2 py-1 rounded-r-md  font-bold\">Subscribe</button></div></form></div></div></div><div class=\"flex-1 w-full\"><div class=\"flex flex-col flex-wrap gap-2 items-start justify-start mt-2 mb-2\"></div><div class=\"flex flex-col sm:flex-row gap-4 w-full\"><a class=\"text-base flex-1 px-4 py-2 font-bold rounded-lg border-2 border-lightBorder transition text-center w-full sm:w-auto bg-light hover:bg-lightAlt text-lightText hover:bg-bodyAccent hover:text-bodyAccentTxt  \" href=\"/u/theburningmonk\">Read my stories</a><a class=\"text-base break-words flex-1 break-all px-4 py-2 font-bold rounded-lg border-2 border-lightBorder transition text-center w-full sm:w-auto bg-light hover:bg-lightAlt text-lightText hover:bg-bodyAccent hover:text-bodyAccentTxt  \" href=\"/about/theburningmonk\">Learn More</a></div></div></div></div></div><span id=\"aboutCard\" class=\"hidden\"></span><section class=\"w-full py-3 px-4 sm:px-0 sm:py-6 \"><h4 class=\"text-xl xs:text-2xl sm:text-3xl  font-bold mb-4 sm:mb-6\">TOPICS</h4><div class=\"flex flex-wrap gap-2\"><div class=\" flex flex-wrap items-center gap-2 border-lightBorder\"><a href=\"/c/cybersecurity\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-lg border-lightBorder hover:bg-lightAccent hover:text-lightAccentText hover:border-lightAccentText bg-lightAlt text-lightText  flex items-center px-2 py-1 border rounded\"><span class=\"mr-2\"><i class=\"hn hn-cybersecurity !leading-[inherit]\"></i></span><span>cybersecurity</span></a></div><a href=\"/tagged/aws\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-sm xs:text-base sm:text-lg flex items-center px-2 py-1 border hover:bg-lightAlt border-lightBorder rounded\">#<!-- -->aws</a><a href=\"/tagged/aws-lambda\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-sm xs:text-base sm:text-lg flex items-center px-2 py-1 border hover:bg-lightAlt border-lightBorder rounded\">#<!-- -->aws-lambda</a><a href=\"/tagged/serverless\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-sm xs:text-base sm:text-lg flex items-center px-2 py-1 border hover:bg-lightAlt border-lightBorder rounded\">#<!-- -->serverless</a><a href=\"/tagged/cloud-computing\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-sm xs:text-base sm:text-lg flex items-center px-2 py-1 border hover:bg-lightAlt border-lightBorder rounded\">#<!-- -->cloud-computing</a><a href=\"/tagged/debugging-serverless\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"text-sm xs:text-base sm:text-lg flex items-center px-2 py-1 border hover:bg-lightAlt border-lightBorder rounded\">#<!-- -->debugging-serverless</a></div></section></div></div></div></div></div><div class=\"min-h-[200px]\"></div></main><div class=\"flex flex-col gap-4 hidden\"><button class=\"mr-auto\"><i class=\"hn-sun hn text-2xl\"></i></button><h2 class=\"text-sm font-semibold  text-darkText\">Light-Mode</h2><div class=\"cursor-pointer p-3 rounded-lg hover:scale-105 transition-transform \"><h3 class=\"text-sm uppercase mb-2 \">Classic</h3><div class=\"flex space-x-1\"><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#0F0\"></span><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#F5EC43\"></span><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#212428\"></span></div></div><div class=\"cursor-pointer p-3 rounded-lg hover:scale-105 transition-transform \"><h3 class=\"text-sm uppercase mb-2 \">Newspaper</h3><div class=\"flex space-x-1\"><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#FFFFFF\"></span><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#F5F5F5\"></span><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#454545\"></span></div></div><div class=\"cursor-pointer p-3 rounded-lg hover:scale-105 transition-transform \"><h3 class=\"text-sm uppercase mb-2 \">Proof of Usefulness</h3><div class=\"flex space-x-1\"><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#FFFFFF\"></span><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#26AB5C\"></span><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#D2FBE2\"></span></div></div><h2 class=\"text-sm font-semibold  text-darkText\">Dark-Mode</h2><div class=\"cursor-pointer p-3 rounded-lg hover:scale-105 transition-transform \"><h3 class=\"text-sm uppercase mb-2 \">Neon Noir</h3><div class=\"flex space-x-1\"><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#1E1E1E\"></span><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#0F0\"></span><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#F5EC43\"></span></div></div><div class=\"cursor-pointer p-3 rounded-lg hover:scale-105 transition-transform \"><h3 class=\"text-sm uppercase mb-2 \">Minty</h3><div class=\"flex space-x-1\"><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#061F19\"></span><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#2AAA74\"></span><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#63FF86\"></span></div></div><div class=\"cursor-pointer p-3 rounded-lg hover:scale-105 transition-transform \"><h3 class=\"text-sm uppercase mb-2 \">Startups of the Year</h3><div class=\"flex space-x-1\"><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#08085E\"></span><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#A2EF44\"></span><span class=\"w-6 h-6 rounded border border-darkBorder\" style=\"background-color:#1B1B95\"></span></div></div></div></div></div><script id=\"__NEXT_DATA__\" type=\"application/json\">{\"props\":{\"pageProps\":{\"data\":{\"pageLang\":\"en\",\"datePublished\":\"2019-01-29\",\"slug\":\"debugging-serverless-applications-with-dashbird-82a2ed86d757\",\"articleBody\":\"With AWS Lambda, we get scalability and resilience out-of-the-box. What\u2019s more, AWS also provides built-in monitoring, logging and tracing support through CloudWatch and X-Ray. These built-in tools provide a good starting point but many developers eventually outgrow them as their serverless application becomes more complex. In this post, let\u2019s take a serverless application and see how can help you debug the application. Dashbird Challenges with serverless observability When it comes to observability, serverless has introduced some interesting challenges. For so long, we have relied on the use of agents and daemons to collect metrics and logs. They run silently in the background, away from our critical paths where we are concerned with minimizing user-facing latencies. They collect, buffer and publish these observability data in batches to improve efficiency. As a practice, they are so deeply ingrained into how we monitor our applications, until now. When it comes to serverless, specifically with managed platforms such as AWS Lambda, there\u2019s simply nowhere for us to install these agents! To collect metrics and logs as part of your function\u2019s invocation would understandably add overhead to its invocation time. Since AWS is collecting logs from your function asynchronously already, and publishing them to CloudWatch Logs. A common workaround is to subscribe to these logs and perform post-processing on them. Indeed, that is how Dashbird collects data about your function\u2019s execution. It subscribes the CloudWatch Logs log groups to a Kinesis stream and then processes the events from there. You can read about the advantages of this approach in . this article As our serverless applications become more complex, it\u2019s important for us to be able to trace executions across multiple functions. As the demo app demonstrates, even a simple user transaction can span across multiple event sources as well as Lambda functions. The demo\u00a0app Imagine you\u2019re building a Twitter clone. One of the core features of the system is to distribute a user\u2019s post to his followers\u2019 feeds. To implement this feature, imagine we have two separate API endpoints: POST posts/create\u00a0: to create a new post for the current user GET followers/{userId}\u00a0: to fetch a user\u2019s followers Each endpoint is handled by a separate Lambda function\u200a\u2014 and respectively. create-post get-followers When a user publishes a new post, the function would save the post in the DynamoDB table and also publish a event into a Kinesis stream. This event then triggers a function. This function would query the endpoint and then add the post to the followers\u2019 feeds. The function would query the DynamoDB table to return the IDs of the user\u2019s followers. create-post posts post-created distribute-post GET followers/{userId} get-followers followers For brevity sake I have omitted the logic for actually distributing the posts. So the overall architecture for our demo app looks like the following. To make things more interesting, each of the Lambda functions are hardwired to error or timeout based on a configurable probability. The source code for the demo app is , so feel free to try it out yourself. available on Github Introducing Dashbird Even with a simple serverless application like the one outlined above, we have quite a few functions to look after. Let\u2019s see how we can use Dashbird to help us monitor this application and debug issues. As soon as I log in, I have a high level dashboard for my account. In addition to the data I get in the AWS Lambda console (see below), the Dashbird dashboard has two useful data points: Average memory utilization for the functions Cost for the Lambda invocations Next, in Dashbird\u2019s Lambda console, I can see a high level summary of my functions and their activities over the last 24 hours. What I find very useful here is the fact that it highlights functions that have been idle for 10 days as inactive. As your serverless architecture expands and you end up with hundreds of functions, maintained by different teams, it\u2019s very difficult to track which functions are no longer needed. Having redundant functions lying around is a security risk as they remain an attack surface that can be exploited. While this view alone cannot tell you definitively which functions are no longer used. Many functions are not run on a regular basis. Maybe they are part of a cron job that only runs once a month. Or maybe they are only used during disaster recovery scenarios. Nonetheless, being aware of which functions are inactive encourages teams to ask the question \u201cIs this function still needed?\u201d. From here, maybe better practices can emerge. For example, use tags to mark functions that are expected to be used sparingly so they are not flagged by these checks. If I navigate to one of the functions, then I have a function-centric view of invocation time, error, cost and memory utilization. In addition, I can also see a list of the recent invocations. What\u2019s really useful here is that cold starts and retries are clearly labelled. When debugging live issues this lets me quickly narrow down the invocations that I need to pay attention to. Straight away, I can see that 3 of the invocations timed out after 6 seconds. What\u2019s more, the original Kinesis event was retried 3 times and finally succeeded on the third retry. If I click on the \u201c+\u201d button next to an invocation then I can drill down to the invocation itself. Here I can see the logs and X-Ray trace for this invocation in one screen. This is great as it saves me from having to constantly jump between different AWS console. Debugging with\u00a0Dashbird As mentioned before, the demo app is hardwired to error and timeout. And sure enough, when these failure cases happen, Dashbird\u2019s built-in alerting kicks in and I promptly received emails notifying me that something went wrong. While this built-in alerting is great, I couldn\u2019t see any settings to adjust the alert sensitivity. As I followed the links in the emails, to the function, then the failed invocation. Dashbird neatly groups the related invocations\u200a\u2014\u200athe initial timeout, and the subsequent retries\u200a\u2014\u200atogether. I can quickly see that the failed Kinesis event was successfully processed on the 3rd retry. Dashbird also tracks the open issues in the Errors console. Now that I know the problem has resolved itself I can go ahead and resolve the error. Tailing function\u00a0logs Another nice feature of Dashbird is that it\u2019s able to tail the logs for multiple functions at the same time. For the demo app, I want to see the logs for both the and functions as I curl the endpoint. create-post distribute-post POST posts/create That way, I can see that the event was successfully published into the Kinesis stream, and was subsequently received by the function. distribute-post Conclusion Overall I was impressed with what Dashbird has to offer, and it\u2019s clear that a lot of thought has gone into the product. It has many nice touches that makes debugging much easier. For example, grouping retries together, and integrating X-Ray traces and logs in one screen. These might seem like trivial niceties, but they can make a big difference under the high-pressure scenarios of dealing with a live issue. From what I have been able to see, I think Dashbird is a really great tool. The main thing missing for me is the ability to trace executions end-to-end. Personally, I\u2019d really like to see the entire execution traced from the API call to create a post, all the way to the function performing a Query against the DynamoDB table. get-followers followers If you\u2019re solely relying on the built-in AWS tools (CloudWatch, CloudWatch Logs, and X-Ray) then you should give Dashbird a try. Why not sign up for a free trial, and deploy the demo app to your environment so you can see how Dashbird can help you debug your serverless application? Originally published at dashbird.io on January 25, 2019.\",\"arweave\":\"1-0SrkB2_rIKhi38f1xVrhCW6p7X7wlntN_7aremyhs\",\"createdAt\":\"2019-01-29T11:43:01.367Z\",\"excerpt\":\"With AWS Lambda, we get scalability and resilience out-of-the-box. What\u2019s more, AWS also provides built-in monitoring, logging and tracing support through CloudWatch and X-Ray. These built-in tools provide a good starting point but many developers eventually outgrow them as their serverless application becomes more complex.\",\"featureImgColor\":\"rgb(49 64 77 / 70%)\",\"firstSeenAt\":false,\"id\":\"debugging-serverless-applications-with-dashbird-82a2ed86d757\",\"imageSizes\":{\"https://hackernoon.com/hn-images/0*z21gtl_jfN-kE-nn.png\":{\"width\":1600,\"height\":850},\"https://hackernoon.com/hn-images/0*OKovmxFYKL4pGPmG.png\":{\"width\":1600,\"height\":907},\"https://hackernoon.com/hn-images/0*8_jid1Y_sG_cbTJn.png\":{\"width\":1600,\"height\":872},\"https://hackernoon.com/hn-images/0*nq_eP-14T_YcL3ps.png\":{\"width\":1600,\"height\":907},\"https://hackernoon.com/hn-images/0*3wx05u1keXGMJAij.png\":{\"width\":1600,\"height\":910},\"https://hackernoon.com/hn-images/0*-RRtkvYI3B7LvFeT.png\":{\"width\":1600,\"height\":871},\"https://hackernoon.com/hn-images/0*CsuMFbXUfo4gUeLy.png\":{\"width\":1600,\"height\":507},\"https://hackernoon.com/hn-images/0*P8P9xvKvn_-IdQzv.png\":{\"width\":1514,\"height\":928},\"https://hackernoon.com/hn-images/0*NoHAE22yc7RxaT9V.png\":{\"width\":902,\"height\":561},\"https://hackernoon.com/hn-images/0*TDIcxxsnG-n_eap0.png\":{\"width\":1304,\"height\":1222},\"https://hackernoon.com/hn-images/0*9-VOw-xsrF3mB5nQ.png\":{\"width\":1600,\"height\":995},\"https://hackernoon.com/hn-images/0*unPiVL0E6QC057iS.png\":{\"width\":1286,\"height\":1182},\"https://hackernoon.com/hn-images/0*Tjx1XgwC9lZZgtCP.png\":{\"width\":1574,\"height\":966},\"https://hackernoon.com/hn-images/0*J7SEZ_EK1aWK6o3A.png\":{\"width\":1600,\"height\":701}},\"mainImage\":\"https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png\",\"mainImageHeight\":655,\"mainImageWidth\":1600,\"mentions\":[{\"image\":null,\"name\":\"Fetch\",\"id\":\"fetch\",\"collection\":\"companies\",\"manual\":false},{\"image\":null,\"name\":\"Trace\",\"collection\":\"companies\",\"id\":\"trace\",\"manual\":false},{\"image\":\"http://logo.bigpicture.io/logo/twitter.com\",\"name\":\"Twitter\",\"collection\":\"companies\",\"id\":\"twitter\",\"manual\":false}],\"owner\":\"YjziSuGeDecNvCZR0j4bivrb6V13\",\"parentCategory\":\"cloud\",\"parsed\":\"\\u003cp\\u003eWith AWS Lambda, we get scalability and resilience out-of-the-box. What\u2019s more, AWS also provides built-in monitoring, logging and tracing support through CloudWatch and X-Ray. These built-in tools provide a good starting point but many developers eventually outgrow them as their serverless application becomes more complex.\\u003c/p\\u003e\\n\\u003cp\\u003eIn this post, let\u2019s take a serverless application and see how \\u003ca href=\\\"https://dashbird.io/\\\"\\u003eDashbird\\u003c/a\\u003e can help you debug the application.\\u003c/p\\u003e\\n\\u003ch3\\u003eChallenges with serverless observability\\u003c/h3\\u003e\\n\\u003cp\\u003eWhen it comes to observability, serverless has introduced some interesting challenges. For so long, we have relied on the use of agents and daemons to collect metrics and logs. They run silently in the background, away from our critical paths where we are concerned with minimizing user-facing latencies. They collect, buffer and publish these observability data in batches to improve efficiency. As a practice, they are so deeply ingrained into how we monitor our applications, until now.\\u003c/p\\u003e\\n\\u003cp\\u003eWhen it comes to serverless, specifically with managed platforms such as AWS Lambda, there\u2019s simply nowhere for us to install these agents!\\u003c/p\\u003e\\n\\u003cp\\u003eTo collect metrics and logs as part of your function\u2019s invocation would understandably add overhead to its invocation time. Since AWS is collecting logs from your function asynchronously already, and publishing them to CloudWatch Logs. A common workaround is to subscribe to these logs and perform post-processing on them.\\u003c/p\\u003e\\n\\u003cp\\u003eIndeed, that is how Dashbird collects data about your function\u2019s execution. It subscribes the CloudWatch Logs log groups to a Kinesis stream and then processes the events from there. You can read about the advantages of this approach in \\u003ca href=\\\"https://theburningmonk.com/2018/07/centralised-logging-for-aws-lambda-revised-2018/\\\"\\u003ethis article\\u003c/a\\u003e.\\u003c/p\\u003e\\n\\u003cp\\u003eAs our serverless applications become more complex, it\u2019s important for us to be able to trace executions across multiple functions. As the demo app demonstrates, even a simple user transaction can span across multiple event sources as well as Lambda functions.\\u003c/p\\u003e\\n\\u003ch3\\u003eThe demo\u00a0app\\u003c/h3\\u003e\\n\\u003cp\\u003eImagine you\u2019re building a Twitter clone. One of the core features of the system is to distribute a user\u2019s post to his followers\u2019 feeds. To implement this feature, imagine we have two separate API endpoints:\\u003c/p\\u003e\\n\\u003cul\\u003e\\n\\u003cli\\u003ePOST posts/create\u00a0: to create a new post for the current user\\u003c/li\\u003e\\n\\u003cli\\u003eGET followers/{userId}\u00a0: to fetch a user\u2019s followers\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\\u003cp\\u003eEach endpoint is handled by a separate Lambda function\u200a\u2014\u200a\\u003cstrong\\u003e\\u003cem\\u003ecreate-post\\u003c/em\\u003e\\u003c/strong\\u003e and \\u003cstrong\\u003e\\u003cem\\u003eget-followers\\u003c/em\\u003e\\u003c/strong\\u003e respectively.\\u003c/p\\u003e\\n\\u003cp\\u003eWhen a user publishes a new post, the \\u003cstrong\\u003e\\u003cem\\u003ecreate-post\\u003c/em\\u003e\\u003c/strong\\u003e function would save the post in the \\u003cstrong\\u003e\\u003cem\\u003eposts\\u003c/em\\u003e\\u003c/strong\\u003e DynamoDB table and also publish a \\u003cstrong\\u003e\\u003cem\\u003epost-created\\u003c/em\\u003e\\u003c/strong\\u003e event into a Kinesis stream. This event then triggers a \\u003cstrong\\u003e\\u003cem\\u003edistribute-post\\u003c/em\\u003e\\u003c/strong\\u003e function. This function would query the \\u003cem\\u003eGET followers/{userId}\\u003c/em\\u003e endpoint and then add the post to the followers\u2019 feeds. The \\u003cstrong\\u003e\\u003cem\\u003eget-followers\\u003c/em\\u003e\\u003c/strong\\u003e function would query the \\u003cstrong\\u003e\\u003cem\\u003efollowers\\u003c/em\\u003e\\u003c/strong\\u003e DynamoDB table to return the IDs of the user\u2019s followers.\\u003c/p\\u003e\\n\\u003cp\\u003eFor brevity sake I have omitted the logic for actually distributing the posts. So the overall architecture for our demo app looks like the following.\\u003c/p\\u003e\\n\\u003cp\\u003e\\u003cimg src=\\\"https://hackernoon.com/hn-images/0*NoHAE22yc7RxaT9V.png\\\" alt=\\\"\\\"\\u003e\\u003c/p\\u003e\\n\\u003cp\\u003eTo make things more interesting, each of the Lambda functions are hardwired to error or timeout based on a configurable probability. The source code for the demo app is \\u003ca href=\\\"https://github.com/theburningmonk/dashbird-demo\\\"\\u003eavailable on Github\\u003c/a\\u003e, so feel free to try it out yourself.\\u003c/p\\u003e\\n\\u003ch3\\u003eIntroducing Dashbird\\u003c/h3\\u003e\\n\\u003cp\\u003eEven with a simple serverless application like the one outlined above, we have quite a few functions to look after. Let\u2019s see how we can use Dashbird to help us monitor this application and debug issues.\\u003c/p\\u003e\\n\\u003cp\\u003eAs soon as I log in, I have a high level dashboard for my account.\\u003c/p\\u003e\\n\\u003cp\\u003e\\u003cimg src=\\\"https://hackernoon.com/hn-images/0*3wx05u1keXGMJAij.png\\\" alt=\\\"\\\"\\u003e\\u003c/p\\u003e\\n\\u003cp\\u003eIn addition to the data I get in the AWS Lambda console (see below), the Dashbird dashboard has two useful data points:\\u003c/p\\u003e\\n\\u003cul\\u003e\\n\\u003cli\\u003eAverage memory utilization for the functions\\u003c/li\\u003e\\n\\u003cli\\u003eCost for the Lambda invocations\\u003c/li\\u003e\\n\\u003c/ul\\u003e\\n\\u003cp\\u003e\\u003cimg src=\\\"https://hackernoon.com/hn-images/0*-RRtkvYI3B7LvFeT.png\\\" alt=\\\"\\\"\\u003e\\u003c/p\\u003e\\n\\u003cp\\u003eNext, in Dashbird\u2019s Lambda console, I can see a high level summary of my functions and their activities over the last 24 hours.\\u003c/p\\u003e\\n\\u003cp\\u003e\\u003cimg src=\\\"https://hackernoon.com/hn-images/0*z21gtl_jfN-kE-nn.png\\\" alt=\\\"\\\"\\u003e\\u003c/p\\u003e\\n\\u003cp\\u003eWhat I find very useful here is the fact that it highlights functions that have been idle for 10 days as inactive. As your serverless architecture expands and you end up with hundreds of functions, maintained by different teams, it\u2019s very difficult to track which functions are no longer needed. Having redundant functions lying around is a security risk as they remain an attack surface that can be exploited.\\u003c/p\\u003e\\n\\u003cp\\u003eWhile this view alone cannot tell you definitively which functions are no longer used. Many functions are not run on a regular basis. Maybe they are part of a cron job that only runs once a month. Or maybe they are only used during disaster recovery scenarios. Nonetheless, being aware of which functions are inactive encourages teams to ask the question \u201cIs this function still needed?\u201d. From here, maybe better practices can emerge. For example, use tags to mark functions that are expected to be used sparingly so they are not flagged by these checks.\\u003c/p\\u003e\\n\\u003cp\\u003e\\u003cimg src=\\\"https://hackernoon.com/hn-images/0*CsuMFbXUfo4gUeLy.png\\\" alt=\\\"\\\"\\u003e\\u003c/p\\u003e\\n\\u003cp\\u003eIf I navigate to one of the functions, then I have a function-centric view of invocation time, error, cost and memory utilization. In addition, I can also see a list of the recent invocations. What\u2019s really useful here is that cold starts and retries are clearly labelled. When debugging live issues this lets me quickly narrow down the invocations that I need to pay attention to.\\u003c/p\\u003e\\n\\u003cp\\u003e\\u003cimg src=\\\"https://hackernoon.com/hn-images/0*8_jid1Y_sG_cbTJn.png\\\" alt=\\\"\\\"\\u003e\\u003c/p\\u003e\\n\\u003cp\\u003eStraight away, I can see that 3 of the invocations timed out after 6 seconds. What\u2019s more, the original Kinesis event was retried 3 times and finally succeeded on the third retry.\\u003c/p\\u003e\\n\\u003cp\\u003e\\u003cimg src=\\\"https://hackernoon.com/hn-images/0*J7SEZ_EK1aWK6o3A.png\\\" alt=\\\"\\\"\\u003e\\u003c/p\\u003e\\n\\u003cp\\u003eIf I click on the \u201c+\u201d button next to an invocation then I can drill down to the invocation itself. Here I can see the logs and X-Ray trace for this invocation in one screen. This is great as it saves me from having to constantly jump between different AWS console.\\u003c/p\\u003e\\n\\u003cp\\u003e\\u003cimg src=\\\"https://hackernoon.com/hn-images/0*9-VOw-xsrF3mB5nQ.png\\\" alt=\\\"\\\"\\u003e\\u003c/p\\u003e\\n\\u003ch3\\u003eDebugging with\u00a0Dashbird\\u003c/h3\\u003e\\n\\u003cp\\u003eAs mentioned before, the demo app is hardwired to error and timeout. And sure enough, when these failure cases happen, Dashbird\u2019s built-in alerting kicks in and I promptly received emails notifying me that something went wrong.\\u003c/p\\u003e\\n\\u003cp\\u003e\\u003cimg src=\\\"https://hackernoon.com/hn-images/0*TDIcxxsnG-n_eap0.png\\\" alt=\\\"\\\"\\u003e\\u003c/p\\u003e\\n\\u003cp\\u003e\\u003cimg src=\\\"https://hackernoon.com/hn-images/0*unPiVL0E6QC057iS.png\\\" alt=\\\"\\\"\\u003e\\u003c/p\\u003e\\n\\u003cp\\u003eWhile this built-in alerting is great, I couldn\u2019t see any settings to adjust the alert sensitivity.\\u003c/p\\u003e\\n\\u003cp\\u003eAs I followed the links in the emails, to the function, then the failed invocation. Dashbird neatly groups the related invocations\u200a\u2014\u200athe initial timeout, and the subsequent retries\u200a\u2014\u200atogether. I can quickly see that the failed Kinesis event was successfully processed on the 3rd retry.\\u003c/p\\u003e\\n\\u003cp\\u003e\\u003cimg src=\\\"https://hackernoon.com/hn-images/0*P8P9xvKvn_-IdQzv.png\\\" alt=\\\"\\\"\\u003e\\u003c/p\\u003e\\n\\u003cp\\u003eDashbird also tracks the open issues in the Errors console. Now that I know the problem has resolved itself I can go ahead and resolve the error.\\u003c/p\\u003e\\n\\u003cp\\u003e\\u003cimg src=\\\"https://hackernoon.com/hn-images/0*OKovmxFYKL4pGPmG.png\\\" alt=\\\"\\\"\\u003e\\u003c/p\\u003e\\n\\u003ch3\\u003eTailing function\u00a0logs\\u003c/h3\\u003e\\n\\u003cp\\u003eAnother nice feature of Dashbird is that it\u2019s able to tail the logs for multiple functions at the same time. For the demo app, I want to see the logs for both the \\u003cem\\u003ecreate-post\\u003c/em\\u003e and \\u003cem\\u003edistribute-post\\u003c/em\\u003e functions as I curl the \\u003cem\\u003ePOST posts/create\\u003c/em\\u003e endpoint.\\u003c/p\\u003e\\n\\u003cp\\u003eThat way, I can see that the event was successfully published into the Kinesis stream, and was subsequently received by the \\u003cem\\u003edistribute-post\\u003c/em\\u003e function.\\u003c/p\\u003e\\n\\u003cp\\u003e\\u003cimg src=\\\"https://hackernoon.com/hn-images/0*nq_eP-14T_YcL3ps.png\\\" alt=\\\"\\\"\\u003e\\u003c/p\\u003e\\n\\u003ch3\\u003eConclusion\\u003c/h3\\u003e\\n\\u003cp\\u003eOverall I was impressed with what Dashbird has to offer, and it\u2019s clear that a lot of thought has gone into the product. It has many nice touches that makes debugging much easier. For example, grouping retries together, and integrating X-Ray traces and logs in one screen. These might seem like trivial niceties, but they can make a big difference under the high-pressure scenarios of dealing with a live issue.\\u003c/p\\u003e\\n\\u003cp\\u003eFrom what I have been able to see, I think Dashbird is a really great tool. The main thing missing for me is the ability to trace executions end-to-end. Personally, I\u2019d really like to see the entire execution traced from the API call to create a post, all the way to the \\u003cstrong\\u003e\\u003cem\\u003eget-followers\\u003c/em\\u003e\\u003c/strong\\u003e function performing a Query against the \\u003cstrong\\u003e\\u003cem\\u003efollowers\\u003c/em\\u003e\\u003c/strong\\u003e DynamoDB table.\\u003c/p\\u003e\\n\\u003cp\\u003e\\u003cimg src=\\\"https://hackernoon.com/hn-images/0*Tjx1XgwC9lZZgtCP.png\\\" alt=\\\"\\\"\\u003e\\u003c/p\\u003e\\n\\u003cp\\u003eIf you\u2019re solely relying on the built-in AWS tools (CloudWatch, CloudWatch Logs, and X-Ray) then you should give Dashbird a try. Why not sign up for a free trial, and deploy the demo app to your environment so you can see how Dashbird can help you debug your serverless application?\\u003c/p\\u003e\\n\\u003cp\\u003e\\u003cem\\u003eOriginally published at\\u003c/em\\u003e \\u003ca href=\\\"https://dashbird.io/blog/debugging-serverless-apps-with-dashbird/\\\"\\u003e\\u003cem\\u003edashbird.io\\u003c/em\\u003e\\u003c/a\\u003e \\u003cem\\u003eon January 25, 2019.\\u003c/em\\u003e\\u003c/p\\u003e\",\"profile\":{\"about_page_settings\":{\"blocked\":false,\"createdAt\":\"2021-12-16T04:44:48.785Z\",\"owner\":\"YjziSuGeDecNvCZR0j4bivrb6V13\",\"published\":true,\"style\":{\"headline_pos\":\"center\",\"layout\":0,\"skin\":0},\"updatedAt\":\"2021-12-16T04:44:48.785Z\"},\"adLink\":\"https://theburningmonk.com/hire-me/\",\"adText\":\"Ask me for help about serverless\",\"avatar\":\"https://hackernoon.com/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg\",\"bio\":\"AWS Serverless Hero. Independent Consultant. Developer Advocate at Lumigo.\",\"callToActions\":[{\"active\":true,\"icon\":\"far fa-smile\",\"id\":\"98d3912fa2ee6-brand\",\"name\":\"Ask me for help about serverless\",\"url\":\"https://theburningmonk.com/hire-me/\"},{\"active\":true,\"icon\":\"fa fa-book\",\"id\":\"e11673721d0c1\",\"name\":\"Read My Stories\",\"url\":\"https://hackernoon.com/u/theburningmonk\"},{\"active\":true,\"icon\":\"far fa-smile\",\"id\":\"2c5ef23d3285d-brand\",\"name\":\"Ask me for help about serverless\",\"url\":\"https://theburningmonk.com/hire-me/\"}],\"displayName\":\"Yan Cui\",\"handle\":\"theburningmonk\",\"currentJob\":{},\"isBrand\":false,\"jobHistory\":[],\"isTrusted\":false,\"allowSubscribers\":true},\"publishedAt\":1548762181.367,\"tags\":[\"aws\",\"aws-lambda\",\"serverless\",\"cloud-computing\",\"debugging-serverless\"],\"title\":\"Debugging Serverless Applications with Dashbird\",\"backlinks\":{\"fetched\":\"2025-05-05T17:05:12.031Z\",\"urls\":[\"https://www.bitcoininsider.org/article/57408/debugging-serverless-applications-dashbird\"]},\"draftId\":\"debugging-serverless-applications-with-dashbird-82a2ed86d757\",\"tldr\":\"With AWS Lambda, we get scalability and resilience out-of-the-box. What\u2019s more, AWS also provides built-in monitoring, logging and tracing support through CloudWatch and X-Ray. These built-in tools provide a good starting point but many developers eventually outgrow them as their serverless application becomes more complex.\",\"super_category\":\"cybersecurity\",\"annotations\":[],\"coAuthorProfiles\":[],\"commentsCount\":0,\"fromMongo\":true,\"relatedStories\":[{\"title\":\"Running and debugging AWS Lambda functions locally with the Serverless framework and VS Code\",\"mainImage\":\"https://hackernoon.com/hn-images/1*Iu-ScNJcyMp1hFIkt2pAeA.png\",\"slug\":\"running-and-debugging-aws-lambda-functions-locally-with-the-serverless-framework-and-vs-code-a254e2011010\",\"tags\":[\"aws\",\"serverless\",\"vscode\",\"aws-lambda\",\"cloud\"],\"excerpt\":\"An often underused feature of the Serverless framework is the \\u003ca href=\\\"https://serverless.com/framework/docs/providers/aws/cli-reference/invoke-local/\\\" target=\\\"_blank\\\"\\u003einvoke local\\u003c/a\\u003e command, which runs your code locally by emulating the AWS Lambda environment. Granted, it\u2019s not a perfect simulation and only works with Node.js and Python, but it has been good enough for most of local development needs.\",\"publishedAt\":1500984314506,\"profile\":{\"handle\":\"theburningmonk\",\"avatar\":\"https://hackernoon.com/images/avatars/YjziSuGeDecNvCZR0j4bivrb6V13.jpg\",\"displayName\":\"Yan Cui\",\"isBrand\":false},\"recommended\":true},{\"title\":\"Why the AWS Console Isn\u2019t the Best for Serverless Debugging\",\"mainImage\":\"https://cdn.hackernoon.com/images/JT4BgXlfxveziEP9szyBKsEXoFf2-4qf31dj.jpeg\",\"slug\":\"why-the-aws-console-isnt-the-best-for-serverless-debugging-391e34nk\",\"tags\":[\"serverless\",\"aws\",\"aws-lambda\",\"aws-troubleshooting\",\"debugging\",\"cloudwatch\",\"amazon\",\"serverless-debugging\"],\"excerpt\":\"Debugging and troubleshooting in AWS Console is hard and time-consuming. Here's a few reasons why you should stop digging around in Cloudwatch. \",\"publishedAt\":1609961032808,\"profile\":{\"handle\":\"taavi-rehemagi\",\"avatar\":\"https://hackernoon.com/images/avatars/JT4BgXlfxveziEP9szyBKsEXoFf2.jpg\",\"displayName\":\"Taavi Rehem\u00e4gi\"},\"recommended\":true},{\"title\":\"How to Debug Serverless Apps on AWS Lambda\",\"mainImage\":\"https://cdn.hackernoon.com/images/PVJZAra3SJb106HGMWMnMsiHUCk1-sz82rtg.jpeg\",\"slug\":\"how-to-debug-serverless-apps-on-aws-lambda\",\"tags\":[\"debugging\",\"serverless-computing\",\"aws-lambda\",\"aws-lambda-best-practices\",\"lambda-functions\",\"feature-flags-in-serverless\",\"serverless-debugging-tools\",\"aws-sam-local-debugging\"],\"excerpt\":\"Discover effective strategies for debugging serverless in general and AWS Lambda. Serverless can be painful, but not a bottomless pit of despair.\",\"publishedAt\":1719932148054,\"profile\":{\"handle\":\"shai.almog\",\"avatar\":\"https://cdn.hackernoon.com/images/PVJZAra3SJb106HGMWMnMsiHUCk1-lk129qc.png\",\"displayName\":\"Shai Almog\"},\"recommended\":true},{\"title\":\"Overcome X-Ray\u2019s issue for Lambda debugging\",\"mainImage\":\"https://hackernoon.com/fallback-feat.png\",\"slug\":\"overcome-x-rays-issue-for-debugging-892498b14346\",\"tags\":[\"aws\",\"serverless\",\"debugging\",\"lambda\",\"lambda-debugging\"],\"excerpt\":\"Tracing is one of the pillars of Observebility, according to Twitter. \\u003ca href=\\\"https://hackernoon.com/tagged/aws\\\" target=\\\"_blank\\\"\\u003eAWS\\u003c/a\\u003e X-Ray helps you to get an overview of your distributed application, to find bottlenecks and to tune its critical path. Also, it provides you with the ability to trace your requests, so you can see which journey, any single request goes through when it enters your application. AWS X-Ray can potentially be a powerful tool for debugging your serverless application, however it\u2019s still immature and there is a lot to improve. One of them is about its debugging ability and how it shows the errors.\",\"publishedAt\":1529351457264,\"profile\":{\"handle\":\"azarboon\",\"avatar\":\"https://firebasestorage.googleapis.com/v0/b/hackernoon-app.appspot.com/o/images%2FngRlQHxJgPRevsLpt9VOthznPb52-re9v3t8o.jpeg?alt=media\\u0026token=e7e16251-aec5-41e9-b392-4fb3f2cf1f8b\",\"displayName\":\"Mahdi Azarboon\"},\"recommended\":true},{\"title\":\"Debug your AWS Lambda in Production in just 5 steps\",\"mainImage\":\"https://cdn.hackernoon.com/images/fPDaWVkv8leWTOQalzsf4nuOStC3-3fa3ja6.jpeg\",\"slug\":\"debug-your-aws-lambda-in-production-in-just-5-steps\",\"tags\":[\"aws-lambda\",\"debugging\",\"serverless-debugging\",\"vscode\",\"thundra\",\"debugger\",\"call-stack\",\"nodejs\"],\"excerpt\":\"By using AWS Lambda Debugger VS Code Extension, you can debug your serverless applications natively with their permissions. \",\"publishedAt\":1649476086745,\"profile\":{\"handle\":\"kantarci\",\"avatar\":\"https://cdn.hackernoon.com/images/fPDaWVkv8leWTOQalzsf4nuOStC3-gi93j4t.jpeg\",\"displayName\":\"Burak Kantarc\u0131\"},\"recommended\":true},{\"title\":\"Debugging AWS Lambda Runtime Errors\",\"mainImage\":\"https://cdn.hackernoon.com/images/33UpiIBRRuXB2vb2m4f8GRq2cRt2-md93q2k.jpeg\",\"slug\":\"debugging-aws-lambda-runtime-errors\",\"tags\":[\"aws-lambda\",\"cloudwatch\",\"serverless-monitoring\",\"observability\",\"observability-tools\",\"serverless-observability\",\"aws\",\"aws-services\"],\"excerpt\":\"Debugging AWS Lambda can get tricky in Amazon CloudWatch. KloudMate lets you get to Lambda errors quickly and effectively using Lambda error logs. \",\"publishedAt\":1669245072582,\"profile\":{\"handle\":\"akanksharana\",\"avatar\":\"https://cdn.hackernoon.com/images/33UpiIBRRuXB2vb2m4f8GRq2cRt2-cj93w8z.jpeg\",\"displayName\":\"Akanksha\"},\"recommended\":true},{\"title\":\"Introductory Guide to Debugging Lambda Configuration Errors\",\"mainImage\":\"https://cdn.hackernoon.com/images/JT4BgXlfxveziEP9szyBKsEXoFf2-szm33p0.jpeg\",\"slug\":\"introductory-guide-to-debugging-lambda-configuration-errors-eb2f339d\",\"tags\":[\"aws\",\"aws-lambda\",\"serverless\",\"debugging\",\"lambda\",\"devops\",\"well-architected-framework\",\"observability\"],\"excerpt\":\"The \u201cLambda configuration error\u201d is as generic as it gets but at the end of the day, it's a pathing issue. Let's go over how to resolve this.\",\"publishedAt\":1616717281370,\"profile\":{\"handle\":\"taavi-rehemagi\",\"avatar\":\"https://hackernoon.com/images/avatars/JT4BgXlfxveziEP9szyBKsEXoFf2.jpg\",\"displayName\":\"Taavi Rehem\u00e4gi\"},\"recommended\":true},{\"title\":\"Setting up a Debugging Environment for Azure Functions 2.x using VS Code\",\"mainImage\":\"https://images.unsplash.com/photo-1550439062-609e1531270e?ixlib=rb-1.2.1\\u0026q=80\\u0026fm=jpg\\u0026crop=entropy\\u0026cs=tinysrgb\\u0026w=1080\\u0026fit=max\\u0026ixid=eyJhcHBfaWQiOjEwMDk2Mn0\",\"slug\":\"setting-up-a-debugging-environment-for-azure-functions-2x-using-vs-code-6vaf3z4y\",\"tags\":[\"python\",\"vscode\",\"azure-functions-in-python\",\"debugging\",\"csharp\",\"azure\",\"serverless\",\"programming\"],\"excerpt\":\"Overview\",\"publishedAt\":1579270496965,\"profile\":{\"handle\":\"joegatt\",\"avatar\":\"https://hackernoon.com/images/avatars/eOytFjsyJYdjeyWOP61s4G9Vru42.jpg\",\"displayName\":\"Joe Gatt\"},\"recommended\":true},{\"title\":\"Using a NestJS Application with DynamoDB and Serverless Framework on AWS\",\"mainImage\":\"https://cdn.hackernoon.com/images/JaI04JxjP5WiiJKlOeLrImL5dAw2-7ib3lnd.jpeg\",\"slug\":\"using-a-nestjs-application-with-dynamodb-and-serverless-framework-on-aws\",\"tags\":[\"debugging\",\"coding\",\"coding-skills\",\"programming\",\"nestjs-application\",\"dynamodb\",\"serverless-framework\",\"aws\",\"web-monetization\"],\"excerpt\":\"NestJS is\u00a0a progressive Node.\u00a0js framework that helps build server-side applications. \",\"publishedAt\":1658445329783,\"profile\":{\"handle\":\"airscholar\",\"avatar\":\"https://cdn.hackernoon.com/images/JaI04JxjP5WiiJKlOeLrImL5dAw2-7n93nz6.jpeg\",\"displayName\":\"Yusuf Ganiyu\"},\"recommended\":true},{\"title\":\"How to Save Hundreds of Hours on Lambda Debugging\",\"mainImage\":\"https://cdn.hackernoon.com/images/JT4BgXlfxveziEP9szyBKsEXoFf2-ffk31oz.jpeg\",\"slug\":\"how-to-save-hundreds-of-hours-on-lambda-debugging-5s1q319k\",\"tags\":[\"aws\",\"aws-lambda\",\"debugging\",\"lambda-function\",\"aws-lambda-best-practices\",\"lambda-scalability\",\"monitoring\",\"serverless\"],\"excerpt\":\"Lambda debugging can take hours to resolve. Learn these time-saving methods to quickly scan logs and errors in your Lambda functions\",\"publishedAt\":1611657101720,\"profile\":{\"handle\":\"taavi-rehemagi\",\"avatar\":\"https://hackernoon.com/images/avatars/JT4BgXlfxveziEP9szyBKsEXoFf2.jpg\",\"displayName\":\"Taavi Rehem\u00e4gi\"},\"recommended\":true},{\"title\":\"3 Tools to Gain More Insights into Your AWS Lambda Functions\",\"mainImage\":\"https://cdn.hackernoon.com/images/JT4BgXlfxveziEP9szyBKsEXoFf2-1l036ch.jpeg\",\"slug\":\"top-tools-for-monitoring-python-in-aws-lambda\",\"tags\":[\"python\",\"python-programming\",\"serverless\",\"aws\",\"aws-lambda\",\"cloud-computing\",\"monitoring-python-aws-lambda\",\"top-tools\"],\"excerpt\":\"Comparison of top observability and debugging tools to help you monitor Python in AWS Lambda.\",\"publishedAt\":1635203394862,\"profile\":{\"handle\":\"taavi-rehemagi\",\"avatar\":\"https://hackernoon.com/images/avatars/JT4BgXlfxveziEP9szyBKsEXoFf2.jpg\",\"displayName\":\"Taavi Rehem\u00e4gi\"},\"recommended\":true},{\"title\":\"Using ngrok with Azure Functions\u26a1\",\"mainImage\":\"https://hackernoon.com/hn-images/1*SwCPvaS2WZDsfiko8igAIg.png\",\"slug\":\"using-ngrok-with-azure-functions-7e209e96538c\",\"tags\":[\"serverless\",\"azure\",\"azure-functions\",\"ngrok\",\"api\"],\"excerpt\":\"With things like the Azure Functions Cli and Azure Functions tools for Visual Studio you get the full development and debugging story locally on your machine. This is great as you can iterate and test quickly without the need to push the code to the cloud first, the drawback of this is that you can\u2019t do incoming webhooks from. 3:rd party services, i.e. GitHub can\u2019t access your locally running function.\",\"publishedAt\":1503737512905,\"profile\":{\"handle\":\"mattias\",\"avatar\":\"https://hackernoon.com/images/avatars/QiHY59qgkDRnIOeA6CLoENW34HA3.jpg\",\"displayName\":\"Mattias Karlsson\"},\"recommended\":true},{\"title\":\"What Causes Malformed Lambda Proxy Response and How to Fix it\",\"mainImage\":\"https://cdn.hackernoon.com/images/JT4BgXlfxveziEP9szyBKsEXoFf2-2w1w31gd.jpeg\",\"slug\":\"what-causes-malformed-lambda-proxy-response-and-how-to-fix-it-4t1d31ld\",\"tags\":[\"serverless\",\"aws\",\"aws-lambda\",\"debugging\",\"error-handling\",\"amazon-web-services\",\"lambda\",\"proxy\"],\"excerpt\":\"Malformed Lambda proxy response is a common configuration error in a serverless architecture. Learn what causes this error and how to fix it.\",\"publishedAt\":1610981054671,\"profile\":{\"handle\":\"taavi-rehemagi\",\"avatar\":\"https://hackernoon.com/images/avatars/JT4BgXlfxveziEP9szyBKsEXoFf2.jpg\",\"displayName\":\"Taavi Rehem\u00e4gi\"},\"recommended\":true}],\"previousRead\":{\"slug\":\"subscribe-sqs-to-a-sns-topic-in-another-aws-account-with-cloudformation-and-gotchas-b80f229d32e4\",\"mainImage\":\"https://hackernoon.com/hn-images/0*_H3-LaaQUzj4JB_g.png\",\"owner\":\"YjziSuGeDecNvCZR0j4bivrb6V13\",\"title\":\"Subscribe SQS to a SNS topic in another AWS account with CloudFormation, and gotchas!\"},\"nextRead\":{\"slug\":\"lambda-optimization-tip-enable-http-keep-alive-6dc503f6f114\",\"mainImage\":\"https://hackernoon.com/hn-images/0*bmImHeGBqn0JWrQz.png\",\"owner\":\"YjziSuGeDecNvCZR0j4bivrb6V13\",\"title\":\"Lambda optimization tip\u200a\u2014\u200aenable HTTP keep-alive\"},\"staticData\":{\"frLangTooltip\":\"Lisez cette histoire en Fran\u00e7ais!\",\"about\":\"About\",\"enLangTooltip\":\"Read this story in the original language, English!\",\"loggedOutBookmark\":\"Create an account to store your bookmarks\",\"learnMore\":\"Learn More\",\"stats\":\"Stats\",\"editStory\":\"Edit Story\",\"audioPresented\":\"Audio Presented by\",\"by\":\"by\",\"audioTranslationText\":null,\"newStory\":\"New Story\",\"loggedInBookmark\":\"Bookmark story\",\"esLangTooltip\":\"Lee esta historia en Espa\u00f1ol!\",\"relatedStories\":\"RELATED STORIES\",\"addComment\":\"Add Comment\",\"ptLangTooltip\":\"Leia esta hist\u00f3ria em portugu\u00eas!\",\"hiLangTooltip\":\"\u0907\u0938 \u0915\u0939\u093e\u0928\u0940 \u0915\u094b \u0939\u093f\u0902\u0926\u0940 \u092e\u0947\u0902 \u092a\u0922\u093c\u0947\u0902!\",\"comments\":\"Comments\",\"removeBookmark\":\"Remove bookmark\",\"commentReply\":\"Reply\",\"minutes\":\"min\",\"reads\":\"reads\",\"trLangTooltip\":\"Bu hikayeyi T\u00fcrk\u00e7e okuyun!\",\"tags\":\"TOPICS\",\"jaLangTooltip\":\"\u3053\u306e\u7269\u8a9e\u3092\u65e5\u672c\u8a9e\u3067\u8aad\u3093\u3067\u304f\u3060\u3055\u3044\uff01\",\"bnLangTooltip\":\"\u098f\u0987 \u0997\u09b2\u09cd\u09aa\u099f\u09bf \u09ac\u09be\u0982\u09b2\u09be\u09af\u09bc \u09aa\u09a1\u09bc\u09c1\u09a8!\",\"storyMentions\":\"MENTIONED IN THIS STORY\",\"ruLangTooltip\":\"\u041f\u0440\u043e\u0447\u0442\u0438\u0442\u0435 \u044d\u0442\u0443 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435!\",\"deLangTooltip\":\"Lesen Sie diese Geschichte auf Deutsch!\",\"featuredIn\":\"THIS ARTICLE WAS FEATURED IN\",\"tldrTitle\":\"Too Long; Didn't Read\",\"koLangTooltip\":\"\uc774 \uc774\uc57c\uae30\ub97c \ud55c\uad6d\uc5b4\ub85c \uc77d\uc5b4\ubcf4\uc138\uc694!\",\"zhLangTooltip\":\"\u7528\u7e41\u9ad4\u4e2d\u6587\u95b1\u8b80\u9019\u500b\u6545\u4e8b\uff01\",\"viLangTooltip\":\"\u0110\u1ecdc b\u00e0i vi\u1ebft n\u00e0y b\u1eb1ng ti\u1ebfng Vi\u1ec7t!\"},\"searchTopics\":[\"debugging serverless\"],\"stats\":{\"pageviews\":490},\"socialPreviewImage\":\"https://hackernoon.imgix.net/hn-images/0*MU2JAw5c2Pkrb6Bn.png\",\"audioData\":null},\"slug\":\"debugging-serverless-applications-with-dashbird-82a2ed86d757\"},\"__N_SSG\":true},\"page\":\"/[slug]\",\"query\":{\"slug\":\"debugging-serverless-applications-with-dashbird-82a2ed86d757\"},\"buildId\":\"pN9uscjfiBPXE13xRBm1c\",\"isFallback\":false,\"isExperimentalCompile\":false,\"dynamicIds\":[77618,63213,87127,71206,89752,41116,31486,42348],\"gsp\":true,\"scriptLoader\":[]}</script><script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML=\"window.__CF$cv$params={r:'a2b1dc4629d505c9',t:'MTc4NjczMDQ0MA=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);\";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body></html>"},"msg":["CREDITS: this demo application is brought to you by courtesy of Dashbird.io. Dashbird makes monitoring logs and performance of serverless applications a breeze. Start a free trial today, no credit card required: https://dashbird.io","COPYRIGHT NOTICE: the data retrieved by the application may be subject to copyright and/or terms of usage. This application is intended ONLY for demonstration purposes. It does not grant you any rights over the content retrieved and you are solely responsible for non-legal usage of the application."]}