<?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: Mohamed Raslan</title>
    <description>The latest articles on DEV Community by Mohamed Raslan (@mohamed_raslan_80b1f09ca0).</description>
    <link>https://dev.to/mohamed_raslan_80b1f09ca0</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%2F3771201%2F259760e2-db26-4dda-a5f7-fc58619a2a95.jpg</url>
      <title>DEV Community: Mohamed Raslan</title>
      <link>https://dev.to/mohamed_raslan_80b1f09ca0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mohamed_raslan_80b1f09ca0"/>
    <language>en</language>
    <item>
      <title>NestJS Profiler 🚀⚡️</title>
      <dc:creator>Mohamed Raslan</dc:creator>
      <pubDate>Fri, 13 Feb 2026 15:14:43 +0000</pubDate>
      <link>https://dev.to/mohamed_raslan_80b1f09ca0/nestjs-profiler-1254</link>
      <guid>https://dev.to/mohamed_raslan_80b1f09ca0/nestjs-profiler-1254</guid>
      <description>&lt;p&gt;Stop flying blind in your 𝐍𝐞𝐬𝐭𝐉𝐒 apps! 🚀&lt;/p&gt;

&lt;p&gt;One thing I always missed from the 𝐋𝐚𝐫𝐚𝐯𝐞𝐥/𝐒𝐲𝐦𝐟𝐨𝐧𝐲 world was the Web Profiler. &lt;/p&gt;

&lt;p&gt;Being able to see every database query, request duration, and cache hit in real-time is a game-changer for debugging. 🪛 &lt;/p&gt;

&lt;p&gt;I couldn't find a perfect equivalent for NestJS... 𝒔𝒐 𝑰 𝒃𝒖𝒊𝒍𝒕 𝒊𝒕. 🚀&lt;/p&gt;

&lt;p&gt;Introducing 𝐧𝐞𝐬𝐭𝐣𝐬-𝐩𝐫𝐨𝐟𝐢𝐥𝐞𝐫 — a lightweight, web-based dashboard for your NestJS backend.&lt;/p&gt;

&lt;p&gt;✅ Inspect HTTP request with hell of details about it.&lt;br&gt;
✅ Track executed DB queries with analyze (PostgreSQL, MySQL, MongoDB).&lt;br&gt;
✅ Monitor cache operations.&lt;br&gt;
✅ Listing all the entities.&lt;br&gt;
✅ Listing all available routes.&lt;br&gt;
✅ Listing all logs from the terminal.&lt;br&gt;
✅ Web UI built right into your app.&lt;/p&gt;
&lt;h2&gt;
  
  
  Installation
&lt;/h2&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;nestjs-profiler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Peer Dependencies (Optional)
&lt;/h2&gt;

&lt;p&gt;Install the dependencies relevant to your project:&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;# For PostgreSQL&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;pg

&lt;span class="c"&gt;# For MongoDB&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;mongodb

&lt;span class="c"&gt;# For MySQL&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;mysql2

&lt;span class="c"&gt;# For Cache Profiling&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; @nestjs/cache-manager cache-manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configuration
&lt;/h2&gt;

&lt;p&gt;Import &lt;code&gt;ProfilerModule&lt;/code&gt; in your root &lt;code&gt;AppModule&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Module&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ProfilerModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nestjs-profiler&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="nd"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;ProfilerModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forRoot&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="c1"&gt;// Global enable/disable (default: true)&lt;/span&gt;
      &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

      &lt;span class="c1"&gt;// PostgreSQL Profiling&lt;/span&gt;
      &lt;span class="na"&gt;collectQueries&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="na"&gt;explain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;enabled&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="na"&gt;thresholdMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Only explain queries taking &amp;gt; 50ms&lt;/span&gt;
        &lt;span class="na"&gt;analyze&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// If true, runs EXPLAIN ANALYZE (execution!)&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="c1"&gt;// Add pgDriver&lt;/span&gt;
      &lt;span class="na"&gt;pgDriver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

      &lt;span class="c1"&gt;// Add mysql2 driver for MySQL profiling&lt;/span&gt;
      &lt;span class="na"&gt;mysqlDriver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;mysql2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

      &lt;span class="c1"&gt;// Add mongodb driver for MongoDB profiling&lt;/span&gt;
      &lt;span class="na"&gt;mongoDriver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;mongodb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

      &lt;span class="c1"&gt;// MongoDB Profiling (default: true)&lt;/span&gt;
      &lt;span class="na"&gt;collectMongo&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="c1"&gt;// MySQL Profiling (default: true)&lt;/span&gt;
      &lt;span class="na"&gt;collectMysql&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="c1"&gt;// Cache Profiling (default: true)&lt;/span&gt;
      &lt;span class="na"&gt;collectCache&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="c1"&gt;// Log Profiling (default: true)&lt;/span&gt;
      &lt;span class="na"&gt;collectLogs&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="c1"&gt;// Storage backend (default: InMemory)&lt;/span&gt;
      &lt;span class="c1"&gt;// You can implement custom storage by passing an object implementing ProfilerStorage&lt;/span&gt;
      &lt;span class="na"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;memory&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="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Initialize Explorers (Optional but Recommended)
&lt;/h3&gt;

&lt;p&gt;To enable the &lt;strong&gt;Entity Explorer&lt;/strong&gt; and &lt;strong&gt;Route Explorer&lt;/strong&gt; features in the dashboard, initialize the profiler in your &lt;code&gt;main.ts&lt;/code&gt; file right after creating the application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// main.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NestFactory&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AppModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ProfilerModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nestjs-profiler&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&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="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;NestFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AppModule&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Initialize Profiler Explorers&lt;/span&gt;
  &lt;span class="nx"&gt;ProfilerModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialize&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="k"&gt;await&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="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Accessing the Dashboard
&lt;/h3&gt;

&lt;p&gt;Once configured, start your application. The profiler automatically intercepts requests and queries.&lt;/p&gt;

&lt;p&gt;Navigate to &lt;code&gt;http://localhost:3000/__profiler&lt;/code&gt; (or your app's port).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. JSON API
&lt;/h3&gt;

&lt;p&gt;You can also retrieve profile data programmatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /__profiler/json&lt;/code&gt; - List recent requests&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /__profiler/:id/json&lt;/code&gt; - Get details for a specific request&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  NOTE: IMPORTANT
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The profiler is designed for development and debugging. &lt;strong&gt;Do not enable in production&lt;/strong&gt; due to performance overhead and potential security risks.&lt;/li&gt;
&lt;li&gt;If you have a prefix for your API routes (e.g., &lt;code&gt;/api&lt;/code&gt;), you have to adjust the global prefix like this:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;  &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setGlobalPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;api&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="na"&gt;exclude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;__profiler/(.*)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RequestMethod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ALL&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;I'd love to hear your feedback! What's the one feature you wish NestJS had out of the box?&lt;/p&gt;

&lt;p&gt;Npm package link: &lt;a href="https://www.npmjs.com/package/nestjs-profiler" rel="noopener noreferrer"&gt;nestjs-profiler&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/MohammedRaslan/Nest-JS-Profiler" rel="noopener noreferrer"&gt;NestJS-Profiler-Repo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nestjs</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
