<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: boroskoyo</title>
    <description>The latest articles on DEV Community by boroskoyo (@boroskoyo).</description>
    <link>https://dev.to/boroskoyo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F297860%2F67d8ee6d-2045-44c3-978d-ab7c77a929c6.png</url>
      <title>DEV Community: boroskoyo</title>
      <link>https://dev.to/boroskoyo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/boroskoyo"/>
    <language>en</language>
    <item>
      <title>Using Grafana to visualize CI Workflow Stats</title>
      <dc:creator>boroskoyo</dc:creator>
      <pubDate>Thu, 02 Mar 2023 08:43:53 +0000</pubDate>
      <link>https://dev.to/boroskoyo/using-grafana-to-visualize-ci-workflow-stats-545d</link>
      <guid>https://dev.to/boroskoyo/using-grafana-to-visualize-ci-workflow-stats-545d</guid>
      <description>&lt;p&gt;Grafana is an excellent tool for creating dashboards to gather data from various sources and serve them in a single place. According to &lt;a href="https://thenewstack.io/will-grafana-become-easier-to-use-in-2022/"&gt;Newstack,&lt;/a&gt; Grafana is the second most popular observability tool, counting 800,000 active installs and over 10 million users. These numbers also include some of our customers, and we have collected much feedback about bringing Foresight’s data &amp;amp; charts to Grafana Dashboards.&lt;/p&gt;

&lt;p&gt;Using a dashboard like Grafana helps teams have a whole view of what the team is doing. Improving visibility and having a streamlined analysis for faster problem-solving. When technical issues arise, having all the data in a single place can help you solve them more quickly. Instead of spending time gathering data from multiple sources, you can access everything you need in one location. This can reduce downtime and minimize the impact of technical issues on productivity.&lt;/p&gt;

&lt;p&gt;Makers define Grafana as “ &lt;em&gt;the open source analytics &amp;amp; monitoring solution for every database&lt;/em&gt;” and we wanted to make Foresight one of those. Making it easier for our users to observe their CI workflow health &amp;amp; stats.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing Foresight Plugin for Grafana!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6KUHO9ZN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v7561hz706w1vpoeqp7u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6KUHO9ZN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v7561hz706w1vpoeqp7u.png" alt="Image description" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Foresight is a powerful tool for monitoring and managing your continuous integration (CI) and testing workflows within GitHub Actions. With Foresight, you can easily track key metrics related to your workflows, such as build times, failure rates, etc. Now, with the Foresight plugin for Grafana, you can bring those insights directly into your Grafana dashboards. This plugin enables you to visualize Foresight’s workflow stats, and workflow failure heatmap features directly within Grafana, making it easier than ever to monitor the performance of your workflows and take action when issues arise. Whether you’re a developer, an operations team member, or a project manager, the Foresight plugin for Grafana can help you stay on top of your workflows and improve your team’s productivity.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b1uApaAp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/0%2A8tBf29QFICY_ZXDM.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b1uApaAp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/0%2A8tBf29QFICY_ZXDM.gif" alt="" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This panel plugin comes with two tabs,&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.runforesight.com/features/workflow-dashboard"&gt;Stats of the workflows:&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Total execution count&lt;/li&gt;
&lt;li&gt;  Fail &amp;amp; Success Rate&lt;/li&gt;
&lt;li&gt;  Fail count&lt;/li&gt;
&lt;li&gt;  Average Duration&lt;/li&gt;
&lt;li&gt;  P95&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://docs.runforesight.com/features/highlights#status"&gt;Workflow failure heatmap&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  number of errors per day &amp;amp; workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many more features are coming, and your feedback is highly appreciated.&lt;/p&gt;

&lt;p&gt;In conclusion, Grafana is a powerful data visualization tool that can help you make sense of your technical data and increase productivity. By bringing all your technical data to a central location and visualizing it in meaningful ways, you can gain insights into your operations, identify areas for improvement, and make data-driven decisions that lead to greater efficiency. With the Foresight plugin for Grafana, you can take your data analysis to the next level by visualizing key CI and testing metrics directly within your Grafana dashboards. To learn more about Grafana and the &lt;a href="https://docs.runforesight.com/integrations/grafana"&gt;Foresight plugin&lt;/a&gt;, check out the documentation today and explore the power of data-driven decision-making.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YW6CEGgQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A4CLDKOCWoKroxS_3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YW6CEGgQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A4CLDKOCWoKroxS_3.png" alt="" width="880" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.runforesight.com/signup"&gt;https://app.runforesight.com/signup&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="https://www.runforesight.com/blog/using-grafana-to-visualize-ci-workflow-stats"&gt;&lt;em&gt;https://www.runforesight.com&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>githubactions</category>
      <category>ci</category>
      <category>devops</category>
      <category>github</category>
    </item>
    <item>
      <title>Collecting error stacks from backend as exceptions occur in E2E tests — A tutorial on Cypress</title>
      <dc:creator>boroskoyo</dc:creator>
      <pubDate>Mon, 28 Nov 2022 06:59:01 +0000</pubDate>
      <link>https://dev.to/boroskoyo/collecting-error-stacks-from-backend-as-exceptions-occur-in-e2e-tests-a-tutorial-on-cypress-3bda</link>
      <guid>https://dev.to/boroskoyo/collecting-error-stacks-from-backend-as-exceptions-occur-in-e2e-tests-a-tutorial-on-cypress-3bda</guid>
      <description>&lt;h2&gt;
  
  
  Discover the missing piece of E2E test results
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;This article is the first chapter of the Sidekick Stack-based Testing Series. Tools mentioned in this article (Cypress &amp;amp; Sidekick) are both &lt;strong&gt;open-source,&lt;/strong&gt; and after reading it you will learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How you can include backend exceptions in your Cypress E2E test results&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exceptions occur in both backend &amp;amp; frontend, and many of them are handled to provide users with trouble-free sessions. Having these error-handling mechanisms is healthy for users’ experience, but they can prevent us, developers, from observing the exceptions and backend-related anomalies in E2E tests.&lt;/p&gt;

&lt;p&gt;E2E tests ensure that the application performs as expected by running the test cases based on the users’ workflows. Tools such as Cypress, Playwright &amp;amp; Selenium enable us to easily define and apply those tests. In this article, I’ll explain backend exceptions, a missing piece of E2E test results, and how we can collect them in a test run in Cypress.&lt;/p&gt;

&lt;p&gt;Well-known E2E testing tools mentioned above allow us to define tests for each action, and there are countless add-ons to improve their abilities. Since those tests are based on users’ behaviors they are mainly focused on frontend experience, and there are barely any significant resources for backend-related test definitions. Most methods/plugins we have are limited to making requests to backend and defining tests based on responses. Although those might be more than enough for mocking users’ perspective, these tests lack depth about backend’s state. Primarily when exceptions are handled, and there is no trace left of anomalies. In the end, even passing all E2E tests might not mean a system with zero issues.&lt;/p&gt;

&lt;p&gt;A way to collect exceptions &amp;amp; stacks from the backend can help us understand the missing pieces in E2E tests. Sidekick’s Test Module comes in handy for this use case. &lt;strong&gt;Sidekick’s Test Module&lt;/strong&gt; and it’s upcoming test framework plugins enable developers to bring Sidekick actions (logpoints, tracepoints &amp;amp; error stack collection) to E2E tests, eventually giving developers ability to &lt;strong&gt;collect errors as they happen&lt;/strong&gt; and &lt;strong&gt;define stack based tests to ensure reliability of backend’s state&lt;/strong&gt;. This article focuses on the first one, collecting backend errors as they occur in a test run.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sidekick’s Error Stack Collection gathers real-time stack data from backends whenever they have an exception. You can read more about it here:&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/boroskoyo" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F297860%2F67d8ee6d-2045-44c3-978d-ab7c77a929c6.png" alt="boroskoyo"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/boroskoyo/capturing-exception-call-stacks-from-nodejs-applications-52l1" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Capturing Exception Call Stacks from Node.js Applications&lt;/h2&gt;
      &lt;h3&gt;boroskoyo ・ Sep 23 '22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#node&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#observability&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#debug&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://medium.com/runsidekick/capturing-exception-call-stacks-in-python-applications-with-sidekick-d4474374659" rel="noopener noreferrer"&gt;https://medium.com/runsidekick/capturing-exception-call-stacks-in-python-applications-with-sidekick-d4474374659&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Error Stack Collection is already helpful for problems in production. With Sidekick’s new Test Module it will also be a literal sidekick to developers for discovering root causes of errors in tests. Such data is nifty for finding neglected issues &amp;amp; root causes of some flaky tests.&lt;/p&gt;

&lt;h1&gt;
  
  
  Setting up Error Stack Collection within our E2E tests in Cypress :
&lt;/h1&gt;

&lt;p&gt;Our setup will be consisted of a simple Node.js To-Do application powered by Express framework. We will define tests in Cypress as we normally do and observe stacks of exceptions thrown in the backend as a result of those tests.&lt;/p&gt;

&lt;p&gt;You can find To-do app’s repo here:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/boroskoyo" rel="noopener noreferrer"&gt;
        boroskoyo
      &lt;/a&gt; / &lt;a href="https://github.com/boroskoyo/todos-express-password-sidekick" rel="noopener noreferrer"&gt;
        todos-express-password-sidekick
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Todo app using Express and Passport for sign in with username and password.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;todos-express-password-sidekick&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;This example is derived from &lt;a href="https://github.com/passport/todos-express-password" rel="noopener noreferrer"&gt;https://github.com/passport/todos-express-password&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This app illustrates how to setup &lt;a href="https://www.runsidekick.com/" rel="nofollow noopener noreferrer"&gt;Sidekick Node.js Agent&lt;/a&gt; with
&lt;a href="https://expressjs.com/" rel="nofollow noopener noreferrer"&gt;Express&lt;/a&gt; to live debug your applications.&lt;/p&gt;
&lt;p&gt;Use this example as a starting point for your own web applications.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quick Start&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;To run this app, fork &amp;amp; clone the repository and install dependencies:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;$ git clone https://github.com/&lt;span class="pl-k"&gt;&amp;lt;&lt;/span&gt;your-user-name&lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt;/todos-express-password-sidekick.git
$ &lt;span class="pl-c1"&gt;cd&lt;/span&gt; todos-express-password-sidekick
$ npm install&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Get your Sidekick API Key: &lt;a href="https://docs.runsidekick.com/installation/get-api-key-and-token" rel="nofollow noopener noreferrer"&gt;https://docs.runsidekick.com/installation/get-api-key-and-token&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change the &amp;lt; api-key &amp;gt; field at 25th line of app.js with your API Key.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then start the server.&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;$ npm start&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Navigate to &lt;a href="http://localhost:3000" rel="nofollow noopener noreferrer"&gt;&lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Next Steps&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Connect your source if you are using Web IDE&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.runsidekick.com/installation/get-api-key-and-token" rel="nofollow noopener noreferrer"&gt;Check docs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continue with your IDE&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.runsidekick.com/plugins/visual-studio-code-extension-python-and-node.js" rel="nofollow noopener noreferrer"&gt;Visual Studio Code Extension&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.runsidekick.com/plugins/webstorm-plugin-node.js" rel="nofollow noopener noreferrer"&gt;WebStorm Plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start debugging!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;License&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://opensource.org/licenses/unlicense" rel="nofollow noopener noreferrer"&gt;The Unlicense&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Credit&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Original version Created by &lt;a href="https://www.jaredhanson.me/" rel="nofollow noopener noreferrer"&gt;Jared Hanson&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/boroskoyo/todos-express-password-sidekick" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  Requirements:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Cypress (this can be applied in any other test framework)&lt;/li&gt;
&lt;li&gt;  Having a Sidekick SaaS account or a Sidekick Open-Source Broker up and running: &lt;a href="https://www.runsidekick.com/" rel="noopener noreferrer"&gt;https://www.runsidekick.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  A Node.js backend configured to work with Sidekick agent (Sidekick Error Stack Collection in supported in both Node.js &amp;amp; Python runtimes)

&lt;ul&gt;
&lt;li&gt;Check the example setup here: &lt;a href="https://www.youtube.com/watch?v=tc9TupvV-TM&amp;amp;ab_channel=Sidekick%28byThundra%29" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=tc9TupvV-TM&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Related docs: &lt;a href="https://docs.runsidekick.com/installation/agents/node.js/error-stack-collection" rel="noopener noreferrer"&gt;https://docs.runsidekick.com/installation/agents/node.js/error-stack-collection&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Sidekick Test Module up and running:

&lt;ul&gt;
&lt;li&gt;An open-source project that can be found here: &lt;a href="https://github.com/runsidekick/sidekick-test-module/" rel="noopener noreferrer"&gt;https://github.com/runsidekick/sidekick-test-mode&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setup:
&lt;/h2&gt;

&lt;p&gt;Before starting our test, we need to setup the Sidekick agent &amp;amp; enable error stack collection.&lt;/p&gt;

&lt;p&gt;1- Installing Sidekick agent to our backend&lt;/p&gt;

&lt;p&gt;You can find extra info here: &lt;a href="https://docs.runsidekick.com/installation/agents/node.js/installation" rel="noopener noreferrer"&gt;https://docs.runsidekick.com/installation/agents/node.js/installation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;//add the code below block to top of your project&lt;br&gt;&lt;br&gt;
const SidekickDebugger = require('@runsidekick/sidekick-agent-nodejs');&lt;/p&gt;

&lt;p&gt;2- Enable Error Stack Collection mode&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//after importing Sidekick Agent, initialize it with the given configuration  
SidekickDebugger.start({   
  applicationName: 'Todo - Express',  
  applicationStage: 'prod',  
  applicationVersion: '1.0.0',  
  apiKey: '&amp;lt;Sidekick-api-key&amp;gt;',  
  errorCollectionEnable: true,  
  errorCollectionEnableCaptureFrame: true  
});  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your backend is ready for our tests.&lt;/p&gt;

&lt;p&gt;3- Configure &amp;amp; Start Sidekick Test Module (check its repo for more info)&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Now we are good to go!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test definition:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The user will login to the system before each test.&lt;/p&gt;

&lt;p&gt;First, it will add a new item “Feed the cat” and check if it is added.&lt;br&gt;&lt;br&gt;
Secondly, it will try to add a new item with an empty string and expect nothing to change. Submitting an empty string results in an error in our backend, but we are catching those errors so that user is not inconvenienced.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8axq2stwofovds27ks8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv8axq2stwofovds27ks8.png" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;UI test results in Cypress&lt;/p&gt;

&lt;p&gt;Finally, in the last test, we will make a request to Error Stack endpoint of Sidekick Test Module to get collected errors within the error. The expected result is an empty array, and anything else means that we had an issue in our backend.&lt;/p&gt;

&lt;p&gt;You can find the example definition below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  it("Check backend errors", () =&amp;gt; {  
    const getErrorStacks = {  
      url: "http://localhost:8081/api/events/errorstack",  
      headers: {  
        Authorization: "Bearer apikey",  
      },  
    };  
    cy.request(getErrorStacks)  
          .its("body")  
          .should("be.an", "array")  
          .and("have.length", 0);  
      });  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Results:
&lt;/h2&gt;

&lt;p&gt;As our test completes, we can see that although our frontend-related tests pass, our E2E test fails as Sidekick had collected errors when it tried to submit an empty string in the test run.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fstmjoyj1f88okwxr15of.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fstmjoyj1f88okwxr15of.png" width="544" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Overall test results&lt;/p&gt;

&lt;p&gt;If there are errors occur in the backend, Sidekick Test Module should return a list of collected errors and their stacks, as seen below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F84q72g2rb0e7okq606dq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F84q72g2rb0e7okq606dq.png" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Failing test case and collected error information&lt;/p&gt;

&lt;p&gt;Now we can click on the related line to get info about the collected error or check the error from any Sidekick client (Web IDE, VSCode, or JetBrains IDEs). Soon we will bring a better view of those errors with our upcoming Cypress plugin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbfyhpit4l3sne2kr7h43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbfyhpit4l3sne2kr7h43.png" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Detailed information about collected error’s stack&lt;/p&gt;

&lt;p&gt;In conclusion, we have used Sidekick agent &amp;amp; Test Module to bring backend errors to our E2E test, and we were able to capture the snapshot of the state of our backend as it threw an exception.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to go from here:
&lt;/h2&gt;

&lt;p&gt;With our current setup, we got in-depth error information from our backend apps. In further chapters, we will be bringing Sidekick’s tracepoint (non-breaking breakpoint) feature to Cypress that will allow us to define tests based on state and stack information of our backend. Right now, we are also working on a Cypress plugin that will make using Sidekick Actions within Cypress as easy as it gets, and your support and feedback will guide us through our road. After Cypress, supporting other test frameworks is on our roadmap. You can find us at &lt;a href="https://www.runsidekick.com/discord-invitation" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; or contact us via our website &lt;a href="https://runsidekick.com" rel="noopener noreferrer"&gt;https://runsidekick.com&lt;/a&gt; if you want to participate or become a part of our community&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>development</category>
      <category>programming</category>
    </item>
    <item>
      <title>Live Debugging Python Applications</title>
      <dc:creator>boroskoyo</dc:creator>
      <pubDate>Thu, 24 Nov 2022 13:49:16 +0000</pubDate>
      <link>https://dev.to/boroskoyo/live-debugging-python-applications-1167</link>
      <guid>https://dev.to/boroskoyo/live-debugging-python-applications-1167</guid>
      <description>&lt;h2&gt;
  
  
  Speed up finding the root cause and minimize the impact of such incidents
&lt;/h2&gt;

&lt;p&gt;A few months back, I read an interesting story where astronauts in the International Space Station had to abandon a mission and seek shelter due to a cloud of orbital debris. According to an article by &lt;a href="https://www.nationalgeographic.com/science/article/russia-just-blew-up-a-satellite-heres-why-that-spells-trouble-for-spaceflight" rel="noopener noreferrer"&gt;National Geographic&lt;/a&gt;, it is a result of Russian anti-satellite missile testing (Nudal ASAT), performed live for the first time on an actual object in orbit.&lt;/p&gt;

&lt;p&gt;This incident made me think of how things can act differently in production compared to development and testing environments. As developers, we often face these unexpected scenarios. And sometimes it is impossible to recreate them locally to find solutions.&lt;/p&gt;

&lt;p&gt;However, having a standard live debugging mechanism in production will significantly speed up finding the root cause and minimize the impact of such incidents. So, in this article, I will discuss how we can use live debugging in Python applications to give you a better understanding.&lt;/p&gt;

&lt;h1&gt;
  
  
  Importance of Debugging in Production Environments
&lt;/h1&gt;

&lt;p&gt;As we all know, testing is an essential part of the development process before releasing into the production environment. Especially modern applications go through extensive manual and automatic testing processes to identify potential bugs.&lt;/p&gt;

&lt;p&gt;However, its hardly possible detect all issues prior to production since these environments have differences from one another. For example, there are errors, caused by data, access patterns, load in production is difficult to replicate identically in development and testing environments. Therefore, we have to debug such errors in the production.&lt;/p&gt;

&lt;p&gt;As developers, we must be aware of different tools and approaches we can use for remote debugging to improve efficiency. &lt;a href="https://docs.runsidekick.com/" rel="noopener noreferrer"&gt;Sidekick&lt;/a&gt;, is one such tool that provides a web IDE &amp;amp; IDE plugins for real-time application debugging. So, let’s see how we can use Sidekick with Python.&lt;/p&gt;

&lt;h1&gt;
  
  
  How to Integrate Sidekick with Python Applications
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2y67xcx9h9oz3v37tn8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2y67xcx9h9oz3v37tn8.png" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this article, I will be creating a simple Python application with distributed microservices using Flask. Then, I will connect it to the Sidekick web IDE and discuss how to use it for live debugging for Python applications.&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 1 — Create a Sidekick account
&lt;/h1&gt;

&lt;p&gt;As the first step, you need to create a &lt;a href="https://app.runsidekick.com/signup" rel="noopener noreferrer"&gt;Sidekick account&lt;/a&gt;. After that, you can easily signup with Sidekick using your Google or GitHub account.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4lu4yoaj3cid1h7zf5sx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4lu4yoaj3cid1h7zf5sx.png" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 2 — Install sidekick-agent-python to your application
&lt;/h1&gt;

&lt;p&gt;After creating your Python project, you need to install sidekick-agent-python to connect the application to Sidekick.&lt;/p&gt;

&lt;p&gt;pip install sidekick-agent-python&lt;/p&gt;

&lt;p&gt;Then, you need to configure the environment variables. Sidekick requires the following as environment variables, and you can use a .env file to include them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SIDEKICK_APIKEY= &amp;lt;API-KEY&amp;gt;  
SIDEKICK_APPLICATION_NAME= POST_APP  
SIDEKICK_APPLICATION_STAGE= PROD  
SIDEKICK_APPLICATION_VERSION= 1.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can find SIDEKICK_APIKEY on the home page of Sidekick IDE.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhyiz65f8cn0k6jtyfups.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhyiz65f8cn0k6jtyfups.png" width="663" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, you can add Sidekick to your application and enable tracing as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
from pathlib import Path  
from dotenv import load_dotenv  

env_path = Path(&amp;lt;.env file path&amp;gt;).resolve()  
load_dotenv(dotenv_path=env_path)  

try:  
    import tracepointdebug  
    tracepointdebug.start()  
except ImportError as e:  
    pass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Step 3 — Connect the application to Sidekick web IDE
&lt;/h1&gt;

&lt;p&gt;Sidekick allows you to connect GitHub, GitLab, and Bitbucket repositories directly to the web IDE. You can use the source tab in the IDE to select your repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flf0l3l2ub2gftcvkjgj9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flf0l3l2ub2gftcvkjgj9.png" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzqpb52i06n5kquba8kph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzqpb52i06n5kquba8kph.png" width="715" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most importantly, you don’t need to worry about the security of your repository since Sidekick will only have read access to your source code, and it will never fetch the code into their servers.&lt;/p&gt;

&lt;h1&gt;
  
  
  Step 4 — Enabling Tracepoints
&lt;/h1&gt;

&lt;p&gt;After connecting the Git repository, you need to connect your application to Sidekick IDE and enable tracepoints. At the Applications tab you will see a list of applications that use your Sidekick API key.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbe0bri2iletriu3t5lpd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbe0bri2iletriu3t5lpd.png" width="636" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please note that your application must be running to get listed in the Applications tab.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffjesuydkf0lk1rmht9bo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffjesuydkf0lk1rmht9bo.png" width="800" height="110"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, you can create tracepoints (non-breaking breakpoints) in the Sidekick editor, and all the tracepoints will be listed in the Tracepoints tab.&lt;/p&gt;

&lt;p&gt;That’s it. You have successfully integrated Sidekick for your Python application. Now, you can start monitoring the application using tracepoints.&lt;/p&gt;

&lt;h1&gt;
  
  
  Debugging with Sidekick
&lt;/h1&gt;

&lt;p&gt;As mentioned, Sidekick tracepoints are a type of nonbreaking remote breakpoints. Tracepoints do not pause your codes as normal breakpoints, and they can also work with Thundra’s distributed technology to enable connections between several tracepoints in a transaction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpd505eid1somvjwx90zs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpd505eid1somvjwx90zs.png" width="800" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After enabling tracepoints, Sidekick will automatically start collecting snapshots of the local variables when the application execution passes that tracepoint. You can find those events in the Sidekick Events tab and filter them by any text or distributed trace IDs.&lt;/p&gt;

&lt;p&gt;The above image shows the tracepoint events of the posts service in the example application.&lt;/p&gt;

&lt;p&gt;However, taking snapshots every time, even without any issues, might not be the ideal approach. Sidekick provides conditional tracepoints to overcome this issue, and you can enable a tracepoint based on a specific condition you define.&lt;/p&gt;

&lt;h1&gt;
  
  
  Using Conditional Tracepoints in Sidekick
&lt;/h1&gt;

&lt;p&gt;Although the posts service of the example application worked as expected, the user service didn’t return the expected response. Instead, it returned an empty response when the get users endpoint is invoked. So, let’s place a conditional tracepoint in Sidekick IDE to trigger to find the reason for this behavior.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fon4nw8fwh8ph1u13vx93.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fon4nw8fwh8ph1u13vx93.png" width="537" height="95"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You have to pick the tracepoint you need to edit from the tracepoint list and click the edit icon to enable conditional tracepoints.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66gjcup1s0uu6c61difc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F66gjcup1s0uu6c61difc.png" width="550" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will open a new window like below, where you can define the condition. In this example, the following tracepoint will only take snapshots if the response status code is not equal to 200.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzgwlcq6509m6j96emvp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzgwlcq6509m6j96emvp.png" width="334" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You need to rerun your application and explore the tracepoint snapshot to get more details.&lt;/p&gt;

&lt;p&gt;As you can see, the response code for the API request is 404, and the reason is Not Found. It means that the application can not find the API we are calling. So, there must be an error in the API path. Likewise, you can easily use Sidekick IDE to monitor and debug issues with your production-level applications easily.&lt;/p&gt;

&lt;p&gt;Besides, Thundra provides a trace map feature where you can visualize the high-level components in your application and trace its behavior in real-time. It helps to identify issues that span across components and identify what’s causing them. For that, you need to integrate the Thundra APM agent. You can find more details about that in &lt;a href="https://docs.runsidekick.com/integrations/tracing-integrations" rel="noopener noreferrer"&gt;Thundra documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa5zu49siu9yklvao3wdw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa5zu49siu9yklvao3wdw.png" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tracemap of sample ToDo app configured with Sidekick &amp;amp; Thundra&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1z4dm4pnk98l8qojv5dq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1z4dm4pnk98l8qojv5dq.png" width="800" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Live Stack Tracing using Sidekick Sidekick &amp;amp; Thundra&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The images below show a trace map of a sample ToDo app configured with Thundra &amp;amp; Sidekick and a live stack trace provided by Thundra.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;In this article, I have discussed the importance of remote debugging production environments and how to integrate Sidekick with a Python project. Sidekick resolves a burning problem in monitoring and debugging live environments. It has introduced non-breaking breakpoints (tracepoints), and developers can monitor application status without pausing the application workflow.&lt;/p&gt;

&lt;p&gt;I hope this article will help you improve the remote debugging of your applications and improve the productivity of your development work. Thank you for reading!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="https://www.runsidekick.com/blog/live-debugging-for-python-applications" rel="noopener noreferrer"&gt;&lt;em&gt;https://www.runsidekick.com&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Bringing the simplicity of print() to production debugging using PyCharm</title>
      <dc:creator>boroskoyo</dc:creator>
      <pubDate>Thu, 20 Oct 2022 08:45:51 +0000</pubDate>
      <link>https://dev.to/boroskoyo/bringing-the-simplicity-of-print-to-production-debugging-using-pycharm-9e5</link>
      <guid>https://dev.to/boroskoyo/bringing-the-simplicity-of-print-to-production-debugging-using-pycharm-9e5</guid>
      <description>&lt;h1&gt;
  
  
  The way we develop software evolves, way we debug can’t stay the same!
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Bringing the simplicity of print() to production debugging using PyCharm
&lt;/h2&gt;

&lt;p&gt;Writing clean and readable code, adding tests and everything is a must for today’s software development teams but it is never enough to avoid bugs from appearing.&lt;/p&gt;

&lt;p&gt;As it is explained in Fireship’s latest video, the best way to avoid writing bugs is to avoid writing code.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/X3jw1JVNdPE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;You might think having a QA team or constantly testing your software is enough but the tweet below is a great example of what you will experience in the real life:&lt;/p&gt;

&lt;p&gt;Even though the way we structure our code or develop architectures changes, &lt;strong&gt;anomalies, and bugs are here to stay.&lt;/strong&gt; So we should start by accepting that fact and find ways to better debug experiences.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.encyclopedia.com/computing/dictionaries-thesauruses-pictures-and-press-releases/debugging"&gt;&lt;em&gt;Encyclopedia.com&lt;/em&gt;&lt;/a&gt;  defines debugging as&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The identification and removal of localized implementation errors — or bugs — from a program or system.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So the first step is to identify the errors. This is why we have debuggers and thankfully Python ecosystem has a vast number of debugger alternatives. In this article I’ll explain you fundamental debugging tools for Python and new ways to debug your Python applications in production with the comfort of your PyCharm instance.&lt;/p&gt;

&lt;h1&gt;
  
  
  A Sea Full of Debugging Solutions
&lt;/h1&gt;

&lt;p&gt;There are plenty of solutions for debugging Python applications. Below I’ve listed a few that I’ve found remarkable.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Good ol’ print()&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;It wouldn’t be fair to publish this article without paying homage to our old friend, print(). It has been a puppy love for all of us and it is by far the easiest one to start with.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zKiUMC5i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AMRs6_QaEf2AsyAvWGV6h0Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zKiUMC5i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AMRs6_QaEf2AsyAvWGV6h0Q.png" alt="" width="860" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sadly, when code gets complicated over time, print() falls short as we need a more sophisticated arsenal to find the root cause of production bugs.&lt;/p&gt;

&lt;p&gt;Check out the article below to learn more about its drawbacks:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/analytics-vidhya/are-you-writing-print-statements-to-debug-your-python-code-690e6ba098e9"&gt;https://medium.com/analytics-vidhya/are-you-writing-print-statements-to-debug-your-python-code-690e6ba098e9&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;pdb&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Python comes with its own debugger called pdb that allows you to start a debugging session with an interactive console to inspect your code while it runs. Furthermore, it also allows you to add a breakpoint to your code and inspect stack frames on the go.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Kost-he_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AIfaGL0xAif0lY52NPsHOaQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Kost-he_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AIfaGL0xAif0lY52NPsHOaQ.png" alt="" width="726" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In addition to the points above, pdb is easily extendable as is implemented as a class in the standard Python library.&lt;/p&gt;

&lt;p&gt;In short, pdb is powerful and easy to use, especially for small to medium-sized projects. One major drawback of using it in production is that you need to edit your code every time you want to debug your application, which in the end will require a redeploy and restart of your application.&lt;/p&gt;

&lt;p&gt;Below you can find extra information about pdb:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/pragmatic-programmers/investigating-with-pdb-breakpoints-d75b4127223b"&gt;https://medium.com/pragmatic-programmers/investigating-with-pdb-breakpoints-d75b4127223b&lt;/a&gt;&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://realpython.com/python-debugging-pdb/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--dNgN5HC---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://files.realpython.com/media/Python-Debugging-With-Pdb_Watermarked.ca76b26fbe1c.jpg" height="495" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://realpython.com/python-debugging-pdb/" rel="noopener noreferrer" class="c-link"&gt;
          Python Debugging With Pdb – Real Python
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          In this hands-on tutorial, you'll learn the basics of using pdb, Python's interactive source code debugger. Pdb is a great tool for tracking down hard-to-find bugs and allows you to fix faulty code more quickly.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--fQRnpzUH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.realpython.com/static/favicon.68cbf4197b0c.png" width="256" height="256"&gt;
        realpython.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  IDE Debuggers
&lt;/h2&gt;

&lt;p&gt;Many IDEs like Visual Studio Code &amp;amp; PyCharm offer ways to visually debug your Python applications. They provide an easier and more efficient way of debugging&lt;/p&gt;

&lt;p&gt;Debugging using IDE’s default debugger is usually the go-to way at the early stage of projects. They are more than enough for daily debugging with the only drawback of lacking real-time data.&lt;/p&gt;

&lt;p&gt;Since traditional debuggers work with the code in your local, they require you to reproduce the buggy scenarios locally. For such scenarios where you can’t reproduce, need real-time data, and debug a remote application remote debugging is the way to go.&lt;/p&gt;

&lt;h2&gt;
  
  
  PyCharm Remote Debugging
&lt;/h2&gt;

&lt;p&gt;Remote debugging is one of PyCharm’s most powerful features that enable IDE to connect running instances on remote servers. This lets you put breakpoints to your running applications just like you do in a local system.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.jetbrains.com/help/pycharm/remote-debugging-with-product.html#prereqs" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--lkIvng5t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://resources.jetbrains.com/storage/products/pycharm/img/meta/preview.png" height="550" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.jetbrains.com/help/pycharm/remote-debugging-with-product.html#prereqs" rel="noopener noreferrer" class="c-link"&gt;
          Remote Debugging with PyCharm | PyCharm
        &lt;/a&gt;
      &lt;/h2&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--Zje1kpYU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://resources.jetbrains.com/storage/products/jetbrains/img/icons/favicon.ico" width="48" height="48"&gt;
        jetbrains.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;PyCharm Remote Debugging and other IDE-provided remote debugging alternatives are great to collect data from remote applications but they require additional setup and can be a major source of lag when used in production.&lt;/p&gt;

&lt;p&gt;Read more :&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://www.runsidekick.com/blog/the-ultimate-guide-to-live-debugging" rel="noopener noreferrer"&gt;
      runsidekick.com
    &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;For cases when you want to collect stack and exception data and add new logs on-demand to your production &amp;amp; pre-production applications live application debuggers are here to help.&lt;/p&gt;

&lt;p&gt;Live application debuggers offer a smoother and more lightweight debugging experience that enables you to collect data from running applications without compromising performance.&lt;/p&gt;

&lt;p&gt;One of those live application debuggers is Sidekick. It is open-source and in addition to having traditional features like adding logpoints and putting breakpoints it is packed with extra features like stack collection when an exception occurs and integrations to ingest collected data to targets you desire like Elastic and Loki.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NeGUgLiB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AVlYYC5vGdPnntNlVktWvkg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NeGUgLiB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AVlYYC5vGdPnntNlVktWvkg.png" alt="" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  PyCharm Sidekick Plugin
&lt;/h2&gt;

&lt;p&gt;Sidekick PyCharm plugin brings live debugging features to PyCharm making remote debugging hassle-free and lightweight. Enabling developers to debug their Python applications remotely from the comfort of their IDE. Unlike PyCharm remote debugging it is easier to setup, brings near zero overhead, and comes with extra features.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sidekick brings simplicity of print() to production debugging using PyCharm&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--A5y8h5w2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/0%2AzksKkfFDsdnn-H18.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A5y8h5w2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://miro.medium.com/max/1400/0%2AzksKkfFDsdnn-H18.gif" alt="" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sidekick’s features include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tracepoints&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A tracepoint is basically a non-breaking remote breakpoint. Tracepoints differ from ordinary breakpoints in two ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  First, it doesn’t pause the code execution but just takes a screenshot of the variables when the code hits that line.&lt;/li&gt;
&lt;li&gt;  Second, it’s integrated with Thundra’s distributed technology enabling the connection between several tracepoints in the same transaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Logpoints&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Logpoints are points that you can add to your running application, just like Tracepoints, for adding logs dynamically.&lt;/p&gt;

&lt;p&gt;Since you can add and remove your logs at any time, getting the log wherever and whenever you need it becomes a walk in the park!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exception Stack Collection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With Sidekick Python agent’s latest update, developers can now activate automatic error stack collection and start collecting exception call stacks from their running applications without stopping them.&lt;/p&gt;

&lt;p&gt;Simply we can describe this new feature as an always-on tracepoint that is looking out for uncaught exceptions.&lt;/p&gt;

&lt;p&gt;Read on:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/runsidekick/capturing-exception-call-stacks-from-running-node-js-applications-d9cd81407593"&gt;https://medium.com/runsidekick/capturing-exception-call-stacks-from-running-node-js-applications-d9cd81407593&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Redaction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sidekick agents let you define custom redaction functions that run every time before sending any data to Sidekick. This way you get full control over your data.&lt;/p&gt;

&lt;p&gt;You can find the Sidekick PyCharm plugin here:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://plugins.jetbrains.com/plugin/20031-sidekick" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--974uDDuQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://plugins.jetbrains.com/files/20031/237243/icon/pluginIcon.png" height="600" class="m-0" width="600"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://plugins.jetbrains.com/plugin/20031-sidekick" rel="noopener noreferrer" class="c-link"&gt;
          Sidekick - IntelliJ IDEs Plugin | Marketplace
        &lt;/a&gt;
      &lt;/h2&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--GzVh1phi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://resources.jetbrains.com/storage/ui/favicons/favicon.ico" width="32" height="32"&gt;
        plugins.jetbrains.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Sidekick does everything above and more while adding near-zero overhead to your applications. No redeploy and restart needed to start collecting new data. This makes it a perfect tool for a production environment, a true sidekick that you can trust.&lt;/p&gt;

&lt;p&gt;One more thing…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It is open-source!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sidekick and its agents bring a lot to the table and promise to improve the developer experience by far. Furthermore, they are completely open-source so you can both learn how they work, expand them, and self-host your own instances.&lt;/p&gt;

&lt;p&gt;You can check out the repository here:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/runsidekick"&gt;
        runsidekick
      &lt;/a&gt; / &lt;a href="https://github.com/runsidekick/sidekick"&gt;
        sidekick
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Free and open-source live application debugger. Like chrome dev tools but for your backend
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/cbe611d3db151d9dc7ab9c6823276006a4c4a2f8f4900b5e2dd8edb4ea7892db/68747470733a2f2f343735303136372e6673312e68756273706f7475736572636f6e74656e742d6e61312e6e65742f68756266732f343735303136372f536964656b69636b2532304f532532307265706f2f6c6f676f2d312e706e67"&gt;&lt;img width="30%" height="30%" src="https://camo.githubusercontent.com/cbe611d3db151d9dc7ab9c6823276006a4c4a2f8f4900b5e2dd8edb4ea7892db/68747470733a2f2f343735303136372e6673312e68756273706f7475736572636f6e74656e742d6e61312e6e65742f68756266732f343735303136372f536964656b69636b2532304f532532307265706f2f6c6f676f2d312e706e67"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://github.com/runsidekick/sidekick"&gt;&lt;img src="https://camo.githubusercontent.com/795e2a053a63fc594cd9fee0bc76c678a924149cd568e82fa485febfa2f5c88d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f72756e736964656b69636b2f736964656b69636b3f7374796c653d666f722d7468652d6261646765" alt="Sidekick Licence"&gt;&lt;/a&gt; 
    &lt;a href="https://www.runsidekick.com/discord-invitation?utm_source=sidekick-readme" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/5e9452f773e5b7e5c3695b8b7849ab7bf8fe1a1a249707e11ca48bfb362369be/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3935383734353034353330383137343431363f7374796c653d666f722d7468652d6261646765266c6f676f3d646973636f7264266c6162656c3d444953434f5244" alt="Sidekick Discord Channel"&gt;&lt;/a&gt; 
    &lt;a href="https://www.runforesight.com?utm_source=sidekick-readme" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/66c620cc2543155969224f0b0b00deeac23c8978b3106db9bcd330e97c32ff74/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d6f6e69746f72656425323062792d466f726573696768742d2532333939303046303f7374796c653d666f722d7468652d6261646765" alt="Foresight monitoring"&gt;&lt;/a&gt; 
    &lt;a href="https://app.runsidekick.com/sandbox?utm_source=sidekick-readme" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/4c22adda37a859dc6e7b4e7b6f48a10deceebdd79bc919422b7f38b6b9cc258c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f747279253230696e2d73616e64626f782d627269676874677265656e3f7374796c653d666f722d7468652d6261646765" alt="Sidekick Sandbox"&gt;&lt;/a&gt; 
&lt;/p&gt;

&lt;div&gt;
&lt;a href="https://www.producthunt.com/posts/sidekick-12?utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-sidekick-12" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/18af9e5f4287294313779214954a4579a634c78f633e0b608aedd6975e72b835/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d333537303533267468656d653d6c6967687426706572696f643d6461696c79" alt="Sidekick - Like Chrome DevTools for your backend, now open source | Product Hunt" width="250" height="54"&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;div&gt;
    &lt;a href="https://docs.runsidekick.com/?utm_source=sidekick-readme" rel="nofollow"&gt;&lt;strong&gt;Explore Docs »&lt;/strong&gt;&lt;/a&gt;
        &lt;a href="https://medium.com/runsidekick/sidekick-open-source-live-debugger-get-started-in-5-mins-efc0845a2288" rel="nofollow"&gt;&lt;strong&gt;Quick Start Tutorial »&lt;/strong&gt;&lt;/a&gt;
&lt;/div&gt;


  Table of Contents
  &lt;ol&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#what-is-sidekick"&gt;What is Sidekick?&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#sidekick-actions"&gt;Sidekick Actions&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#why-sidekick"&gt;Why Sidekick?&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#features"&gt;Features&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#who-should-use-sidekick"&gt;Who should use Sidekick?&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#how-does-sidekick-work"&gt;How does Sidekick work?&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#getting-started"&gt;Getting Started&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#running-sidekick-using-our-docker-image"&gt;Running Sidekick using our Docker image&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#building-sidekick"&gt;Building Sidekick&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#sidekick-ecosystem"&gt;Sidekick Ecosystem&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#documentation"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#agents"&gt;Agents&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#clients"&gt;Clients&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#usage-examples"&gt;Usage Examples&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#sidekick-recipes"&gt;Sidekick Recipes&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#recent-publications"&gt;Recent Publications&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#contributing"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#questions-problems-suggestions"&gt;Questions? Problems? Suggestions?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#contact"&gt;Contact&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;


&lt;h2&gt;
What is Sidekick?&lt;/h2&gt;
&lt;p&gt;Sidekick is a live application debugger that lets you troubleshoot your applications while they keep on running.&lt;/p&gt;
&lt;p&gt;Add dynamic logs and put non-breaking breakpoints in your running application without the need of stopping &amp;amp; redeploying.&lt;/p&gt;
&lt;p&gt;Sidekick Open Source is here to allow self-hosting and make live debugging more accessible. Built for everyone who needs extra information from their running applications.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8d5099f4d215ef42c8c787fd5048b7bf13e3ee90da6c53cc5297244079579cc8/68747470733a2f2f343735303136372e6673312e68756273706f7475736572636f6e74656e742d6e61312e6e65742f68756266732f343735303136372f536964656b69636b2532304f532532307265706f2f486f77536964656b69636b576f726b732e676966"&gt;&lt;img width="70%" height="70%" src="https://camo.githubusercontent.com/8d5099f4d215ef42c8c787fd5048b7bf13e3ee90da6c53cc5297244079579cc8/68747470733a2f2f343735303136372e6673312e68756273706f7475736572636f6e74656e742d6e61312e6e65742f68756266732f343735303136372f536964656b69636b2532304f532532307265706f2f486f77536964656b69636b576f726b732e676966"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h5&gt;
Sidekick Actions:&lt;/h5&gt;
&lt;p&gt;Sidekick has two major actions; Tracepoints &amp;amp; Logpoints.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;tracepoint&lt;/strong&gt; is a non-breaking remote breakpoint. In short, it takes a snapshot of the variables when the code hits that line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logpoints&lt;/strong&gt; open the…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/runsidekick/sidekick"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;
  
  
  Worth mentioning:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Visual Studio Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Visual Studio code also has great modern debugging tools and we will further discuss it in another article. In addition to its tools Visual Studio Code also has a Sidekick plugin itself, which you can find here: &lt;a href="https://marketplace.visualstudio.com/items?itemName=Sidekick.sidekick-debugger"&gt;https://marketplace.visualstudio.com/items?itemName=Sidekick.sidekick-debugger&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;tldr;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Whether your apps are running on a single EC2, docker or a large k8s cluster, Sidekick allows you to collect realtime stacks, logs and errors from your running applications. All without leaving your favourite IDE.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.runsidekick.com/"&gt;Visit our site to learn more.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can get in touch with us through &lt;a href="https://twitter.com/RunSidekick"&gt;&lt;strong&gt;Twitter&lt;/strong&gt;&lt;/a&gt;, and join our &lt;a href="https://www.runsidekick.com/discord-invitation"&gt;&lt;strong&gt;Discord community&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>python</category>
      <category>debug</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Capturing Exception Call Stacks from Node.js Applications</title>
      <dc:creator>boroskoyo</dc:creator>
      <pubDate>Fri, 23 Sep 2022 12:41:32 +0000</pubDate>
      <link>https://dev.to/boroskoyo/capturing-exception-call-stacks-from-nodejs-applications-52l1</link>
      <guid>https://dev.to/boroskoyo/capturing-exception-call-stacks-from-nodejs-applications-52l1</guid>
      <description>&lt;h2&gt;
  
  
  Sidekick allows you to collect stacks as errors happen, without needing for putting a tracepoint beforehand
&lt;/h2&gt;

&lt;p&gt;Sidekick is an &lt;a href="https://github.com/runsidekick/sidekick"&gt;open-source&lt;/a&gt; live application debugger that lets you troubleshoot your applications while they keep on running. It is like Chrome DevTools for your and built for everyone who needs extra information from their applications.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/runsidekick"&gt;
        runsidekick
      &lt;/a&gt; / &lt;a href="https://github.com/runsidekick/sidekick"&gt;
        sidekick
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Free and open-source live application debugger. Like chrome dev tools but for your backend
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/cbe611d3db151d9dc7ab9c6823276006a4c4a2f8f4900b5e2dd8edb4ea7892db/68747470733a2f2f343735303136372e6673312e68756273706f7475736572636f6e74656e742d6e61312e6e65742f68756266732f343735303136372f536964656b69636b2532304f532532307265706f2f6c6f676f2d312e706e67"&gt;&lt;img width="30%" height="30%" src="https://camo.githubusercontent.com/cbe611d3db151d9dc7ab9c6823276006a4c4a2f8f4900b5e2dd8edb4ea7892db/68747470733a2f2f343735303136372e6673312e68756273706f7475736572636f6e74656e742d6e61312e6e65742f68756266732f343735303136372f536964656b69636b2532304f532532307265706f2f6c6f676f2d312e706e67"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://github.com/runsidekick/sidekick"&gt;&lt;img src="https://camo.githubusercontent.com/795e2a053a63fc594cd9fee0bc76c678a924149cd568e82fa485febfa2f5c88d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f72756e736964656b69636b2f736964656b69636b3f7374796c653d666f722d7468652d6261646765" alt="Sidekick Licence"&gt;&lt;/a&gt; 
    &lt;a href="https://www.runsidekick.com/discord-invitation?utm_source=sidekick-readme" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/5e9452f773e5b7e5c3695b8b7849ab7bf8fe1a1a249707e11ca48bfb362369be/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3935383734353034353330383137343431363f7374796c653d666f722d7468652d6261646765266c6f676f3d646973636f7264266c6162656c3d444953434f5244" alt="Sidekick Discord Channel"&gt;&lt;/a&gt; 
    &lt;a href="https://www.runforesight.com?utm_source=sidekick-readme" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/66c620cc2543155969224f0b0b00deeac23c8978b3106db9bcd330e97c32ff74/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d6f6e69746f72656425323062792d466f726573696768742d2532333939303046303f7374796c653d666f722d7468652d6261646765" alt="Foresight monitoring"&gt;&lt;/a&gt; 
    &lt;a href="https://app.runsidekick.com/sandbox?utm_source=sidekick-readme" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/4c22adda37a859dc6e7b4e7b6f48a10deceebdd79bc919422b7f38b6b9cc258c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f747279253230696e2d73616e64626f782d627269676874677265656e3f7374796c653d666f722d7468652d6261646765" alt="Sidekick Sandbox"&gt;&lt;/a&gt; 
&lt;/p&gt;

&lt;div&gt;
&lt;a href="https://www.producthunt.com/posts/sidekick-12?utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-sidekick-12" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/18af9e5f4287294313779214954a4579a634c78f633e0b608aedd6975e72b835/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d333537303533267468656d653d6c6967687426706572696f643d6461696c79" alt="Sidekick - Like Chrome DevTools for your backend, now open source | Product Hunt" width="250" height="54"&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;div&gt;
    &lt;a href="https://docs.runsidekick.com/?utm_source=sidekick-readme" rel="nofollow"&gt;&lt;strong&gt;Explore Docs »&lt;/strong&gt;&lt;/a&gt;
        &lt;a href="https://medium.com/runsidekick/sidekick-open-source-live-debugger-get-started-in-5-mins-efc0845a2288" rel="nofollow"&gt;&lt;strong&gt;Quick Start Tutorial »&lt;/strong&gt;&lt;/a&gt;
&lt;/div&gt;


  Table of Contents
  &lt;ol&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#what-is-sidekick"&gt;What is Sidekick?&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#sidekick-actions"&gt;Sidekick Actions&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#why-sidekick"&gt;Why Sidekick?&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#features"&gt;Features&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#who-should-use-sidekick"&gt;Who should use Sidekick?&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#how-does-sidekick-work"&gt;How does Sidekick work?&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#getting-started"&gt;Getting Started&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#running-sidekick-using-our-docker-image"&gt;Running Sidekick using our Docker image&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#building-sidekick"&gt;Building Sidekick&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#sidekick-ecosystem"&gt;Sidekick Ecosystem&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#documentation"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#agents"&gt;Agents&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#clients"&gt;Clients&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#usage-examples"&gt;Usage Examples&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#sidekick-recipes"&gt;Sidekick Recipes&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#recent-publications"&gt;Recent Publications&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#contributing"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#questions-problems-suggestions"&gt;Questions? Problems? Suggestions?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#contact"&gt;Contact&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;


&lt;h2&gt;
What is Sidekick?&lt;/h2&gt;
&lt;p&gt;Sidekick is a live application debugger that lets you troubleshoot your applications while they keep on running.&lt;/p&gt;
&lt;p&gt;Add dynamic logs and put non-breaking breakpoints in your running application without the need of stopping &amp;amp; redeploying.&lt;/p&gt;
&lt;p&gt;Sidekick Open Source is here to allow self-hosting and make live debugging more accessible. Built for everyone who needs extra information from their running applications.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8d5099f4d215ef42c8c787fd5048b7bf13e3ee90da6c53cc5297244079579cc8/68747470733a2f2f343735303136372e6673312e68756273706f7475736572636f6e74656e742d6e61312e6e65742f68756266732f343735303136372f536964656b69636b2532304f532532307265706f2f486f77536964656b69636b576f726b732e676966"&gt;&lt;img width="70%" height="70%" src="https://camo.githubusercontent.com/8d5099f4d215ef42c8c787fd5048b7bf13e3ee90da6c53cc5297244079579cc8/68747470733a2f2f343735303136372e6673312e68756273706f7475736572636f6e74656e742d6e61312e6e65742f68756266732f343735303136372f536964656b69636b2532304f532532307265706f2f486f77536964656b69636b576f726b732e676966"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h5&gt;
Sidekick Actions:&lt;/h5&gt;
&lt;p&gt;Sidekick has two major actions; Tracepoints &amp;amp; Logpoints.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;tracepoint&lt;/strong&gt; is a non-breaking remote breakpoint. In short, it takes a snapshot of the variables when the code hits that line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logpoints&lt;/strong&gt; open the…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/runsidekick/sidekick"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Sidekick Actions ( &lt;a href="https://docs.runsidekick.com/sidekick-actions/logpoint"&gt;logpoint&lt;/a&gt; and &lt;a href="https://docs.runsidekick.com/sidekick-actions/tracepoint"&gt;tracepoint&lt;/a&gt; ) are giving developers dynamic logging and live debugging abilities. They are most powerful when you know exactly where you should put them.&lt;/p&gt;

&lt;p&gt;Our recent user research shows that when uncaught exceptions occur, proactively putting tracepoints for stack collection might not be enough as in some rare cases, putting a tracepoint after spotting a problem can’t help until the error happens again. That’s why we have developed;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Automatic error stack collection&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With our &lt;a href="https://github.com/runsidekick/sidekick-agent-nodejs"&gt;Node agent&lt;/a&gt;’s latest update, developers can now activate automatic error stack collection and start collecting exception call stacks from their running applications without stopping them.&lt;/p&gt;

&lt;p&gt;Simply we can describe this new feature as an always on tracepoint that is looking out for uncaught exceptions. Of course this can bring an overhead but we see a great potential to lower MTTR’s for exceptions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sfuz25JE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2Ak2PXiKHPv4KOsYcUmQDc3A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sfuz25JE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2Ak2PXiKHPv4KOsYcUmQDc3A.png" alt="" width="700" height="367"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  See it in action:
&lt;/h2&gt;

&lt;p&gt;We will be using our quickstart repository from a previous tutorial.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/boroskoyo"&gt;
        boroskoyo
      &lt;/a&gt; / &lt;a href="https://github.com/boroskoyo/sidekick-nodejs-quickstart"&gt;
        sidekick-nodejs-quickstart
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Quick start example for Sidekick.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://github.com/RunSidekick/sidekick"&gt;&lt;img src="https://camo.githubusercontent.com/818fd408c0a1571ede9def2096d279d75984a55858b362d2247f91a9c7f9658a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5553452d534944454b49434b2d707572706c653f7374796c653d666f722d7468652d6261646765" alt="Sidekick"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;div&gt;
  &lt;a href="https://github.com/runsidekick/sidekick"&gt;
    &lt;img src="https://camo.githubusercontent.com/cbe611d3db151d9dc7ab9c6823276006a4c4a2f8f4900b5e2dd8edb4ea7892db/68747470733a2f2f343735303136372e6673312e68756273706f7475736572636f6e74656e742d6e61312e6e65742f68756266732f343735303136372f536964656b69636b2532304f532532307265706f2f6c6f676f2d312e706e67" alt="Logo" width="40%" height="40%"&gt;
  &lt;/a&gt;
  &lt;/div&gt;
&lt;div&gt;
    &lt;p&gt;+&lt;/p&gt;
  &lt;a href="https://expressjs.com/" rel="nofollow"&gt;
    &lt;img src="https://camo.githubusercontent.com/449c52f7898657e449020360294f2c1950f3153df29b55603f7e0829cbf88df4/68747470733a2f2f75706c6f61642e77696b696d656469612e6f72672f77696b6970656469612f636f6d6d6f6e732f362f36342f457870726573736a732e706e67" alt="Logo" width="35%" height="35%"&gt;
  &lt;/a&gt;
  &lt;h3&gt;
Sidekick Quickstart&lt;/h3&gt;
  &lt;p&gt;
    Simple project to show how you can start using Sidekick Open Source in minutes
    &lt;br&gt;
    &lt;a href="https://github.com/runsidekick/sidekick"&gt;&lt;strong&gt;Explore Sidekick »&lt;/strong&gt;&lt;/a&gt;
        &lt;a href="https://medium.com/runsidekick/sidekick-open-source-live-debugger-get-started-in-5-mins-efc0845a2288" rel="nofollow"&gt;&lt;strong&gt;Related Article »&lt;/strong&gt;&lt;/a&gt;
    &lt;br&gt;
  &lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;a href="https://www.producthunt.com/posts/sidekick-12?utm_source=badge-featured&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-sidekick-12" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/1c4b0b7ce2f158ad21b20766eb2428080d0a880d6a2f65808cedccef404603e5/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f66656174757265642e7376673f706f73745f69643d333537303533267468656d653d6c69676874" alt="Sidekick - Like Chrome DevTools for your backend → now open source! | Product Hunt" width="250" height="54"&gt;&lt;/a&gt; &lt;/div&gt;
&lt;h2&gt;
About Sidekick&lt;/h2&gt;
&lt;p&gt;Sidekick is a live application debugger that lets you troubleshoot your applications while they keep on running.&lt;/p&gt;
&lt;p&gt;Add dynamic logs and put non-breaking breakpoints in your running application without the need of stopping &amp;amp; redeploying.&lt;/p&gt;
&lt;p&gt;Sidekick Open Source is here to allow self-hosting and make live debugging more accessible. Built for everyone who needs extra information from their running applications.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/runsidekick/sidekick"&gt;Check out Sidekick here&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
About the project&lt;/h2&gt;
&lt;p&gt;This project aims to show how you can start live debugging using a self-hosted Sidekick instance.&lt;/p&gt;
&lt;p&gt;(&lt;a href="https://github.com/boroskoyo/sidekick-nodejs-quickstart#readme-top"&gt;back to top&lt;/a&gt;)&lt;/p&gt;
&lt;h3&gt;
Built With&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://expressjs.com/" rel="nofollow"&gt;Express.js&lt;/a&gt;
&lt;a href="https://socket.io/" rel="nofollow"&gt;Socket.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(&lt;a href="https://github.com/boroskoyo/sidekick-nodejs-quickstart#readme-top"&gt;back to top&lt;/a&gt;)&lt;/p&gt;
&lt;h2&gt;
Getting Started&lt;/h2&gt;
&lt;p&gt;This is an end-to-end guide to show you how you can start using Sidekick Open Source.&lt;/p&gt;
&lt;h3&gt;
Prerequisites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;  Make sure docker daemon is running.&lt;/pre&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;npm
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm&lt;/pre&gt;…
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/boroskoyo/sidekick-nodejs-quickstart"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The only difference will the 2 new parameters we are adding at the initialization. errorCollectionEnabled is set true to enable the basic error collection and the latest parameter is set true to enable detailed frame capturing in case of errors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MIb7Lbe6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2AKWO1O5G_veldY6xZHjewIQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MIb7Lbe6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2AKWO1O5G_veldY6xZHjewIQ.png" alt="app/app.js" width="700" height="248"&gt;&lt;/a&gt;&lt;br&gt;
app/app.js&lt;/p&gt;

&lt;p&gt;To show an example of uncaught exception we will add&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;throw new Error(‘yet another error’);&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;at the end of the function.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mMkC6DON--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2A9aOF2kgIKx9nvC6qngV3Zg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mMkC6DON--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2A9aOF2kgIKx9nvC6qngV3Zg.png" alt="routes/speakers.js" width="700" height="490"&gt;&lt;/a&gt;&lt;br&gt;
routes/speakers.js&lt;/p&gt;

&lt;p&gt;Now then we run our application and visit the speakers page it will throw an exception. It is time to collect information about this exception. For this tutorial we will be using our Sidekick Node.js Client and visualisation of collected errors will soon come to our Web IDE and extensions. You can get our client from:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.npmjs.com/package/@runsidekick/sidekick-client" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--r7XxGAJ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.npmjs.com/338e4905a2684ca96e08c7780fc68412.png" height="462" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.npmjs.com/package/@runsidekick/sidekick-client" rel="noopener noreferrer" class="c-link"&gt;
          @runsidekick/sidekick-client - npm
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Sidekick Node.js Client. Latest version: 0.0.4, last published: 19 hours ago. Start using @runsidekick/sidekick-client in your project by running `npm i @runsidekick/sidekick-client`. There are no other projects in the npm registry using @runsidekick/sidekick-client.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--h1do8fu7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.npmjs.com/b0f1a8318363185cc2ea6a40ac23eeb2.png" width="32" height="32"&gt;
        npmjs.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Below you can see a simple script to collect error snapshots and print them to console. Sidekick client allows you to customize your ingest functions, check out our &lt;a href="https://docs.runsidekick.com/sidekick-recipes"&gt;recipes page&lt;/a&gt; for examples.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2nF84JIi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2AOhXXde3TLsR5TNE5ypEamA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2nF84JIi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2AOhXXde3TLsR5TNE5ypEamA.png" alt="client script" width="700" height="423"&gt;&lt;/a&gt;&lt;br&gt;
client script&lt;/p&gt;

&lt;p&gt;We have started both our main application and client script. After visiting the speakers page our app throw an exception and the agent sent every single detail about it to our broker.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7bRxl9hn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2AEQ5s2Lw7KhDr5WU0PED-7Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7bRxl9hn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2AEQ5s2Lw7KhDr5WU0PED-7Q.png" alt="" width="700" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To keep the tutorial simple we have printed everyting to console but to make thing a little bit prettier we will use JSON visualization tool called JSON Crack to understand our collected data. In your own cases sending the collected data to your elastic instances or any other alternative would be much better way to use this data.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://jsoncrack.com/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--oDL0qLI8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://jsoncrack.com/jsoncrack.png" height="550" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://jsoncrack.com/" rel="noopener noreferrer" class="c-link"&gt;
          
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Simple visualization tool for your JSON data. No forced structure, paste your JSON and view it instantly.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--dBJDbXay--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://jsoncrack.com/favicon.ico" width="48" height="48"&gt;
        jsoncrack.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Below is the initial node of our collected data. You can see when and where it happened and other details like the error message, file name, line no etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n6JpuD4e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2A-fl3D_EDkIcRqZRsURO6LA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n6JpuD4e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2A-fl3D_EDkIcRqZRsURO6LA.png" alt="" width="700" height="719"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since we have enabled frame capture we were able to collect every information in our scope. So as you can see below in case of an error, rather than trying to reproduce it or looking out for clues we are now able get everything we need automatically.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;All thanks to Sidekick error stack collection&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--keIo2YQc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2AO3p1OCxFtYXIftQqxRWpHQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--keIo2YQc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/1%2AO3p1OCxFtYXIftQqxRWpHQ.png" alt="" width="700" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you would like to ingest this collected data to your desired target you can use Sidekick’s integrations (Logz.io, Slack, Sumo Logic etc.) or see the examples below to learn how you can build your own.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/boroskoyo"&gt;
        boroskoyo
      &lt;/a&gt; / &lt;a href="https://github.com/boroskoyo/sidekick-elastic"&gt;
        sidekick-elastic
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      send your collected tracepoint &amp;amp; logpoint events to Elasticsearch
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;br&gt;
&lt;div&gt;
  &lt;a href="https://www.runsidekick.com" rel="nofollow"&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1kji3iQG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/boroskoyo/sidekick-elasticSidekick_Logo.svg" alt="Logo" width="200" height="80"&gt;
  &lt;/a&gt;
  &lt;h2&gt;
+&lt;/h2&gt;
   &lt;a href="https://www.runsidekick.com" rel="nofollow"&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cFv5uMJ9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/boroskoyo/sidekick-elasticElasticsearch_logo.png" alt="Logo" width="227" height="50"&gt;
  &lt;/a&gt;
  &lt;h3&gt;
Sidekick Recipes: Elasticsearch Ingest&lt;/h3&gt;
  &lt;p&gt;
    Send your logs and traces to Elasticsearch in seconds
    &lt;br&gt;
    &lt;a href="https://docs.runsidekick.com/" rel="nofollow"&gt;&lt;strong&gt;Explore the docs »&lt;/strong&gt;&lt;/a&gt;
    &lt;br&gt;
    &lt;br&gt;
    &lt;a href="https://www.runsidekick.com" rel="nofollow"&gt;Sidekick Home&lt;/a&gt;
    ·
    &lt;a href="https://www.runsidekick.com/contact-us" rel="nofollow"&gt;Report Bug &amp;amp; Request Feature&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;

  Table of Contents
  &lt;ol&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/boroskoyo/sidekick-elastic#about-the-recipe"&gt;About The Recipe&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="https://github.com/boroskoyo/sidekick-elastic#built-with"&gt;Built With&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/boroskoyo/sidekick-elastic#getting-started"&gt;Getting Started&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="https://github.com/boroskoyo/sidekick-elastic#prerequisites"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/boroskoyo/sidekick-elastic#installation"&gt;Installation&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/boroskoyo/sidekick-elastic#usage"&gt;Usage&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/boroskoyo/sidekick-elastic#roadmap"&gt;Roadmap&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/boroskoyo/sidekick-elastic#contact"&gt;Contact&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;


&lt;h2&gt;
About The Recipe&lt;/h2&gt;
&lt;h3&gt;
Related blog post: &lt;a href="https://medium.com/runsidekick/sidekick-recipes-1-elasticsearch-ingest-561d0970c030" rel="nofollow"&gt;https://medium.com/runsidekick/sidekick-recipes-1-elasticsearch-ingest-561d0970c030&lt;/a&gt;
&lt;/h3&gt;
&lt;br&gt;
Sidekick is a production debugging and on-demand logging tool where you can debug your running applications while they keep on running. Sidekick provides the ability to add logs and put non-breaking breakpoints in your application code which captures the snapshot of the application state, the call stack, variables, etc.
&lt;p&gt;Sidekick Actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A tracepoint is basically a non-breaking remote breakpoint. In short, it takes a screenshot of the variables when the code hits that line.&lt;/li&gt;
&lt;li&gt;Logpoints open the way for dynamic logging to Sidekick users. Replacing traditional logging with dynamic logging has the potential to lower stage sizes, costs, and time for log…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/boroskoyo/sidekick-elastic"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/boroskoyo"&gt;
        boroskoyo
      &lt;/a&gt; / &lt;a href="https://github.com/boroskoyo/sidekick-loki"&gt;
        sidekick-loki
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Ingest your Sidekick logs &amp;amp; snapshots to Loki. Thanks to winston &amp;amp; winston-loki
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;br&gt;
&lt;div&gt;
  &lt;a href="https://www.runsidekick.com" rel="nofollow"&gt;
    &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ksHHh4lV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/boroskoyo/sidekick-elastic/raw/master/Sidekick_Logo.svg" alt="Logo" width="200" height="80"&gt;
  &lt;/a&gt;
  &lt;h2&gt;
+&lt;/h2&gt;
   &lt;a href="https://www.runsidekick.com" rel="nofollow"&gt;
    &lt;img src="https://camo.githubusercontent.com/2e167002e952990ec73a44c0d9b66414df46b483e4ca332bd484cf4a369e38af/68747470733a2f2f6d69726f2e6d656469756d2e636f6d2f6d61782f313037362f302a4f695f4e45346c775157464577356d6a2e706e67" alt="Logo" width="227" height="140"&gt;
  &lt;/a&gt;
  &lt;h3&gt;
Sidekick Recipes: Send logs to Loki -Add missing logs to your running microservices&lt;/h3&gt;
  &lt;p&gt;
    Send your collected tracepoint &amp;amp; logpoint events to your Loki instances
    &lt;br&gt;
    &lt;a href="https://docs.runsidekick.com/" rel="nofollow"&gt;&lt;strong&gt;Explore the docs »&lt;/strong&gt;&lt;/a&gt;
    &lt;br&gt;
    &lt;br&gt;
    &lt;a href="https://www.runsidekick.com" rel="nofollow"&gt;Sidekick Home&lt;/a&gt;
    ·
    &lt;a href="https://www.runsidekick.com/contact-us" rel="nofollow"&gt;Report Bug &amp;amp; Request Feature&lt;/a&gt;
  &lt;/p&gt;
&lt;/div&gt;

  Table of Contents
  &lt;ol&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/boroskoyo/sidekick-loki#about-the-recipe"&gt;About The Recipe&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="https://github.com/boroskoyo/sidekick-loki#built-with"&gt;Built With&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/boroskoyo/sidekick-loki#getting-started"&gt;Getting Started&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="https://github.com/boroskoyo/sidekick-loki#prerequisites"&gt;Prerequisites&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/boroskoyo/sidekick-loki#installation"&gt;Installation&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/boroskoyo/sidekick-loki#usage"&gt;Usage&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/boroskoyo/sidekick-loki#contact"&gt;Contact&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;


&lt;h2&gt;
About The Recipe&lt;/h2&gt;
&lt;h3&gt;
Related blog post: &lt;a href="https://medium.com/runsidekick/sidekick-recipes-2-add-missing-logs-to-your-running-microservices-and-send-them-to-loki-1f5a3449343c" rel="nofollow"&gt;https://medium.com/runsidekick/sidekick-recipes-2-add-missing-logs-to-your-running-microservices-and-send-them-to-loki-1f5a3449343c&lt;/a&gt;
&lt;/h3&gt;
&lt;br&gt;
Sidekick is a production debugging and on-demand logging tool where you can debug your running applications while they keep on running. Sidekick provides the ability to add logs and put non-breaking breakpoints in your application code which captures the snapshot of the application state, the call stack, variables, etc.
&lt;p&gt;Sidekick Actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A tracepoint is basically a non-breaking remote breakpoint. In short, it takes a screenshot of the variables when the code hits that line.&lt;/li&gt;
&lt;li&gt;Logpoints open the way for dynamic logging to Sidekick users. Replacing traditional logging with dynamic logging has the…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/boroskoyo/sidekick-loki"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;TLDR;&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;With Sidekick &lt;a href="https://github.com/runsidekick/sidekick-agent-nodejs"&gt;Node agent&lt;/a&gt;’s latest update, developers can now activate automatic error stack collection and start collecting exception call stacks from their running applications without stopping them. A great addition to Sidekick Actions that will help you boost your developer productivity even more.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sidekick is open-source and brings almost no overhead to your applications. Visit runsidekick.com to meet your new live application debugger.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://www.runsidekick.com/" rel="noopener noreferrer"&gt;
      runsidekick.com
    &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Please let us know your invaluable ideas because they will guide us on our path to discovering the future of application observability. You can get in touch with us through &lt;a href="https://twitter.com/RunSidekick"&gt;&lt;strong&gt;Twitter&lt;/strong&gt;&lt;/a&gt;, and join our &lt;a href="https://www.runsidekick.com/discord-invitation"&gt;&lt;strong&gt;Discord community&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>observability</category>
      <category>debug</category>
    </item>
    <item>
      <title>Achieving Rule-based observability using Sidekick and Camunda</title>
      <dc:creator>boroskoyo</dc:creator>
      <pubDate>Mon, 12 Sep 2022 13:15:29 +0000</pubDate>
      <link>https://dev.to/boroskoyo/achieving-rule-based-observability-using-sidekick-and-camunda-4b9f</link>
      <guid>https://dev.to/boroskoyo/achieving-rule-based-observability-using-sidekick-and-camunda-4b9f</guid>
      <description>&lt;h2&gt;
  
  
  Collect what you need, only when you need it
&lt;/h2&gt;

&lt;p&gt;Sidekick is an &lt;a href="https://github.com/runsidekick/sidekick"&gt;&lt;strong&gt;open source&lt;/strong&gt;&lt;/a&gt; live application debugger that comes with many built-in features to make data collection both easier and more efficient. Collecting snapshots and generating logs from running applications are powerful for learning how your code works as long as you collect the data you need.&lt;/p&gt;

&lt;p&gt;Logging everything is not a smart move as you can find yourself searching in a log pile full of mostly unnecessary logs in a very short time. Similar case applies for the snapshots &amp;amp; traces. That is why we have included conditional data generation in Sidekick. Combined with hit and time limits, they allow you to collect only what you need, leaving a graveyard of useless data behind.&lt;/p&gt;

&lt;p&gt;In addition to our out-of-the-box conditional limitation features, Sidekick’s API’s and clients let you to bring your own rules which leads to a relatively new approach to observability, a rule based one. With this approach we will be able to put tracepoints when rules met and start collecting data automatically based on rule engine’s output.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--__CN2d9b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vjqvqneoyjk8cz33chdw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--__CN2d9b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vjqvqneoyjk8cz33chdw.gif" alt="Image description" width="880" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rule Engines
&lt;/h2&gt;

&lt;p&gt;There are plenty of different rule engines &amp;amp; workflow automation tools that we can use for such a scenario. A few can be listed as:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://camunda.com/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--EBIuebln--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://camunda.com/wp-content/uploads/2022/04/1200x627_Camunda_Homepage_Ftd-Image.png" height="461" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://camunda.com/" rel="noopener noreferrer" class="c-link"&gt;
          The Universal Process Orchestrator | Camunda
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Camunda's process automation platform allows developers to design, automate and improve processes. Start your free trial today.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--ikOGYYIR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://camunda.com/wp-content/uploads/2022/02/Secondary-Logo_Rounded-Black-150x150.png" width="150" height="150"&gt;
        camunda.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.drools.org/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--0Lr2t9dU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://drools.org/headerFooter/droolsIcon.png" height="256" class="m-0" width="256"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.drools.org/" rel="noopener noreferrer" class="c-link"&gt;
          Drools - Drools - Business Rules Management System (Java™, Open Source)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Drools introduces the Business Logic integration Platform which provides a unified and integrated platform for Rules, Workflow and Event Processing.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s---oi7MFnw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.drools.org/favicon.ico" width="128" height="128"&gt;
        drools.org
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.npmjs.com/package/json-rules-engine" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--r7XxGAJ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.npmjs.com/338e4905a2684ca96e08c7780fc68412.png" height="462" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.npmjs.com/package/json-rules-engine" rel="noopener noreferrer" class="c-link"&gt;
          json-rules-engine - npm
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Rules Engine expressed in simple json. Latest version: 6.1.2, last published: a year ago. Start using json-rules-engine in your project by running `npm i json-rules-engine`. There are 102 other projects in the npm registry using json-rules-engine.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--h1do8fu7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.npmjs.com/b0f1a8318363185cc2ea6a40ac23eeb2.png" width="32" height="32"&gt;
        npmjs.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.npmjs.com/package/node-rules" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--r7XxGAJ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.npmjs.com/338e4905a2684ca96e08c7780fc68412.png" height="462" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.npmjs.com/package/node-rules" rel="noopener noreferrer" class="c-link"&gt;
          node-rules - npm
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Business Rules Engine for JavaScript. Latest version: 7.2.0, last published: 24 days ago. Start using node-rules in your project by running `npm i node-rules`. There are 15 other projects in the npm registry using node-rules.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--h1do8fu7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.npmjs.com/b0f1a8318363185cc2ea6a40ac23eeb2.png" width="32" height="32"&gt;
        npmjs.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;We will be using Camunda for this example for broader use cases as Camunda is more than a rule engine it is a universal process orchestrator. For a usage example of Camunda you can check out:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.bernd-ruecker.com/use-camunda-without-touching-java-and-get-an-easy-to-use-rest-based-orchestration-and-workflow-7bdf25ac198e"&gt;Use Camunda as an easy-to-use REST-based orchestration and workflow engine (without touching Java)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Sidekick with Camunda
&lt;/h2&gt;

&lt;p&gt;Camunda provides external task clients that allow developers to implement tasks to run when a workflow hits to the related step. We will be using Node.js client but cases below can also be achieved with different clients of Camunda and Sidekick’s upcoming Python &amp;amp; Java clients.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.npmjs.com/package/camunda-external-task-client-js" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--r7XxGAJ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.npmjs.com/338e4905a2684ca96e08c7780fc68412.png" height="462" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.npmjs.com/package/camunda-external-task-client-js" rel="noopener noreferrer" class="c-link"&gt;
          camunda-external-task-client-js - npm
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Implement your [BPMN Service Task](https://docs.camunda.org/manual/latest/user-guide/process-engine/external-tasks/) in NodeJS.. Latest version: 2.2.0, last published: 5 months ago. Start using camunda-external-task-client-js in your project by running `npm i camunda-external-task-client-js`. There are 15 other projects in the npm registry using camunda-external-task-client-js.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--h1do8fu7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.npmjs.com/b0f1a8318363185cc2ea6a40ac23eeb2.png" width="32" height="32"&gt;
        npmjs.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Example task method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
// Subscribe to the topic: 'topicName'  
client.subscribe("topicName", async function({ task, taskService }) {  
  // Put your business logic  
  // Complete the task  
  await taskService.complete(task);  
});

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://www.npmjs.com/package/@runsidekick/sidekick-client" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--r7XxGAJ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.npmjs.com/338e4905a2684ca96e08c7780fc68412.png" height="462" class="m-0" width="880"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://www.npmjs.com/package/@runsidekick/sidekick-client" rel="noopener noreferrer" class="c-link"&gt;
          @runsidekick/sidekick-client - npm
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Sidekick Node.js Client. Latest version: 0.0.2, last published: a month ago. Start using @runsidekick/sidekick-client in your project by running `npm i @runsidekick/sidekick-client`. There are no other projects in the npm registry using @runsidekick/sidekick-client.
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--h1do8fu7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://static.npmjs.com/b0f1a8318363185cc2ea6a40ac23eeb2.png" width="32" height="32"&gt;
        npmjs.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Task method with Sidekick Put tracepoint event:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Subscribe to the topic: 'topicName'  
client.subscribe("topicName", async function({ task, taskService }) {    const params= {  
      applicationFilters: [  
          {  
            name: "Demo application",  
            version: "v1.0",  
            stage: "prod"  
          }  
        ],  
      fileName: "gitlab.com/repos/...",  
      lineNo: 23,  
      expireSecs: -1,  
      expireCount: -1,  
      enableTracing: true,  
      persist: true  
  }  
  apiClient.putTracepoints(params);  
  await taskService.complete(task);  
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Example use cases
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Case 1 — Activating Tracepoints based on error scenarios
&lt;/h2&gt;

&lt;p&gt;Camunda’s DMN engine provides us ability to define rules in an excel like interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WqRH94HX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2ANiZSUANcysBNOJwAzeNO6A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WqRH94HX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2ANiZSUANcysBNOJwAzeNO6A.png" alt="" width="880" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sidekick DMN&lt;/p&gt;

&lt;p&gt;As you can observe at the DMN above we can define where we put tracepoints when a certain type of error occurs.&lt;/p&gt;

&lt;p&gt;Triggering workflows with error types makes a great use case as it enables us to automatically start collecting extra information based on different cases. Enabling different tracepoints at once is especially useful for spotting state changes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: In addition to this use case Sidekick Node.js agent has ability to automatically capture error stacks, without any tracepoint. check out: &lt;a href="https://www.npmjs.com/package/@runsidekick/sidekick-agent-nodejs"&gt;https://www.npmjs.com/package/@runsidekick/sidekick-agent-nodejs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--42aR8Non--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2APtgBVnGlhUHaG54ioHJrYg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--42aR8Non--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2APtgBVnGlhUHaG54ioHJrYg.png" alt="" width="880" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example Sidekick BPMN&lt;/p&gt;

&lt;h2&gt;
  
  
  Case 2 —Putting Tracepoints on workflow errors
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_VleDV1I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A4GYMm9hF1EzWD4R2MPzIsw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_VleDV1I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A4GYMm9hF1EzWD4R2MPzIsw.png" alt="" width="880" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.bernd-ruecker.com/use-camunda-without-touching-java-and-get-an-easy-to-use-rest-based-orchestration-and-workflow-7bdf25ac198e"&gt;image from: https://blog.bernd-ruecker.com/use-camunda-without-touching-java-and-get-an-easy-to-use-rest-based-orchestration-and-workflow-7bdf25ac198e&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Camunda comes with an error handling mechanism that lets you run actions in cases of errors. In addition to Sidekick client, we can also attach Sidekick agents to task services to observe their state changes and debug them effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  Case 3 — Activating Tracepoints on certain events
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P-Ck1QGq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2ARsCLAeQS9H4dOBF0J1MPPw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P-Ck1QGq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2ARsCLAeQS9H4dOBF0J1MPPw.png" alt="" width="880" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last but not least, Sidekick Actions bring more than debugging to the table. They are also great tools to understand how the system works. Especially for the cases like understanding why and how edge cases occur or understanding when does a certain step is reached.&lt;/p&gt;

&lt;p&gt;We have briefly explained how Sidekick can be used with Camunda to achieve rule based observability, for better understanding systems, having a smoother debug experience and lowering monitoring costs with conditional data collection. The 3 cases we have explained are just the tip of the iceberg and there is a lot more to discover here.&lt;/p&gt;

&lt;p&gt;Please let us know your invaluable ideas because they will guide us on our path to discovering the future of application observability. You can get in touch with us through &lt;a href="https://twitter.com/RunSidekick"&gt;&lt;strong&gt;Twitter&lt;/strong&gt;&lt;/a&gt;, and join our &lt;a href="https://www.runsidekick.com/discord-invitation"&gt;&lt;strong&gt;Discord community&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>devops</category>
      <category>java</category>
    </item>
    <item>
      <title>Sidekick Open Source Live Debugger : Embed Sidekick features to your applications</title>
      <dc:creator>boroskoyo</dc:creator>
      <pubDate>Wed, 31 Aug 2022 10:32:21 +0000</pubDate>
      <link>https://dev.to/boroskoyo/sidekick-open-source-live-debugger-embed-sidekick-features-to-your-applications-5hhn</link>
      <guid>https://dev.to/boroskoyo/sidekick-open-source-live-debugger-embed-sidekick-features-to-your-applications-5hhn</guid>
      <description>&lt;h2&gt;
  
  
  Control Sidekick agents from a React &amp;amp; Express application
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C34H1-v4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AXwXOLaa32JGApvsQBlsKAQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C34H1-v4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AXwXOLaa32JGApvsQBlsKAQ.png" alt="" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Sidekick?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VB8wLiiL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/960/0%2ASauxO0Hs_fS8G4Ex" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VB8wLiiL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/960/0%2ASauxO0Hs_fS8G4Ex" alt="" width="480" height="95"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sidekick is an open-source live application debugger that lets you troubleshoot your applications while they keep on running.&lt;/p&gt;

&lt;p&gt;Check out Sidekick Open-source repo to learn more:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/runsidekick"&gt;
        runsidekick
      &lt;/a&gt; / &lt;a href="https://github.com/runsidekick/sidekick"&gt;
        sidekick
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Free and open-source live application debugger. Like chrome dev tools but for your backend
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/cbe611d3db151d9dc7ab9c6823276006a4c4a2f8f4900b5e2dd8edb4ea7892db/68747470733a2f2f343735303136372e6673312e68756273706f7475736572636f6e74656e742d6e61312e6e65742f68756266732f343735303136372f536964656b69636b2532304f532532307265706f2f6c6f676f2d312e706e67"&gt;&lt;img width="30%" height="30%" src="https://camo.githubusercontent.com/cbe611d3db151d9dc7ab9c6823276006a4c4a2f8f4900b5e2dd8edb4ea7892db/68747470733a2f2f343735303136372e6673312e68756273706f7475736572636f6e74656e742d6e61312e6e65742f68756266732f343735303136372f536964656b69636b2532304f532532307265706f2f6c6f676f2d312e706e67"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;a href="https://github.com/runsidekick/sidekick"&gt;&lt;img src="https://camo.githubusercontent.com/795e2a053a63fc594cd9fee0bc76c678a924149cd568e82fa485febfa2f5c88d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f72756e736964656b69636b2f736964656b69636b3f7374796c653d666f722d7468652d6261646765" alt="Sidekick Licence"&gt;&lt;/a&gt; 
    &lt;a href="https://www.runsidekick.com/discord-invitation?utm_source=sidekick-readme" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/5e9452f773e5b7e5c3695b8b7849ab7bf8fe1a1a249707e11ca48bfb362369be/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3935383734353034353330383137343431363f7374796c653d666f722d7468652d6261646765266c6f676f3d646973636f7264266c6162656c3d444953434f5244" alt="Sidekick Discord Channel"&gt;&lt;/a&gt; 
    &lt;a href="https://www.runforesight.com?utm_source=sidekick-readme" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/66c620cc2543155969224f0b0b00deeac23c8978b3106db9bcd330e97c32ff74/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d6f6e69746f72656425323062792d466f726573696768742d2532333939303046303f7374796c653d666f722d7468652d6261646765" alt="Foresight monitoring"&gt;&lt;/a&gt; 
    &lt;a href="https://app.runsidekick.com/sandbox?utm_source=sidekick-readme" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/4c22adda37a859dc6e7b4e7b6f48a10deceebdd79bc919422b7f38b6b9cc258c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f747279253230696e2d73616e64626f782d627269676874677265656e3f7374796c653d666f722d7468652d6261646765" alt="Sidekick Sandbox"&gt;&lt;/a&gt; 
&lt;/p&gt;

&lt;div&gt;
&lt;a href="https://www.producthunt.com/posts/sidekick-12?utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-sidekick-12" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/18af9e5f4287294313779214954a4579a634c78f633e0b608aedd6975e72b835/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d333537303533267468656d653d6c6967687426706572696f643d6461696c79" alt="Sidekick - Like Chrome DevTools for your backend, now open source | Product Hunt" width="250" height="54"&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;div&gt;
    &lt;a href="https://docs.runsidekick.com/" rel="nofollow"&gt;&lt;strong&gt;Explore Docs »&lt;/strong&gt;&lt;/a&gt;
        &lt;a href="https://medium.com/runsidekick/sidekick-open-source-live-debugger-get-started-in-5-mins-efc0845a2288" rel="nofollow"&gt;&lt;strong&gt;Quick Start Tutorial »&lt;/strong&gt;&lt;/a&gt;
&lt;/div&gt;


  Table of Contents
  &lt;ol&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#what-is-sidekick"&gt;What is Sidekick?&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#sidekick-actions"&gt;Sidekick Actions&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#why-sidekick"&gt;Why Sidekick?&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#features"&gt;Features&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#who-should-use-sidekick"&gt;Who should use Sidekick?&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#how-does-sidekick-work"&gt;How does Sidekick work?&lt;/a&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#getting-started"&gt;Getting Started&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#running-sidekick-using-our-docker-image"&gt;Running Sidekick using our Docker image&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#building-sidekick"&gt;Building Sidekick&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;
      &lt;a href="https://github.com/runsidekick/sidekick#sidekick-ecosystem"&gt;Sidekick Ecosystem&lt;/a&gt;
      &lt;ul&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#documentation"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#agents"&gt;Agents&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#clients"&gt;Clients&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#usage-examples"&gt;Usage Examples&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#sidekick-recipes"&gt;Sidekick Recipes&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#recent-publications"&gt;Recent Publications&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#contributing"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#questions-problems-suggestions"&gt;Questions? Problems? Suggestions?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="https://github.com/runsidekick/sidekick#contact"&gt;Contact&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;


&lt;h2&gt;
What is Sidekick?&lt;/h2&gt;
&lt;p&gt;Sidekick is a live application debugger that lets you troubleshoot your applications while they keep on running.&lt;/p&gt;
&lt;p&gt;Add dynamic logs and put non-breaking breakpoints in your running application without the need of stopping &amp;amp; redeploying.&lt;/p&gt;
&lt;p&gt;Sidekick Open Source is here to allow self-hosting and make live debugging more accessible. Built for everyone who needs extra information from their running applications.&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8d5099f4d215ef42c8c787fd5048b7bf13e3ee90da6c53cc5297244079579cc8/68747470733a2f2f343735303136372e6673312e68756273706f7475736572636f6e74656e742d6e61312e6e65742f68756266732f343735303136372f536964656b69636b2532304f532532307265706f2f486f77536964656b69636b576f726b732e676966"&gt;&lt;img width="70%" height="70%" src="https://camo.githubusercontent.com/8d5099f4d215ef42c8c787fd5048b7bf13e3ee90da6c53cc5297244079579cc8/68747470733a2f2f343735303136372e6673312e68756273706f7475736572636f6e74656e742d6e61312e6e65742f68756266732f343735303136372f536964656b69636b2532304f532532307265706f2f486f77536964656b69636b576f726b732e676966"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;h5&gt;
Sidekick Actions:&lt;/h5&gt;
&lt;p&gt;Sidekick has two major actions; Tracepoints &amp;amp; Logpoints.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;tracepoint&lt;/strong&gt; is a non-breaking remote breakpoint. In short, it takes a snapshot of the variables when the code hits that line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logpoints&lt;/strong&gt; open the…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/runsidekick/sidekick"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Sidekick agents can be controlled both via a UI from Sidekick Web IDE, Visual Studio Code &amp;amp; IntelliJ IDEA and via a headless approach from REST API &amp;amp; Node.js Client. Sidekick REST API and Node.js client allows developers to control Sidekick actions from their own solutions.&lt;/p&gt;
&lt;h1&gt;
  
  
  About the example
&lt;/h1&gt;

&lt;p&gt;We have prepared an example project to show how you can develop a custom application to control your Sidekick agents using Sidekick Node.js Client.&lt;/p&gt;

&lt;p&gt;This example consists of 2 parts. First part is a standard web application that we will live debug and the second one is our custom Sidekick control app. Both parts are connected to a self hosted version of Sidekick.&lt;/p&gt;

&lt;p&gt;Sidekick Control App that we have build has 2 main features.&lt;/p&gt;
&lt;h2&gt;
  
  
  1 - Putting tracepoints
&lt;/h2&gt;

&lt;p&gt;In the React applicaion you can find 2 buttons that let you put tracepoints to specified locations.&lt;/p&gt;

&lt;p&gt;Tracepoints are added via making a call to express server that is running behind. The express server uses the Sidekick client’s putTracepoints function to make an api call to Sidekick REST API.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
apiClient.putTracepoints(params);&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  2 - Listening events
&lt;/h2&gt;

&lt;p&gt;Sidekick client’s onTrigger feature is used to listed activities from Sidekick broker.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
onTrigger(clientInfo);&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We have implemented a custom ingest function for tracepoints to send them to the react application using socket.io.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function ingestFunc(index) {   
    return async function (data) {   
        console.log(data);   
        io.to(“stack-room”).emit(“stack”, data);   
    };  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;get extra info about Sidekick Node.js client here: &lt;a href="https://www.npmjs.com/package/@runsidekick/sidekick-client"&gt;Sidekick Node.js Client&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Built With
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  React&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://expressjs.com/"&gt;Express&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://github.com/runsidekick/sidekick"&gt;Socket.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.electronjs.org/"&gt;Electron&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.npmjs.com/package/@runsidekick/sidekick-client"&gt;Sidekick Node.js Client&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.npmjs.com/package/react-json-view"&gt;react-json-view&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Getting Started
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://github.com/runsidekick/sidekick"&gt;Sidekick&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make sure Sidekick broker is running. (check main Sidekick repo)&lt;br&gt;&lt;br&gt;
If you have changed the default settings, update token and port values in this tutorial accordingly.&lt;/p&gt;

&lt;p&gt;Check out our &lt;a href="https://medium.com/p/efc0845a2288"&gt;Quick Start Guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Part-1 | Employee System (Main App)
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Clone Employee System repository  
git clone [https://github.com/boroskoyo/sidekick-example-employee-management-system](https://github.com/boroskoyo/sidekick-example-employee-management-system)  
# Go into the repository  
cd sidekick-example-employee-management-system  
# Install dependencies  
npm i --legacy-peer-deps  
# Run the app  
npm run start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;UI will start running at &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt; and backend will be using the port 8081&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kcvtw_gU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2AlTvLqDifKDoUBIP_.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kcvtw_gU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2AlTvLqDifKDoUBIP_.png" alt="" width="880" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;server/index.js&lt;/code&gt; - This is where we include our Sidekick agent. You can edit the agent settings according to your setup and needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agent settings can be seen below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BpaOdNL7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/634/0%2A9PM0Zyky6QGzgjfV.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BpaOdNL7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/634/0%2A9PM0Zyky6QGzgjfV.png" alt="" width="317" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agent Settings&lt;/p&gt;
&lt;h2&gt;
  
  
  Part-2 | Control Application
&lt;/h2&gt;

&lt;p&gt;This is the application we have built to control our Sidekick agent.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Clone control app repository  
git clone https://github.com/boroskoyo/sidekick-electron-quick-start  
# Go into the repository  
cd sidekick-electron-quick-start  
# Install dependencies  
npm i --legacy-peer-deps  
# Run the app  
npm run dev-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also run the browser version — &lt;a href="http://localhost:5173"&gt;http://localhost:5173&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HqMGNQc---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A6IdYgAXncboghsUt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HqMGNQc---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A6IdYgAXncboghsUt.png" alt="" width="880" height="750"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sidekick Explorer UI&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;server.js&lt;/code&gt; - Contains the main functions for putting Tracepoint.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;params&lt;/code&gt; - This is where we prepare our params for Sidekick API requests for putting tracepoints.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--trXjX-qU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/530/0%2AIAk_yhimcHWr83Yb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--trXjX-qU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/530/0%2AIAk_yhimcHWr83Yb.png" alt="" width="265" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;parameters for tracepoint&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;filename&lt;/code&gt; - Filname paramters consists of git address of the file and the commit hash.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  Usage
&lt;/h1&gt;

&lt;p&gt;After running all applications. Go to &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt; and check out the employee app. Then use the put tracepoint buttons on the Electron app to put tracepoints on the running application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TJAqZbe6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3jzwd2a1jq5j3i0gtgsj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TJAqZbe6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3jzwd2a1jq5j3i0gtgsj.png" alt="Image description" width="880" height="475"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Tracepoint Locations:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q0L-6l2p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A0eHmKlJ19ZZpzmGHYnQAtw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q0L-6l2p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A0eHmKlJ19ZZpzmGHYnQAtw.png" alt="" width="880" height="503"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Get Employees (Line 62)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AOuWMVUI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1276/0%2ASCQ_B2qqgQtuSxRE.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AOuWMVUI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1276/0%2ASCQ_B2qqgQtuSxRE.png" alt="" width="638" height="235"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Delete Employees (Line 202)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Visit the home page and capture stack related to employee list endpoint.&lt;/li&gt;
&lt;li&gt;  Delete an employee to collect related data.&lt;/li&gt;
&lt;li&gt;  Check out Electron app to see your collected events.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can than further edit those apps to explore Sidekick Client’s features.&lt;/p&gt;
&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;As you can see above, Sidekick clients allow developers to easily use collected data and control Sidekick Actions from third party applications. We are planning to implement Sidekick control plugins for different dashboards and platforms, share your desired targets and feature requests via issues and discussions.&lt;/p&gt;

&lt;p&gt;Please let us know your invaluable ideas because they will guide us on our path to discovering the future of application observability. You can get in touch with us through &lt;a href="https://github.com/runsidekick/sidekick"&gt;&lt;strong&gt;Github&lt;/strong&gt;&lt;/a&gt;&lt;a href="https://twitter.com/RunSidekick"&gt;&lt;strong&gt;, Twitter&lt;/strong&gt;&lt;/a&gt;, and join our &lt;a href="https://www.runsidekick.com/discord-invitation"&gt;&lt;strong&gt;Discord community&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you liked this article and learn more about &lt;a href="https://www.runsidekick.com"&gt;&lt;strong&gt;Sidekick&lt;/strong&gt;&lt;/a&gt; you can check out our &lt;a href="https://docs.runsidekick.com/"&gt;docs&lt;/a&gt; and start using it right away!&lt;/p&gt;

&lt;p&gt;Repo related to this article:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/boroskoyo"&gt;
        boroskoyo
      &lt;/a&gt; / &lt;a href="https://github.com/boroskoyo/sidekick-electron-quick-start"&gt;
        sidekick-electron-quick-start
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      an example app to show how you can control your agents from a React application:
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://github.com/RunSidekick/sidekick"&gt;&lt;img src="https://camo.githubusercontent.com/818fd408c0a1571ede9def2096d279d75984a55858b362d2247f91a9c7f9658a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5553452d534944454b49434b2d707572706c653f7374796c653d666f722d7468652d6261646765" alt="Sidekick"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;div&gt;
  &lt;a href="https://github.com/runsidekick/sidekick"&gt;
    &lt;img src="https://camo.githubusercontent.com/cbe611d3db151d9dc7ab9c6823276006a4c4a2f8f4900b5e2dd8edb4ea7892db/68747470733a2f2f343735303136372e6673312e68756273706f7475736572636f6e74656e742d6e61312e6e65742f68756266732f343735303136372f536964656b69636b2532304f532532307265706f2f6c6f676f2d312e706e67" alt="Logo" width="40%" height="40%"&gt;
  &lt;/a&gt;
  &lt;/div&gt;
&lt;div&gt;
  &lt;h3&gt;
Sidekick Example: Embed Sidekick features to your applications &lt;/h3&gt;
  &lt;p&gt;
    Example to show how you can control your agents from a React application
    &lt;br&gt;
    &lt;a href="https://github.com/runsidekick/sidekick"&gt;&lt;strong&gt;Explore Sidekick »&lt;/strong&gt;&lt;/a&gt;
    &lt;br&gt;
  &lt;/p&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;a href="https://www.producthunt.com/posts/sidekick-12?utm_source=badge-top-post-badge&amp;amp;utm_medium=badge&amp;amp;utm_souce=badge-sidekick-12" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/18af9e5f4287294313779214954a4579a634c78f633e0b608aedd6975e72b835/68747470733a2f2f6170692e70726f6475637468756e742e636f6d2f776964676574732f656d6265642d696d6167652f76312f746f702d706f73742d62616467652e7376673f706f73745f69643d333537303533267468656d653d6c6967687426706572696f643d6461696c79" alt="Sidekick - Like Chrome DevTools for your backend, now open source | Product Hunt" width="250" height="54"&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;h2&gt;
About the project&lt;/h2&gt;

&lt;p&gt;This project aims to show how you can develop a custom application to control your Sidekick agents using Sidekick Node.js Client.&lt;/p&gt;

&lt;p&gt;
    &lt;a rel="noopener noreferrer" href="https://github.com/boroskoyo/sidekick-electron-quick-startassets/tutorial.gif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5VsHYLKZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://github.com/boroskoyo/sidekick-electron-quick-startassets/tutorial.gif" alt="sidekick explorer"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h4&gt;
Built With&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;&lt;a href="https://expressjs.com/" rel="nofollow"&gt;Express&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Socket.io&lt;/li&gt;
&lt;li&gt;Electron&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@runsidekick/sidekick-client" rel="nofollow"&gt;Sidekick Node.js Client&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
Getting Started&lt;/h4&gt;

&lt;p&gt;This tutorial consists of 2 parts. First part is a standard web application that we will live debug and the second one is our custom Sidekick control app.&lt;/p&gt;

&lt;h5&gt;
Prerequisites&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sidekick&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt; Make sure Sidekick broker is running. (check main Sidekick repo)
 If you have changed the default settings, update token and port values in this tutorial accordingly
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out our  &lt;a href="https://medium.com/p/efc0845a2288" rel="nofollow"&gt;Quick Start Guide&lt;/a&gt;.&lt;/p&gt;

&lt;h5&gt;
Part-1 | Employee System (Main App)&lt;/h5&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Clone Employee System repository&lt;/span&gt;
git clone https://github.com/boroskoyo/sidekick-example-employee-management-system
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Go into the repository&lt;/span&gt;
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; sidekick-example-employee-management-system
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Install dependencies&lt;/span&gt;
npm i --legacy-peer-deps
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/boroskoyo/sidekick-electron-quick-start"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



</description>
      <category>node</category>
      <category>react</category>
      <category>api</category>
      <category>devops</category>
    </item>
    <item>
      <title>State of Sidekick Open Source Live Application Debugger</title>
      <dc:creator>boroskoyo</dc:creator>
      <pubDate>Thu, 25 Aug 2022 15:30:07 +0000</pubDate>
      <link>https://dev.to/boroskoyo/state-of-sidekick-open-source-live-application-debugger-5313</link>
      <guid>https://dev.to/boroskoyo/state-of-sidekick-open-source-live-application-debugger-5313</guid>
      <description>&lt;h2&gt;
  
  
  It has been around 6 months since we released Sidekick as a standalone solution. It is time for our biggest update ever.
&lt;/h2&gt;

&lt;p&gt;You can see where we were at day zero here:  &lt;a href="https://www.runsidekick.com/blog/announcing-sidekick-instant-live-debugging-to-fix-software-bugs"&gt;https://www.runsidekick.com/blog/announcing-sidekick-instant-live-debugging-to-fix-software-bugs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the beginning we were describing Sidekick as;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“a modern live debugging tool that helps development teams to understand their code instantly by getting snapshots of their running applications wherever they run.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Initially, improving developers’ day-to-day debugging routines with tracepoints aka non-breaking breakpoints was our main goal. As we got to know our customers and the market more, we discovered that Sidekick has a lot more to bring to the table. First, we added log points and give our users the ability to collect traces and generate logs on-demand without stopping &amp;amp; redeploying their applications. Then we started working on discovering the extra benefits of Sidekick-generated data. As an initial step, we developed an MVP for Sidekick Node.js Client that lets you use your generated data programmatically.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/YcsHUQv9Sj4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;A subset of what we achieved in this relatively short period of time;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.runsidekick.com/blog/realtime-debugging-support-for-nodejs"&gt;Node.js support&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://twitter.com/RunSidekick/status/1531281824349044737?s=20&amp;amp;t=TYutkodx9MLTzV-pjWXVjA"&gt;Team support&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;New Sidekick Action :&lt;/strong&gt; &lt;a href="https://www.runsidekick.com/blog/log-you-are-looking-for-is-a-needle-in-a-haystack-not-anymore"&gt;&lt;strong&gt;Logpoints!&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://twitter.com/RunSidekick/status/1537440015629750272"&gt;Webhooks support&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.runsidekick.com/blog/sidekick-vscode"&gt;Visual Studio Code extension&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://docs.runsidekick.com/plugins/intellij-idea-plugin"&gt;Improved IntelliJ IDEA plugin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://twitter.com/RunSidekick/status/1532338741402120192"&gt;Collaboration support&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Improved On-premise solution with Web IDE support&lt;/li&gt;
&lt;li&gt;  Newer &amp;amp; better Web IDE with improved user experience&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://app.runsidekick.com/sandbox?utm_source=github&amp;amp;utm_medium=devto1"&gt;Sandbox page for frictionless onboarding&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  OpenTelemetry support for Sidekick Agents &lt;/li&gt;
&lt;li&gt;  &lt;a href="https://docs.runsidekick.com/installation/installing-agents/node.js/data-redaction"&gt;Improved data reduction at the edge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://docs.runsidekick.com/headless/rest-api"&gt;REST API → allowing programmatically managing Tracepoints &amp;amp; Logpoints &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.npmjs.com/package/@runsidekick/sidekick-client"&gt;Sidekick Node.js Client&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Sidekick recipes → Ingest your Sidekick-generated data to your observability platform :  &lt;a href="https://docs.runsidekick.com/sidekick-recipes"&gt;https://docs.runsidekick.com/sidekick-recipes&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F4IFeqH0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/840/0%2AAtG3t0xK9Q3uAfIX" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F4IFeqH0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/840/0%2AAtG3t0xK9Q3uAfIX" alt="Team Sidekick after the latest sprint" width="420" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Team Sidekick after the latest sprint&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One thing led to another and we started to discover new surface areas for Sidekick. Now it is a headless addition to your observability stack. With new OpenTelemetry support and REST API, it came to a stage where it allows you to put your logpoints / tracepoints programmatically and use the generated data again using your programming skills. A true developer-first tool that makes the developers a part of the core loop.&lt;/p&gt;

&lt;p&gt;Today;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In addition to its live debugger superpowers, Sidekick is a plus one for your observability stack.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Our journey continues and there are many more steps to come, but the big news is future of Sidekick is bright and open! Open as in Open-Source!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gsXJ0qAc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/0%2AFkNh_9yfl89KB_Jf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gsXJ0qAc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/700/0%2AFkNh_9yfl89KB_Jf.jpg" alt="" width="350" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🥁🥁🥁Drum rolls!🥁🥁🥁&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Sidekick is now open-source!&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;With this release anybody will be able to have thier self hosted Sidekick instances, this will open up new opportunites for community to meet live debugging and contribute to Sidekick.&lt;/p&gt;

&lt;p&gt;Sidekick Open Source Github Repository: &lt;a href="https://github.com/runsidekick/sidekick"&gt;https://github.com/runsidekick/sidekick&lt;/a&gt; (don't forget to give us a ⭐)&lt;/p&gt;

&lt;p&gt;We still have a lot to do and we are constantly looking for feedbacks and contributors. Your support is important for improving Sidekick's live debugging experience more.&lt;/p&gt;

&lt;p&gt;Please let us know your invaluable ideas because they will guide us on our path to discovering the future of application observability. You can get in touch with us through  &lt;a href="https://twitter.com/RunSidekick"&gt;&lt;strong&gt;Twitter&lt;/strong&gt;&lt;/a&gt;, and join our  &lt;a href="https://www.runsidekick.com/discord-invitation"&gt;&lt;strong&gt;Discord community&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>github</category>
      <category>showdev</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Sidekick Open Source Live Debugger : Get started in 5 mins</title>
      <dc:creator>boroskoyo</dc:creator>
      <pubDate>Wed, 24 Aug 2022 13:22:00 +0000</pubDate>
      <link>https://dev.to/boroskoyo/sidekick-open-source-live-debugger-get-started-in-5-mins-347o</link>
      <guid>https://dev.to/boroskoyo/sidekick-open-source-live-debugger-get-started-in-5-mins-347o</guid>
      <description>&lt;h2&gt;
  
  
  Sidekick Open Source is finally ready! Here is how you can start using it in 5 minutes.
&lt;/h2&gt;

&lt;p&gt;Sidekick is a live application debugger that lets you troubleshoot your applications while they keep on running.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SnSZ_AMt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2Achr1RgtR8YzRcfb0L5AulQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SnSZ_AMt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2Achr1RgtR8YzRcfb0L5AulQ.png" alt="meet our agents!" width="880" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sidekick Open Source is here to allow self-hosting and make live debugging more accessible. Built for everyone who needs extra information from their running applications.&lt;/p&gt;

&lt;p&gt;Today is the big day for Sidekick Open Source as we are launching on Product Hunt! Your upvotes and comments will help us a lot and we are looking forward you hear your feedback.&lt;/p&gt;

&lt;p&gt;Our Product Hunt page:  &lt;a href="https://www.producthunt.com/posts/sidekick-12"&gt;https://www.producthunt.com/posts/sidekick-12&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.producthunt.com/posts/sidekick-12"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T7FAUb4H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A0172aN2BF9u8w4XX.png" alt="support us on ph" width="880" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sidekick Open Source Github repo: (don’t forget to star it  ⭐)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/runsidekick/sidekick"&gt;https://github.com/runsidekick/sidekick&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Quickstart
&lt;/h1&gt;

&lt;p&gt;We have prepared a simple project to show how you can start live debugging using a self-hosted Sidekick instance in just 5 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Docker&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Make sure docker daemon is running.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;  npm&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;npm install npm@latest -g&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Visual Studio Code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;( Note: Sidekick has many other clients. Check out our headless options if you don’t want to install a new IDE :  &lt;a href="https://docs.runsidekick.com/headless/"&gt;https://docs.runsidekick.com/headless/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Running Sidekick with default settings&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.Clone the Sidekick repo&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git clone https://github.com/runsidekick/sidekick.git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2.Go to the docker folder under the project&lt;/p&gt;

&lt;p&gt;3.Run command &lt;code&gt;docker-compose up -d&lt;/code&gt; and wait for a minute&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kwNSiRRN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A7OR3dgOSTRUsJqJN8dcg3Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kwNSiRRN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A7OR3dgOSTRUsJqJN8dcg3Q.png" alt="docker compose screen" width="880" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your Sidekick instance is ready&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Running Quickstart Project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.Clone the Quicstart application repo&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git clone https://github.com/boroskoyo/sidekick-nodejs-quickstart.git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2.Install NPM packages&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3.Run!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm start&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now you have your self-hosted Sidekick instance and Quickstart application up and running.&lt;/p&gt;

&lt;p&gt;It is time to use a client to put tracepoints and collect data from Quickstart application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And live debugging for all!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Install Sidekick Extension form the VSCode marketplace:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5v28EkRQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A0USk7sHehyzJo23g" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5v28EkRQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A0USk7sHehyzJo23g" alt="" width="880" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open the folder of Quickstart application at VSCode&lt;/p&gt;

&lt;p&gt;.vscode folder in this repo should set the config for you. If you have any issues just check the instructions here:  &lt;a href="https://docs.runsidekick.com/plugins/visual-studio-code-extension-python-and-node.js/self-hosted-settings"&gt;https://docs.runsidekick.com/plugins/visual-studio-code-extension-python-and-node.js/self-hosted-settings&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---eihh3oP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A_5k6ke05nioz9R_T" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---eihh3oP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A_5k6ke05nioz9R_T" alt="" width="880" height="742"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now login using Sidekick plugin&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ybV0rEN---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AOgvO1WV2jyORValD5hbnJg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ybV0rEN---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AOgvO1WV2jyORValD5hbnJg.png" alt="" width="790" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Head to the Sidekick: Trace Events panel to enable it&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--btMwbMbd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AkNN9gkHlPNfVQacdqXEDDw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--btMwbMbd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AkNN9gkHlPNfVQacdqXEDDw.png" alt="" width="880" height="70"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Right click on 10th line on app/routes/index.js and put your first tracepoint. Check docs for extra info:  &lt;a href="https://docs.runsidekick.com/plugins/visual-studio-code-extension-python-and-node.js/tracepoints-and-logpoints"&gt;https://docs.runsidekick.com/plugins/visual-studio-code-extension-python-and-node.js/tracepoints-and-logpoints&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--54Q2lrha--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A06Au3nLFF2c4aaFhXh_9Xg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--54Q2lrha--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2A06Au3nLFF2c4aaFhXh_9Xg.png" alt="" width="880" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visit  &lt;a href="http://localhost:3000/"&gt;http://localhost:3000/&lt;/a&gt;  to trigger your tracepoint.&lt;/p&gt;

&lt;p&gt;Observe your collected trace events at VSCode Sidekick: Trace Events panel!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q66EkjUp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AyPH_cuD4rlN4PRNO0xUi_Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q66EkjUp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AyPH_cuD4rlN4PRNO0xUi_Q.png" alt="" width="880" height="273"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s it!&lt;/p&gt;

&lt;p&gt;That is all you need to start using Sidekick Open Source.&lt;/p&gt;

&lt;p&gt;Happy debugging y’all!&lt;/p&gt;

&lt;p&gt;repo containing this project : &lt;a href="https://github.com/boroskoyo/sidekick-nodejs-quickstart"&gt;https://github.com/boroskoyo/sidekick-nodejs-quickstart&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>testing</category>
      <category>docker</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to add logs to your running applications on-demand without redeploying, restarting, or stopping the execution</title>
      <dc:creator>boroskoyo</dc:creator>
      <pubDate>Mon, 15 Aug 2022 10:23:48 +0000</pubDate>
      <link>https://dev.to/boroskoyo/how-to-add-logs-to-your-running-applications-on-demand-without-redeploying-restarting-or-stopping-the-execution-4ihb</link>
      <guid>https://dev.to/boroskoyo/how-to-add-logs-to-your-running-applications-on-demand-without-redeploying-restarting-or-stopping-the-execution-4ihb</guid>
      <description>&lt;p&gt;Logs have become a fundamental part of traditional software development as they help us understand what is going on with our systems while they are running.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wg1kDUb5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2AWTRtvC8QZ5MbXHWh.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wg1kDUb5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2AWTRtvC8QZ5MbXHWh.jpeg" alt="" width="880" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Photo by Thierry Chabot on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Regardless of your runtime you can add logs anywhere you want and start collecting information but there is always a catch:&lt;/p&gt;

&lt;p&gt;As your system becomes more complex and/or the number of logs you are generating increases it is getting easier to get lost in log piles. On the flip side, logs only help you if they are placed in the right place and any replacement etc. requires a new deployment which does not end to be the most chill scenario if you are trying to find a bug in production.&lt;/p&gt;

&lt;h1&gt;
  
  
  These two points create a dilemma:
&lt;/h1&gt;

&lt;p&gt;You either log everything for your comfort and get lost in gigabytes or maybe a larger of logs you have created or you end up with inadequate logs that you need to populate by adding more logs into your code and redeploying it.&lt;/p&gt;

&lt;h1&gt;
  
  
  Solution: Dynamic logging
&lt;/h1&gt;

&lt;p&gt;Our latest update brings logpoints along with many improvements.&lt;/p&gt;

&lt;p&gt;Logpoints are points that you can add to your running application, just like Tracepoints, for adding logs dynamically.&lt;/p&gt;

&lt;p&gt;Logpoints solve the dilemma by letting you add logs to your running applications without stopping and redeploying. Since you can add and remove your logs at any time, getting the log wherever and whenever you need it becomes a walk at the park!&lt;/p&gt;

&lt;p&gt;Not only solving the issues of traditional logging, but Sidekick Logpoint feature also comes with extras. In addition to adding and removing logs on demand, with Sidekick you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Define conditions for your logpoints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define time to live and maximum hit counts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change log levels dynamically&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enrich your log content with variable information from the context&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure agent to print logs directly to &lt;strong&gt;stdout&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Send generated logs to any target you desire!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0mjr17Xt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2AS2rOj0biOmf2754y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0mjr17Xt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2AS2rOj0biOmf2754y.png" alt="" width="880" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our integrations with Slack and some of the well-known logging tools are at the corner and we also added custom webhook support for you to extend the possibilities. Don’t forget to join our &lt;a href="https://www.runsidekick.com/discord-invitation"&gt;&lt;strong&gt;Discord channel&lt;/strong&gt;&lt;/a&gt; for news and to share your integration requests.&lt;/p&gt;

&lt;h1&gt;
  
  
  TL;DR
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://app.runsidekick.com/signup"&gt;&lt;strong&gt;Sidekick’s Logpoints feature&lt;/strong&gt;&lt;/a&gt;, in the end, opens the way of dynamic logging to its users. It replaces traditional logging with dynamic logging. This means you easily have the potential to lower stage sizes, costs, and time for log searching. Additionally, logpoints feature brings the ability to add new logpoints without editing the source code, redeploying, or restarting the application.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eUB0WXDx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2As6HiR06ne09o5aLh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eUB0WXDx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2As6HiR06ne09o5aLh.png" alt="" width="880" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>node</category>
      <category>python</category>
      <category>java</category>
    </item>
    <item>
      <title>Collect Realtime Stack Traces from NodeJS Applications</title>
      <dc:creator>boroskoyo</dc:creator>
      <pubDate>Fri, 12 Aug 2022 12:16:46 +0000</pubDate>
      <link>https://dev.to/boroskoyo/collect-realtime-stack-traces-from-nodejs-applications-4da5</link>
      <guid>https://dev.to/boroskoyo/collect-realtime-stack-traces-from-nodejs-applications-4da5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Whether you are working on a dev branch or prod, you can now remotely debug your running Node.js applications using Sidekick’s web IDE.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this post, I’ll show you how you can quickstart collecting stack traces from your Node.js applications using Sidekick. All without restarting &amp;amp; redeploying.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WvoFWXqt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AonbmmERKyQ_QKkIbJ9ToIw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WvoFWXqt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/1%2AonbmmERKyQ_QKkIbJ9ToIw.png" alt="" width="880" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To keep everything nice and short I’ve started with the Hello World example from Express.js’ website. (&lt;a href="http://expressjs.com/en/starter/hello-world.html"&gt;http://expressjs.com/en/starter/hello-world.html&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Then I plugged in body-parser and added a new endpoint to demonstrate what you can achieve in a few seconds.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const express = require('express')  
const app = express()  
const port = 3000  
const bodyParser = require('body-parser')  

app.use(bodyParser.json())  

app.get('/', (req, res) =&amp;gt; {  
  res.send('Hello World!')  
})  

app.post('/:id', (req, res) =&amp;gt; {  
    let body = req.body  
    res.json(req.body.foo)  
  })  

app.listen(port, () =&amp;gt; {  
  console.log(\`Example app listening on port ${port}\`)  
})

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So as you can see, my new endpoint is returning a part of the request body. Now we will use Sidekick to observe more and see what other information was included in the request body.&lt;/p&gt;

&lt;p&gt;First, we will install our Sidekick Node.js agent.&lt;br&gt;
&lt;code&gt;&lt;br&gt;
npm install @runsidekick/sidekick-agent-nodejs&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Then we will sign in to our Sidekick account and copy the API Key of our workspace.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sidekick comes with a 7-day free trial so you can use this link to sign up and follow along with this article.&lt;/p&gt;

&lt;p&gt;‍&lt;a href="https://app.runsidekick.com/"&gt;https://app.runsidekick.com/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then we will add the Sidekick agent on top of our project. Final code will look like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const SidekickDebugger = require('@runsidekick/sidekick-agent-nodejs');  

SidekickDebugger.start({   
    apiKey: 'your-sidekick-api-key'  
});  

const express = require('express')  
…

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And we are good to go. Now we can run our application and start observing its state on the go.&lt;/p&gt;

&lt;p&gt;To put your first tracepoint, head to &lt;a href="https://app.runsidekick.com"&gt;app.runsidekick.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select your running application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1p53Hi79--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A7KAr7cqFdrHB6_Xl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1p53Hi79--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A7KAr7cqFdrHB6_Xl.png" alt="" width="880" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add your tracepoint and call your endpoint to collect related data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YSUM_Lld--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1032/0%2A9VdQfI92VpmXffiY.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YSUM_Lld--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1032/0%2A9VdQfI92VpmXffiY.png" alt="" width="516" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nTl7WpWX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A43w2DF3c329ETf8Z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nTl7WpWX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A43w2DF3c329ETf8Z.png" alt="" width="818" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;‍&lt;/p&gt;

&lt;p&gt;There you go, now that you have collected your data you can observe what is going on behind the curtains.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TtAx7yWp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A1oCHGB0R2lx-S919.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TtAx7yWp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/1400/0%2A1oCHGB0R2lx-S919.png" alt="" width="880" height="169"&gt;&lt;/a&gt;&lt;br&gt;
(checkout the initial image for the zoomed in version)&lt;/p&gt;

&lt;p&gt;As you can see starting with Sidekick is a breeze.&lt;/p&gt;

&lt;p&gt;If you liked this article and learn more about &lt;a href="https://marketplace.visualstudio.com/items?itemName=Sidekick.sidekick-debugger"&gt;&lt;strong&gt;Sidekick&lt;/strong&gt;&lt;/a&gt; you can check out our &lt;a href="https://docs.runsidekick.com/"&gt;docs&lt;/a&gt; and start using it right away!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>docker</category>
      <category>api</category>
    </item>
    <item>
      <title>Production Debuggers — 2022 Benchmark Results</title>
      <dc:creator>boroskoyo</dc:creator>
      <pubDate>Thu, 11 Aug 2022 06:29:57 +0000</pubDate>
      <link>https://dev.to/boroskoyo/production-debuggers-2022-benchmark-results-8gp</link>
      <guid>https://dev.to/boroskoyo/production-debuggers-2022-benchmark-results-8gp</guid>
      <description>&lt;h1&gt;
  
  
  Production Debuggers — 2022 Benchmark Results — Part-1
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Passive impact of agents under high load
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2A5XVjgbf7x3NdShqJ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2A5XVjgbf7x3NdShqJ.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Case1: Passive impact under high load
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Story Behind the Research
&lt;/h1&gt;

&lt;p&gt;We develop Sidekick to give developers new abilities for collecting data from their running applications. On our road to making live debugging &amp;amp; observability easier for developers, our performance impact is among the most questioned topics. To answer this question, we decided to make a research to observe how much overhead Sidekick and its competitors Lightrun and Rookout bring to the applications.&lt;/p&gt;

&lt;p&gt;This benchmarking research consists of 3 parts.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Case1: Passive impact under high load&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@kaya/production-debuggers-2022-benchmark-results-part2-7f8e9411e882" rel="noopener noreferrer"&gt;Case2: Comparing Sidekick &amp;amp; Lightrun &amp;amp; Rookout load test performance with active tracepoints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@kaya/production-debuggers-2022-benchmark-results-part3-e352caae57e9" rel="noopener noreferrer"&gt;Case3: Comparing Sidekick and Rookout performances with active tracepoints with 1000 hit limits under under high load&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All the cases will be consisted of load tests and we will perform these tests using JMeter. You check it out here: &lt;a href="https://jmeter.apache.org/" rel="noopener noreferrer"&gt;&lt;strong&gt;https://jmeter.apache.org/&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To test out the performance impact we have decided to go with the pet clinic app example served by the Spring community itself for a fair comparison. Below you can see the system’s overall design.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2AyjTItLhMCbtEzWy6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2AyjTItLhMCbtEzWy6.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find our testing repo below if you want to repeat this test yourself. Both pet clinic example and our testing repo including JMeter test JMX files can be found in this repo:&lt;br&gt;
&lt;a href="https://github.com/runsidekick/sidekick-load-test" rel="noopener noreferrer"&gt;https://github.com/runsidekick/sidekick-load-test&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;JMeter &amp;amp; Throughput Shaping Timer plugin link:&lt;br&gt;
(&lt;a href="https://jmeter.apache.org/" rel="noopener noreferrer"&gt;https://jmeter.apache.org/&lt;/a&gt;)&lt;br&gt;
(&lt;a href="https://jmeter-plugins.org/wiki/ThroughputShapingTimer/" rel="noopener noreferrer"&gt;https://jmeter-plugins.org/wiki/ThroughputShapingTimer/&lt;/a&gt;)&lt;/p&gt;
&lt;h1&gt;
  
  
  Hardware info:
&lt;/h1&gt;

&lt;p&gt;We will be using AWS EC2 instances with default settings to run. You can find image details below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
"Images": \[   
{  
  "Architecture": "x86_64",  
  "CreationDate": "2022-04-28T21:51:14.000Z",  
  "ImageId": "ami-0ca285d4c2cda3300",  
  "ImageLocation": "amazon/amzn2-ami-kernel-5.10-hvm-2.0.20220426.0-x86_64-gp2",  
  "ImageType": "machine",  
  "Public": true,  
  "OwnerId": "137112412989",  
  "PlatformDetails": "Linux/UNIX",  
  "UsageOperation": "RunInstances",  
  "State": "available",  
  "BlockDeviceMappings": \[  
    {  
      "DeviceName": "/dev/xvda",  
      "Ebs": {  
        "DeleteOnTermination": true,  
        "SnapshotId": "snap-0ce66497b69246e3d",  
        "VolumeSize": 8,  
        "VolumeType": "gp2",  
        "Encrypted": false  
      }  
    }  
  \],  
  "Description": "Amazon Linux 2 Kernel 5.10 AMI 2.0.20220426.0 x86_64 HVM gp2",  
  "EnaSupport": true,  
  "Hypervisor": "xen",  
  "ImageOwnerAlias": "amazon",  
  "Name": "amzn2-ami-kernel-5.10-hvm-2.0.20220426.0-x86_64-gp2",  
  "RootDeviceName": "/dev/xvda",  
  "RootDeviceType": "ebs",  
  "SriovNetSupport": "simple",  
  "VirtualizationType": "hvm"  
}  
\]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are multiple EC2 instance types in AWS environment. Amazon EC2 C5 instances deliver cost-effective high performance at a low price per compute ratio for running advanced compute-intensive workloads. We have used c5.4xlarge with default configurations for all our cases. You can find the details for this instance below. If you would prefer to learn more about EC2 C5 instances, you can check out the &lt;a href="https://aws.amazon.com/ec2/instance-types/c5/" rel="noopener noreferrer"&gt;&lt;strong&gt;official AWS website&lt;/strong&gt;&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
{  
  "InstanceTypes": \[  
    {  
      "InstanceType": "c5.4xlarge",  
      "CurrentGeneration": true,  
      "FreeTierEligible": false,  
      "SupportedUsageClasses": \[  
        "on-demand",  
        "spot"  
      \],  
      "SupportedRootDeviceTypes": \[  
        "ebs"  
      \],  
      "SupportedVirtualizationTypes": \[  
        "hvm"  
      \],  
      "BareMetal": false,  
      "Hypervisor": "nitro",  
      "ProcessorInfo": {  
        "SupportedArchitectures": \[  
          "x86_64"  
        \],  
        "SustainedClockSpeedInGhz": 3.4  
      },  
      "VCpuInfo": {  
        "DefaultVCpus": 16,  
        "DefaultCores": 8,  
        "DefaultThreadsPerCore": 2,  
        "ValidCores": \[  
          2,  
          4,  
          6,  
          8  
        \],  
        "ValidThreadsPerCore": \[  
          1,  
          2  
        \]  
      },  
      "MemoryInfo": {  
        "SizeInMiB": 32768  
      },  
      "InstanceStorageSupported": false,  
      "EbsInfo": {  
        "EbsOptimizedSupport": "default",  
        "EncryptionSupport": "supported",  
        "EbsOptimizedInfo": {  
          "BaselineBandwidthInMbps": 4750,  
          "BaselineThroughputInMBps": 593.75,  
          "BaselineIops": 20000,  
          "MaximumBandwidthInMbps": 4750,  
          "MaximumThroughputInMBps": 593.75,  
          "MaximumIops": 20000  
        },  
        "NvmeSupport": "required"  
      },  
      "NetworkInfo": {  
        "NetworkPerformance": "Up to 10 Gigabit",  
        "MaximumNetworkInterfaces": 8,  
        "MaximumNetworkCards": 1,  
        "DefaultNetworkCardIndex": 0,  
        "NetworkCards": \[  
          {  
            "NetworkCardIndex": 0,  
            "NetworkPerformance": "Up to 10 Gigabit",  
            "MaximumNetworkInterfaces": 8  
          }  
        \],  
        "Ipv4AddressesPerInterface": 30,  
        "Ipv6AddressesPerInterface": 30,  
        "Ipv6Supported": true,  
        "EnaSupport": "required",  
        "EfaSupported": false  
      },  
      "PlacementGroupInfo": {  
        "SupportedStrategies": \[  
          "cluster",  
          "partition",  
          "spread"  
        \]  
      },  
      "HibernationSupported": true,  
      "BurstablePerformanceSupported": false,  
      "DedicatedHostsSupported": true,  
      "AutoRecoverySupported": true  
    }  
  \]  
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the databases we will be using db.t2.micro MySQLinstances. T2 instances are &lt;a href="https://aws.amazon.com/rds/instance-types/#Burstable_Performance_Instances" rel="noopener noreferrer"&gt;&lt;strong&gt;burstable general-purpose performance instances&lt;/strong&gt;&lt;/a&gt; that provide a baseline level of CPU performance with the ability to burst above the baseline. T2 instances are a good choice for a variety of database workloads including micro-services and test and staging databases. General details for t2.micro instance hardware info is shared below. For getting more information, you can visit &lt;a href="https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.DBInstanceClass.html" rel="noopener noreferrer"&gt;&lt;strong&gt;the official AWS website&lt;/strong&gt;&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
{  
  "InstanceTypes": \[  
    {  
      "InstanceType": "t2.micro",  
      "CurrentGeneration": true,  
      "FreeTierEligible": true,  
      "SupportedUsageClasses": \[  
        "on-demand",  
        "spot"  
      \],  
      "SupportedRootDeviceTypes": \[  
        "ebs"  
      \],  
      "SupportedVirtualizationTypes": \[  
        "hvm"  
      \],  
      "BareMetal": false,  
      "Hypervisor": "xen",  
      "ProcessorInfo": {  
        "SupportedArchitectures": \[  
          "i386",  
          "x86_64"  
        \],  
        "SustainedClockSpeedInGhz": 2.5  
      },  
      "VCpuInfo": {  
        "DefaultVCpus": 1,  
        "DefaultCores": 1,  
        "DefaultThreadsPerCore": 1  
      },  
      "MemoryInfo": {  
        "SizeInMiB": 1024  
      },  
      "InstanceStorageSupported": false,  
      "EbsInfo": {  
        "EbsOptimizedSupport": "unsupported",  
        "EncryptionSupport": "supported",  
        "NvmeSupport": "unsupported"  
      },  
      "NetworkInfo": {  
        "NetworkPerformance": "Low to Moderate",  
        "MaximumNetworkInterfaces": 2,  
        "MaximumNetworkCards": 1,  
        "DefaultNetworkCardIndex": 0,  
        "NetworkCards": \[  
          {  
            "NetworkCardIndex": 0,  
            "NetworkPerformance": "Low to Moderate",  
            "MaximumNetworkInterfaces": 2  
          }  
        \],  
        "Ipv4AddressesPerInterface": 2,  
        "Ipv6AddressesPerInterface": 2,  
        "Ipv6Supported": true,  
        "EnaSupport": "unsupported",  
        "EfaSupported": false  
      },  
      "PlacementGroupInfo": {  
        "SupportedStrategies": \[  
          "partition",  
          "spread"  
        \]  
      },  
      "HibernationSupported": true,  
      "BurstablePerformanceSupported": true,  
      "DedicatedHostsSupported": false,  
      "AutoRecoverySupported": true  
    }  
  \]  
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  The case:
&lt;/h1&gt;

&lt;p&gt;In this case, we are investigating the passive impact of Java Agents of production debuggers which we took in our scope.&lt;/p&gt;

&lt;p&gt;Agents in this case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agentless&lt;/strong&gt;: Agentless version of the pet clinic app which we will use as a reference index for our comparison.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sidekick&lt;/strong&gt;: &lt;a href="https://www.runsidekick.com" rel="noopener noreferrer"&gt;&lt;strong&gt;https://www.runsidekick.com&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rookout&lt;/strong&gt;: &lt;a href="https://www.rookout.com" rel="noopener noreferrer"&gt;&lt;strong&gt;https://www.rookout.com&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightrun&lt;/strong&gt;: &lt;a href="https://www.lightrun.com" rel="noopener noreferrer"&gt;&lt;strong&gt;https://www.lightrun.com&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For all agents we will have separate EC2 instances and we will be using JMeter for all our tests. For each case only dependent variable will be the agent.&lt;/p&gt;

&lt;p&gt;We will make same amount of requests to the same endpoints for each setup and observe the impact of each agent via comparing their latencies and throughputs.&lt;/p&gt;

&lt;p&gt;Below you can find our JMeter setup for the load test:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F1%2A2pnvDhCJCn9LdpaDYV6Xjg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F1%2A2pnvDhCJCn9LdpaDYV6Xjg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The pattern above(shaping-timer-load) will be repeated for each setup. You can download the .jmx file from here: &lt;a href="https://github.com/runsidekick/sidekick-load-test/blob/master/petclinic-app/src/test/jmeter/petclinic_test_plan.jmx" rel="noopener noreferrer"&gt;https://github.com/runsidekick/sidekick-load-test/blob/master/petclinic-app/src/test/jmeter/petclinic_test_plan.jmx&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Passive Impact Benchmark Results
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Agentless (Ref):
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2ATggUdsrObGAtKBhg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2ATggUdsrObGAtKBhg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reference Statistics&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2AtyJtnhOnfxMpwawX.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2AtyJtnhOnfxMpwawX.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lightrun:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2AM-y3UPmrN7CFqx7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2AM-y3UPmrN7CFqx7v.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lightrun Statistics&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2Atarga3AeN8jcpsD8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2Atarga3AeN8jcpsD8.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rookout:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2ArBQKw6U9GaIfWUF7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2ArBQKw6U9GaIfWUF7.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rookout Statistics&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2AbSxbPq1z8WJc1Kxy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2AbSxbPq1z8WJc1Kxy.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sidekick:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2Af0kGo2xFFxhPk1J6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2Af0kGo2xFFxhPk1J6.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sidekick Statistics&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2Aa1u1mfYOB9j2Omcm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2Aa1u1mfYOB9j2Omcm.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Results Summary:
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2AiSQZrpv8BX6f67Hh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2AiSQZrpv8BX6f67Hh.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Statistics comparison table&lt;/p&gt;

&lt;p&gt;Observing that the least amount of Transactions/s is 982.30 and it is only 1.14% lower than the reference value we can see how low impact is done when agents are in their passive state. Furthermore, Min &amp;amp; Median latency values are almost identical and we can use graphs to observe Max values are ususally one time occurrences that does not represent a negative outcome.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion:
&lt;/h1&gt;

&lt;p&gt;All 3 alternatives and the agentless instance performed almost identically. This means you can ship your applications with any live debugger agent and don’t worry about performance losses.&lt;/p&gt;

&lt;p&gt;Bearing in mind that this performance research is done under the constraints of idle positions. To be more specific, we plugged in the agents and did not use the products yet. We did not put any tracepoints and sent any requests from the agents.&lt;/p&gt;

&lt;p&gt;In this research, we came to the conclusion that neither the Sidekick agent nor the Rookout, and Lightrun agents bring very little negligible overhear compared to the application without any agent plugged.&lt;/p&gt;

&lt;p&gt;This means no performance loss is gained using these 3 Java agents in the idle situation. In another perspective, production debuggers differ from APMs or Error/bug tracking tool in means of performance.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sidekick is going open source to allow self-hosting and make live debugging more accessible.&lt;br&gt;&lt;br&gt;
Subscribe and get the latest news from Sidekick Open-Source here:&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2APlpW1B2DJfSGgD8Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmiro.medium.com%2Fmax%2F1400%2F0%2APlpW1B2DJfSGgD8Q.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.producthunt.com/upcoming/sidekick-open-source-collect-traces-and-generate-logs-on-demand-without-stopping-redeploying-your-applications" rel="noopener noreferrer"&gt;https://www.producthunt.com/upcoming/sidekick-open-source-collect-traces-and-generate-logs-on-demand-without-stopping-redeploying-your-applications&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>benchmark</category>
      <category>debug</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
