<?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: Eden Federman</title>
    <description>The latest articles on DEV Community by Eden Federman (@edenfed).</description>
    <link>https://dev.to/edenfed</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%2F1186289%2Fdf8cfed9-0a23-435c-a921-a35ec00b2884.jpg</url>
      <title>DEV Community: Eden Federman</title>
      <link>https://dev.to/edenfed</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/edenfed"/>
    <language>en</language>
    <item>
      <title>🎉Monitor your Javascript application like a pro🧙‍♂️💫</title>
      <dc:creator>Eden Federman</dc:creator>
      <pubDate>Thu, 14 Dec 2023 12:42:56 +0000</pubDate>
      <link>https://dev.to/odigos/monitor-your-javascript-application-like-a-pro-581p</link>
      <guid>https://dev.to/odigos/monitor-your-javascript-application-like-a-pro-581p</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;TL;DR&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will learn how to monitor your Javascript application with &lt;strong&gt;modern tools&lt;/strong&gt; and &lt;strong&gt;best practices&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Explore the power of distributed tracing, and discover how to seamlessly integrate and utilize tools like Odigos and Jaeger to enhance your monitoring capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you will learn: ✨&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to build microservices 🐜 in Javascript.&lt;/li&gt;
&lt;li&gt;Setting up Docker containers 📦 for microservices.&lt;/li&gt;
&lt;li&gt;Configuring Kubernetes ☸️ for managing microservices.&lt;/li&gt;
&lt;li&gt;Integrating a tracing backend for visualizing the traces 🔍.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Are you ready to become a &lt;strong&gt;pro&lt;/strong&gt; at monitoring your JS application? 😍 Say &lt;strong&gt;Yes, sir!&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I can't hear you. Say it louder. 🙉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/8m5dizh7ghyEPIWIx1/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/8m5dizh7ghyEPIWIx1/giphy.gif" alt="Say it louder GIF"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Let's set it up 🦄&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;🚨 In this section of the blog, we'll be building a dummy JavaScript microservices application and deploying it on local Kubernetes. If you already have one and are following along, feel free to skip this part.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Create the initial folder structure for your application as shown below. 👇🏻&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;microservices-demo
&lt;span class="nb"&gt;cd &lt;/span&gt;microservices-demo
&lt;span class="nb"&gt;mkdir &lt;/span&gt;src
&lt;span class="nb"&gt;cd &lt;/span&gt;src
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Setting up the Server&lt;/strong&gt; 🖥️
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;👀 For demonstration purposes, I will create two microservices that will communicate with each other, and eventually, we can use that to visualize distributed tracing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Build and Dockerize Microservice 1&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inside the &lt;code&gt;/src&lt;/code&gt; folder, create a new folder &lt;code&gt;/microservice-1&lt;/code&gt;. Inside the folder initialize a &lt;strong&gt;NodeJS&lt;/strong&gt; project and install the required dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;microservice-1
&lt;span class="nb"&gt;cd &lt;/span&gt;microservice-1
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save&lt;/span&gt; express node-fetch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a new file &lt;code&gt;index.js&lt;/code&gt; and add the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇🏻/src/microservice-1/index.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node-fetch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3001&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://microservice2:8081/api/data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Microservice 2 data received in Microservice 1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;microservice2Data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Internal Server Error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Microservice 1 listening on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 If you've noticed, we're requesting data from &lt;code&gt;http://microservice2:8081/api/data&lt;/code&gt;. You might be wondering, what is this microservice2? Well, we can use service names as host names. 😉 We will build this service later.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The server is listening on port &lt;code&gt;3001&lt;/code&gt; and on get request to &lt;code&gt;/&lt;/code&gt; we are requesting data from &lt;code&gt;microservice2&lt;/code&gt; and returning the response as a JSON object. 📦&lt;/p&gt;

&lt;p&gt;Now, it's time to dockerize this microservice. Create a new &lt;code&gt;Dockerfile&lt;/code&gt; inside the &lt;code&gt;/microservice-1&lt;/code&gt; folder and add the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;// 👇🏻/src/microservice-1/Dockerfile
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:18&lt;/span&gt;

&lt;span class="c"&gt;# Use /usr/src/app as the working directory&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /usr/src/app&lt;/span&gt;

&lt;span class="c"&gt;# Copy package files and install production dependencies&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --chown=node:node package*.json /usr/src/app&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--production&lt;/span&gt;

&lt;span class="c"&gt;# Copy the rest of the files&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --chown=node:node . /usr/src/app/&lt;/span&gt;

&lt;span class="c"&gt;# Switch to the user node with limited permissions&lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; node&lt;/span&gt;

&lt;span class="c"&gt;# Expose the application port&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3001&lt;/span&gt;

&lt;span class="c"&gt;# Set the default command to run the application&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "index.js"]&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;It is always nice to add files to &lt;code&gt;.dockerignore&lt;/code&gt; that we do not want to push to the container. Create a &lt;code&gt;.dockerignore&lt;/code&gt; file with the names of the files we don't want to push.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// 👇🏻/src/microservice-1/.dockerignore
node_modules
Dockerfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, build 🏗️ the docker image by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; microservice1-image:latest &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, that is the entire setup for our first microservice. ✨&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Build and Dockerize Microservice 2&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will have a setup similar to &lt;code&gt;microservice1&lt;/code&gt;, with just a few changes here and there.&lt;/p&gt;

&lt;p&gt;Inside the &lt;code&gt;/src&lt;/code&gt; folder, create a new folder &lt;code&gt;/microservice-2&lt;/code&gt;. Inside the folder, initialize a &lt;strong&gt;NodeJS&lt;/strong&gt; project and install the required dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;microservice-2
&lt;span class="nb"&gt;cd &lt;/span&gt;microservice-2
npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save&lt;/span&gt; express node-fetch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a new file &lt;code&gt;index.js&lt;/code&gt; and add the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇🏻/src/microservice-2/index.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node-fetch&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3002&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://jsonplaceholder.typicode.com/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Internal Server Error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Microservice 2 listening on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;The server is listening on port 3002, and upon a &lt;code&gt;GET request&lt;/code&gt; to &lt;code&gt;/api/data&lt;/code&gt;, we fetch data from &lt;code&gt;jsonplaceholder&lt;/code&gt; and return the response as a JSON object. 📦&lt;/p&gt;

&lt;p&gt;Now, it's time to dockerize this microservice as well. Copy and paste the entire &lt;code&gt;Dockerfile&lt;/code&gt; content for &lt;code&gt;microservice1&lt;/code&gt; and just change the port from 3001 to 3002.&lt;/p&gt;

&lt;p&gt;Also, add a &lt;code&gt;.dockerignore&lt;/code&gt; file and include the same files that we added when creating &lt;code&gt;microservice1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Finally, build 🏗️ the Docker image by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; microservice2-image:latest &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, that is the entire setup for our second microservice as well. ✨&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Setting up Kubernetes&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Make sure &lt;strong&gt;&lt;a href="https://github.com/kubernetes/minikube" rel="noopener noreferrer"&gt;Minikube&lt;/a&gt;&lt;/strong&gt; is installed, or follow &lt;a href="https://minikube.sigs.k8s.io/docs/start/" rel="noopener noreferrer"&gt;&lt;strong&gt;this&lt;/strong&gt;&lt;/a&gt; link for installation instructions. 👀&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Create a new local Kubernetes cluster, by running the following command. We will need it when setting up Odigos and Jaeger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start Minikube: 🚀&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;minikube start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we have both of our microservices ready and dockerized, it's time to set up Kubernetes for managing these services.&lt;/p&gt;

&lt;p&gt;At the root of the project, create a new folder &lt;code&gt;/k8s/manifests&lt;/code&gt;. Inside this folder, we will add deployment and service configurations for both of our microservices.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deployment Configuration 📜&lt;/strong&gt;: For actually deploying the containers on the Kubernetes Cluster.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service Configuration 📄&lt;/strong&gt;: To expose the pods to both within the cluster and outside the cluster.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First, let's create the manifest for the &lt;code&gt;microservice1&lt;/code&gt;. Create a new file &lt;code&gt;microservice1-deployment-service.yaml&lt;/code&gt; and add the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;// 👇🏻/k8s/manifests/microservice1-deployment-service.yaml&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice1&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice1&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice1&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice1&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice1-image&lt;/span&gt;
          &lt;span class="c1"&gt;# Make sure to set it to Never, or else it will pull from the docker hub and fail.&lt;/span&gt;
          &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Never&lt;/span&gt;
          &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200Mi"&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;500m"&lt;/span&gt;
          &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3001&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice1&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice1&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NodePort&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice1&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
      &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3001&lt;/span&gt;
      &lt;span class="na"&gt;nodePort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30001&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This configuration deploys a microservice named &lt;code&gt;microservice1&lt;/code&gt; with resource limits of &lt;strong&gt;200MB memory&lt;/strong&gt; 🗃️ and &lt;strong&gt;0.5 CPU cores&lt;/strong&gt;. It exposes the microservice internally on port 3001 through a Deployment and externally on &lt;strong&gt;NodePort&lt;/strong&gt; 30001 through a Service.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤔 Remember the &lt;code&gt;Dockerfile&lt;/code&gt; we built with the name &lt;code&gt;microservice1-image&lt;/code&gt;? We are using the same image to create the container.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is accessible on port 8080 within the cluster. We assume &lt;code&gt;microservice1-image&lt;/code&gt; is locally available with &lt;code&gt;imagePullPolicy: Never&lt;/code&gt;. If this is not in place, it would attempt to pull the image from the Docker Hub 🐋 and fail.&lt;/p&gt;

&lt;p&gt;Now, let's create the manifest for &lt;code&gt;microservice2&lt;/code&gt;. Create a new file named &lt;code&gt;microservice2-deployment-service.yaml&lt;/code&gt; and add the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;// 👇🏻/k8s/manifests/microservice1-deployment-service.yaml&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice2&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice2&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice2&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice2&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice2-image&lt;/span&gt;
          &lt;span class="c1"&gt;# Make sure to set it to Never, or else it will pull from the docker hub and fail.&lt;/span&gt;
          &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Never&lt;/span&gt;
          &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200Mi"&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;500m"&lt;/span&gt;
          &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3002&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Service&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice2&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice2&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NodePort&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;microservice2&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8081&lt;/span&gt;
      &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3002&lt;/span&gt;
      &lt;span class="na"&gt;nodePort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30002&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is similar to the manifest for &lt;code&gt;microservice1&lt;/code&gt;, with just a few changes. 👀&lt;/p&gt;

&lt;p&gt;This configuration deploys a microservice named &lt;code&gt;microservice2&lt;/code&gt; and exposes it internally on port 3002 through a Deployment and externally on &lt;strong&gt;NodePort&lt;/strong&gt; 30002 through a Service. &lt;/p&gt;

&lt;p&gt;Accessible on port 8081 within the cluster, assuming the &lt;code&gt;microservice2-image&lt;/code&gt; is locally available with &lt;code&gt;imagePullPolicy: Never&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Once, this is all done, make sure to apply these configurations and start the Kubernetes cluster with these services. Change the directory to &lt;code&gt;/manifests&lt;/code&gt; and execute the following commands: 👇🏻&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; microservice1-deployment-service.yaml
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; microservice2-deployment-service.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check that both our deployments are &lt;strong&gt;Running&lt;/strong&gt; by executing the following command: 👇🏻&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fywsvodcqqbx1wv0kede1.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fywsvodcqqbx1wv0kede1.png" alt="Kubernetes Pods"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, our application is ready and deployed on Kubernetes with the necessary deployment configurations. 🎉&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Installing Odigos 😍&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;a href="https://odigos.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Odigos&lt;/strong&gt;&lt;/a&gt; is an open-source observability control plane that enables organizations to create and maintain their observability pipeline.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7c6i7wth5l3ey9frk0cx.jpg" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7c6i7wth5l3ey9frk0cx.jpg" alt="Odigos - Monitoring Tool"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ If you are running on a Mac run the following command to install Odigos locally.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;keyval-dev/homebrew-odigos-cli/odigos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;ℹ️ If you are on a Linux machine, consider installing it from GitHub releases by executing the following commands. Make sure to change the file according to your Linux distribution.&lt;/p&gt;

&lt;p&gt;ℹ️ If the Odigos binary is not executable, run this command &lt;code&gt;chmod +x odigos&lt;/code&gt; to make it executable before running the install command.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-LJO&lt;/span&gt; https://github.com/keyval-dev/odigos/releases/download/v1.0.9/cli_1.0.9_linux_amd64.tar.gz
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xvzf&lt;/span&gt; cli_1.0.9_linux_amd64.tar.gz
./odigos &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F145z2j9fusgnbp41whcw.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F145z2j9fusgnbp41whcw.png" alt="Odigos Installation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you need more brief instructions on its installation, follow this &lt;a href="https://docs.odigos.io/installation" rel="noopener noreferrer"&gt;&lt;strong&gt;link&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, Odigos is ready to run 🎉. We can execute its UI, configure the tracing backend, and send traces accordingly.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Connect Odigos with a Tracing Backend 💫&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;a href="https://github.com/jaegertracing/jaeger" rel="noopener noreferrer"&gt;&lt;strong&gt;Jaeger&lt;/strong&gt;&lt;/a&gt; is an open source, end-to-end distributed tracing system.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9bytdpf4wv1ncb0z52p.jpg" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9bytdpf4wv1ncb0z52p.jpg" alt="Odigos - Distributed Tracing Platform"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Setting up Jaeger!&lt;/strong&gt; ✨
&lt;/h3&gt;

&lt;p&gt;For this tutorial, we will use &lt;strong&gt;Jaeger&lt;/strong&gt; 🕵️‍♂️, a popular open-source platform for viewing distributed traces in a microservices application. We will use it to view the traces generated by Odigos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For Jaeger installation instructions, follow this &lt;a href="https://www.jaegertracing.io/download/" rel="noopener noreferrer"&gt;&lt;strong&gt;link&lt;/strong&gt;&lt;/a&gt;. 👀&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To deploy Jaeger on a Kubernetes cluster, run the following commands: 👇🏻&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create ns tracing
kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/keyval-dev/opentelemetry-go-instrumentation/master/docs/getting-started/jaeger.yaml &lt;span class="nt"&gt;-n&lt;/span&gt; tracing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, we are creating a &lt;code&gt;tracing&lt;/code&gt; namespace and applying the deployment configuration 📃 for Jaeger in that namespace.&lt;/p&gt;

&lt;p&gt;This command sets up the self-hosted Jaeger instance and its service. 👀&lt;/p&gt;

&lt;p&gt;Run the below command to get the status of the running pods: 👇🏻&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait for all three pods to be &lt;strong&gt;Running&lt;/strong&gt; before proceeding further.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn41rxtp8gcbe4cwsl6xx.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn41rxtp8gcbe4cwsl6xx.png" alt="Kubernetes Pods"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, to view the Jaeger Interface 💻 locally, we need to port forward. Forward traffic from port 16686 on the local machine to port 16686 on the selected pod within the Kubernetes cluster.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl port-forward &lt;span class="nt"&gt;-n&lt;/span&gt; tracing svc/jaeger 16686:16686
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command creates a tunnel between the local machine and the Jaeger pod, exposing the Jaeger UI so you can interact with it.&lt;/p&gt;

&lt;p&gt;Finally, open up &lt;code&gt;http://localhost:16686&lt;/code&gt; on your browser and see the Jaeger Instance running.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgr6bcqph7nyxa7v0u01t.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgr6bcqph7nyxa7v0u01t.png" alt="Jaeger UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Setting up Odigos to work with Jaeger!&lt;/strong&gt; 🌟
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ For Linux users, go to the folder where you downloaded the Odigos binaries from GitHub releases and run the following command to launch the Odigos UI.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./odigos ui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;ℹ️ For Mac users, just run:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;odigos ui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit &lt;code&gt;http://localhost:3000&lt;/code&gt; and you will be presented with the Odigos interface where you will see both your deployments in the &lt;code&gt;default&lt;/code&gt; namespace.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14yqd2x41i9gqvwxdtsu.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14yqd2x41i9gqvwxdtsu.png" alt="Odigos Landing Page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select both of these and click Next. On the next page, choose Jaeger as the backend, and add the following details when prompted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Destination Name 🛣️&lt;/strong&gt;: Give any name you want, let's say &lt;strong&gt;express-tracing&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Endpoint 🎯&lt;/strong&gt;: Add &lt;code&gt;jaeger.tracing:4317&lt;/code&gt; for the endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that's it — Odigos is all set to send traces to our Jaeger backend. It's that simple. 🤯&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqqmo7div92zngnkdwwyu.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqqmo7div92zngnkdwwyu.png" alt="Odigos UI with two microservices"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;View the Distributed Tracing 🧐&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;After setting up Odigos, on the Jaeger homepage at &lt;code&gt;http://localhost:16686&lt;/code&gt;, you will already see both of our microservices listed.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwb0qjdmxi4ydcvwjgr1.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwb0qjdmxi4ydcvwjgr1.png" alt="Jaeger UI listing two microservices"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Odigos has already begun sending traces of our application to Jaeger. 😉&lt;/p&gt;

&lt;p&gt;Remember, this is our microservices application. Make a few more requests to &lt;code&gt;microservice1&lt;/code&gt; since it serves as the starting point, it will subsequently request &lt;code&gt;microservice2&lt;/code&gt; for data and return it. Eventually, Jaeger will begin to populate with the traces.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4kwzh854bsh5wga1or3.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu4kwzh854bsh5wga1or3.png" alt="Jaeger Distributed Tracing"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on any one of the requests, and you should be able to observe how the request flows through your application and the time taken to complete each request.&lt;/p&gt;

&lt;p&gt;This was all done without changing a single line of code. 🤯 All thanks to &lt;strong&gt;Odigos&lt;/strong&gt;! 🤩&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l0NwHXQy3kUSfFF60/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l0NwHXQy3kUSfFF60/giphy.gif" alt="Mind Blown GIF"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just imagine, this was such a small dummy application but for a bigger application with tons of microservices running 🏃🏻‍♂️ and interacting with each other, distributed tracing would be extremely powerful! 💪&lt;/p&gt;

&lt;p&gt;With distributed tracing, you could easily identify bottlenecks in your application and determine which service is causing problems or is taking a longer time. 🕒&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Let's Wrap Up! 🥱&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;So far, you've learned how to closely monitor 👀 your Javascript application with distributed tracing, using &lt;strong&gt;Odigos&lt;/strong&gt; as the &lt;strong&gt;middleware&lt;/strong&gt; between your application and the tracing backend &lt;strong&gt;Jaeger&lt;/strong&gt;. 👏&lt;/p&gt;

&lt;p&gt;If you have made it this far, give yourself a pat on the back. 🥳 You deserve it! 😉&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you found the article and the tools helpful, be sure to give a star 🌟 &lt;a href="https://github.com/keyval-dev/odigos" rel="noopener noreferrer"&gt;&lt;strong&gt;Odigos&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://github.com/jaegertracing/jaeger" rel="noopener noreferrer"&gt;&lt;strong&gt;Jaeger&lt;/strong&gt;&lt;/a&gt; on their GitHub repositories.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The source code for this tutorial is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/keyval-dev/blog/tree/main/odigos-monitor-JS-like-a-pro" rel="noopener noreferrer"&gt;https://github.com/keyval-dev/blog/tree/main/odigos-monitor-JS-like-a-pro&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you have any questions or suggestions about this article, please share them in the comments section below. 👇🏻&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, that is it for this article. Thank you for reading! 🎉🫡&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🔥5 Must have tools to install on your Kubernetes cluster ✨️🚀</title>
      <dc:creator>Eden Federman</dc:creator>
      <pubDate>Mon, 27 Nov 2023 16:21:40 +0000</pubDate>
      <link>https://dev.to/odigos/5-must-have-tools-to-install-on-your-kubernetes-cluster-489k</link>
      <guid>https://dev.to/odigos/5-must-have-tools-to-install-on-your-kubernetes-cluster-489k</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;This article lists five must-have tools for developers to install on their Kubernetes cluster. 🎉&lt;/p&gt;

&lt;p&gt;Feel free to explore these projects, star the repositories, and contribute to your favorites. 😉&lt;/p&gt;

&lt;p&gt;Without any further ado, let's get started. 🏃‍♂️💨&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1p4nkxc6qnkbcpo59q9c.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1p4nkxc6qnkbcpo59q9c.gif" alt="Let's start"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;1. &lt;a href="https://odigos.io" rel="noopener noreferrer"&gt;Odigos&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Distributed tracing without code changes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vrtvOUOw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/najz95vmowa4uv1jlecq.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--vrtvOUOw--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnajz95vmowa4uv1jlecq.jpg" alt="Odigos - Observability control plane"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Odigos is an open-source observability control plane that enables organizations to create and maintain their observability pipeline.&lt;/p&gt;

&lt;p&gt;Odigos automatically generates telemetry data in OpenTelemetry format to any Observability backend, without any code change. 😻.&lt;/p&gt;

&lt;p&gt;It automatically instruments our application, eliminating the need to set up OpenTelemetry or anything on our own. Odigos handles it all. 🤯&lt;/p&gt;

&lt;p&gt;All this is possible because of the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Automated Instrumentation 👾:&lt;/strong&gt; Odigos enables automated instrumentation of applications with OpenTelemetry and eBPF, eliminating the need for code modifications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Universal Observability Tool Compatibility 🤝:&lt;/strong&gt; It smoothly integrates with various observability tools, providing comprehensive support and efficient collector management.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;We've recently published an article on implementing Odigos, check it out &lt;a href="https://dev.to/odigos/how-to-monitor-your-requests-between-multiple-applications-4fi8"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/keyval-dev/odigos" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;🌟 Star Odigos&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2. &lt;a href="https://argoproj.github.io/cd/" rel="noopener noreferrer"&gt;Argo CD&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Declarative GitOps CD for Kubernetes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q6PXSe2d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oawy0bzp0hok5jvwq1l3.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--Q6PXSe2d--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foawy0bzp0hok5jvwq1l3.jpg" alt="Argo CD Working"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Argo CD is a powerful GitOps CD tool that can help automate and simplify the deployment and management of Kubernetes applications 🚀.&lt;/p&gt;

&lt;p&gt;Argo CD main feature include a web UI 💻, CLI, rollback capabilities, and simplified monitoring.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why use Argo CD over traditional CD tools?&lt;/strong&gt; 🤔&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Git as single source of truth 🤫:&lt;/strong&gt; Argo CD uses Git as a single aource of truth for app and infrastructure configuration. It makes it easy to track changes and rollback deployment if something goes wrong.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Friendly web UI 💻:&lt;/strong&gt; Argo CD provides a dashboard to manage and get status of all the deployed applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Easy Rollbacks 🔄:&lt;/strong&gt; The cluster is synced with a separate git repository so we just need to revert the changes in git and the cluster will be automatically synced with the git repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Disaster Recovery 🌋:&lt;/strong&gt; In case of a disaster just point the git repository to the newly created cluster and it will have all the configs of previous cluster.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These features makes it accessible for both beginners and experienced Kubernetes users.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In short, Argo CD is a GitOps CD tool for Kubernetes ☸️ that uses Git as the single source for app and infastructure configurations and provides easy rollbacks, dashboard, and disaster recovery capabilities.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/argoproj/argo-cd" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;🌟 Argo CD on GitHub&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;3. &lt;a href="https://docs.nginx.com/nginx-ingress-controller/" rel="noopener noreferrer"&gt;Nginx Ingress Controller&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Specialized load balancer for Kubernetes environments.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kF0dD7J1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/muuooo0w51619q33djhf.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--kF0dD7J1--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmuuooo0w51619q33djhf.jpg" alt="Nginx Ingress Controller Working"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is a most widely used ingress controller for Kubernetes. ☸️ It uses Nginx as a reverse proxy and load balancer.&lt;/p&gt;

&lt;p&gt;It runs 🏃‍♂️ in a Kubernetes environment with Nginx Plus or Nginx Open Source instances.&lt;/p&gt;

&lt;p&gt;The key responsibilities of Nginx Ingress Controller are 👇:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Load balance traffic to containers 📦 in the Kubernetes cluster. It monitors Kubernetes ingress resources and routes traffic to the appropriate Kubernetes services and pods.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Handles networking, traffic management 👮‍♂️, communication and security 🔒.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploys resources based on its configuration 📝 and automatically updates rules based on ingress resource definitions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;In short, It manages traffic, security and dynamically adjusts routing based on Kubernetes ingress resources and configurations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/kubernetes/ingress-nginx" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;🌟 Nginx Ingress Controller on GitHub&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. &lt;a href="https://aws-controllers-k8s.github.io/community/" rel="noopener noreferrer"&gt;AWS Controller for Kubernetes&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Manage AWS services using Kubernetes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e5ctsHl5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o4ingv6dcfvzyyq20ps6.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--e5ctsHl5--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4ingv6dcfvzyyq20ps6.jpg" alt="AWS Controllers for Kubernetes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ACK&lt;/strong&gt;, short for AWS Controllers for Kubernetes, is a set of custom controllers enabling integration between AWS services and Kubernetes clusters that let you directly manage AWS services from Kubernetes 😮.&lt;/p&gt;

&lt;p&gt;ACK makes it simple to build scalable and highly-available Kubernetes applications that utilize AWS services. It provides a unified way to manage our application and it's dependencies ✨️.&lt;/p&gt;

&lt;p&gt;Some key features of AWS Controllers for Kubernetes are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Define and use AWS service resources directly from Kubernetes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Take advantage of AWS managed services for our Kubernetes applications without needing to define resources outside of the cluster or run services that provide supporting capabilities like databases 🗄 or message queues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;In short, ACK enables us to manage AWS services directly from Kubernetes and provides a unified way to define and use AWS services from within our Kubernetes cluster.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/aws-controllers-k8s/community" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;🌟 AWS Controllers for K8 on GitHub&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;5. &lt;a href="https://kyverno.io" rel="noopener noreferrer"&gt;Kyverno&lt;/a&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Policy engine designed for Kubernetes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DvZZ-qz5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uf6a4ut913qf4trvjmhu.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--DvZZ-qz5--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuf6a4ut913qf4trvjmhu.jpg" alt="Kyverno - K8S policy engine"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When deploying things in Kubernetes, like Pods or ConfigMaps, it's important to set rules/policies.&lt;/p&gt;

&lt;p&gt;A key practice is avoiding the use of the &lt;code&gt;latest&lt;/code&gt; tag for container images in production, as it's often a work-in-progress dev build.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What Kyverno actually does?&lt;/strong&gt; 🧐&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In Kubernetes, security issue is a big deal, and one of the main reason is &lt;strong&gt;misconfigurations&lt;/strong&gt;. These security issues arise when there are no good rules (policies) in place.&lt;/p&gt;

&lt;p&gt;This is where policy manager like &lt;strong&gt;Kyverno&lt;/strong&gt; comes in action. 😎&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🚨 &lt;strong&gt;NOTE:&lt;/strong&gt; Kyverno does not work on any other environment other than Kubernetes. If you are looking for a policy management that is vendor agnostic you might consider using something like &lt;a href="https://www.openpolicyagent.org/" rel="noopener noreferrer"&gt;Open Policy Agent&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kyverno manages policies, whether they're about security or just good practices, in our Kubernetes setup.&lt;/p&gt;

&lt;p&gt;We can create rules for things like the &lt;code&gt;latest&lt;/code&gt; tag issue mentioned earlier or focus on security, like making sure your container images are safe in the software supply chain.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In short, Kyverno is a policy engine that helps manage security and best practices by allowing users to manage policies for deployments, addressing issues like misconfigurations and promoting good practices ✅️.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/kyverno/kyverno" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;🌟 Kyverno on GitHub&lt;/a&gt;
&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;If you think of any other helpful projects that I haven't covered in this article, please share them in the comments section below. 👇🏻&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, that is it for this article. Thank you so much for reading! 🎉&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>💨 The fastest way to deploy your Javascript app to Kubernetes 🌬️ ✨</title>
      <dc:creator>Eden Federman</dc:creator>
      <pubDate>Tue, 14 Nov 2023 12:24:54 +0000</pubDate>
      <link>https://dev.to/odigos/the-fastest-way-to-deploy-your-javascript-app-to-kubernetes-2j33</link>
      <guid>https://dev.to/odigos/the-fastest-way-to-deploy-your-javascript-app-to-kubernetes-2j33</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you'll learn how to deploy your first javascript application on Kubernetes - a container orchestration platform ☸️.&lt;/p&gt;

&lt;p&gt;We will deploy a simple &lt;strong&gt;express&lt;/strong&gt; server that returns a sample JSON object on Kubernetes locally using &lt;strong&gt;Minikube&lt;/strong&gt; ✨.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt;: For containerizing the application. 🐋&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minikube&lt;/strong&gt;: For running Kubernetes locally. ☸️&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmn162frk9shm0d76z99n.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmn162frk9shm0d76z99n.gif" alt="GetADeploy"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Odigos - Open-source Distributed Tracing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Monitor all your apps simultaneously without writing a single line of code!&lt;/strong&gt;&lt;br&gt;
Simplify OpenTelemetry complexity with the only platform that can generate distributed tracing across all your applications.&lt;/p&gt;

&lt;p&gt;We are really just starting out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/keyval-dev/odigos" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Can you help us with a star? Plz? 😽&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/keyval-dev/odigos" rel="noopener noreferrer"&gt;&lt;img src="https://media.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%2F84twzafd93w3a4ktqflm.png" alt="Cats"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h3&gt;
  
  
  Let's set it up 🚀
&lt;/h3&gt;

&lt;p&gt;We'll start by initializing our project with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This initializes a &lt;strong&gt;NodeJS&lt;/strong&gt; project with the &lt;code&gt;package.json&lt;/code&gt; 📝 file which keeps track of our installed dependencies.&lt;/p&gt;

&lt;p&gt;Install Express.js framework&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;express
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, inside the &lt;code&gt;package.json&lt;/code&gt; the dependencies object should look something like this. ✅&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"express"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.18.2"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, at the root of the project create an &lt;code&gt;index.js&lt;/code&gt; file and add the following lines of code. 🚀&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇🏻 Initialize express.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 👇🏻 Return a sample JSON object with a message property on the root path.&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello from Odigos!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// 👇🏻 Listen on port 3000.&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server is listening on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We need to add a script in our &lt;code&gt;package.json&lt;/code&gt; for running the application. Add it within the scripts object of &lt;code&gt;package.json&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node index.js"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, to check our application is running properly, run the server using &lt;code&gt;npm run dev&lt;/code&gt; and make a get request to &lt;code&gt;localhost:3000&lt;/code&gt; either via CLI or in the browser. ✨&lt;/p&gt;

&lt;p&gt;If you are using CLI, make sure to have &lt;a href="https://curl.se/" rel="noopener noreferrer"&gt;cURL&lt;/a&gt; installed. ✅&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see something like this. 👇🏻&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkxs2uu8u0aa7kw6k9ta4.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkxs2uu8u0aa7kw6k9ta4.png" alt="cURL response"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you can simply stop the running express server using &lt;code&gt;Ctrl + C&lt;/code&gt; 🚫&lt;/p&gt;

&lt;p&gt;Our sample application is ready! 🎉 Now, let's containerize it and push it to Kubernetes. 🐳☸️&lt;/p&gt;




&lt;h3&gt;
  
  
  Containerize the application 📦
&lt;/h3&gt;

&lt;p&gt;We will be using &lt;strong&gt;Docker&lt;/strong&gt; to containerize our application.&lt;br&gt;
In the root of the project, create a new file named &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Make sure to exactly name it the same. Otherwise, you will need to explicitly pass the &lt;code&gt;-f&lt;/code&gt; flag for specifying the &lt;code&gt;Dockerfile&lt;/code&gt; path.&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Uses node as the base image&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:21-alpine &lt;/span&gt;
&lt;span class="c"&gt;# Sets up our working directory as /app inside the container.&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="c"&gt;# Copyies package json files.&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package.json package-lock.json ./&lt;/span&gt;
&lt;span class="c"&gt;# Installs the dependencies from the package.json&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--production&lt;/span&gt;
&lt;span class="c"&gt;# Copies current directory files into the docker environment&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="c"&gt;# Expose port 3000 as our server uses it.&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;span class="c"&gt;# Finally runs the server.&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "index.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we need to build ⚒️ this container to be able to actually use it and push it to Kubernetes.&lt;/p&gt;

&lt;p&gt;Run this command to build the &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🚨 If you are running it on Windows, make sure to have Docker Desktop running.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;// 👇🏻 We are tagging our image name to express-server
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; express-server &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, it's time to run the container. 🏃🏻‍♂️💨&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -dp 127.0.0.1:3000:3000 express-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 We are running our container in the background with the container port 3000 mapping to our computer port 3000.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once again run the following command and you should see the same result as earlier. ✅&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: This time the application is not running on our computer as before. Instead, it is running inside the container. 🤯&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Deploying in Kubernetes ⚓
&lt;/h3&gt;

&lt;p&gt;As said earlier, we will use Minikube to create an orchestration environment in our local computer and use &lt;code&gt;kubectl&lt;/code&gt; command to interact with Kubernetes. 😄&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start Minikube: 🚀&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;minikube start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since we are going to be using local containers instead of pulling them from the docker hub, run these commands. ✨&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;minikube docker-env&lt;span class="si"&gt;)&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; express-server &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;eval $(minikube docker-env)&lt;/code&gt;: It is used to point your terminal’s &lt;code&gt;docker-cli&lt;/code&gt; to the Docker Engine inside minikube.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🚨 Note, many of us use Fish as our shell, so for fish the corresponding command would be &lt;code&gt;eval (minikube docker-env)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, in the project root, create a nested folder &lt;code&gt;k8/deployment&lt;/code&gt;, and inside the deployment folder, create a new file called &lt;code&gt;deployment.yaml&lt;/code&gt; with the following content.&lt;/p&gt;

&lt;p&gt;In this file, we will manage the deployment of our container. 👇🏻&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 👇🏻 /k8/deployment/deployment.yaml&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;express-deployment&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;express-svr&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;express-svr&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;express-svr&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;express-server&lt;/span&gt;
          &lt;span class="na"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Never&lt;/span&gt; &lt;span class="c1"&gt;# Make sure to set it to Never, or else it will pull from the docker hub and fail.&lt;/span&gt;
          &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;128Mi"&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;500m"&lt;/span&gt;
          &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, run this command to apply the deployment configuration we just created, &lt;code&gt;deployment.yaml&lt;/code&gt;. ✨&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; .&lt;span class="se"&gt;\k&lt;/span&gt;8&lt;span class="se"&gt;\d&lt;/span&gt;eployment&lt;span class="se"&gt;\d&lt;/span&gt;eployment.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, if we take a look at the running pods we can see that the pod has successfully been created. 🎉&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F83ijo09xpd9ccv30h6ug.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F83ijo09xpd9ccv30h6ug.png" alt="running kubernetes pods"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To view the logs of our created pod, run &lt;code&gt;kubectl logs &amp;lt;pod_name&amp;gt;&lt;/code&gt; and we should see the following.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff97aap8qioqsjr45rafw.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff97aap8qioqsjr45rafw.png" alt="logs of the running kubernetes pod"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With this, our &lt;code&gt;express-server&lt;/code&gt; is successfully deployed on a local Kubernetes. 😎&lt;/p&gt;




&lt;p&gt;That is it for this article, we successfully containerized our application and deployed it to Kubernetes.&lt;/p&gt;

&lt;p&gt;The source code for this article can be found here&lt;br&gt;
&lt;a href="https://github.com/keyval-dev/blog/tree/main/js-on-k8s" rel="noopener noreferrer"&gt;https://github.com/keyval-dev/blog/tree/main/js-on-k8s&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you so much for reading! 🎉🫡&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>💨 How to know what's going on in your cloud 🌥️⚡️</title>
      <dc:creator>Eden Federman</dc:creator>
      <pubDate>Mon, 06 Nov 2023 11:51:04 +0000</pubDate>
      <link>https://dev.to/odigos/how-to-know-whats-going-on-in-your-cloud-dn6</link>
      <guid>https://dev.to/odigos/how-to-know-whats-going-on-in-your-cloud-dn6</guid>
      <description>&lt;h1&gt;
  
  
  TL;DR
&lt;/h1&gt;

&lt;p&gt;Today, you will learn about the world of open-source observability. In this guide, I'll be touching:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build a Comprehensive Observability Stack&lt;/strong&gt;: Assemble an end-to-end solution using popular open-source tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Extract and Ship with Ease&lt;/strong&gt;: Learn the ins and outs of handling traces, metrics, and logs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Master Data Correlation&lt;/strong&gt;: Gain expertise in linking various types of observability data for deeper insights.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Utilize a Powerful Backend Stack&lt;/strong&gt;: Implement Grafana, Prometheus, Tempo, and Loki for robust backend management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Control with Confidence&lt;/strong&gt;: Harness the capabilities of Odigos to manage your observability landscape effectively.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4xyrj05ck216l4z23z7.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg4xyrj05ck216l4z23z7.gif" alt="Kitty Cloud"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Odigos - Open-source Distributed Tracing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Monitor all your apps simultaneously without writing a single line of code!&lt;/strong&gt;&lt;br&gt;
Simplify OpenTelemetry complexity with the only platform that can generate distributed tracing across all your applications.&lt;/p&gt;

&lt;p&gt;We are really just starting out.&lt;br&gt;
Can you help us with a star? Plz? 😽&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/keyval-dev/odigos" rel="noopener noreferrer"&gt;https://github.com/keyval-dev/odigos&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/keyval-dev/odigos" rel="noopener noreferrer"&gt;&lt;img src="https://media.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%2Fk6l36g0qcds52ww1do96.png" alt="GiveStar"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Theory
&lt;/h2&gt;

&lt;p&gt;If you are new to observability or just interested in the difference between monitoring and observability, we recommend watching &lt;a href="https://www.youtube.com/watch?v=_OXYCzwFd1Y" rel="noopener noreferrer"&gt;this short video&lt;/a&gt; by the creator of OpenTelemetry.&lt;/p&gt;

&lt;p&gt;In short, distributed traces, metrics, and logs, with the ability to correlate between one signal to another, are the best practices for debugging production issues when working with microservices-based applications.&lt;/p&gt;

&lt;p&gt;This is exactly what we are going to achieve for our demo application.&lt;/p&gt;

&lt;p&gt;There is no need to learn any new technologies in order to implement and enjoy observability. With some basic Kubernetes commands — you are ready to get started.&lt;/p&gt;



&lt;h2&gt;
  
  
  Solution Overview
&lt;/h2&gt;

&lt;p&gt;We are going to deploy 3 different systems on our Kubernetes cluster:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Target application&lt;/strong&gt; — we will use a microservices-based application written in Java and Python. (for example applications with more programming languages and more complex architecture, use the example from the Odigos &lt;a href="https://docs.odigos.io/intro" rel="noopener noreferrer"&gt;getting started guide&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability backend&lt;/strong&gt; — we are going to use the following applications to store and analyze our observability data: - Grafana: for dashboards and visualization of the data - Prometheus: for storage of metrics data - Loki: for storage of logs data - Tempo: for storage of distributed tracing data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability control plane&lt;/strong&gt; — we will use Odigos for automatic instrumentation of our applications (automatic extraction of traces, metrics, and logs), collectors deployment, and configuration.&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj33zgl56okqw4fy3khl8.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj33zgl56okqw4fy3khl8.png" alt="SolutionVerview"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;The following tools are required to run this tutorial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://kind.sigs.k8s.io/" rel="noopener noreferrer"&gt;Kind&lt;/a&gt; to run a local Kubernetes cluster with Docker container nodes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io/docs/tasks/tools/install-kubectl/" rel="noopener noreferrer"&gt;Kubernetes CLI (kubectl)&lt;/a&gt; to run commands against Kubernetes clusters.&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  Creating the Kubernetes cluster
&lt;/h2&gt;

&lt;p&gt;Create a new local Kubernetes cluster, by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;kind create cluster
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installing Target Applications
&lt;/h2&gt;

&lt;p&gt;We will install a fork of &lt;a href="https://github.com/keyval-dev/bank-of-athnos" rel="noopener noreferrer"&gt;bank-of-athnos&lt;/a&gt;, an example of a bank application created by Google.&lt;/p&gt;

&lt;p&gt;We use a modified version without any instrumentation code to demonstrate how Odigos automatically collects observability data from the application.&lt;/p&gt;

&lt;p&gt;Deploy the application using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;kubectl apply -f https://raw.githubusercontent.com/keyval-dev/bank-of-athnos/main/release/kubernetes-manifests.yaml
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installing Observability Backend
&lt;/h2&gt;

&lt;p&gt;As there is currently no one database that can store traces, logs, and metrics, we will deploy three different databases alongside Grafana as a visualization tool.&lt;/p&gt;

&lt;p&gt;The following helm chart deploy Tempo (traces database), Prometheus (metrics database), and Loki (logs database) as well as a preconfigured Grafana instance with those databases as data sources.&lt;/p&gt;

&lt;p&gt;Install odigos CLI by &lt;a href="https://docs.odigos.io" rel="noopener noreferrer"&gt;following this link&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting Everything Together Using Odigos
&lt;/h2&gt;

&lt;p&gt;Now that our test application is running, our observability databases are deployed and ready to receive data, the last piece of the puzzle is to extract and ship logs, metrics, and traces from our applications to the observability databases.&lt;/p&gt;

&lt;p&gt;The simplest and easiest way to do it is by using Odigos - a control plane for observability data. Install Odigos by executing the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;odigos install
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After all the pods in the &lt;code&gt;odigos-system&lt;/code&gt; namespace are running, open the Odigos UI by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;odigos ui
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And navigate to &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; to access the UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Selecting Applications
&lt;/h2&gt;

&lt;p&gt;There are two ways to select which applications Odigos should instrument:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opt out (recommended): Instrument everything, including every new application that will be deployed going forward.
Users can still manually mark applications that should not be instrumented&lt;/li&gt;
&lt;li&gt;Opt In: Only instrument the applications selected manually by the user.&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fipibfuhgm78o4716lofw.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fipibfuhgm78o4716lofw.png" alt="Sources"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this tutorial, we recommend choosing the opt out mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing Destinations
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpfcw2gb8qrsyuxkwloii.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpfcw2gb8qrsyuxkwloii.png" alt="Destinations"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next step is to tell Odigos how to reach the three databases that we deployed earlier.&lt;br&gt;
Add the following three destinations:&lt;/p&gt;
&lt;h3&gt;
  
  
  Tempo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: tempo (you can choose any name you would like)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href="http://observability-tempo.observability" rel="noopener noreferrer"&gt;http://observability-tempo.observability&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Prometheus
&lt;/h3&gt;

&lt;p&gt;In order to add another destination, select Destinations from the sidebar and click Add New Destination&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: prometheus&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href="http://observability-prometheus-server.observability" rel="noopener noreferrer"&gt;http://observability-prometheus-server.observability&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Loki
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: loki&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href="http://observability-loki.observability" rel="noopener noreferrer"&gt;http://observability-loki.observability&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Exploring The Data
&lt;/h2&gt;

&lt;p&gt;Wait a few seconds for Odigos to finish deploying the required collectors and instrument the target applications. You can monitor the progress by running&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;kubectl get pods -w
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait for all the pods to be in &lt;code&gt;Running&lt;/code&gt; state (especially notice the transactionservice application which has a slow startup time).&lt;/p&gt;

&lt;p&gt;The last step is to explore our observability data in Grafana. We can now see and correlate metrics to traces to logs in order to dive deeply into how our application behaves.&lt;/p&gt;

&lt;h3&gt;
  
  
  Connecting to Grafana
&lt;/h3&gt;

&lt;p&gt;Port forward to your Grafana instance by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;kubectl port-forward svc/observability-grafana -n observability 3000:80
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And navigating to &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enter admin as the username&lt;/li&gt;
&lt;li&gt;For the password enter the output of the following command:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;kubectl get secret -n observability observability-grafana -o jsonpath={.data.admin-password} | base64 --decode
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Service Graph
&lt;/h2&gt;

&lt;p&gt;Let’s start by viewing a service graph of our microservices application:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the Explore from the sidebar&lt;/li&gt;
&lt;li&gt;Select Tempo as datasource&lt;/li&gt;
&lt;li&gt;Choose the Service Graph tab&lt;/li&gt;
&lt;li&gt;Run the query&lt;/li&gt;
&lt;/ol&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqesdyand56ymnoaaogfp.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqesdyand56ymnoaaogfp.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Metrics
&lt;/h2&gt;

&lt;p&gt;Now let’s view some metrics. Click on the contacts node from the service graph and choose Request rate&lt;br&gt;
&lt;a href="https://media.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%2F6o6xkfozm5b8cg25n01n.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6o6xkfozm5b8cg25n01n.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A graph similar to the following should be presented:&lt;br&gt;
&lt;a href="https://media.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%2Ft7o3weh3nglcuqkigysq.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7o3weh3nglcuqkigysq.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are many more metrics that Odigos collect and can be queried easily from the Prometheus data source, check out &lt;a href="https://docs.odigos.io/telemetry-types" rel="noopener noreferrer"&gt;this document&lt;/a&gt; for the full list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Traces
&lt;/h2&gt;

&lt;p&gt;Click on the contacts application again in the Service Graph, but this time choose Request Histogram.&lt;/p&gt;

&lt;p&gt;In order to correlate metrics to traces, we will use a feature called exemplars. To show exemplars:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the options menu&lt;/li&gt;
&lt;li&gt;Turn on exemplars&lt;/li&gt;
&lt;li&gt;Notice that the histogram is now added with green diamonds.&lt;/li&gt;
&lt;/ol&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdhbzu0pvxkjomjnk236h.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdhbzu0pvxkjomjnk236h.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hover over one of the added points and click &lt;strong&gt;Query With Tempo&lt;/strong&gt;. A trace similar to the following should be presented:&lt;br&gt;
&lt;a href="https://media.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%2Fab29knfj1bghx9f1f4y3.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fab29knfj1bghx9f1f4y3.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this trace, you can see exactly how much time each part of the entire request took.&lt;/p&gt;

&lt;p&gt;Digging into one of the sections will show additional information such as database queries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Logs
&lt;/h2&gt;

&lt;p&gt;To further investigate specific action you can simply query the relevant logs by pressing on the small document icon.&lt;br&gt;
Press on the document icon next to the balancereader to show the relevant logs:&lt;br&gt;
&lt;a href="https://media.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%2F4k66xzs4mgsvzhmqx745.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4k66xzs4mgsvzhmqx745.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;We have shown how easy it is to extract and ship logs, traces, and metrics using only open-source solutions.&lt;/p&gt;

&lt;p&gt;In addition, we were also able to generate traces, metrics, and logs from an application within minutes.&lt;/p&gt;

&lt;p&gt;We now also have the ability to correlate between the different signals: We correlated metrics to traces and traces to logs. We now have all the needed data to quickly detect and fix production issues in our target applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;Notice that the observability backend that we installed is not suited for production usage.&lt;/p&gt;

&lt;p&gt;For high volumes of data, it is recommended to persist those databases to cloud storage like S3 or use a managed offering.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>⤴️ Top 6 projects for building scalable cloud-based applications 🚀</title>
      <dc:creator>Eden Federman</dc:creator>
      <pubDate>Mon, 30 Oct 2023 14:39:46 +0000</pubDate>
      <link>https://dev.to/odigos/top-5-projects-for-building-scalable-cloud-based-applications-3e38</link>
      <guid>https://dev.to/odigos/top-5-projects-for-building-scalable-cloud-based-applications-3e38</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;This article lists 6 top projects for simplifying the deployment and building scalable cloud-based applications for developers. 🎉&lt;/p&gt;

&lt;p&gt;Feel free to explore these projects, contribute to your favorites, and support them by starring their repositories.🌟&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fncmz12tyxu79tzj5xgfn.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fncmz12tyxu79tzj5xgfn.gif" alt="mylist"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Odigos - Open-source Distributed Tracing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Monitor all your apps simultaneously without writing a single line of code!&lt;/strong&gt;&lt;br&gt;
Simplify OpenTelemetry complexity with the only platform that can generate distributed tracing across all your applications.&lt;/p&gt;

&lt;p&gt;We are really just starting out.&lt;br&gt;
Can you help us with a star? Plz? 😽&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/keyval-dev/odigos" rel="noopener noreferrer"&gt;https://github.com/keyval-dev/odigos&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/keyval-dev/odigos" rel="noopener noreferrer"&gt;&lt;img src="https://media.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%2Fk6l36g0qcds52ww1do96.png" alt="GiveStar"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;1. &lt;a href="https://opentelemetry.io/" rel="noopener noreferrer"&gt;OpenTelemetry&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Collect telemetry data and forward it to analysis tools.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhjnuu0w2fgeiwyadtjz3.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhjnuu0w2fgeiwyadtjz3.png" alt="OpenTelemetry"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OpenTelemetry is an observability toolkit that helps us collect data like &lt;strong&gt;traces&lt;/strong&gt;, &lt;strong&gt;metrics&lt;/strong&gt;, and &lt;strong&gt;logs&lt;/strong&gt;. It is vendor and tool-neutral 🛠️ meaning it can work with different Observability Backends.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What OpenTelemetry is not? 🫣&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;OpenTelemetry is not a monitoring backend. Many people confuse themselves between OpenTelemetry and Observability backends like &lt;strong&gt;Jaegar&lt;/strong&gt;, &lt;strong&gt;Datadog&lt;/strong&gt;, etc. OpenTelemetry only generates, collects, and exports telemetry data. Storage and visualization are left to other tools. 📊&lt;/p&gt;

&lt;p&gt;OpenTelemetry sits between the code and the observability tools we use. This provides us with flexibility and makes it easier to switch tools. 🔄&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To better understand how &lt;em&gt;OTel&lt;/em&gt; (short for OpenTelemetry) works,  take a look at the below image. 👇🏻&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbkupgifpjknk8nxsf1up.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbkupgifpjknk8nxsf1up.png" alt="Working of OpenTelemetry"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/open-telemetry" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;🌟 OpenTelemetry on GitHub&lt;/a&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. &lt;a href="https://kubernetes.io/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Container orchestration platform for managing applications.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8u6iwfpujvhrd10lt2r.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8u6iwfpujvhrd10lt2r.png" alt="Kubernetes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kubernetes is the most important repo on the list when we are talking about cloud-native applications. How, can we skip Kubernetes right? 😜 It is the most famous orchestration platform for container-based applications and a foundation for many cloud-native tools to work.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What is Container Orchestration, and why do we even need it? 🤔&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A container engine is sufficient for managing a few containers, but for hundreds or thousands of containers and hundreds of services running, the complexity grows huge 📈. Trust me, it is something I have had experience with. 🥲&lt;/p&gt;

&lt;p&gt;This is where the orchestration engine like &lt;strong&gt;Kubernetes&lt;/strong&gt; comes into play.&lt;/p&gt;

&lt;p&gt;The best way I think of Kubernetes is as a &lt;strong&gt;puppet master&lt;/strong&gt; 🎭 for containers, manipulating their actions, coordinating their tasks, and ensuring they work in harmony across a cluster of servers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Refer to the image below to get a better understanding of what I meant by puppet master.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs0jmccrhedqwia8f3f2m.jpg" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs0jmccrhedqwia8f3f2m.jpg" alt="Working of Kubernetes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kubernetes/kubernetes" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;🌟 Kubernetes on GitHub&lt;/a&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. &lt;a href="https://backstage.io/" rel="noopener noreferrer"&gt;Backstage&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Unifies tools for a streamlined development environment.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpszeeza08pnx1xlmtxe.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpszeeza08pnx1xlmtxe.png" alt="Backstage Dev Portal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Backstage is an open-source project that serves as a developer portal, offering a unified view of infrastructure resources, CI/CD pipelines, and observability metrics. 📊 It gives us all the building blocks to create a platform ourselves that manages our complex software development ecosystem.&lt;/p&gt;

&lt;p&gt;It provides us with easy access to essential information without requiring in-depth tool knowledge 🧰, acting as a central hub 🏛️ for company-wide development needs.&lt;/p&gt;

&lt;p&gt;The core functionalities of Backstage are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service Catalog 📋:&lt;/strong&gt; This is the core Backstage &lt;strong&gt;foundation&lt;/strong&gt;. It allows us to track and manage all our services, apps, and pipelines in one place.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Software Templates 📄:&lt;/strong&gt; With the Backstage UI interface, we can easily create new services with just a few clicks or use a &lt;strong&gt;YAML&lt;/strong&gt; template to add necessary resources.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tech Documentations 📃:&lt;/strong&gt; It adds seamless technical documentation management, ensuring teams can effortlessly keep content up-to-date, all from their code repositories.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;In short, this abstracts away a lot of &lt;strong&gt;CI/CD&lt;/strong&gt; and provides us with information on the company's services. 🚀 I would say this is a &lt;strong&gt;must-have&lt;/strong&gt; tool for any company that is planning to upscale and streamline their development operations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/backstage/backstage" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;🌟 Backstage on GitHub&lt;/a&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4. &lt;a href="https://prometheus.io/" rel="noopener noreferrer"&gt;Prometheus&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 System monitoring tool with time-series data.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6wsdw0itsb8ymn62b67.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6wsdw0itsb8ymn62b67.png" alt="Prometheus Monitoring Tool"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Prometheus is a free open-source software application used for event monitoring and alerting. 🧐 It records real-time metrics in a time series database (allows querying the data using its own query language called &lt;strong&gt;PromQL&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;It also provides an alerting system that allows us to define thresholds and conditions for alerts.&lt;/p&gt;

&lt;p&gt;When certain metrics exceed or fall below defined thresholds, Prometheus can trigger notifications, helping in successfully addressing potential issues before they impact the system's health.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In short, Prometheus helps keep a close watch 👀 on our infrastructure's health and performance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/prometheus/prometheus" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;🌟 Prometheus on GitHub&lt;/a&gt;
&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;🔴 GOOD TO KNOW:&lt;/strong&gt; Notice that I've mentioned two similar projects, &lt;em&gt;OpenTelemetry&lt;/em&gt; and &lt;em&gt;Prometheus&lt;/em&gt;, which serve similar purposes. 🔄&lt;/p&gt;

&lt;p&gt;Prometheus is primarily a system-level monitoring and alerting tool, while OpenTelemetry is focused on collecting and forwarding application-level telemetry data.&lt;/p&gt;

&lt;p&gt;Prometheus didn't initially support OpenTelemetry metrics, but now they can work together.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For more details, you can refer to this &lt;a href="https://horovits.medium.com/prometheus-now-supports-opentelemetry-metrics-83f85878e46a" rel="noopener noreferrer"&gt;article&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;5. &lt;a href="https://cilium.io/" rel="noopener noreferrer"&gt;Cilium&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Efficient eBPF-based networking for containers.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvark5crabe1rtv4scbj.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvark5crabe1rtv4scbj.png" alt="Cilium"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cilium is a free and open-source software solution that provides networking and security 🛡️ for containerized applications.&lt;/p&gt;

&lt;p&gt;Cilium leverages eBPF to provide high-performance networking and security and has been designed to integrate with container orchestration platforms like &lt;strong&gt;Kubernetes&lt;/strong&gt;. ☸️&lt;/p&gt;

&lt;p&gt;One important feature of Cilium is its ability to apply security rules at the network level, also allows us to encrypt and authenticate network traffic, making sure that data is transmitted securely between containers. 🐋&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In short, Cilium secures container workloads in &lt;strong&gt;Kubernetes&lt;/strong&gt; with eBPF, offering network security, encryption, and authentication.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To better understand how Cilium works at its architectural level, take a look at the below image. 👇🏻&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forj4pimzs73lb3kqcoxs.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forj4pimzs73lb3kqcoxs.png" alt="Cilium Architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/cilium/cilium" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;🌟 Cilium on GitHub&lt;/a&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  6. &lt;strong&gt;&lt;a href="https://https://rook.io/" rel="noopener noreferrer"&gt;Rook&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Simplifies cloud-native persistent storage management.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fisvy9wcqkgeziptxmzva.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fisvy9wcqkgeziptxmzva.png" alt="Rook.io persistent storage management"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This tool really is a lifesaver for anyone who is working with the Ceph storage. 😍&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To understand and implement Rook, you must have a basic understanding of &lt;strong&gt;Ceph&lt;/strong&gt; software-defined storage. If not, let me briefly introduce Ceph.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What exactly is Ceph? 🧐&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ceph is an open-source software storage platform that provides object storage, block storage, and file system storage in a single unified storage cluster. 📦&lt;/p&gt;

&lt;p&gt;Rook simplifies the deployment and management of Ceph storage systems on Kubernetes. &lt;/p&gt;

&lt;p&gt;By deploying Rook on Kubernetes, we can make Ceph storage highly available, automated 🤖, and simple to operate at scale.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In short, Rook turns Ceph into a fully managed service for Kubernetes and abstracts away the complexity of Ceph, making it easy to set up and manage cloud-native storage for our containers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/rook/rook" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;🌟 Rook on GitHub&lt;/a&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Introducing &lt;a href="https://github.com/keyval-dev/odigos" rel="noopener noreferrer"&gt;&lt;strong&gt;Odigos&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;💡Distributed tracing without code changes.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qeln9ptv8ftdrxc086c.jpeg" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qeln9ptv8ftdrxc086c.jpeg" alt="keyval-dev banner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are working with OpenTelemetry then this is the tool you need. ✨&lt;/p&gt;

&lt;p&gt;Odigos automatically generates telemetry data in OpenTelemetry format to any Observability backend, without any code change. 😲&lt;/p&gt;

&lt;p&gt;It achieves this all by the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automated Instrumentation 🤖:&lt;/strong&gt; Odigos enables automated instrumentation of applications with OpenTelemetry and eBPF, eliminating the need for code modifications.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Universal Observability Tool Compatibility 🤝:&lt;/strong&gt; It smoothly integrates with various observability tools, providing comprehensive support and efficient collector management.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ease of installation ✨:&lt;/strong&gt; Odigos excels in user-friendliness, seamlessly integrating OpenTelemetry, ensuring easy installation and adaptability to specific requirements with minimal hurdles.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;We've recently published an article on implementing Odigos. Read &lt;a href="https://dev.to/odigos/how-to-monitor-your-requests-between-multiple-applications-4fi8"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;If you think of any other helpful projects that I haven't covered in this article, please share them in the comments section below. 👇🏻&lt;/p&gt;

&lt;p&gt;So, that is it for this article.&lt;/p&gt;

&lt;p&gt;Thank you so much for reading! 🎉🫡&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>🔥 Top 6 monitoring tools to become a better developer 🤯 🤯</title>
      <dc:creator>Eden Federman</dc:creator>
      <pubDate>Mon, 23 Oct 2023 11:35:41 +0000</pubDate>
      <link>https://dev.to/odigos/top-6-monitoring-tools-to-become-a-better-developer-4j4k</link>
      <guid>https://dev.to/odigos/top-6-monitoring-tools-to-become-a-better-developer-4j4k</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Monitoring can be complex, especially given the number of available tools and the dynamic nature of environments.&lt;/p&gt;

&lt;p&gt;In this article, I compare the most popular monitoring tools to help you choose the right one for your specific needs.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ub2lutjy59vxh4qhohe.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ub2lutjy59vxh4qhohe.gif" alt="Monitor"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Odigos - Open-source Distributed Tracing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Monitor all your apps simultaneously without writing a single line of code!&lt;/strong&gt;&lt;br&gt;
Simplify OpenTelemetry complexity with the only platform that can generate distributed tracing across all your applications.&lt;/p&gt;

&lt;p&gt;We are really just starting out.&lt;br&gt;
Can you help us with a star? Plz? 😽&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/keyval-dev/odigos" rel="noopener noreferrer"&gt;https://github.com/keyval-dev/odigos&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/keyval-dev/odigos" rel="noopener noreferrer"&gt;&lt;img src="https://media.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%2Fk6l36g0qcds52ww1do96.png" alt="GiveStar"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;With the growing need for scalable applications, Kubernetes emerged as the standard for managing containerized workloads and services.&lt;/p&gt;

&lt;p&gt;It makes deploying and running applications on distributed instances easy, but monitoring the infrastructure can be challenging.&lt;/p&gt;

&lt;p&gt;Kubernetes monitoring is the practice of tracking and observing the performance, health, and behavior of your applications and the infrastructure providing them.&lt;/p&gt;

&lt;p&gt;It involves collecting and analyzing traces, metrics, and logs to help you detect and troubleshoot issues, and even optimize your clusters for better resource management.&lt;/p&gt;

&lt;p&gt;But being such a complex environment, various tools have arisen to address this issue.&lt;/p&gt;

&lt;p&gt;Here we’ll explore some of the main solutions and hopefully help you choose according to your needs.&lt;/p&gt;



&lt;h3&gt;
  
  
  Key metrics to monitor
&lt;/h3&gt;

&lt;p&gt;First, let’s divide our metrics into two groups:&lt;/p&gt;

&lt;h3&gt;
  
  
  Resource Utilization
&lt;/h3&gt;

&lt;p&gt;These include CPU, memory, and disk usage at the cluster, node, pod, and container levels, and help you make decisions about decreasing or increasing the size of your cluster. It is also important to monitor your cluster with more general metrics such as node availability and health.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cluster&lt;/strong&gt; is a set of nodes that run containerized applications. It is the highest level of abstraction in Kubernetes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node&lt;/strong&gt; is a physical or virtual machine that is part of your cluster. It can be a virtual machine in the cloud, for instance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pod&lt;/strong&gt; is a group of one or more containers that share storage and network resources. It is the smallest deployable unit in Kubernetes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container&lt;/strong&gt; is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3&gt;
  
  
  Application Performance
&lt;/h3&gt;

&lt;p&gt;These will depend on the type of your application and business.&lt;/p&gt;

&lt;p&gt;For example, an API will provide metrics like response time, request latencies, error rates and throughput.&lt;/p&gt;

&lt;p&gt;With that in mind, let’s get to know some of the solutions we can use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Kubernetes Dashboard
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/kubernetes/dashboard" rel="noopener noreferrer"&gt;https://github.com/kubernetes/dashboard&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgumk5qc1ypzhs7k2ni58.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgumk5qc1ypzhs7k2ni58.png" alt="Kubernetes Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Kubernetes Dashboard is a web-based user interface made for monitoring and managing Kubernetes clusters. You can access essential information such as CPU and memory utilization, deploy and manage applications running in the pods, and change the amount of resources in the cluster.&lt;/p&gt;

&lt;p&gt;It gives you a basic overview of your cluster and it makes it easy to execute some actions, while it is maintained by the Kubernetes community.&lt;/p&gt;

&lt;p&gt;But being that simple also means it doesn’t have many options for visualizations, and it also does not have advanced resource metrics.&lt;/p&gt;



&lt;h3&gt;
  
  
  cAdvisor
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/google/cadvisor" rel="noopener noreferrer"&gt;https://github.com/google/cadvisor&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjcexmrskpdl0xrh7xttm.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjcexmrskpdl0xrh7xttm.png" alt="Advisor"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;cAdvisor is an open-source tool developed to monitor containers, and since Kubernetes is a container orchestrator, we can use it too. It can help you collect, process, and export container metrics such as CPU and memory usage. By default, it exists on every Kubernetes node, and it can even expose Prometheus metrics. It is one of the more basic Kubernetes-native monitoring tools.&lt;/p&gt;

&lt;p&gt;It is built into Kubernetes and is easy to use, but it is also basic and has limited functionality. It is usually used together with Prometheus and Grafana.&lt;/p&gt;



&lt;h3&gt;
  
  
  Prometheus
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://prometheus.io/" rel="noopener noreferrer"&gt;https://prometheus.io/&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffi0f27qrw4hpo9wch1ej.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffi0f27qrw4hpo9wch1ej.png" alt="Prometheus"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prometheus&lt;/strong&gt; is the leading solution for open-source monitoring, widely recognized as the primary standard for monitoring Kubernetes. It is a fundamental component of the Cloud Native Computing Foundation (CNCF).&lt;/p&gt;

&lt;p&gt;Prometheus consists of three main components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Server&lt;/strong&gt;: This component is responsible for managing and storing the metrics collected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alert Manager&lt;/strong&gt;: It handles alerting and notification functionalities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exporters&lt;/strong&gt;: Exporters are in charge of generating and exporting metrics.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exporters gather metrics from various sources, and the server stores them in a database for analysis and visualization.&lt;/p&gt;

&lt;p&gt;Prometheus offers several noteworthy features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An intuitive query-based system.&lt;/li&gt;
&lt;li&gt;Built-in alerting capabilities.&lt;/li&gt;
&lt;li&gt;A thriving and extensive community for support.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One thing to note is that Prometheus lacks a built-in visualization interface. Therefore, it is common to complement Prometheus with a tool like &lt;strong&gt;Grafana&lt;/strong&gt;, which is another open-source project. Grafana not only offers pre-built dashboards for Kubernetes but also enables users to create custom visualizations to suit their specific needs.&lt;/p&gt;



&lt;h3&gt;
  
  
  ELK stack (and OpenSearch)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.elastic.co/pt/elastic-stack" rel="noopener noreferrer"&gt;https://www.elastic.co/pt/elastic-stack&lt;/a&gt;&lt;br&gt;
&lt;a href="https://opensearch.org/" rel="noopener noreferrer"&gt;https://opensearch.org/&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6g21729aqio4n12eefqc.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6g21729aqio4n12eefqc.png" alt="ELK Stack"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;ELK stack&lt;/strong&gt; used to be an open-source monitoring solution for Kubernetes, but Elastic decided to close it with proprietary licenses.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ELK&lt;/strong&gt; stands for:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ElasticSearch&lt;/strong&gt;: A database engine for storing and searching data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logstash&lt;/strong&gt;: Captures and processes logs, then sends them to ElasticSearch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kibana&lt;/strong&gt;: A data visualization tool.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;In response to Elastic's decision, AWS forked ElasticSearch and Kibana to create &lt;strong&gt;OpenSearch&lt;/strong&gt; and &lt;strong&gt;OpenSearch Dashboard&lt;/strong&gt;. As of now, they remain relatively similar to their ELK counterparts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages&lt;/strong&gt; of choosing the open-source option:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It includes some security and analysis features that are paid in the ELK stack.&lt;/li&gt;
&lt;li&gt;Both ELK and OpenSearch have strong communities.&lt;/li&gt;
&lt;li&gt;They are easy to deploy and use with Kubernetes and offer rich analysis capabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, there are &lt;strong&gt;disadvantages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They can be challenging to maintain at scale.&lt;/li&gt;
&lt;li&gt;Often paired with &lt;strong&gt;Apache Kafka&lt;/strong&gt; for buffering data with large volumes.&lt;/li&gt;
&lt;li&gt;While the closed source ELK has a free tier, payment is required for some features.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3&gt;
  
  
  Datadog
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.datadoghq.com/" rel="noopener noreferrer"&gt;https://www.datadoghq.com/&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8r9n53ypb6davjo9i4ib.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8r9n53ypb6davjo9i4ib.png" alt="Datadog"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Datadog: When exploring beyond open-source options, Datadog emerges as a comprehensive full-stack monitoring solution.&lt;/p&gt;

&lt;p&gt;Key Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;End-to-End Monitoring&lt;/strong&gt;: Datadog offers robust infrastructure, security, and application monitoring features, covering the entire spectrum of your systems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Insights&lt;/strong&gt;: You can monitor requests, traces, logs, and correlate these diverse data sets to derive valuable insights.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resource Metrics&lt;/strong&gt;: Datadog provides detailed metrics on resource utilization.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Coverage&lt;/strong&gt;: Once configured, Datadog efficiently gathers data from across your architecture, offering a holistic view of your systems.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it also has its disadvantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complex Initial Setup&lt;/strong&gt;: Please note that the initial setup may be somewhat intricate, requiring configuration file adjustments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Budget Considerations&lt;/strong&gt;: Keep in mind that while this broad data collection is beneficial, it can be expensive and should be managed prudently to avoid unnecessary expenses.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;h3&gt;
  
  
  Dynatrace
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.dynatrace.com/" rel="noopener noreferrer"&gt;https://www.dynatrace.com/&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fswxgw427xuo58v136pl4.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fswxgw427xuo58v136pl4.png" alt="Dynatrace"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dynatrace is a comprehensive, &lt;strong&gt;paid full-stack monitoring solution&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;It excels in monitoring the availability and health of your Kubernetes clusters while enabling unified monitoring across a wide array of tools, including services in &lt;strong&gt;AWS&lt;/strong&gt; and &lt;strong&gt;Google Cloud&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The platform is known for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user-friendly setup&lt;/li&gt;
&lt;li&gt;highly effective for tracking metrics in complex, distributed systems. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, it comes with a notable investment requirement.&lt;/p&gt;

&lt;p&gt;For those who prefer not to handle monitoring setup and infrastructure management, Dynatrace offers a compelling option. &lt;/p&gt;

&lt;p&gt;It's often chosen over &lt;strong&gt;Datadog&lt;/strong&gt; when the focus is primarily on application monitoring rather than monitoring infrastructure resource usage.&lt;br&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Odigos
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://odigos.io" rel="noopener noreferrer"&gt;https://odigos.io&lt;/a&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmac6oi5nsb6py9qi8z9.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmac6oi5nsb6py9qi8z9.png" alt="Odigos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/keyval-dev/odigos" rel="noopener noreferrer"&gt;Odigos&lt;/a&gt; is an open-source platform that generates distributed traces, metrics, and logs instantly, without code changes. &lt;/p&gt;

&lt;p&gt;It focuses on the automatic instrumentation and collection of the telemetry data from all your applications and &lt;strong&gt;works alongside traditional monitoring solutions&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;It’s great for beginners who want to instrument their applications quickly, without touching their code.  &lt;/p&gt;

&lt;p&gt;It’s also great if you are unhappy or stuck with your current monitoring solution and want to try other options. &lt;/p&gt;

&lt;p&gt;Just install Odigos, and it will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatically &lt;strong&gt;instrument&lt;/strong&gt; all of your applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collect and manage&lt;/strong&gt; the telemetry data, and &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send&lt;/strong&gt; it to the monitoring vendor of your choice. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Instantly&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;It supports all the major open-source and managed solutions and is &lt;strong&gt;very easy to install and implement&lt;/strong&gt;.&lt;/p&gt;



&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;With so many Kubernetes monitoring solutions available, it can be difficult to choose the right one for your needs. Now that you have a basic understanding of the different options available, you can start to narrow down your choices and choose the solution that best meets your specific requirements.&lt;/p&gt;

&lt;p&gt;The main factors to consider when choosing a Kubernetes monitoring solution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt;: What features are most important to you&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost&lt;/strong&gt;: Open source (typically free to use) vs paid solutions (can be expensive).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ease of use&lt;/strong&gt;: Some solutions are easier to set up and use than others.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Can the solution scale to meet your needs as your cluster grows?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kubernetes</category>
      <category>monitoring</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to monitor your requests between multiple applications... 🤔</title>
      <dc:creator>Eden Federman</dc:creator>
      <pubDate>Mon, 16 Oct 2023 11:20:53 +0000</pubDate>
      <link>https://dev.to/odigos/how-to-monitor-your-requests-between-multiple-applications-4fi8</link>
      <guid>https://dev.to/odigos/how-to-monitor-your-requests-between-multiple-applications-4fi8</guid>
      <description>&lt;h1&gt;
  
  
  TL;DR
&lt;/h1&gt;

&lt;p&gt;Imagine that you are sending an HTTP request from one app; this one sends it to another app that sends it to another app. &lt;strong&gt;What if something happens along the way?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need to mark all the requests to pinpoint where the problem occurred.&lt;/p&gt;

&lt;p&gt;In this tutorial, you'll learn how to use OpenTelemetry to monitor your applications with insights into performance, tracing, and metrics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You will learn:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to monitor our application using OpenTelemetry.&lt;/li&gt;
&lt;li&gt;How to view logs and ship traces.&lt;/li&gt;
&lt;li&gt;How to view Metrics and filter the traces.&lt;/li&gt;
&lt;li&gt;How to automate the monitoring of applications.&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F83qk71hrarm24iis4477.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F83qk71hrarm24iis4477.gif" alt="Logged"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Odigos - Open-source Distributed Tracing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Monitor all your apps simultaneously without writing a single line of code!&lt;/strong&gt;&lt;br&gt;
Simplify OpenTelemetry complexity with the only platform that can generate distributed tracing across all your applications.&lt;/p&gt;

&lt;p&gt;We are really just starting out.&lt;br&gt;
Can you help us with a star? Plz? 😽&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/keyval-dev/odigos" rel="noopener noreferrer"&gt;https://github.com/keyval-dev/odigos&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/keyval-dev/odigos" rel="noopener noreferrer"&gt;&lt;img src="https://media.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%2Fk6l36g0qcds52ww1do96.png" alt="GiveStar"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Let's set it up🔥
&lt;/h2&gt;

&lt;p&gt;Here, I'll walk you through installing the package dependencies required for this project.&lt;/p&gt;

&lt;p&gt;Create your project folder for the web application as done below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;monitor-app
&lt;span class="nb"&gt;cd &lt;/span&gt;monitor-app
&lt;span class="nb"&gt;mkdir &lt;/span&gt;server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setting up the Node.js server 🤖
&lt;/h3&gt;

&lt;p&gt;Navigate into the server folder and create a &lt;code&gt;package.json&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;server &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install Express.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;express
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://expressjs.com" rel="noopener noreferrer"&gt;ExpressJS&lt;/a&gt; is a back-end web application framework for building RESTful APIs with Node.js.&lt;/p&gt;

&lt;p&gt;Create an &lt;code&gt;index.js&lt;/code&gt; file - the entry point to our web server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;// 👇server/index.js
&lt;span class="nb"&gt;touch &lt;/span&gt;index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set up a Node.js server using Express. The code snippet below returns a JSON object with one key when we do a &lt;code&gt;get&lt;/code&gt; request to &lt;code&gt;/static-data&lt;/code&gt; or &lt;code&gt;/fetch-data&lt;/code&gt; endpoint in our browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt; &lt;span class="c1"&gt;// 👇server/index.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlencoded&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;extended&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/static-data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello world!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/fetch-data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Simulate a real-world database call&lt;/span&gt;
  &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello world!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`The server is listening on port: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡TIP OF THE DAY&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Since the node version &lt;a href="https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V18.md#18.11.0" rel="noopener noreferrer"&gt;v18.11.0&lt;/a&gt; we no longer need &lt;strong&gt;nodemon&lt;/strong&gt; to watch for changes and restart the server, it is now built into Node with &lt;code&gt;--watch&lt;/code&gt; flag.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Configure &lt;code&gt;node --watch&lt;/code&gt; by adding the &lt;code&gt;start&lt;/code&gt; &amp;amp; &lt;code&gt;trace-start&lt;/code&gt; command to the list of scripts in the &lt;code&gt;package.json&lt;/code&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;👇server/package.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Error: no test specified&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &amp;amp;&amp;amp; exit 1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node --watch index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trace-start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node -r ./tracing.js --watch index.js"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;start&lt;/code&gt;: The code snippet starts the web server.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;trace-start&lt;/code&gt;: This code snippet starts the web server while preloading the &lt;code&gt;tracing.js&lt;/code&gt; file. We will be using this command for demonstration.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Manually Setting up OpenTelemetry and SigNoz ⚒️
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://opentelemetry.io/" rel="noopener noreferrer"&gt;OpenTelemetry&lt;/a&gt; is used to instrument, generate, collect, and export telemetry data. &lt;a href="https://signoz.io/" rel="noopener noreferrer"&gt;SigNoz&lt;/a&gt; is an open-source APM. It helps developers monitor their applications &amp;amp; troubleshoot problems, an open-source alternative to other APMs available. It is a one-stop solution to get access to metrics, logs, and traces of an application.&lt;/p&gt;

&lt;p&gt;We'll start by installing the required OpenTelemetry packages.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ If you are running this on Windows, run each of these commands individually.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;opentelemetry&lt;/span&gt;&lt;span class="sr"&gt;/sdk-node &lt;/span&gt;&lt;span class="err"&gt;\
&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;opentelemetry&lt;/span&gt;&lt;span class="sr"&gt;/auto-instrumentations-node &lt;/span&gt;&lt;span class="err"&gt;\
&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;opentelemetry&lt;/span&gt;&lt;span class="sr"&gt;/exporter-trace-otlp-htt&lt;/span&gt;&lt;span class="err"&gt;p
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;For &lt;strong&gt;SigNoz&lt;/strong&gt; installation, follow the installation steps shown &lt;a href="https://signoz.io/docs/install/docker/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instantiate tracing by creating a &lt;code&gt;tracing.js&lt;/code&gt; file and using the below code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;    &lt;span class="c1"&gt;// 👇server/tracing.js&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;use strict&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;process&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;opentelemetry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@opentelemetry/sdk-node&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;getNodeAutoInstrumentations&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@opentelemetry/auto-instrumentations-node&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;OTLPTraceExporter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@opentelemetry/exporter-trace-otlp-http&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Resource&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@opentelemetry/resources&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;SemanticResourceAttributes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@opentelemetry/semantic-conventions&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;exporterOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:4318/v1/traces&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// default URL for sending tracing data.&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;traceExporter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OTLPTraceExporter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;exporterOptions&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sdk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;opentelemetry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;NodeSDK&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;traceExporter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;instrumentations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;getNodeAutoInstrumentations&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
  &lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Resource&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;SemanticResourceAttributes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SERVICE_NAME&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Monitor-Node-App&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// initialize the SDK and register with the OpenTelemetry API&lt;/span&gt;
&lt;span class="nx"&gt;sdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// shut down the SDK on process exit&lt;/span&gt;
&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SIGTERM&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;sdk&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shutdown&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tracing terminated!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error terminating tracing.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are monitoring our Node application using the Node SDK &lt;code&gt;@opentelemetry/sdk-node&lt;/code&gt; for tracing and metrics, &lt;code&gt;@opentelemetry/auto-instrumentations-node&lt;/code&gt; for easy setup of instrumentations, and &lt;code&gt;@opentelemetry/exporter-trace-otlp-http&lt;/code&gt; for exporting trace data to OTLP-compatible receivers via HTTP and JSON.&lt;/p&gt;

&lt;p&gt;We are done with the basic instrumentation of our demo Node application with OpenTelemetry and SigNoz 🥂. Now, run the &lt;code&gt;trace-start&lt;/code&gt; command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run trace-start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit the SigNoz UI &lt;code&gt;http://localhost:3301&lt;/code&gt;. We should be presented with something like this after we log in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dURJPqvv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/povsb2fu2o91b9vnk0pr.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--dURJPqvv--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpovsb2fu2o91b9vnk0pr.png" alt="SigNoz Default UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don't worry about all this data; it is pre-populated by SigNoz. Note that we do not see our &lt;code&gt;Monitor-Node-App&lt;/code&gt; in the list of services. This is because we have not made requests to our server.&lt;/p&gt;

&lt;p&gt;For SigNoz to show the traces, we need to generate some load on our server. For this, we can refresh endpoints multiple times on our browser or run the following CLI command on our endpoints &lt;code&gt;/static-data&lt;/code&gt; or &lt;code&gt;/fetch-data&lt;/code&gt; to automatically do that for us.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Linux Users&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ Make sure to have &lt;code&gt;curl&lt;/code&gt; installed.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;1..20&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do &lt;/span&gt;curl http://localhost:8000/fetch-data&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For Windows Users&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;1..20 | ForEach-Object &lt;span class="o"&gt;{&lt;/span&gt; Invoke-RestMethod &lt;span class="nt"&gt;-Uri&lt;/span&gt; &lt;span class="s1"&gt;'http://localhost:8000/fetch-data'&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, on visiting the SigNoz UI once again we should see our service in the list of services.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y5epQymO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7v2ngcoljg6hesyk7ay8.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--Y5epQymO--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7v2ngcoljg6hesyk7ay8.png" alt="SigNoz UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this trace, we can exactly see how much time each part of the entire request took. In our case not many, since the request is fairly simple.&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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--SVb4S3KZ--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_66%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04r9njmy6nhibvf74by5.gif" 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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--SVb4S3KZ--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_66%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F04r9njmy6nhibvf74by5.gif" alt="Walkthrough of SigNoz"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For proper visualization, we will take a look at the request from one of the demo applications already provided with SigNoz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0TnWMHz9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jwv52ab669987cf2010y.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--0TnWMHz9--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwv52ab669987cf2010y.png" alt="SigNoz request Explain"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we can clearly see, the first request which basically executes SQL Query goes through multiple steps, and, at last, it finally executes the SQL query. We can also see the time taken for each span in the request.&lt;/p&gt;

&lt;p&gt;SigNoz's Traces dashboard offers ready-made visualizations for our tracing data. It includes strong filters to analyze the spans based on our selected criteria and chosen time frame.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--McleVa5N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mnnz52nrpizob32xgin8.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--McleVa5N--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmnnz52nrpizob32xgin8.png" alt="SigNoz Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Visualize Metrics from Hostmetrics 👀
&lt;/h3&gt;

&lt;p&gt;The most common way to accept metrics in SigNoz is through the Prometheus receiver.&lt;/p&gt;

&lt;p&gt;For simplicity, I will demonstrate how to Visualize default metrics provided by Hostmetrics that is by default enabled on SigNoz installation.&lt;/p&gt;

&lt;p&gt;All the list of available metrics can be found &lt;a href="https://signoz.io/docs/userguide/send-metrics/#metrics-from-hostmetrics-receiver" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Under the &lt;strong&gt;Dashboards&lt;/strong&gt; section in the SigNoz UI, create a new &lt;strong&gt;Time Series&lt;/strong&gt; panel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---y48FmWI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xicj026at6x6lg1opr6q.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs---y48FmWI--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxicj026at6x6lg1opr6q.png" alt="SigNoz metric dashboard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the PromQL query input, please enter the following: For example, let's use the metric &lt;code&gt;system_cpu_load_average_5m&lt;/code&gt;, as the name suggests it gives the 5-minute load average of the CPU. Feel free to adjust the metric to your preference.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P7YRBYxJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j36cnp3jyr7usfeop4a4.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--P7YRBYxJ--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj36cnp3jyr7usfeop4a4.png" alt="Metric Graph"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Automatically connect with Odigos 🤝
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://odigos.io/" rel="noopener noreferrer"&gt;Odigos&lt;/a&gt; is an open-source observability control plane that enables organizations to create and maintain their observability pipeline.&lt;/p&gt;

&lt;p&gt;Remember all the hassle we went through when manually setting up? With Odigos, there's no need for that. It automatically instruments our application, eliminating the need to set up OpenTelemetry or anything on our own. Odigos handles it all for us. 🤯&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Instructions on how to install &lt;strong&gt;Odigos&lt;/strong&gt; can be found &lt;a href="https://docs.odigos.io/installation" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We need to install SigNoz on Kubernetes so that OpenTelemetry can send the collected data to it.&lt;/p&gt;

&lt;p&gt;SigNoz can be installed on Kubernetes easily using Helm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm repo add signoz https://charts.signoz.io
kubectl create ns platform
helm &lt;span class="nt"&gt;--namespace&lt;/span&gt; platform &lt;span class="nb"&gt;install &lt;/span&gt;my-release signoz/signoz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To port forward SigNoz UI on our local machine, run the following.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;POD_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;kubectl get pods &lt;span class="nt"&gt;--namespace&lt;/span&gt; platform &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="s2"&gt;"app.kubernetes.io/name=signoz,app.kuber
    netes.io/instance=my-release,app.kubernetes.io/component=frontend"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"{.items[0].metadata.name}"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

kubectl &lt;span class="nt"&gt;--namespace&lt;/span&gt; platform port-forward &lt;span class="nv"&gt;$POD_NAME&lt;/span&gt; 3301:3301
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can access the SigNoz UI on &lt;code&gt;http://localhost:3301&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;For the demonstration, we will use another e-commerce application from Google to get a bigger picture of distributed tracing. The repo does not contain any instrumentation or monitoring setup.&lt;/p&gt;

&lt;p&gt;Create a clone of this repository &lt;a href="https://github.com/keyval-dev/microservices-demo" rel="noopener noreferrer"&gt;microservices-demo&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/keyval-dev/microservices-demo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a new local Kubernetes cluster, by running the following command. We will need it when setting up Odigos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ For Windows Users, make sure to have Docker Desktop running.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;minikube start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Instructions on how to install &lt;strong&gt;minikube&lt;/strong&gt; can be found &lt;a href="https://minikube.sigs.k8s.io/docs/start/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Deploy the cloned application with the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/keyval-dev/microservices-demo/master/release/kubernetes-manifests.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start the Odigos UI with the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./odigos ui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit the Odigos UI on &lt;code&gt;localhost:3000&lt;/code&gt;. Select all the microservices in the namespace as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4dwc5YIr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/edq4qcopcm408wqgxrho.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--4dwc5YIr--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedq4qcopcm408wqgxrho.png" alt="Odigos UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After selecting all the applications we will be asked for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Destination Name&lt;/strong&gt;: A name for our destination.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Host Endpoint&lt;/strong&gt;: Use the host endpoint for SigNoz.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After doing this, we should now be prompted with the following UI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nPq37bOX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cowug72v6xzxayw2oi3i.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--nPq37bOX--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcowug72v6xzxayw2oi3i.png" alt="Odigos UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations🎉! The Odigos setup has been successful. Now, it should automatically send traces, metrics, and logs to our observability backend.&lt;/p&gt;

&lt;p&gt;Now, to see that in practice, we need to first set up the external IP for our &lt;code&gt;frontend-external&lt;/code&gt; LoadBalancer service.&lt;/p&gt;

&lt;p&gt;Running the &lt;code&gt;kubectl get services&lt;/code&gt; command should show the following. Notice the &lt;code&gt;&amp;lt;pending&amp;gt;&lt;/code&gt; IP for the &lt;code&gt;external-frontend&lt;/code&gt; service.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qebdJ9TO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7khodfb93czrl360a8mk.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--qebdJ9TO--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7khodfb93czrl360a8mk.png" alt="Kubernetes Services"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By default, it is not possible to access &lt;code&gt;LoadBalancer&lt;/code&gt; service on the browser. For this, we need to set up &lt;code&gt;minikube tunnel&lt;/code&gt;. For more info on this command visit &lt;a href="https://minikube.sigs.k8s.io/docs/commands/tunnel/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;minikube tunnel
kubectl get services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we can see the IP and port assigned to the &lt;code&gt;external-frontend&lt;/code&gt; service.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k19sdDJ5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lmstfmq5cu418n9hbh11.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--k19sdDJ5--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flmstfmq5cu418n9hbh11.png" alt="Kubernetes Services Tunnel Image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visit &lt;code&gt;http://127.0.0.1:8081&lt;/code&gt; on the browser to access the application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qIwqSoqV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/osqhlyq3pahhwb195ps0.png" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--qIwqSoqV--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_800%2Fhttps%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fosqhlyq3pahhwb195ps0.png" alt="Google e-commerce application"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run the SigNoz service and execute the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl port-forward &lt;span class="nt"&gt;-n&lt;/span&gt; tracing svc/&amp;lt;service_name&amp;gt; &amp;lt;port_to_use&amp;gt;:&amp;lt;port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we should be able to view all the traces of our application as we did previously.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrap Up! 📝
&lt;/h2&gt;

&lt;p&gt;So far, we've learned how to closely monitor our app's performance with traces and Hostmetrics, first manually using OpenTelemetry and SigNoz, and then automating the process with Odigos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: We are not limited to using SigNoz; we can use any observability database out there. Just for the sake of this article, I have chosen to use SigNoz.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is always a good idea to have a monitoring system for any production-level application. This will help us debug errors if any arise in the future. Most importantly, it will help us identify any performance bottlenecks in our application, resulting in enhanced efficiency and user experience.&lt;/p&gt;

&lt;p&gt;The source code for this tutorial is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/keyval-dev/blog/tree/main/instrumenting-node-app" rel="noopener noreferrer"&gt;https://github.com/keyval-dev/blog/tree/main/instrumenting-node-app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for reading! 🎉&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
