<?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: Aadvik Krishna</title>
    <description>The latest articles on DEV Community by Aadvik Krishna (@aadvik_krishna_2d1baa4c0a).</description>
    <link>https://dev.to/aadvik_krishna_2d1baa4c0a</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%2F4044639%2Fdeb5005d-30f5-40d7-9d50-9f9515df7034.png</url>
      <title>DEV Community: Aadvik Krishna</title>
      <link>https://dev.to/aadvik_krishna_2d1baa4c0a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aadvik_krishna_2d1baa4c0a"/>
    <language>en</language>
    <item>
      <title>Tracing Fraud Rings with a Graph: What I Learned Building with FalkorDB</title>
      <dc:creator>Aadvik Krishna</dc:creator>
      <pubDate>Sat, 17 Oct 2026 19:25:00 +0000</pubDate>
      <link>https://dev.to/aadvik_krishna_2d1baa4c0a/tracing-fraud-rings-with-a-graph-what-i-learned-building-with-falkordb-4p2h</link>
      <guid>https://dev.to/aadvik_krishna_2d1baa4c0a/tracing-fraud-rings-with-a-graph-what-i-learned-building-with-falkordb-4p2h</guid>
      <description>&lt;p&gt;Banks flag suspicious transactions all day. The hard part isn't the flag—it's seeing what's behind it.&lt;/p&gt;

&lt;p&gt;Fraud rings can hide in relationships: accounts that share a device, logins from the same IP address, and money that loops between accounts. This is a graph problem, so for Graph Hacks, I built &lt;strong&gt;Fraud Ring Investigator&lt;/strong&gt;, a project that investigates flagged transactions using FalkorDB and explains the evidence behind its findings.&lt;/p&gt;

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

&lt;p&gt;The graph contains people, accounts, devices, IP addresses, merchants, and money transfers. The project uses synthetic data with three planted fraud rings among legitimate accounts.&lt;/p&gt;

&lt;p&gt;For each flagged transaction, the investigation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finds accounts linked through shared devices and IP addresses.&lt;/li&gt;
&lt;li&gt;Groups connected accounts using weakly connected components.&lt;/li&gt;
&lt;li&gt;Ranks potentially important hub accounts.&lt;/li&gt;
&lt;li&gt;Traces money paths as evidence.&lt;/li&gt;
&lt;li&gt;Looks for circular transfer patterns.&lt;/li&gt;
&lt;li&gt;Freezes accounts and creates a compliance case in the graph.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The report includes graph paths and the Cypher queries behind its claims, helping an analyst inspect how the investigation reached its conclusions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. The relationships you choose matter
&lt;/h3&gt;

&lt;p&gt;My initial approach to weakly connected components included money transfers. That connected separate rings through ordinary accounts. Restricting the analysis to device and IP relationships helped separate the planted rings in my dataset.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. PageRank doesn't tell the whole story
&lt;/h3&gt;

&lt;p&gt;PageRank can help identify important accounts, but it doesn't capture every kind of activity. An account sending money to multiple other accounts may be important even if PageRank alone doesn't rank it highly. Combining it with transfer degree helped address this in my project.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Database details matter
&lt;/h3&gt;

&lt;p&gt;While building the project, I encountered FalkorDB query constraints and duplicate graph nodes. I adjusted the shortest-path queries to fit the engine's requirements and used &lt;code&gt;MERGE&lt;/code&gt; to avoid creating duplicate device and IP nodes. This reinforced the importance of testing queries against the actual database.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. A graph can store investigation outcomes
&lt;/h3&gt;

&lt;p&gt;The project doesn't just query relationships. It also writes investigation outcomes back into the graph: freezing an account and creating a &lt;code&gt;Case&lt;/code&gt; node linked to affected accounts. This keeps the investigation evidence and recorded actions connected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations and next steps
&lt;/h2&gt;

&lt;p&gt;The current project uses a small synthetic dataset and a fixed investigation pipeline. It is a prototype, not a production fraud-detection system. A possible next step is to let an LLM choose which graph investigation tool to call based on the evidence found at each stage.&lt;/p&gt;

&lt;p&gt;You can explore the source code here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/aadvik93/fraud-ring-investigator" rel="noopener noreferrer"&gt;Fraud Ring Investigator on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building this project taught me that graph databases are useful not just for storing connected data, but also for investigating relationships and producing evidence that people can inspect.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>data</category>
      <category>database</category>
      <category>security</category>
    </item>
    <item>
      <title>Building an Incident Triage Agent with Full Observability in SigNoz</title>
      <dc:creator>Aadvik Krishna</dc:creator>
      <pubDate>Fri, 24 Jul 2026 01:00:59 +0000</pubDate>
      <link>https://dev.to/aadvik_krishna_2d1baa4c0a/building-an-incident-triage-agent-with-full-observability-in-signoz-55b0</link>
      <guid>https://dev.to/aadvik_krishna_2d1baa4c0a/building-an-incident-triage-agent-with-full-observability-in-signoz-55b0</guid>
      <description>&lt;h2&gt;
  
  
  The problem: AI agents are black boxes
&lt;/h2&gt;

&lt;p&gt;AI agents chain LLM calls and tool calls together to make decisions. But&lt;br&gt;
when something goes wrong — a slow response, an unexpected answer, a&lt;br&gt;
runaway cost — you're stuck guessing. You can't debug what you can't see.&lt;/p&gt;

&lt;p&gt;For the "Agents of SigNoz" hackathon, I wanted to build something that&lt;br&gt;
addresses this directly: an AI agent whose entire decision-making process&lt;br&gt;
is fully observable, end to end.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;Incident Triage Agent&lt;/strong&gt; — a small AI agent that simulates what an&lt;br&gt;
on-call engineer's assistant might do during a production incident:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Plans&lt;/strong&gt; an investigation approach (LLM call)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Searches logs&lt;/strong&gt; for relevant errors (tool call)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checks a runbook&lt;/strong&gt; for the matching incident type (tool call)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scores severity&lt;/strong&gt; based on what it found (tool call)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summarizes&lt;/strong&gt; a recommended action for the engineer (LLM call)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every one of these five steps is wrapped in its own OpenTelemetry span, so&lt;br&gt;
a single incident investigation shows up in SigNoz as one connected trace&lt;br&gt;
with all five child spans nested underneath it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt; for the agent logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemini API&lt;/strong&gt; (&lt;code&gt;gemini-3.5-flash&lt;/code&gt;) for the two LLM calls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenTelemetry SDK&lt;/strong&gt;, exporting spans via OTLP/gRPC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SigNoz&lt;/strong&gt;, self-hosted locally via the new Foundry installer&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I used SigNoz
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Traces
&lt;/h3&gt;

&lt;p&gt;Each span carries custom attributes beyond the defaults — token counts,&lt;br&gt;
latency in seconds, an estimated cost, the severity level the agent&lt;br&gt;
assigned, and even a simple heuristic flag for potential hallucination&lt;br&gt;
(whether the final summary references something that was never in the&lt;br&gt;
logs or runbook). Opening a trace in SigNoz's flame graph view immediately&lt;br&gt;
shows where the time went — in my case, the two LLM calls consistently&lt;br&gt;
took 10-15 seconds each, while all three tool calls combined took under a&lt;br&gt;
second. That's not obvious from reading code; it's obvious from a trace.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dashboards
&lt;/h3&gt;

&lt;p&gt;I built two dashboards directly from trace data using SigNoz's query&lt;br&gt;
builder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Latency by Step&lt;/strong&gt; — average duration grouped by span name, showing
exactly which part of the agent's pipeline is the bottleneck&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severity Distribution&lt;/strong&gt; — count of incidents grouped by the severity
the agent assigned, useful for spotting patterns across many runs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Alerts
&lt;/h3&gt;

&lt;p&gt;I set up a threshold alert on the planning LLM call: if &lt;code&gt;agent.llm.plan&lt;/code&gt;&lt;br&gt;
takes longer than 15 seconds on average, it fires. This is the kind of&lt;br&gt;
thing you'd actually want in production — a way to know your agent is&lt;br&gt;
degrading before someone notices the user-facing symptom.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;The most interesting finding, honestly, wasn't about SigNoz — it was&lt;br&gt;
about my own agent. Once I could see the trace breakdown, it became&lt;br&gt;
obvious that essentially all the latency in this pipeline comes from the&lt;br&gt;
two LLM calls, not the tool calls. That's an unglamorous but important&lt;br&gt;
insight: if I wanted to optimize this agent, the tool calls are not&lt;br&gt;
where I'd spend my time.&lt;/p&gt;

&lt;p&gt;That's the whole pitch for agent observability — it turns "the agent&lt;br&gt;
felt slow" into "the agent's planning step specifically took 12 seconds,&lt;br&gt;
here's the trace, here's the token count, here's the cost." You can't&lt;br&gt;
have that conversation without instrumentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Full code, setup instructions, and the Foundry deployment config are on&lt;br&gt;
GitHub: &lt;strong&gt;&lt;a href="https://github.com/aadvik93/incident-triage-agent" rel="noopener noreferrer"&gt;github.com/aadvik93/incident-triage-agent&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built for the &lt;a href="https://www.wemakedevs.org/hackathons/signoz" rel="noopener noreferrer"&gt;Agents of SigNoz&lt;/a&gt;&lt;br&gt;
hackathon, Track 01: AI &amp;amp; Agent Observability.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opentelemetry</category>
      <category>hackathon</category>
      <category>observability</category>
    </item>
  </channel>
</rss>
