<?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: mamoor123</title>
    <description>The latest articles on DEV Community by mamoor123 (@mamoor123).</description>
    <link>https://dev.to/mamoor123</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%2F3862196%2Fc352af61-07ef-4ca6-ab20-cfffbbfc18de.jpeg</url>
      <title>DEV Community: mamoor123</title>
      <link>https://dev.to/mamoor123</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mamoor123"/>
    <language>en</language>
    <item>
      <title>I built a one-line observability decorator for Python AI agents</title>
      <dc:creator>mamoor123</dc:creator>
      <pubDate>Sun, 05 Apr 2026 12:22:02 +0000</pubDate>
      <link>https://dev.to/mamoor123/i-built-a-one-line-observability-decorator-for-python-ai-agents-i0</link>
      <guid>https://dev.to/mamoor123/i-built-a-one-line-observability-decorator-for-python-ai-agents-i0</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Your AI agents break and you find out when users complain. No logs, no metrics, no idea what went wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;@observe&lt;/code&gt; decorator that tracks every call to local SQLite. No cloud, no API key, no signup.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;agentdna&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;observe&lt;/span&gt;

&lt;span class="nd"&gt;@observe&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;transcribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;whisper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transcribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@observe&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;summarize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;summarize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;markdown&lt;/span&gt;
&lt;span class="n"&gt;markdown&lt;/span&gt;
&lt;span class="c1"&gt;## The problem
&lt;/span&gt;
&lt;span class="n"&gt;Your&lt;/span&gt; &lt;span class="n"&gt;AI&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;find&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;complain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;logs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;idea&lt;/span&gt; &lt;span class="n"&gt;what&lt;/span&gt; &lt;span class="n"&gt;went&lt;/span&gt; &lt;span class="n"&gt;wrong&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="c1"&gt;## The fix
&lt;/span&gt;
&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="sb"&gt;`@observe`&lt;/span&gt; &lt;span class="n"&gt;decorator&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;tracks&lt;/span&gt; &lt;span class="n"&gt;every&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="n"&gt;SQLite&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;signup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="c1"&gt;## How it works
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
python&lt;br&gt;
from agentdna import observe&lt;/p&gt;

&lt;p&gt;@observe&lt;br&gt;
def transcribe(audio):&lt;br&gt;
    return whisper.transcribe(audio)&lt;/p&gt;

&lt;p&gt;@observe&lt;br&gt;
def summarize(text):&lt;br&gt;
    return llm.summarize(text)&lt;br&gt;
That's it. Every call is now logged with latency, success/failure, and error types.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;View your stats&lt;/strong&gt;&lt;br&gt;
$ agentdna stats&lt;/p&gt;

&lt;p&gt;📌 transcribe&lt;br&gt;
   ✅ Healthy 42 calls ██████████ 97% avg 1250ms&lt;/p&gt;

&lt;p&gt;📌 summarize&lt;br&gt;
   ⚠️ Degraded 38 calls █████████░ 92% avg 3400ms&lt;br&gt;
   ❌ 3 failures: Timeout(2), RateLimit(1)&lt;/p&gt;

&lt;p&gt;Health thresholds:&lt;/p&gt;

&lt;p&gt;✅ Healthy — 95%+ success rate&lt;br&gt;
⚠️ Degraded — 80-95%&lt;br&gt;
🔴 Unhealthy — below 80%&lt;/p&gt;

&lt;p&gt;Features&lt;/p&gt;

&lt;p&gt;Sync and async support&lt;br&gt;
Latency percentiles (p50, p95, p99)&lt;br&gt;
Error type breakdown&lt;br&gt;
SQLite persistence — survives restarts&lt;br&gt;
Zero dependencies beyond stdlib&lt;br&gt;
Export to JSON or CSV&lt;/p&gt;

&lt;p&gt;Install&lt;br&gt;
pip install agentdna-sdk&lt;/p&gt;

&lt;p&gt;Open source&lt;/p&gt;

&lt;p&gt;Apache 2.0 — &lt;br&gt;
GitHub&lt;/p&gt;

&lt;p&gt;Built this because I was tired of debugging agents blind. Would love feedback!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>python</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
