<?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: Akash Goyal</title>
    <description>The latest articles on DEV Community by Akash Goyal (@akash_goyal).</description>
    <link>https://dev.to/akash_goyal</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4035678%2F8d61e23d-d268-4115-b5ca-7e0c452f4742.jpg</url>
      <title>DEV Community: Akash Goyal</title>
      <link>https://dev.to/akash_goyal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/akash_goyal"/>
    <language>en</language>
    <item>
      <title>Why I Built PaperFlakes (And How Zerops Saved the Stack)</title>
      <dc:creator>Akash Goyal</dc:creator>
      <pubDate>Sun, 09 Aug 2026 18:22:38 +0000</pubDate>
      <link>https://dev.to/akash_goyal/why-i-built-paperflakes-and-how-zerops-saved-the-stack-2ki7</link>
      <guid>https://dev.to/akash_goyal/why-i-built-paperflakes-and-how-zerops-saved-the-stack-2ki7</guid>
      <description>&lt;p&gt;Late one night while preparing slides for an upcoming talk, I ran three dense research papers through a standard OCR tool.&lt;/p&gt;

&lt;p&gt;The OCR worked, but left me with 40 pages of raw, unformatted text. The real problem wasn't extracting the text; it was finding the insight buried inside it.&lt;/p&gt;

&lt;p&gt;I wanted something that could turn dense PDFs into small, visual insights - &lt;strong&gt;bite-sized cards ready for slides, developer notes, or Twitter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That was the spark for &lt;strong&gt;PaperFlakes&lt;/strong&gt;.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;PaperFlakes takes PDFs - pick from a curated list of classic ML papers or upload your own - OCRs them, and turns the extracted text into shareable "sticky note" insight cards across four categories, which you can filter, download as images, or share straight to X /Twitter.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Features for Users
&lt;/h2&gt;

&lt;p&gt;I set out to build a platform that turns dense academic reading into a fast, visual experience:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Batch Processing:&lt;/strong&gt; Drop up to 25 multi-page PDFs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Progress:&lt;/strong&gt; Watch live updates as the engine parses document queues, tracking statuses, page counts, and extracted word tallies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Did You Know?" Fact Cards:&lt;/strong&gt; Color-coded visual cards highlighting key facts, formulas, and takeaways.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Export &amp;amp; Sharing:&lt;/strong&gt; Download cards or share them straight to social media.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/5ra5lgwRpeQ"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  How to use it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://app-2c11-8000.prg1.zerops.app/" rel="noopener noreferrer"&gt;live app&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Check one or more papers under "Try it on papers" and &lt;strong&gt;click Process batch&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Watch the Processing status table update as each document is OCR'd.&lt;/li&gt;
&lt;li&gt;Insight cards appear in the Insights panel as soon as each category finishes — &lt;strong&gt;no need to wait for the whole batch&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use the &lt;em&gt;category chips and paper dropdown&lt;/em&gt; above the panel to filter what's shown.&lt;/li&gt;
&lt;li&gt;On any card: &lt;strong&gt;Save downloads it as a PNG&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;On any card: 𝕏 Share opens a pre-filled tweet. &lt;/li&gt;
&lt;li&gt;Download all (top right) exports every currently-visible card as one combined image. &lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;The UI view:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5gv5890v04jmu46xbbd8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5gv5890v04jmu46xbbd8.png" alt="The product view" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The social media share view:&lt;/strong&gt; &lt;a href="https://x.com/akashgoyal95/status/2086510334790303979?s=20" rel="noopener noreferrer"&gt;Link to generated tweet&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl6pj5ryjpiotkago4yub.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl6pj5ryjpiotkago4yub.png" alt="Share card on X" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Product Walkthrough :
&lt;/h2&gt;

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

&lt;p&gt;The application follows a simple &lt;strong&gt;three-stage flow&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upload &amp;amp; Queue (left)&lt;/strong&gt; - Users select multiple PDFs or upload their own documents and start a batch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process &amp;amp; Track (center)&lt;/strong&gt; - Each document is processed asynchronously, with its status, page count, and processing details visible in real time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate Insights (right)&lt;/strong&gt; - As soon as a document finishes processing, AI-generated facts and insights appear as shareable &lt;strong&gt;sticky-note cards&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Engineering &amp;amp; Zerops ZCP
&lt;/h2&gt;

&lt;p&gt;Behind the UI, the backend handles the pipeline:&lt;br&gt;
&lt;strong&gt;PDF ingestion → metadata storage → chunking &amp;amp; OCR → AI-powered insight extraction → result storage → fact-card generation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This keeps the user experience simple while the heavy document processing happens asynchronously in the backend.&lt;/p&gt;

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

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

&lt;p&gt;The zerops.yaml is &lt;a href="https://github.com/akashgoyal/paperflakes-zerops/blob/main/zerops.yaml" rel="noopener noreferrer"&gt;shared here&lt;/a&gt; .&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When a user submits a batch, the Express API registers the job inside &lt;strong&gt;PostgreSQL with a queued status&lt;/strong&gt; and returns an instant job token to the &lt;strong&gt;React UI&lt;/strong&gt;. As workers process pages through &lt;strong&gt;Gemma (Together AI) asynchronously&lt;/strong&gt;, the database updates in real time, and the UI streams progress smoothly without dropping connections.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  This whole project is heavily reliant on Zerops infra &amp;amp; built using the ZCP.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Runtime service&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managed PostgreSQL&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public HTTPS&lt;/strong&gt; — zerops.app subdomain after deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secrets&lt;/strong&gt; — TOGETHER_API_KEY is stored as a Zerops service secret.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Health checks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git-based deployment&lt;/strong&gt; — deploys the latest commit to Zerops using zcli.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ZCP with Claude Code&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Running your own copy
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The repository is self-contained:&lt;/strong&gt; zerops.yaml defines the deployment configuration, while migrate.py initializes the database schema idempotently on each deploy.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a Zerops project&lt;/strong&gt; with a Python runtime service and a PostgreSQL service named db.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a Together AI API key&lt;/strong&gt; and add it as the TOGETHER_API_KEY secret on the runtime service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configure ZEROPS_TOKEN and ZEROPS_SERVICE_ID&lt;/strong&gt; as GitHub repository secrets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push to main&lt;/strong&gt;. The included GitHub Actions workflow builds and deploys the application automatically.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can also deploy manually using zcli push or the Zerops MCP tools.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;You can see the zerops-services in action &amp;amp; associated cost with them (left-bottom)&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqhr4syhnca39997w2uml.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqhr4syhnca39997w2uml.png" alt=" " width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;By offloading setup headaches to Zerops, I was able to go from an initial draft idea to a production-ready, multi-service application in a single hackathon build window.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo Video :&lt;/strong&gt; &lt;a href="https://youtu.be/5ra5lgwRpeQ" rel="noopener noreferrer"&gt;https://youtu.be/5ra5lgwRpeQ&lt;/a&gt; &lt;br&gt;
&lt;strong&gt;Github :&lt;/strong&gt; &lt;a href="https://github.com/akashgoyal/paperflakes-zerops" rel="noopener noreferrer"&gt;https://github.com/akashgoyal/paperflakes-zerops&lt;/a&gt; &lt;br&gt;
&lt;strong&gt;Live App :&lt;/strong&gt; &lt;a href="https://app-2c11-8000.prg1.zerops.app/" rel="noopener noreferrer"&gt;https://app-2c11-8000.prg1.zerops.app/&lt;/a&gt; &lt;br&gt;
&lt;strong&gt;Built For :&lt;/strong&gt; &lt;a href="https://www.wemakedevs.org/hackathons/zerops" rel="noopener noreferrer"&gt;https://www.wemakedevs.org/hackathons/zerops&lt;/a&gt; &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Written by :&lt;/strong&gt; Akash Goyal&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Sentinel MCP Signoz (Agents of Signoz)</title>
      <dc:creator>Akash Goyal</dc:creator>
      <pubDate>Sun, 26 Jul 2026 17:40:36 +0000</pubDate>
      <link>https://dev.to/akash_goyal/sentinel-mcp-signoz-25nf</link>
      <guid>https://dev.to/akash_goyal/sentinel-mcp-signoz-25nf</guid>
      <description>&lt;p&gt;I participated in 'Agents of Signoz' hacakthon with Ashish Agrawal.&lt;br&gt;
We built an impactful project using the Signoz ecosystem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Signoz Alert based - Agentic system - with Unified Observability Dashboard
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Project features :
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Agentic application with SRE Agent, Data Quality Agent.&lt;/li&gt;
&lt;li&gt;SREAgent would trigger on Alert (from log/trace/metric) via webhook.&lt;/li&gt;
&lt;li&gt;Data Quality Agent would run at certain durations once the Data ingestion is complete.&lt;/li&gt;
&lt;li&gt;Each Agents make use MCP tools from signoz-mcp-server &amp;amp; tools&lt;/li&gt;
&lt;li&gt;Signoz Dashboard customized for unified experience - &lt;strong&gt;for Agent, App, mcp-tools &amp;amp; APM metrics&lt;/strong&gt; - using Query Builder&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hackathon :&lt;/strong&gt; &lt;a href="https://www.wemakedevs.org/hackathons/signoz" rel="noopener noreferrer"&gt;https://www.wemakedevs.org/hackathons/signoz&lt;/a&gt; &lt;br&gt;
&lt;strong&gt;Github :&lt;/strong&gt; &lt;a href="https://github.com/akashgoyal/sentinel-mcp-signoz" rel="noopener noreferrer"&gt;https://github.com/akashgoyal/sentinel-mcp-signoz&lt;/a&gt; &lt;br&gt;
&lt;strong&gt;Hackathon Project PPT :&lt;/strong&gt; &lt;a href="https://docs.google.com/presentation/d/1ECSsDfM-7LE-z0lPU4y3F6BGCXiJrOl_uem43iVTJC8/edit?slide=id.g3f5b372df0a_0_749#slide=id.g3f5b372df0a_0_749" rel="noopener noreferrer"&gt;LINK&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Youtube Video :&lt;/strong&gt; &lt;a href="https://youtu.be/OIFl7tt6IVY" rel="noopener noreferrer"&gt;Demo Link&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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




&lt;p&gt;This blog will hand hold you through the project - in understanding it's whereabout, reasoning behind features, and finally practicals.&lt;br&gt;
Kepe reading to know below : &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;About the Project&lt;/li&gt;
&lt;li&gt;Tech Stack &amp;amp; architecture&lt;/li&gt;
&lt;li&gt;How to setup on your local &amp;amp; run demo &lt;/li&gt;
&lt;li&gt;Learning &amp;amp; Growth&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Create User application - which will use OTel
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Langgraph based application with [Ingestion → Analyser → Extractor → Refiner] Nodes. All using qwen2.5-coder:1.5b model from ollama.&lt;/li&gt;
&lt;li&gt;Application Flow chart : &lt;/li&gt;
&lt;/ol&gt;

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

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




&lt;h2&gt;
  
  
  Create SRE Agent &amp;amp; Data Quality Agent - using signoz-mcp-server
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SRE Agent :
&lt;/h3&gt;

&lt;p&gt;SRE Agent (powered by gemini-3.6-flash) takes over without human intervention. Features : &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Performs RCA on application &amp;amp; setup errors &lt;/li&gt;
&lt;li&gt;Triggered on Signoz-Alert for RCA.&lt;/li&gt;
&lt;li&gt;Analyzes the application traces, logs, metrics&lt;/li&gt;
&lt;li&gt;Identify the Root Cause of the problem &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Design Diagram : &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzcvfocj5r5qbz40fmumh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzcvfocj5r5qbz40fmumh.png" alt="SRE Agent" width="799" height="517"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Data Quality Agent :
&lt;/h3&gt;

&lt;p&gt;Data Quality Agent (powered by openai-4o) takes over without human intervention. Features : &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Triggered on Signoz-Alert when ingestion process completes.&lt;/li&gt;
&lt;li&gt;Analyzes the application traces and logs - from Signoz Storage.&lt;/li&gt;
&lt;li&gt;Generates an analysis focused on Compliance Governance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Design Diagram : &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkkg77rf0u968ar3tz7mx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkkg77rf0u968ar3tz7mx.png" alt="Data Quality Agent" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;h3&gt;
  
  
  Unified Observability Dashboard
&lt;/h3&gt;

&lt;p&gt;Single monitoring panel for all project components. Features : &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Metrics related to &amp;gt;10 signoz-mcp-server tool calls . &lt;/li&gt;
&lt;li&gt;Langgraph based user app metrics (custom metrics)&lt;/li&gt;
&lt;li&gt;SRE Agent related metrics&lt;/li&gt;
&lt;li&gt;APM Metrics&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Tools Used : &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Default Signoz Dashboard Templates.&lt;/li&gt;
&lt;li&gt;Query Builder - Drag &amp;amp; Drop, query builder.&lt;/li&gt;
&lt;/ol&gt;

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




&lt;h2&gt;
  
  
  PRACTICALS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Setup on your machine locally :
&lt;/h3&gt;

&lt;p&gt;Refer the github repo shared in first section of this blog.&lt;/p&gt;

&lt;h4&gt;
  
  
  Infra Setup
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Setup Signoz via foundry. Enable MCP. Follow this guide.&lt;/li&gt;
&lt;li&gt;Create user-account in Docker&lt;/li&gt;
&lt;li&gt;Create a service-account&lt;/li&gt;
&lt;li&gt;Create Signoz-API-Key in service account&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  User + Agents Application Setup
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;An agentic app using instrumented packages which could generate telemetry data &lt;/li&gt;
&lt;li&gt;Enable Traces, Logs, metrics in app&lt;/li&gt;
&lt;li&gt;Exporters configured to Signoz OTel Collector&lt;/li&gt;
&lt;li&gt;Scripts to generate data - for both Success, Failure scenarios&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Signoz Viewers
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Check Trace Viewers &lt;/li&gt;
&lt;li&gt;Check Log Viewers &lt;/li&gt;
&lt;li&gt;Check Metric Viewers&lt;/li&gt;
&lt;li&gt;Create Metric dashboard and use Signoz Query Builder to adjust metric widgets queries, with service-name, metric name or trace-field name&lt;/li&gt;
&lt;li&gt;Setup a webhook notification channel&lt;/li&gt;
&lt;li&gt;Configure Alerts (using query builder)&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Execution Outputs :
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;User Application Run&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7e3lw01swr0noy0cql01.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7e3lw01swr0noy0cql01.png" alt="User Application Run" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Errors generated in Signoz&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb93yk415w0ucrrbxvj14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb93yk415w0ucrrbxvj14.png" alt="Errors generated in Signoz" width="799" height="449"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alert triggered in Signoz&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkncag78vllynapn6ckxn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkncag78vllynapn6ckxn.png" alt="Alert triggered in Signoz" width="799" height="449"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Webhook server start &amp;amp; request received&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fapohdw5g8pug7lp8lgxm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fapohdw5g8pug7lp8lgxm.png" alt="Webhook server logs" width="799" height="448"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SRE Agent in Action - MCP tool call (fetch logs)&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbxzlwiq8isb3b93tljxa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbxzlwiq8isb3b93tljxa.png" alt="SREAgent-log-fetch" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SRE Agent in Action - MCP tool call (fetch traces) &amp;amp; OUTPUT &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2xekgn4vewdgbutxa3di.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2xekgn4vewdgbutxa3di.png" alt="SREAgent-trace-fetch" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unified Observability Dashboard for - APM + User App + Agent App + MCP Tools metrics&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7qhpclf9p9k7skc1qm2r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7qhpclf9p9k7skc1qm2r.png" alt="unified-observability-dashboard" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Impact of Project
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Built an AI-powered observability solution leveraging the Signoz ecosystem.&lt;/li&gt;
&lt;li&gt;Minutes instead of hours for initial incident triage using AI agents.&lt;/li&gt;
&lt;li&gt;Single-click investigation across Signoz Logs, Metrics, Traces, and Query Builder.&lt;/li&gt;
&lt;li&gt;Automated root cause analysis and data quality validation using Signoz MCP Tools.&lt;/li&gt;
&lt;li&gt;Showcased the potential to significantly reduce manual debugging effort.&lt;/li&gt;
&lt;li&gt;Dashboard view in one place has customer - Easy visuals for Business stakeholders&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Learning &amp;amp; Growth
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Gained hands-on experience with Signoz, OpenTelemetry, and Signoz MCP.&lt;/li&gt;
&lt;li&gt;Learned to integrate Logs, Metrics, Traces, Query Builder, Dashboards, and Alerts into AI workflows.&lt;/li&gt;
&lt;li&gt;Strengthened skills in AI agents, observability, and event-driven system design.&lt;/li&gt;
&lt;li&gt;Improved rapid prototyping and solution building in a hackathon environment.&lt;/li&gt;
&lt;li&gt;MCP tools eased the Agentic Development &lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;Github Repo : &lt;a href="https://github.com/akashgoyal/sentinel-mcp-signoz" rel="noopener noreferrer"&gt;https://github.com/akashgoyal/sentinel-mcp-signoz&lt;/a&gt; &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User Application &lt;/li&gt;
&lt;li&gt;MCP based Agents &lt;/li&gt;
&lt;li&gt;Programmatic Webhook Server &lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Disclaimer :
&lt;/h2&gt;

&lt;p&gt;AI-tools were used in : &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Writing Code &lt;/li&gt;
&lt;li&gt;Debugging issues &lt;/li&gt;
&lt;li&gt;Refining system design diagrams &lt;/li&gt;
&lt;li&gt;Getting clarity on doubtful concepts
AI Tools - Gemini, CoPilot, AntiGravity&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Presenting with Thanks
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/akashgoyal7/" rel="noopener noreferrer"&gt;Akash Goyal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/ashish-agrawal-6b889915/" rel="noopener noreferrer"&gt;Ashish Agrawal&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Custom Metrics Dashboard for GenAI apps with SigNoz and OpenTelemetry</title>
      <dc:creator>Akash Goyal</dc:creator>
      <pubDate>Sat, 18 Jul 2026 22:55:40 +0000</pubDate>
      <link>https://dev.to/akash_goyal/custom-metrics-dashboard-for-genai-apps-with-signoz-and-opentelemetry-1lg</link>
      <guid>https://dev.to/akash_goyal/custom-metrics-dashboard-for-genai-apps-with-signoz-and-opentelemetry-1lg</guid>
      <description>&lt;p&gt;SigNoz supports lot of features and has a lot of documentations around those features. It has a full section dedicated to LLM observability across different service providers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But, this blog is a bit different. Instead of relying on out-of-the-box vendor presets, it shows you how to create a completely custom dashboard tailored for your specific GenAI/agentic application as per your needs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Just tracking generic infrastructure metrics like CPU and memory utilization isn't enough. To understand how your AI features are truly performing, you need specialize application-level telemetry.&lt;/p&gt;

&lt;p&gt;All the code discussed in this post is available in the &lt;a href="https://www.google.com/search?q=https://github.com/akashgoyal/custom-metrics-dashboard-signoz" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Signoz supports both Trace Data and Metrics Data - for setting metric widget queries. This feature is really helpful in scaling the existing instrumented codebases &amp;amp; has uniqueness.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Part 1: Setting Up SigNoz Locally (Self-Hosted Docker)
&lt;/h2&gt;

&lt;p&gt;Referred &lt;a href="https://signoz.io/docs/install/docker/" rel="noopener noreferrer"&gt;Signoz Doc Section&lt;/a&gt; for setting this up.&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="c"&gt;### Step 1: Install Foundry&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://signoz.io/foundry.sh | bash

&lt;span class="c"&gt;### Step 2: Create `casting.yaml`&lt;/span&gt;
vi casting.yaml  &lt;span class="c"&gt;#add below&lt;/span&gt;
&lt;span class="s2"&gt;"""
apiVersion: v1alpha1
kind: Installation
metadata:
  name: signoz
spec:
  deployment:
    flavor: compose
    mode: docker
"""&lt;/span&gt;

&lt;span class="c"&gt;### Step 3: Deploy SigNoz - spin up your local SigNoz infrastructure:&lt;/span&gt;
foundryctl cast &lt;span class="nt"&gt;-f&lt;/span&gt; casting.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 2: Application Architecture &amp;amp; Quick Start
&lt;/h2&gt;

&lt;p&gt;I designed a minimal llm-inference based workflow application, with two language models, to work on this topic.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Application Architecture Block
&lt;/h3&gt;

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

&lt;p&gt;&lt;strong&gt;Explanation of the diagram:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Traffic Flow:&lt;/strong&gt; The LLM Client actively invokes endpoints on the LLM Server to run inference tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telemetry Collection:&lt;/strong&gt; Both the client and the server generate performance data during these interactions. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Export:&lt;/strong&gt; The gathered telemetry is continuously pushed out via a Metrics periodic export routine utilizing OpenTelemetry standard components (OTLP Span Exporter and OTLP Metric Exporter).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage and Visualization:&lt;/strong&gt; The exported data flows directly into SigNoz, where it is permanently stored in a ClickHouse DB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability:&lt;/strong&gt; Finally, developers can monitor the application using the integrated Trace Viewer and Dashboards.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  2. Getting Started with App
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Clone the &lt;a href="https://github.com/akashgoyal/custom-metrics-dashboard-signoz" rel="noopener noreferrer"&gt;repo from github&lt;/a&gt;&lt;/strong&gt;. Then, follow these steps to initialize the environment and launch your components:&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="c"&gt;# 1. Setup local virtual environment&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 2. Ensure metric computation logic is added.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;CODE - &lt;a href="https://github.com/akashgoyal/custom-metrics-dashboard-signoz/blob/main/metric_record.py" rel="noopener noreferrer"&gt;custom metrics&lt;/a&gt; relevant to the application.&lt;/li&gt;
&lt;li&gt;CODE - Setting &lt;a href="https://github.com/akashgoyal/custom-metrics-dashboard-signoz/blob/main/llm_server.py#L78-L101" rel="noopener noreferrer"&gt;span attrs &amp;amp; record metrics&lt;/a&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fas5o0c5cffvox0ffmif8.png" alt="Recording metrics &amp;amp; setting Span attributes" width="800" height="328"&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 3. Spin up the LLM Server container &lt;/span&gt;
&lt;span class="c"&gt;# Create your docker-compose.yaml file first, then run:&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; llm-server 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fozvtywtlhx8mx0r1awi6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fozvtywtlhx8mx0r1awi6.png" alt="llm-server is up" width="800" height="387"&gt;&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;&lt;span class="c"&gt;# 4. Configure local environment and run client loops sequentially&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;httpx opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp 
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:4317"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OTEL_RESOURCE_ATTRIBUTES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"service.name=llm-client-service"&lt;/span&gt;
python llm_client.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 3: Visualising the Traces
&lt;/h2&gt;

&lt;h3&gt;
  
  
  A look at the traces :
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Success Client requests - Trace View:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb43yhvygz62ca8iei5f7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb43yhvygz62ca8iei5f7.png" alt="Success Client Requests Trace" width="799" height="336"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If the infra capacity is limited, after some requests, time-out errors might start surfacing. (Nothing to worry, just restart the llm-server from docker app). Related traces examples below:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Requests getting Timed Out one after other. (Server was hung)&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fflhlz2eilmglgf8159jh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fflhlz2eilmglgf8159jh.png" alt="Requests getting Timed Out" width="798" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Errored Request Trace (server was not up by that time)&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnqravl2b8j1925tzxz1h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnqravl2b8j1925tzxz1h.png" alt="Trace of Errored Request" width="800" height="269"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 4: Custom Metrics Dashboard in SigNoz
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Creating the Custom Dashboard - Below are &lt;u&gt;the steps I followed in order&lt;/u&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Implemented the &lt;a href="https://github.com/akashgoyal/custom-metrics-dashboard-signoz/blob/main/metric_record.py" rel="noopener noreferrer"&gt;custom metrics&lt;/a&gt; relevant to the application.&lt;/li&gt;
&lt;li&gt;Added relevant attributes in &lt;a href="https://github.com/akashgoyal/custom-metrics-dashboard-signoz/blob/main/llm_server.py#L78-L101" rel="noopener noreferrer"&gt;spans &amp;amp; record metrics&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Referred one of the template dashboards in &lt;a href="https://signoz.io/docs/dashboards/dashboard-templates/overview/" rel="noopener noreferrer"&gt;Signoz Dashboard Page&lt;/a&gt;. Took the &lt;u&gt;&lt;a href="https://signoz.io/docs/dashboards/dashboard-templates/agno-dashboard/" rel="noopener noreferrer"&gt;Agno Dashboard&lt;/a&gt; as Base&lt;/u&gt; to build upon.&lt;/li&gt;
&lt;li&gt;Took the code for 'Error rate' metric widget. Created new metric widgets, in sync with the &lt;em&gt;metric_record.py&lt;/em&gt; logic.&lt;/li&gt;
&lt;li&gt;Modified the queries of existing widgets in Base Json.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;For any further edits&lt;/strong&gt; &lt;em&gt;(metric-name, widget-type, etc.)&lt;/em&gt;, I used the &lt;strong&gt;&lt;a href="https://signoz.io/docs/userguide/query-builder-v5/" rel="noopener noreferrer"&gt;SigNoz's native Query Builder&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb71jgx8kolloivq6xeia.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb71jgx8kolloivq6xeia.png" alt="Update Metric Widget in DB Builder" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dashboard JSON used for this experiment is shared in &lt;a href="https://github.com/akashgoyal/custom-metrics-dashboard-signoz/blob/main/custom-metrics-dashboard.json" rel="noopener noreferrer"&gt;the repo file&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it appears in SigNoz:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Signoz Default Metrics Section :&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs1b4bvze8kov69y69enj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs1b4bvze8kov69y69enj.png" alt="Signoz Default metrics section view" width="800" height="676"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your Custom Metrics dashboard - data rendered using both span params &amp;amp; metrics :&lt;/strong&gt;&lt;/p&gt;

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




&lt;h2&gt;
  
  
  Conclusion &amp;amp; Impact: An insight into custom dashboards with Signoz
&lt;/h2&gt;

&lt;p&gt;These are my findings on how &lt;strong&gt;Signoz supports custom metrics dashboards&lt;/strong&gt;, and what changes are needed or good to have while working on such requirements. &lt;/p&gt;

&lt;p&gt;Signoz supports both Trace Data and Metrics Data - for setting metric widget queries. This feature is really helpful in scaling the existing instrumented codebases &amp;amp; has uniqueness.&lt;/p&gt;

&lt;p&gt;I hope this content would help readers enhance their knowledge.&lt;/p&gt;

&lt;p&gt;Ready to get started? Clone the experimental code from &lt;a href="https://github.com/akashgoyal/custom-metrics-dashboard-signoz/tree/main" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt; and spin it up in your local developer environment!&lt;/p&gt;

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