<?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>Forem: John Vester</title>
    <description>The latest articles on Forem by John Vester (@johnjvester).</description>
    <link>https://forem.com/johnjvester</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%2F633601%2F9066f76d-9683-4bd6-88dd-418414f0dbad.png</url>
      <title>Forem: John Vester</title>
      <link>https://forem.com/johnjvester</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/johnjvester"/>
    <language>en</language>
    <item>
      <title>The Future of Agentic AI</title>
      <dc:creator>John Vester</dc:creator>
      <pubDate>Wed, 04 Feb 2026 16:37:52 +0000</pubDate>
      <link>https://forem.com/johnjvester/the-future-of-agentic-ai-312</link>
      <guid>https://forem.com/johnjvester/the-future-of-agentic-ai-312</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Flx101irtr0iryb8g8o74.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2Flx101irtr0iryb8g8o74.jpg" alt="Article Image" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The era of passive AI chatbots is ending. We are now entering the age of &lt;strong&gt;Agentic AI&lt;/strong&gt;: systems that actively reason, plan, and execute tasks. &lt;/p&gt;

&lt;p&gt;For organizations, this represents a potential leap in productivity, but it also introduces new engineering challenges. Moving from a simple prompt to a reliable agent ecosystem requires a new, robust architecture.&lt;/p&gt;

&lt;p&gt;In this article, we’ll explore the anatomy of AI agents, how the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; has finally solved the integration bottleneck, and how you can architect safe, scalable systems where humans and agents collaborate effectively.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;What is an AI agent?&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Some AI agents are simply a system prompt and a collection of tools that are sent to a model that does all the thinking. However, there are also more powerful AI agents that use the LLM to recommend and propose actions, then the AI agent runs its own code to perform functions such as:   &lt;/p&gt;

&lt;p&gt;• Control execution: state machines, task graphs, retries, timeouts&lt;/p&gt;

&lt;p&gt;• Enforce policy: auth, scopes, RBAC, allow/deny rules&lt;/p&gt;

&lt;p&gt;• Validate actions: schema checks, safety filters, sandboxing&lt;/p&gt;

&lt;p&gt;• Manage memory/state: databases, vector stores, session state&lt;/p&gt;

&lt;p&gt;• Coordinate agents: message passing, role separation, voting&lt;/p&gt;

&lt;p&gt;• Handle failure: rollbacks, circuit breakers, human-in-the-loop&lt;/p&gt;

&lt;p&gt;While a standard LLM (large language model) is passive and waits for your input to generate a response, an AI agent is active. It uses reasoning to break down a goal into steps, decides which tools to use, and executes actions to achieve an outcome.&lt;/p&gt;

&lt;p&gt;Agentic AI systems initiate a session by sending an LLM a system prompt, which may include the definition of multiple agents and their tools. Some of these tools may allow agents to invoke other agents, manage the context itself, and even select the model for the next step. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;LLM Chatbot&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;AI Agent&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Flow&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;User Input -&amp;gt; Model -&amp;gt; Output&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;User Goal -&amp;gt; LLM -&amp;gt; Reasoning/Planning -&amp;gt;  Tool Use -&amp;gt; Action -&amp;gt; Verification -&amp;gt; Output&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Summary&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Gives you advice but you have to do the work.&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;You give the agents a goal and access to software, they come back when the job is done.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The mastery of building Agentic AI systems is finding the right mix of agents, tools, and prompts that allow the LLM to accomplish your goals while still providing adequate guardrails and verification.&lt;/p&gt;

&lt;p&gt;To this end, managing the tools and other resources available to the AI agents is a major focus. This is where the Model Context Protocol (MCP) comes in.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;The Model Context Protocol&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; is an open standard introduced by &lt;a href="https://www.anthropic.com/" rel="noopener noreferrer"&gt;Anthropic&lt;/a&gt; in November 2024. It standardizes how AI systems connect to external data and services. &lt;/p&gt;

&lt;p&gt;The idea behind MCP is that all LLM API providers allow the LLM to invoke tools. Developers can benefit from a structured way to define those tools and make them available to the LLM in a uniform and consistent way. &lt;/p&gt;

&lt;p&gt;Prior to MCP, the integration of 3rd party tools into Agentic AI systems added a lot of friction. But by providing a universal interface for reading files, executing functions, and handling contextual prompts, MCP enables AI models to access the data they need securely and consistently, regardless of where that information lives. &lt;/p&gt;

&lt;p&gt;Since its release, the protocol has been adopted by major AI providers including OpenAI and Google, cementing its role as the industry standard for AI system integration.&lt;/p&gt;

&lt;p&gt;MCP operates through a straightforward client-server architecture with four key components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The host application&lt;/strong&gt; such as Claude Desktop, modern IDEs, or your AI system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The MCP client&lt;/strong&gt; which establishes one-to-one connections from the host to a server, often a built-in capability of AI frameworks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The MCP server&lt;/strong&gt; which exposes tools, resources, and prompts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The transport layer&lt;/strong&gt; which manages communication between clients and servers.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MCP also opened the door to an ecosystem where 3rd party platforms expose their capabilities to AI agents by publishing their own official MCP servers. Large enterprises such as &lt;a href="https://www.microsoft.com/en-us/dynamics-365/blog/it-professional/2025/11/11/dynamics-365-erp-model-context-protocol/" rel="noopener noreferrer"&gt;Microsoft&lt;/a&gt;, &lt;a href="https://awslabs.github.io/mcp/" rel="noopener noreferrer"&gt;AWS&lt;/a&gt;, &lt;a href="https://www.atlassian.com/blog/announcements/remote-mcp-server" rel="noopener noreferrer"&gt;Atlassian&lt;/a&gt;, and &lt;a href="https://www.sumologic.com/demo/mcp-server" rel="noopener noreferrer"&gt;Sumo Logic&lt;/a&gt; have all published MCP servers.&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.amazonaws.com%2Fuploads%2Farticles%2F535c7surjrjorkpql4lt.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.amazonaws.com%2Fuploads%2Farticles%2F535c7surjrjorkpql4lt.png" alt="Image 1" width="562" height="630"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MCP solves an important problem, but it is just one among many for agents. Let’s look next at how to design safe Agentic AI systems.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Designing Safe Agentic AI Systems&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Agentic AI can go catastrophically wrong. There are multiple risks such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prompt injection&lt;/strong&gt; that hijacks workflows to exfiltrate data or execute ransomware.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Privilege escalation&lt;/strong&gt; via tool chaining that drains accounts or deletes production systems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Infinite loops&lt;/strong&gt; that burn millions in API costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hallucinated actions&lt;/strong&gt; that trigger irreversible trades or compliance violations. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.sumologic.com/blog/token-torching-ai-attack" rel="noopener noreferrer"&gt;&lt;strong&gt;Token Torching&lt;/strong&gt;&lt;/a&gt; where malicious actors hijack token spend through MCP.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agents are often entrusted with access to APIs, browsers, and infra systems. Without safeguards, this greatly amplifies your risks. Safe Agentic AI requires a “defense-in-depth” approach built on multiple overlapping layers. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Input validation, output auditing, and human-in-the-loop escalation form the verification backbone.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Decisions are never fully autonomous when the blast radius or financial impact is high.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sandboxing and explicit permission boundaries prevent unauthorized access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Each agent should receive a distinct identity with least-privilege credentials and scoped tokens, rather than inheriting user permissions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fault tolerance through retry logic, fallback models, and anomaly detection ensures that systems degrade gracefully under failure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deep observability implemented via standardized telemetry, structured logging, metrics collection, and real-time monitoring dashboards enables rapid detection and response.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Engineering effective multi-agent systems requires deliberate architecture design that incorporates one or more coordination patterns: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Centralized orchestration&lt;/strong&gt; where a supervisor agent coordinates specialized workers and maintains global state.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Decentralized peer-to-peer communication&lt;/strong&gt; enabling flexible agent-to-agent interaction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hierarchical delegation&lt;/strong&gt; that organizes agents into levels of abstraction.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Development environments like Sumo Logic's &lt;a href="https://www.sumologic.com/solutions/dojo-ai" rel="noopener noreferrer"&gt;Dojo AI&lt;/a&gt; (an Agentic AI platform for security operations centers) can help significantly, providing essential infrastructure for safely iterating on agentic systems before production deployment. Dojo AI is carefully curated according to its design principles and safeguards. Customers can use Dojo AI as is and they can build their own agentic AI environment (similar to Dojo AI) for their own AI-based core competencies. The &lt;a href="https://www.sumologic.com/demo/mcp-server" rel="noopener noreferrer"&gt;Sumo Logic MCP server&lt;/a&gt; lets you run data queries and make Dojo AI agent calls when needed from your own AI agents.&lt;/p&gt;

&lt;p&gt;Next, let's see some of the different ways people interact with Agentic AI systems.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;How People Collaborate with AI Agents&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Traditional systems follow a well-defined workflow and pre-programmed algorithms. User input and outputs are fully structured. Even in dynamic systems, user input can deterministically control the flow. &lt;/p&gt;

&lt;p&gt;Agentic AI systems, however, are different. The LLM controls the flow (within its guardrails). Users provide initial intent and motivation, and later operate as approvers and a gating function. In particular, the free text conversation is novel.&lt;/p&gt;

&lt;p&gt;So how do we best collaborate with these agents?&lt;/p&gt;

&lt;p&gt;One of the most common ways to interact with AI agents is through chatbots, where you can exchange text, images, and files with LLMs and their agents. Voice conversations are also becoming more popular.&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.amazonaws.com%2Fuploads%2Farticles%2Fl2kvyy9knlyllvil2ipo.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.amazonaws.com%2Fuploads%2Farticles%2Fl2kvyy9knlyllvil2ipo.png" alt="Image 3" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, generic chatbots like ChatGPT, Gemini, and Claude Desktop are not aware of your agents out of the box. However, agents can be introduced as MCP tools.&lt;/p&gt;

&lt;p&gt;Another interesting option is to build a Slack application allowing agents to join channels, interact with users, automatically monitor the channels, and automatically respond to events.&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.amazonaws.com%2Fuploads%2Farticles%2Fkac5h97eoajcwm8j5w4v.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.amazonaws.com%2Fuploads%2Farticles%2Fkac5h97eoajcwm8j5w4v.png" alt="Image 2" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a rich environment as it allows humans and agents to collaborate smoothly. The Slack user experience already supports group channels and threads, so agents can add details such as their chain of thoughts or citations without cluttering the screen. Multiple human users can engage with each other and AI agents all in the same channel.  &lt;/p&gt;

&lt;p&gt;If you need even more specialized user experience, you could build a custom web, desktop, or mobile application for your agents.  &lt;/p&gt;

&lt;p&gt;You could even create a chatbot like &lt;a href="https://www.sumologic.com/help/docs/search/mobot/" rel="noopener noreferrer"&gt;Mobot&lt;/a&gt;, a Slack application integration, or a custom suite of agents like &lt;a href="https://www.sumologic.com/solutions/dojo-ai" rel="noopener noreferrer"&gt;Dojo AI&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;The Future of Agents&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Perhaps the most important thing to understand about AI agents is that they are coming faster than you think. In the past, major technological revolutions like the personal computer, the internet, and mobile phones took decades to become ubiquitous and the pace of innovation was manageable. AI is different.&lt;/p&gt;

&lt;p&gt;Many experts predict that in just the next few years, AI agents will be able to perform any knowledge work better than the best humans. They will unlock scientific discoveries and provide unprecedented productivity gains. Manual labor is not far behind, with humanoid robots making impressive strides powered by AI agents.&lt;/p&gt;

&lt;p&gt;LLMs can already perform many tasks as well as humans, though they lack the ability to plan and operate over long time horizons, deal with complexity, and maintain coherence. But with a carefully constructed web of agents and a curated set of tools that collaborate over multiple iterations to accomplish long horizon tasks, these constraints are being removed. There is much innovation in this domain beyond just MCP such as agent orchestration, toolkits, and verification layers.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Industry Standardization&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We’re starting now to see the standardization of techniques, tools, and formats for AI agents. For example, the &lt;a href="https://aaif.io/" rel="noopener noreferrer"&gt;Agentic AI Foundation (AAIF)&lt;/a&gt; is a new initiative under the Linux Foundation to ensure Agentic AI evolves in an open and collaborative manner. Its &lt;a href="https://aaif.io/members/" rel="noopener noreferrer"&gt;members&lt;/a&gt; include Anthropic, OpenAI, Amazon, Google, Microsoft and Block. It hosts several prominent agent technologies, including MCP, goose, and &lt;a href="http://agents.md/" rel="noopener noreferrer"&gt;AGENTS.md&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are other prominent open efforts as well, including Google's &lt;a href="https://a2a-protocol.org/" rel="noopener noreferrer"&gt;Agent2Agent (A2A) protocol&lt;/a&gt; and &lt;a href="https://github.com/agentskills/agentskills" rel="noopener noreferrer"&gt;Agent Skills&lt;/a&gt; (also originating from Anthropic).&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Dynamic User Experiences&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The future of the user experience is all about generative UI. The LLM and agents will generate an appropriate UI on the fly depending on the query, user, conversation history, and more. &lt;/p&gt;

&lt;p&gt;For example, if you ask about the stock market, rather than provide a generic overview of today’s business news, the AI system may decide to show a historical timeline and a pie chart with your current positions as well as links to relevant educational material. Everything will be tailored per user.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;The Shift to AI Agents&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;The agentic shift is here. We’re moving from passive text generation to active, autonomous work. As we’ve seen, this shift requires more than just new models. It calls for a careful architecture.&lt;/p&gt;

&lt;p&gt;To succeed, organizations should focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Leveraging the Model Context Protocol (MCP).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Moving beyond simple prompts to a "defense-in-depth" strategy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Designing interfaces, such as Slack apps and custom UIs, where humans provide the intent and agents handle the execution.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI agents may soon outperform top human knowledge workers, unlock major scientific and productivity gains, and eventually expand into physical work through robotics. Understanding their basics is the first step to harnessing their power for your organization.&lt;/p&gt;

&lt;p&gt;Have a really great day!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>architecture</category>
      <category>agentaichallenge</category>
    </item>
    <item>
      <title>Effectively Managing AI Agents for Testing</title>
      <dc:creator>John Vester</dc:creator>
      <pubDate>Thu, 18 Dec 2025 02:23:00 +0000</pubDate>
      <link>https://forem.com/johnjvester/effectively-managing-ai-agents-for-testing-iie</link>
      <guid>https://forem.com/johnjvester/effectively-managing-ai-agents-for-testing-iie</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Fcgp3rti1sbance7rl4am.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.amazonaws.com%2Fuploads%2Farticles%2Fcgp3rti1sbance7rl4am.png" alt="Article Image" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Large language models and AI agents have already transformed many fields and are changing our lives in fundamental ways. In the &lt;strong&gt;testing domain&lt;/strong&gt;, AI agents have a clear path for making immediate improvements in process and quality, and ultimately for producing reliable, performant, secure, and compliant software. Check out &lt;a href="https://dev.to/johnjvester/demystifying-agentic-test-automation-for-qa-teams-53ph"&gt;Demystifying Agentic Test Automation: What It Means for QA Teams&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;But it’s not obvious how to take advantage of these capabilities. While AI agents are not fully predictable, they can be managed reliably via robust control mechanisms. Let's see how.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;What does it mean to manage AI agents in QA?&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;There are several important aspects to managing AI agents, both in general and specifically in the testing domain.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configuration and guardrails&lt;/strong&gt; involve setting agent autonomy levels and boundaries, defining test objectives through prompts and constraints, and specifying which areas require human approval. These steps ensure that the system operates within controlled parameters while meeting goals.  &lt;/p&gt;

&lt;p&gt;For example, you may allow your agentic AI system to write test code and even tracking and reporting systems, but not necessarily modify your production code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model selection and updates&lt;/strong&gt; focus on deciding when to upgrade models versus maintaining stability. This includes testing model changes before rolling them out to production to avoid unexpected issues. If the quality of testing and coverage deteriorates when you upgrade models, it's a clear signal your AI agents are too finetuned to a specific model version.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Oversight and validation&lt;/strong&gt; encompass quality gates and verification protocols, monitoring for flaky tests and low-value coverage, and managing the budget for execution costs. These practices help maintain test reliability and cost-effectiveness throughout the development lifecycle.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to manage AI agents in practice&lt;/strong&gt; 
&lt;/h2&gt;

&lt;p&gt;With those aspects in mind, let's see how to actually control your agents.&lt;/p&gt;

&lt;p&gt;Consider a scenario where your team is migrating to agentic AI testing. You want to configure your agent's autonomy carefully. Here is a concrete example of how to go about it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;First, &lt;strong&gt;configure the agent system prompt&lt;/strong&gt;. For example, you might specify: "You may generate API and UI test code for the /checkout and /payment flows. You may create test reports and update tracking dashboards. You must NOT modify production code or database schemas. All destructive operations (deleting tests, changing CI/CD pipelines) require human approval."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next is &lt;strong&gt;tool integration&lt;/strong&gt;. Connect your agent to your test management platform via APIs so it can read existing test cases and understand coverage gaps. This may be done through an MCP server like the &lt;a href="https://docs.tricentis.com/tosca-cloud/en-us/content/ai_integration/connect_mcp_server.htm" rel="noopener noreferrer"&gt;Tosca MCP server&lt;/a&gt; or via &lt;a href="https://modelcontextprotocol.io/docs/develop/build-server" rel="noopener noreferrer"&gt;custom tools you build.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Next, it’s time for a &lt;strong&gt;progressive rollout&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Week 1 - Agent generates tests in "suggestion mode" only.&lt;br&gt;&lt;br&gt;
Week 2-3 - Agent executes tests in an isolated staging environment.&lt;br&gt;&lt;br&gt;
Week 4+ - Agent runs tests in pre-production with human review of failures.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally, &lt;strong&gt;set up quality gates&lt;/strong&gt; in your CI/CD pipeline that require a minimum pass rate (for example, 80%) before agent-generated tests can block deployments. Monitor false positive rate weekly and tune prompts accordingly.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;How to Control AI Agents: prompts, tools, and feedback loops&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Learning to control your agents is critical. AI agents, contrary to common beliefs, don’t actually have intelligence or agency. Agents are best understood as a system prompt combined with state/memory and a selection of tools. All the intelligence lies within the large language model (LLM), which accepts the agent (system prompt plus tools) and the user prompt as context. It then decides which tools to invoke and how to process both prompts until generating a final answer. &lt;/p&gt;

&lt;p&gt;There are three ways to help control your AI agents: prompt engineering, tool integration, and performance monitoring/feedback loops.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prompt engineering&lt;/strong&gt; serves as the primary interface with these agents. This process involves writing effective test objectives and acceptance criteria, building a library of proven prompts, and iterating based on the outputs generated by the agent. Well-crafted prompts guide the agent to deliver precise and useful results.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tool integration&lt;/strong&gt; can be achieved through the MCP server, connecting agents to source control, design documents, and CI/CD pipelines. This integration provides essential context that enhances the agent’s intelligence.  Additionally, emerging platforms like Applitools (for visual AI testing), Katalon Studio (for codeless test automation), and Selenium combined with AI extensions provide varying levels of autonomy and control for different organizational needs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance monitoring and feedback loops&lt;/strong&gt; track key metrics such as coverage, bug detection, false positives, and maintenance time. Real-time monitoring and alerting systems help determine when to reconfigure or retrain the agent for continued optimal performance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's next consider the trajectory from traditional testing to agentic AI testing&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;How to migrate from traditional testing to agentic AI testing&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Transitioning from traditional testing to agentic AI testing will be different for each organization as they start with their own unique combination of test automation, skill, and culture. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Organizations with existing automation&lt;/strong&gt; typically run agentic AI tests alongside their legacy scripts, adopting gradual migration strategies and increasing the system’s autonomy as confidence grows. &lt;/p&gt;

&lt;p&gt;This approach allows for a smoother shift without disrupting existing processes. The primary value here is flexibility and the ability to adapt quickly to changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Organizations that rely primarily on manual testing&lt;/strong&gt; often start the process with low-risk regression suites to minimize risk. They focus on codifying tribal knowledge, transforming informal, human-centered test expertise into formalized, repeatable tests. &lt;/p&gt;

&lt;p&gt;Additionally, for these organizations there is a cultural shift within QA teams, moving from maintaining scripts towards overseeing autonomous agents. But, in some ways it is easier to effect this change because the value is so much greater compared to already automated organizations.&lt;/p&gt;

&lt;p&gt;Practical integration typically involves hybrid testing methods that combine manual, AI-assisted, and fully agentic approaches. Platforms like &lt;a href="https://www.tricentis.com/products/automate-continuous-testing-tosca" rel="noopener noreferrer"&gt;Tricentis Tosca&lt;/a&gt; and &lt;a href="https://www.tricentis.com/products/unified-test-management-qtest" rel="noopener noreferrer"&gt;qTest&lt;/a&gt; enable unified management across these methods.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Example: Evolving a Traditional Test to an Agentic Approach&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let's compare how a typical test scenario might evolve from traditional to agentic approaches.&lt;/p&gt;

&lt;p&gt;In a traditional Selenium test (using manual scripting) a QA engineer might write an explicit WebDriver code like this: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;driver.findElement(By.id("username")).sendKeys("test@example.com")&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;But this test breaks when the UI changes (e.g., ID becomes class-based selector). Manual updates are required for every locator change. And with dynamic UI changes (very common when practicing A/B testing) the maintenance overhead and chance for errors is significant.&lt;/p&gt;

&lt;p&gt;However, with AI-Assisted Testing (with tools like Tricentis Tosca or &lt;a href="https://www.mabl.com/" rel="noopener noreferrer"&gt;mabl&lt;/a&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The QA engineer records user actions via visual test builder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Self-healing locators adapt to minor UI changes automatically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This approach still requires human intervention for test design and assertion logic.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And with &lt;em&gt;fully&lt;/em&gt; Agentic AI Testing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The QA engineer provides high-level intent: "Test the login flow with valid and invalid credentials, edge cases, and security scenarios."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The agent autonomously discovers UI elements, generates test cases, and creates assertions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It self-adapts to UI changes and refactors test logic without human input.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It learns from failures and adjusts test strategies in real-time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key insight is that traditional testing requires constant developer/QA time. Agentic AI shifts effort from execution and maintenance to strategic oversight and prompt engineering. &lt;/p&gt;

&lt;p&gt;This is all great. But it’s also good to remember that agentic AI testing is a new paradigm, and migration to the bleeding edge always comes with challenges. So next, let's review some of the common challenges and solutions.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Common challenges in agentic AI testing&lt;/strong&gt; 
&lt;/h1&gt;

&lt;p&gt;A common challenge with implementing agentic testing is &lt;strong&gt;calibrating trust&lt;/strong&gt; in the AI, which is best done through incremental rollout. &lt;/p&gt;

&lt;p&gt;Teams can introduce AI agents into the process gradually, validate their behavior on constrained scopes, and expand their responsibilities as confidence grows based on real outcomes and monitored performance.  &lt;/p&gt;

&lt;p&gt;Another persistent challenge is &lt;strong&gt;dealing with flaky tests&lt;/strong&gt;, which can undermine trust and inflate maintenance costs.&lt;/p&gt;

&lt;p&gt;Effective strategies include isolating unstable scenarios, tagging and quarantining flaky tests, and using AI agents to surface patterns in failures so teams can harden those areas. &lt;/p&gt;

&lt;p&gt;At the same time, &lt;strong&gt;cost control and coverage deduplication&lt;/strong&gt; require continuously pruning redundant scenarios and ensuring that additional test coverage actually adds incremental value rather than just increasing execution spend.&lt;/p&gt;

&lt;p&gt;Finally, &lt;strong&gt;maintaining clear accountability&lt;/strong&gt; is critical as agents take on more work. Even when agents generate, execute, and update tests, QA must own all agent outputs and remain the ultimate decision-maker on what ships. This means establishing review workflows, audit trails, and sign-off checkpoints so that autonomous activity is always paired with human oversight and responsibility.&lt;/p&gt;

&lt;p&gt;But, even here AI agents can help as they are perfectly capable of performing review tasks. Moreover, it is possible to try multi-agent review: run three review agents, let them debate their findings, come to an agreement, then have a human receive the final distilled report and perform their own sanity checks.  &lt;/p&gt;

&lt;p&gt;The end game is integrating agentic AI testing directly into the software development lifecycle where agents don't just test code written by human developers. Instead they operate as part of a multi-agent AI development team where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;AI engineers write code &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;that AI testers develop and execute tests for&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and together they iterate until the task is complete.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;The key takeaways? To move to agentic AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Start with low autonomy and constrained scope.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use MCP/tools to give agents context without giving them production write access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Track failure rate, coverage, and costs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expand autonomy only after reliability is proven.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Managing agentic AI for testing shifts the focus from traditional script maintenance to strategic oversight. It requires QA teams to embrace a new mindset where they guide, monitor, and refine autonomous agents rather than manually updating scripts. &lt;/p&gt;

&lt;p&gt;To get started with agentic AI testing, organizations should begin small, validating AI agents on low-risk scenarios and gradually expanding their scope as confidence builds. &lt;/p&gt;

&lt;p&gt;By following best practices and leveraging robust tools, QA teams can transform their testing processes, accelerate releases, and improve software quality in an increasingly complex digital landscape.&lt;/p&gt;

&lt;p&gt;Have a really great day!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agentaichallenge</category>
      <category>programming</category>
      <category>testing</category>
    </item>
    <item>
      <title>Demystifying Agentic Test Automation for QA Teams</title>
      <dc:creator>John Vester</dc:creator>
      <pubDate>Wed, 10 Dec 2025 14:09:22 +0000</pubDate>
      <link>https://forem.com/johnjvester/demystifying-agentic-test-automation-for-qa-teams-53ph</link>
      <guid>https://forem.com/johnjvester/demystifying-agentic-test-automation-for-qa-teams-53ph</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Fxz3i69doumfks1mkn0l9.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2Fxz3i69doumfks1mkn0l9.jpg" alt="Article Image" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agentic test automation&lt;/strong&gt; is a fundamental shift in how we test. Instead of depending on static, hand-written scripts that must be continually updated, agentic systems analyze apps, plan testing strategies, execute tests, and adapt to changing code—largely on their own. &lt;/p&gt;

&lt;p&gt;In this blog post, we’ll look at agentic test automation. We’ll cover what it is, how it improves traditional test automation, the skills needed in order to move to the agentic world, how to navigate the pitfalls of agentic automation, and some of the tools that you can use. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is Agentic Test Automation?&lt;/strong&gt; 
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Agentic test automation&lt;/strong&gt; is a type of software testing where AI (often powered by large language models) plans, executes, and adapts tests autonomously. &lt;/p&gt;

&lt;p&gt;Unlike traditional automation that relies on static, hand-written scripts, agentic systems can understand context, analyze changes in real time, and decide what and how to test, all on their own. This often means broader test coverage, better and faster detection of defects, and less maintenance. &lt;/p&gt;

&lt;p&gt;Large Language Models (LLMs) play a big role here. LLMs can understand application context and user intent, interpret the purpose and meaning of different components, and focus on what’s most critical. This means they can not only help create and adapt tests, but they can also identify edge cases and scenarios that conventional automation will probably overlook. &lt;/p&gt;

&lt;p&gt;Agentic test automation can be seen as the pinnacle of the test automation spectrum:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manual scripts&lt;/strong&gt; - require constant maintenance and breaking with UI changes. Relies on manually crafted scripts that are brittle and fail when applications change or evolve. These scripts require constant maintenance and updates whenever the user interface or application structure changes, making them time-consuming and expensive to maintain over time. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI-assisted tools&lt;/strong&gt; - intelligent locators and visual recognition that still need human oversight.  While AI-assisted tools can introduce intelligent locators, visual recognition, and reduced maintenance requirements to help identify elements more reliably and adapt to minor UI changes, they still require human oversight and predefined test cases, and don't fundamentally change the need for human-defined test strategies. (examples include &lt;a href="https://applitools.com/" rel="noopener noreferrer"&gt;Applitools Visual AI&lt;/a&gt; or &lt;a href="https://www.mabl.com/" rel="noopener noreferrer"&gt;Mabl&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agentic automation&lt;/strong&gt; - autonomously explores applications and discovers edge cases without constant oversight, as seen with platforms like &lt;a href="https://www.tricentis.com/products/automate-continuous-testing-tosca" rel="noopener noreferrer"&gt;Tricentis Tosca&lt;/a&gt; and &lt;a href="https://www.tricentis.com/products/unified-test-management-qtest" rel="noopener noreferrer"&gt;qTest&lt;/a&gt;, which support scalable, agentic workflows with features like model-based automation and broad test management across environments.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, agentic test automation is not a panacea just yet. You can think of agentic test automation as shifting QA focus away from people testing and to people giving oversight of independent and strategic AI agents. &lt;/p&gt;

&lt;p&gt;Skilled and thoughtful QA engineers are still needed for high-level oversight and to ensure the agentic automation operates effectively and within policy. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Essential Skills for QA Engineers in an Agentic World&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;So if the testing world is moving more towards agentic AI (with human oversight), what skills do QA engineers need to adapt?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prompt engineering:&lt;/strong&gt; The ability to communicate clearly with agents becomes essential, as engineers need to articulate test objectives and quality criteria (through prompting) in ways that guide automated decision-making. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strategic thinking:&lt;/strong&gt; Rather than focusing on writing detailed test scripts, QA engineers should cultivate strategic thinking about test coverage. They need to understand which areas require attention and how to evaluate the comprehensiveness of agent-generated tests. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model oversight:&lt;/strong&gt; QA engineers will need to be active in oversight. They must evaluate when the AI’s reasoning is sound, catch false positives or hallucinations, and know when to step in.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integrations:&lt;/strong&gt; QA will be responsible for making sure the agents have access to context. Source control, CI/CD systems, and design documents are necessary to help agents understand when a test is truly a failure. Tools such as &lt;a href="https://www.tricentis.com/blog/model-context-protocol-ai-testing" rel="noopener noreferrer"&gt;Tricentis’ Model Context Protocol (MCP)&lt;/a&gt; is an example of how teams can allow AI agents to directly interact with testing frameworks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Accountability:&lt;/strong&gt; When the final results come in, QA engineers will still be responsible for the results. They need to &lt;strong&gt;embrace accountability&lt;/strong&gt; for all agent-generated tests, ensuring that results meet the same quality standards as human-created tests, even if they didn’t manually create them.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s also critical for QA professionals to stay current with emerging &lt;strong&gt;AI models and testing frameworks&lt;/strong&gt;. While newer models are often faster and more cost-effective, stability and alignment with company workflows matter more than novelty. QA engineers will need to understand and implement this balance.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Navigating the Pitfalls of Agentic Test Automation&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Of course, as with all new technologies, agentic test automation comes with pitfalls. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trust calibration&lt;/strong&gt; is key. QA engineers must have robust verification protocols to ensure accuracy and reliability, especially in the beginning when engineers are still fine-tuning agent prompts. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the early learning phases, agents may frequently generate &lt;strong&gt;false positives&lt;/strong&gt;. QA engineers will need to provide careful oversight and tuning to avoid wasted effort. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;QA maintenance duties will shift from labor-intensive script updates to &lt;strong&gt;configuring agent parameters and guardrails&lt;/strong&gt;. This is a challenge, but it can be made easier by platforms like Tricentis Tosca/ qTest or Applitools Execution Cloud (focused on self-healing infrastructure), both of which simplify maintenance with built-in agentic workflow controls and model-based automation. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Even as agents take on more testing responsibilities, &lt;strong&gt;human-in-the-loop validation&lt;/strong&gt; remains vital for safeguarding critical workflows and ensuring decisions align with enterprise priorities. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flaky tests&lt;/strong&gt; are the bane of high-quality testing. Agentic test automation can quickly generate a lot of tests. If some of those are flaky, the value is greatly diminished, productivity will drop, and trust in the overall QA process will fall. Make sure to help the LLM weed out flaky tests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally, agentic AI systems might generate many &lt;strong&gt;low-value tests with coverage overlap&lt;/strong&gt;. And this can be quite expensive both in time and money. As part of human oversight, QA engineers will need to carefully monitor, and budget, their tests. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Getting Started: Practical First Steps&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Getting started with agentic test automation is best approached incrementally. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;First, begin by &lt;strong&gt;experimenting with low-risk regression suites&lt;/strong&gt; or exploratory tests in non-production environments. This allows teams to validate agentic outputs alongside legacy automation. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It’s also wise to &lt;strong&gt;constrain the agent’s initial autonomy to specific features or flows&lt;/strong&gt;, making oversight manageable and learning outcomes clear. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally, take full advantage of agentic test automation and &lt;strong&gt;incorporate automatic root cause analysis&lt;/strong&gt; when tests fail. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Agentic Testing with Tools/Platforms&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Agentic testing can be wildly successful for metrics—and can be made easy to implement with the right tools. Platforms such as &lt;strong&gt;Tricentis Tosca and Mabl have already shown strong results in improving key metrics&lt;/strong&gt;. For example Tricentis (which can automatically generate test cases using agentic AI and natural language prompts) has shown up to a 85% reduction in test creation and 60% increase in productivity by automating complex regression suites across thousands of test cases with agentic orchestration. &lt;/p&gt;

&lt;p&gt;But when using these tools, QA engineers should &lt;strong&gt;continually compare new agent-generated results with existing baselines&lt;/strong&gt; to be sure their tests are accurate and on-task. Use success metrics like expanded coverage, higher bug detection rates, and reduced maintenance time to guide adaptation. A structured and monitored onboarding process helps QA teams build confidence, understand limitations, and embrace agentic automation and the right tools. &lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Agentic test automation marks a transformative leap for QA teams, shifting the focus from manual scripting and maintenance to strategic oversight and collaboration with AI agents. &lt;/p&gt;

&lt;p&gt;By embracing new skills, teams can unlock better test coverage, improved metrics, and streamlined workflows. And as agentic systems mature, QA teams that embrace and prepare for the shift will move successfully from manual work to orchestrating AI. &lt;/p&gt;

&lt;p&gt;Have a really great day!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>testing</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why the MITRE ATT&amp;CK Framework Actually Works</title>
      <dc:creator>John Vester</dc:creator>
      <pubDate>Fri, 21 Nov 2025 03:22:35 +0000</pubDate>
      <link>https://forem.com/johnjvester/why-the-mitre-attck-framework-actually-works-302i</link>
      <guid>https://forem.com/johnjvester/why-the-mitre-attck-framework-actually-works-302i</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Ffe7okhefeswtx0156dh6.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2Ffe7okhefeswtx0156dh6.jpg" alt="Article Image" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The alert goes off at 2:17 p.m.&lt;/p&gt;

&lt;p&gt;You count yourself lucky that this one’s in the afternoon, not morning. You drop what you’re doing, open the console, and start digging in.&lt;/p&gt;

&lt;p&gt;Oh, a significant spike in outbound traffic from a Kubernetes node. A privileged service account authenticating from an unfamiliar IP. Hmm, some DNS requests look… odd, but not that odd. You pivot through dashboards, trace the source in your SIEM, check cloud logs, query identity data, and even pull container logs. Nothing definitive. No confirmed breach. No clear story is emerging.&lt;/p&gt;

&lt;p&gt;Was it a misconfigured workload? A developer testing a deployment script? A legitimate automation job or the first step of lateral movement by someone already inside? The indicators blur together until you can’t tell if you’ve caught an attack in-progress or another false positive in a sea of noise.&lt;/p&gt;

&lt;p&gt;Twenty minutes later, you close the ticket with the same note as the last one: “Monitoring.”&lt;/p&gt;

&lt;p&gt;Imagine doing that fifty times daily. The backlog grows as threats move through the network using valid credentials, blending in with legitimate activity, leaving ambiguous traces. Many security teams face a harsh reality: traditional detection systems catch known threats such as signature exploits, anomalies, and documented indicators. But attackers now mimic user behavior, hijack processes, and pivot beyond correlation rules, flooding alerts with few meaningful ones. Analysts are overwhelmed chasing false alarms while real threats go unnoticed.&lt;/p&gt;

&lt;p&gt;Security shouldn’t just be about stopping the bad, but understanding how the bad actually happens. Enter the &lt;a href="https://attack.mitre.org/" rel="noopener noreferrer"&gt;MITRE ATT&amp;amp;CK&lt;/a&gt; framework. Built from years of real-world threat research, it offers a living map of how adversaries operate, move laterally, and exploit systems step by step. And when paired with a modern analytics platform, it turns that understanding into actionable visibility by showing exactly where your defenses are strong and, by contrast, where they may be weak.&lt;/p&gt;

&lt;p&gt;This article explains how MITRE ATT&amp;amp;CK shifts threat detection from reactive to proactive, how modern analytics platforms support this, and shares best practices for developing adaptive detection logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The ATT&amp;amp;CK framework&lt;/strong&gt; 
&lt;/h2&gt;

&lt;p&gt;Most security frameworks start with what went wrong after the fact. MITRE ATT&amp;amp;CK begins with how things go wrong in the first place.&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.amazonaws.com%2Fuploads%2Farticles%2F6ysv636ekvf18qqwmv4b.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.amazonaws.com%2Fuploads%2Farticles%2F6ysv636ekvf18qqwmv4b.png" alt="Image 3" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Developed by the nonprofit &lt;a href="https://www.mitre.org/" rel="noopener noreferrer"&gt;MITRE Corporation&lt;/a&gt;, &lt;strong&gt;ATT&amp;amp;CK&lt;/strong&gt; (Adversarial Tactics, Techniques, and Common Knowledge) is a living knowledge base of real-world attacker behavior. Each entry in the &lt;a href="https://attack.mitre.org/matrices/enterprise/" rel="noopener noreferrer"&gt;ATT&amp;amp;CK Matrix&lt;/a&gt; maps tactics (the why) and techniques (the how) that adversaries use across different stages of an intrusion.&lt;/p&gt;

&lt;p&gt;Instead of focusing on malware signatures or static indicators, it emphasizes observable behavior, attacker tactics like gaining access, escalating privileges, lateral movement, or data exfiltration. It's a structured playbook covering phishing, credential dumping, command-and-control, linked to threat groups and campaigns.&lt;/p&gt;

&lt;p&gt;For instance, the framework details how &lt;a href="https://en.wikipedia.org/wiki/Cozy_Bear" rel="noopener noreferrer"&gt;APT29 (Cozy Bear)&lt;/a&gt;, a threat group tied to multiple espionage operations, frequently abuses legitimate credentials to blend into regular network traffic. By mapping detections to those same techniques, teams can uncover blind spots that purely signature-based tools miss.&lt;/p&gt;

&lt;p&gt;This behavioral model helps security and engineering teams speak a shared language. A SOC analyst investigating a PowerShell command might tag it as T1059.001 (Command and Scripting Interpreter: PowerShell), while a cloud engineer reviewing IAM logs might reference T1078 (Valid Accounts). Each technique includes definitions, detection ideas, and references to confirmed incidents, making ATT&amp;amp;CK as practical for detection engineering as it is for incident response.&lt;/p&gt;

&lt;p&gt;ATT&amp;amp;CK's strength lies in its ongoing evolution, incorporating recent threat intelligence, observations, and community input to reflect current attacker behavior. Engineers should follow the principle: Log what matters, detect observable actions, and verify assumptions against real adversary behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Real-world ATT&amp;amp;CK&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Today, every major security platform claims “MITRE ATT&amp;amp;CK integration”: Splunk, Microsoft Sentinel, Palo Alto Networks, Sumo Logic and Check Point. They all offer dashboards mapping detections to ATT&amp;amp;CK tactics and techniques. But not all dashboards are equal. Some provide only surface-level, color-coded matrices that look impressive but don’t show what’s detectable in your environment. Others display only one or two data sources, leaving visibility gaps. Few help compare coverage to real-world tactics. That’s where a modern analytics platform can help. &lt;/p&gt;

&lt;p&gt;For this article we’ll use Sumo Logic’s &lt;a href="https://www.sumologic.com/help/docs/cse/administration/mitre-coverage/" rel="noopener noreferrer"&gt;Threat Coverage Explorer&lt;/a&gt; as an example of the kind of tool you can use to map detections to ATT&amp;amp;CK techniques. Rather than only displaying an ATT&amp;amp;CK matrix, it connects the dots between your real detection rules and the techniques they map to. It analyzes your security content, including correlation rules, log patterns, and detections-as-code. And it builds a visual model of your defensive coverage across all ATT&amp;amp;CK tactics and techniques across all this content.&lt;/p&gt;

&lt;p&gt;By combining the right tool with ATT&amp;amp;CK you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;See which ATT&amp;amp;CK techniques you can actually detect.&lt;/strong&gt; Instead of relying on vendor defaults, you can evaluate your detections and map them to relevant ATT&amp;amp;CK TTPs. You see where you have visibility and where you don’t.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Perform gap analysis and peer comparison.&lt;/strong&gt; You can benchmark your coverage against industry peers at both technique and technology levels. Are your detections strong on credential access (TA0006) but weak on lateral movement (TA0008)? You’ll see it immediately.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tag custom rules with ATT&amp;amp;CK techniques.&lt;/strong&gt; Detection engineers can label correlation rules with specific ATT&amp;amp;CK IDs like T1055 for Process Injection or T1552.001 for Unsecured Credentials in Files, enabling your content library to map to the framework automatically. This simplifies documenting, testing, and maintaining coverage as attacker behavior evolves.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Visualize coverage at a glance.&lt;/strong&gt; You can see a heatmap that shows which techniques are fully, partially, or not covered. You can drill down from tactic summaries to rules, events, and data sources. It’s more than a dashboard—it’s an actionable view of your detection maturity.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach transforms ATT&amp;amp;CK from a theoretical framework into a living operational map. Imagine a scenario in which your logs capture credential misuse (T1078) but miss persistence mechanisms such as scheduled tasks (T1053). It exposes that blind spot before an attacker can exploit it. And because it updates dynamically as your rules or content evolve, it becomes part of your continuous detection engineering workflow rather than a one-time assessment. In the same way DevOps teams rely on observability metrics to measure system health, modern SecOps teams can now measure detection health.&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.amazonaws.com%2Fuploads%2Farticles%2Fho36o9srrub28i4vwjws.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.amazonaws.com%2Fuploads%2Farticles%2Fho36o9srrub28i4vwjws.png" alt="Image 1" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Using ATT&amp;amp;CK for a better SecOps&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The real power of MITRE ATT&amp;amp;CK isn’t in its taxonomy. At its core, the ATT&amp;amp;CK taxonomy is a schema for adversarial behavior. Each tactic is like a stage in an attacker’s workflow, while each technique describes the specific implementation of that step. It’s a structure of how attacks unfold, grounded in empirical evidence from real intrusions rather than theoretical models. This taxonomy enables a shift from reactive firefighting to proactive defense.&lt;/p&gt;

&lt;p&gt;Many organizations spend their days chasing alerts. Every detection is treated as an isolated event instead of a step in a larger narrative. ATT&amp;amp;CK flips that mindset. By mapping activity to known adversarial tactics and techniques, teams start thinking like attackers and thereby anticipating what comes next instead of waiting for another alert to tell them.&lt;/p&gt;

&lt;p&gt;When combined with the right tool, this mindset becomes operational. You can test hypotheses (“If an attacker gained initial access through phishing, would we see their lateral movement?”), validate detection logic, and continuously measure improvements over time. Again, the goal isn’t about collecting more data for its own sake; it’s about collecting the correct data and understanding what it tells you in context.&lt;/p&gt;

&lt;p&gt;Because ATT&amp;amp;CK evolves as adversaries do, your detection logic can grow too. New techniques emerge in the framework as they’re observed in the wild, giving engineers a head start on updating correlation rules, dashboards, and automation playbooks before those tactics appear in production environments. &lt;/p&gt;

&lt;p&gt;Proactive security is a process, not a steady-state. With ATT&amp;amp;CK as your blueprint and the right tool as your lens, your team can move from reacting to alerts toward anticipating attacker behavior. That’s the difference between being surprised by a breach and detecting it before it becomes one.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;MITRE ATT&amp;amp;CK is Your Blueprint&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Security isn’t about building taller walls; it’s about understanding how attackers move within them. The next time that 2:17 p.m. alert fires, it doesn’t have to end with “Monitoring.” The MITRE ATT&amp;amp;CK framework works because it’s grounded in how real adversaries think and operate. &lt;/p&gt;

&lt;p&gt;With MITRE ATT&amp;amp;CK as your blueprint and the right tool as your lens, those same signals become context, not chaos. You’ll know which behaviors matter, where your defenses stand, and how to strengthen them before attackers can adapt. Together, they transform security from reactive noise management into a cycle of continuous learning and proactive defense, which is why ATT&amp;amp;CK continues to work in practice, not just in theory.&lt;/p&gt;

&lt;p&gt;Have a really great day!&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>architecture</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Why Enterprise AI Needs Agentic Messaging Platforms</title>
      <dc:creator>John Vester</dc:creator>
      <pubDate>Tue, 07 Oct 2025 01:06:44 +0000</pubDate>
      <link>https://forem.com/johnjvester/why-enterprise-ai-needs-agentic-messaging-platforms-12nd</link>
      <guid>https://forem.com/johnjvester/why-enterprise-ai-needs-agentic-messaging-platforms-12nd</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Fuhpspsxu8ih5m2kde7oy.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2Fuhpspsxu8ih5m2kde7oy.jpg" alt="Article Image" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enterprise AI initiatives often follow a predictable pattern. They launch with ambitious goals: "We need AI agents that can automate workflows, integrate with our systems, and execute complex business logic." The demonstrations are compelling. The potential is clear.&lt;/p&gt;

&lt;p&gt;But then the implementation reality sets in.&lt;/p&gt;

&lt;p&gt;Months pass while teams wrestle with infrastructure challenges instead of focusing on intelligence. The problem isn't that the AI lacks capability—it's that organizations get bogged down in building infrastructure instead of moving quickly to bring solutions to market.&lt;/p&gt;

&lt;p&gt;Most enterprise teams get trapped in endless cycles of integration work. They write custom code to connect APIs, stitch together services, debug fragile workflows, and make everything scale. By the time they've built the foundation, business requirements have evolved, and the cycle begins again.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why Enterprise AI Gets Stuck&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Understanding why promising AI initiatives stall requires examining the fundamental challenges that emerge when moving from concept to production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API integration complexity&lt;/strong&gt; represents one of the most significant bottlenecks. What appears simple on paper—connecting to existing enterprise systems—becomes an exercise in digital archaeology. Each system communicates differently, uses unique authentication schemes, and has distinct ideas about data flow.&lt;/p&gt;

&lt;p&gt;In some cases, APIs need to be adjusted and require enhanced documentation Or converting them to MCPs so AI systems can understand how to use them effectively. Without this, integration work consumes weeks instead of days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building business logic requires significant resources.&lt;/strong&gt; Developing and maintaining enterprise workflows, rules, and decision trees demands close collaboration between product managers, analysts, and developers. Translating high-level business requirements into executable code, handling exceptions, and ensuring consistency across systems requires significant effort. Complex rules often span databases, microservices, and legacy systems, making implementation time-consuming and error-prone. Even small changes in requirements can trigger substantial work to update and validate workflows, slowing iteration, increasing costs, and raising the risk of inconsistencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workflow orchestration visibility&lt;/strong&gt; poses ongoing challenges for complex AI systems. Multi-step processes involve interactions between various services, but traditional enterprise systems provide limited insight into these workflows. When issues arise—and in complex systems, they inevitably do—teams are left reconstructing events from scattered log files across different systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scaling requirements&lt;/strong&gt; expose the limitations of traditional enterprise architectures when faced with AI workloads. Production systems need to handle sudden spikes—market events triggering thousands of simultaneous alerts, or batch jobs processing millions of records in parallel. Building this infrastructure requires expertise in distributed systems, message queuing, load balancing, and fault tolerance patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Governance and compliance&lt;/strong&gt; considerations often emerge as afterthoughts, creating significant delays when teams realize they need comprehensive audit trails, access controls, and compliance monitoring. Retrofitting these requirements into existing systems isn’t just technically challenging—it requires coordination across security teams, legal departments, and compliance officers.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;How Enterprises Try to Solve This Today&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Organizations typically pursue one of several approaches to address these infrastructure challenges, each with distinct trade-offs.&lt;/p&gt;

&lt;p&gt;Custom development efforts involve building orchestration and integration frameworks internally. This approach offers complete control and perfect alignment with specific organizational needs, but typically consumes entire engineering teams for months. Teams end up rebuilding infrastructure that already exists—message queues, workflow engines, monitoring systems—instead of focusing on their core business problems and AI capabilities.&lt;/p&gt;

&lt;p&gt;More technically sophisticated organizations often choose robust messaging platforms like Kafka, RabbitMQ, or NATS as their foundation. These are proven, battle-tested systems capable of handling enormous volumes and complex routing patterns. The challenge is that they're building blocks rather than complete solutions. Organizations still need to layer on orchestration logic, compliance monitoring, agent management, and comprehensive observability tools. What begins as a straightforward messaging implementation evolves into a complex system-of-systems requiring specialized expertise to maintain and operate.&lt;/p&gt;

&lt;p&gt;Each approach addresses portions of the overall challenge, but none provides a complete solution that allows teams to focus primarily on AI logic rather than infrastructure complexity.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;KubeMQ- Aiway: Next Generation Agentic Messaging Platform&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://kubemq.io/" rel="noopener noreferrer"&gt;KubeMQ&lt;/a&gt;'s revolution in this space reflects an understanding of these enterprise realities. The company has been powering mission-critical messaging for finance, telecom, and defense organizations—environments where system reliability is paramount. Their development of &lt;a href="https://kubemq-aiway.com/" rel="noopener noreferrer"&gt;KubeMQ-Aiway&lt;/a&gt; represents recognition that messaging alone isn't sufficient for AI-driven enterprise requirements.&lt;/p&gt;

&lt;p&gt;The platform combines proven enterprise messaging capabilities with the orchestration layer that AI agents require. Rather than treating messaging as merely a transport mechanism, the architecture integrates intelligence and workflow automation directly into the messaging foundation.&lt;/p&gt;

&lt;p&gt;The approach offers several key capabilities: business logic can be written in natural language and automatically converted into executable workflows. API documentation—including comprehensive specification documents—can be uploaded to generate &lt;strong&gt;ready-to-use tools&lt;/strong&gt; that agents can immediately consume. These tools abstract away the complexity of raw APIs, making them reusable building blocks across multiple workflows. Complex flows can then be assembled using these tools, with built-in parallelism and observability, all running on messaging infrastructure proven in production environments.&lt;/p&gt;

&lt;p&gt;The architecture maintains enterprise reliability and security requirements while enabling the development speed that modern business environments demand.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Exploring KubeMQ-Aiway’s Features in Practice&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Having recently explored KubeMQ-Aiway firsthand, I was able to see how its design reduces much of the complexity described earlier. Unlike traditional messaging platforms that require separate orchestration tooling, KubeMQ-Aiway brings everything into one workspace: tools, APIs, agents, and flows.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Tools &amp;amp; APIs&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The Tools dashboard lets teams register any service API (e.g., proprietary systems, partner services, SaaS/market feeds). This means a team can quickly add a legacy &lt;strong&gt;CoreBanking&lt;/strong&gt; API, a real-time &lt;strong&gt;MarketData&lt;/strong&gt; feed, or a compliance service, and monitor usage directly. The platform supports both synchronous request/reply and streaming connections, all managed via KubeMQ’s underlying broker. This visibility ensures that when APIs misbehave or hit limits, teams see the warning signals before workflows break.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Agents&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Aiway’s &lt;strong&gt;Agents&lt;/strong&gt; panel shows how AI-powered components connect to tools. Each agent can be configured with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;An underlying model (e.g., &lt;strong&gt;GPT-5, Sonnet 4.1&lt;/strong&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Natural language prompts that define its role (“You are a stock trading agent for our bank…”)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexible messaging patterns&lt;/strong&gt;, enabling a single agent to coordinate multiple tools in different ways simultaneously. For example, the same agent might place portfolio-update requests into a queue for a risk analysis service, while also streaming real-time market data to a monitoring tool—all orchestrated from the instructions given in the prompt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linked tools it can call during execution&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This capability is particularly important for enterprise workflows, where one agent often needs to manage different communication patterns across heterogeneous systems. Instead of splitting responsibilities across multiple agents or hardcoding integrations, teams can define rich, multi-tool behaviors within a single prompt. The result is tighter coordination, less fragmentation, and easier maintenance—while still providing complete transparency and auditability for compliance.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Flows&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Flow Editor&lt;/strong&gt; is where orchestration happens. Teams can visually design sequences that link APIs and agents. For example, a &lt;strong&gt;TradingAgent&lt;/strong&gt; might:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Pull account balance from CoreBanking via request/reply.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Validate KYC with CustomerKYC service using a cached check.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run a compliance validation through the ComplianceAgent via pub/sub.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Forward results to a notification service for customer updates.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All of these are configured through drag-and-connect nodes, backed by KubeMQ’s messaging guarantees (queues, pub/sub, streams). The visual interface makes it clear how data flows, while the messaging backbone ensures it never gets lost.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Monitoring, Cost Control &amp;amp; Analytics&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Aiway’s &lt;strong&gt;Analytics&lt;/strong&gt; dashboard provides system-wide insight across operations, performance, and costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Message volume&lt;/strong&gt; (e.g., 2.4M daily transactions)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Response times&lt;/strong&gt; (e.g., 43ms average latency)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;System health&lt;/strong&gt; (e.g., 99.9% uptime)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost control metrics&lt;/strong&gt;, including per-agent and per-tool usage tracking, allowing enterprises to monitor API call volumes, model consumption, and infrastructure load. This visibility helps teams forecast expenses, identify cost-heavy workflows, and optimize where necessary without compromising reliability.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Equally important, Aiway delivers deep &lt;strong&gt;observability&lt;/strong&gt; into agent coordination and system behavior. Enterprises can trace message flows end-to-end, identify bottlenecks across distributed services, and drill down into per-agent execution details. With real-time dashboards, anomaly detection, and exportable audit logs, teams can ensure compliance while also improving operational efficiency.&lt;/p&gt;

&lt;p&gt;This isn’t just cosmetic. For enterprise teams, observability and cost transparency are often the missing link. By unifying these capabilities in one platform, Aiway shortens mean time to detect and resolve issues, prevents cost overruns, and gives stakeholders the confidence that large-scale AI operations remain both sustainable and accountable.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Use Case Example: AI Index Fund Selection&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In this use case, the bank wants to provide customers with an AI‑powered filtering service that goes beyond static programmatic checks. Customers may ask broader questions such as: &lt;em&gt;Which S&amp;amp;P 500 index fund should I consider?&lt;/em&gt; or &lt;em&gt;What robotics‑focused funds are available right now?&lt;/em&gt; Rather than replacing a financial advisor or giving prescriptive recommendations, the IndexAgent helps customers by narrowing down a large universe of funds into a filtered, ranked list that best matches their stated preferences, portfolio, and risk profile. The agent provides clear explanations of why certain options were selected, while still requiring the customer to make the final decision. This service adds value by simplifying complex fund choices into an understandable shortlist backed by real‑time data, portfolio alignment, and compliance checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Setup of the required tools&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The bank uploads the API specs of its key services into the &lt;strong&gt;Tools&lt;/strong&gt; tab. Each tool is registered separately:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MarketData&lt;/strong&gt; provides live quotes, spreads, and constituents so the agent always works with the latest market context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PortfolioService&lt;/strong&gt; delivers current holdings and exposures, enabling personalized filtering aligned with customer portfolios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RiskProfile&lt;/strong&gt; supplies suitability and risk tolerance information to ensure shortlist results fit the customer’s profile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CustomerKYC&lt;/strong&gt; checks eligibility and residency rules, preventing options that customers cannot legally access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BenchmarksAPI&lt;/strong&gt; maps funds to benchmark indices, supporting comparisons across families like S&amp;amp;P 500 or sector‑focused indices.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NotificationService&lt;/strong&gt; handles delivery of outputs such as shortlists and rationales directly to the customer portal or app.&lt;/p&gt;

&lt;p&gt;Optionally, an &lt;strong&gt;Execution Broker API&lt;/strong&gt; can be added if the customer later chooses to place an order, connecting shortlist results to trade execution.&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.amazonaws.com%2Fuploads%2Farticles%2Fzjgqj3ggel6gabe3l5sj.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.amazonaws.com%2Fuploads%2Farticles%2Fzjgqj3ggel6gabe3l5sj.png" alt="Image 2" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Setting up the main Agent (IndexAgent)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The IndexAgent prompt is written to coordinate all these tools and ensure the flow remains compliant and explainable. Here is the full prompt assembled:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You are IndexAgent for our bank. Your job is to narrow a large universe of index funds/ETFs into a filtered, ranked shortlist that fits the customer’s stated intent, portfolio, and risk profile.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Do not place orders unless the customer explicitly approves.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;When a customer request arrives via [Pattern:Queue:advisor.requests], begin a new advisory session and tag all messages with advisor_session_id and customer_id.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pull live prices, spreads, ADV, and constituents for candidate funds from [Tool:MarketData] via [Pattern:Stream:prices]. If the stream stalls, fall back to the last 30s snapshot.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fetch holdings, sector exposure, and concentration limits from [Tool:PortfolioService] via [Pattern:Request/Reply].&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Retrieve risk band and suitability constraints from [Tool:RiskProfile] via [Pattern:Request/Reply].&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Validate product eligibility and restrictions using [Tool:CustomerKYC] via [Pattern:Cache:5min].&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Query index families and fund‑to‑benchmark mappings from [Tool:BenchmarksAPI] via [Pattern:Request/Reply].&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Score candidates on expense ratio, liquidity (ADV/spreads), tracking error, diversification (top‑10 weight), historical drawdowns, tax efficiency, and fit to portfolio &amp;amp; risk constraints. Output a TOP‑3 shortlist with a plain‑language rationale and a small metrics table for each option. Include explain_trace=true.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Publish a compliance summary for review to [Agent:ComplianceAgent] via [Pattern:Pub/Sub:compliance]. If flagged, revise the shortlist or request human approval.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Present the shortlist and rationale to the customer. If the customer clicks BUY, emit an order‑intent event with an idempotency key and hand off to execution via [Pattern:Queue:trading.orders].&lt;/em&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.amazonaws.com%2Fuploads%2Farticles%2Fsta6yi6bxe3d5gjvtvgg.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.amazonaws.com%2Fuploads%2Farticles%2Fsta6yi6bxe3d5gjvtvgg.png" alt="Image 1" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This single agent prompt demonstrates how Aiway unites multiple tools, a sub‑agent, and different messaging patterns in one cohesive flow. The IndexAgent coordinates MarketData, PortfolioService, RiskProfile, CustomerKYC, and BenchmarksAPI, while also publishing to a ComplianceAgent as a sub‑agent. It shows how queueing, streaming, request/reply, cache, and pub/sub patterns can be combined in one agent to orchestrate a complete advisory workflow. This highlights how a bank can use agentic infrastructure not only to answer general questions like &lt;em&gt;Which S&amp;amp;P 500 index fund should I consider?&lt;/em&gt; but also handle specific sector‑based requests such as &lt;em&gt;Show me index funds following the robotics industry.&lt;/em&gt; In both cases, the IndexAgent narrows the universe of options into a clear, compliant shortlist, leaving the customer in control of the final decision.&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.amazonaws.com%2Fuploads%2Farticles%2F4rw2s8sfa8svh5n02ezp.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.amazonaws.com%2Fuploads%2Farticles%2F4rw2s8sfa8svh5n02ezp.png" alt="Image 3" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;The Power of Integrated Agenting on Top of a Messaging Platform&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The integrated approach changes the fundamental economics of enterprise AI deployment. When messaging and orchestration layers are designed together, entire classes of integration problems that typically consume months of development time are eliminated.&lt;/p&gt;

&lt;p&gt;Organizations will continue using various approaches—some building on Kafka or RabbitMQ while layering orchestration and compliance tools on top, others gravitating toward integrated platforms that combine agent workflows with proven messaging infrastructure. Both approaches can succeed, but integrated platforms dramatically reduce expertise requirements and time-to-market.&lt;/p&gt;

&lt;p&gt;KubeMQ’s specific advantages make this integration particularly effective. The platform features Kubernetes-native architecture that works naturally within modern cloud infrastructures, eliminating complex bridge configurations that often introduce failure points. Resource usage scales efficiently from proof-of-concept deployments to massive enterprise workloads handling millions of transactions, with automatic performance optimization as demand changes.&lt;/p&gt;

&lt;p&gt;The underlying principle is fundamental: agentic AI requires enterprise messaging at its core. Without robust messaging infrastructure, AI agents cannot coordinate reliably at enterprise scale. The question isn't whether messaging is needed—it's whether to build it internally or leverage proven platforms that already address these challenges.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Enterprise AI success increasingly depends on the ability to deploy reliable, observable, and scalable agent systems quickly. The intelligence capabilities of AI are largely established—the challenge lies in making them work reliably within enterprise environments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kubemq.io/" rel="noopener noreferrer"&gt;KubeMQ&lt;/a&gt; has revolutionized this space with KubeMQ-Aiway, transforming workflows that traditionally required months of manual integration into solutions deployable in weeks. The platform recognizes that enterprise messaging isn't just about data movement—it’s about enabling the coordination, observability, and cost control that intelligent systems require.&lt;/p&gt;

&lt;p&gt;As enterprises transition from proof of concept to production AI, success will depend less on agent capabilities and more on how reliably and efficiently these systems can be deployed at scale. The infrastructure foundation chosen today will determine whether AI initiatives become transformative business capabilities or expensive technical exercises.&lt;/p&gt;

&lt;p&gt;Organizations that establish effective AI infrastructure foundations first will gain significant competitive advantages. Those that don't will find themselves rebuilding infrastructure while competitors deploy working AI solutions.&lt;/p&gt;

&lt;p&gt;Have a really great day!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>automation</category>
    </item>
    <item>
      <title>Beyond Code: How to Use AI to Modernize Software Architecture</title>
      <dc:creator>John Vester</dc:creator>
      <pubDate>Tue, 09 Sep 2025 01:33:54 +0000</pubDate>
      <link>https://forem.com/johnjvester/beyond-code-how-to-use-ai-to-modernize-software-architecture-1clb</link>
      <guid>https://forem.com/johnjvester/beyond-code-how-to-use-ai-to-modernize-software-architecture-1clb</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2F7z8i4z1zwdbm9zagryjd.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2F7z8i4z1zwdbm9zagryjd.jpg" alt="Article Image" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enterprise teams today ship more code, more frequently, &lt;a href="https://www.faros.ai/blog/deployment-frequency-what-why-and-how" rel="noopener noreferrer"&gt;than ever before&lt;/a&gt; — fueled in part by AI-driven coding tools like GitHub Copilot and Amazon Q.&lt;/p&gt;

&lt;p&gt;But there’s a problem.&lt;/p&gt;

&lt;p&gt;While AI helps enterprise teams ship more, faster, the legacy systems they’ve inherited — along with years or even decades of architectural debt — &lt;a href="https://devclass.com/2025/02/20/ai-is-eroding-code-quality-states-new-in-depth-report/" rel="noopener noreferrer"&gt;are getting worse&lt;/a&gt;. As complexity mounts, many organizations are turning to modernization — not just to keep up, but because cloud migration demands it.&lt;/p&gt;

&lt;p&gt;The reality is that while much of the excitement around AI coding focuses on greenfield projects and newly built applications, &lt;strong&gt;most developers spend their time maintaining and modernizing legacy systems that are filled with outdated code, old frameworks, and accumulated&lt;/strong&gt; &lt;a href="https://dzone.com/articles/managing-architectural-tech-debt" rel="noopener noreferrer"&gt;&lt;strong&gt;architectural debt&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Teams have been given this mandate to modernize, but with their AI tools having little to no context of the existing software architecture (or architectural debt), problems such as tight coupling, tangled dependencies, and architectural drift are exacerbated. Developers are quickly discovering AI isn’t improving their architecture … &lt;a href="https://www.tomshardware.com/tech-industry/artificial-intelligence/ai-coding-platform-goes-rogue-during-code-freeze-and-deletes-entire-company-database-replit-ceo-apologizes-after-ai-engine-says-it-made-a-catastrophic-error-in-judgment-and-destroyed-all-production-data" rel="noopener noreferrer"&gt;it’s making it worse&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But there’s an answer. Because modernization isn’t just about quickly rewriting code. It’s about &lt;strong&gt;reshaping software architecture to support scalability, faster delivery, and cloud-native goals&lt;/strong&gt;. And with the right approach to using AI, these goals can be achieved.&lt;/p&gt;

&lt;p&gt;In this article, we’ll explore how to enable &lt;strong&gt;AI-assisted software architecture modernization&lt;/strong&gt;. While most articles focus on using AI to code, we’ll look at specific examples of how AI can &lt;strong&gt;actively help modernize software architecture&lt;/strong&gt;, including how to create effective prompts. Because with the right tools and the right context, AI can provide consistent, and correct, architectural suggestions that help, not hinder, your team’s efforts..&lt;/p&gt;

&lt;p&gt;Whether you’re wrestling with a monolithic legacy system or navigating the intricacies of inherited microservices, AI can be an effective and powerful co-architect.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem with AI and Software Architecture
&lt;/h3&gt;

&lt;p&gt;We know that AI has transformed coding. Most developers rely on AI coding assistants in their daily work, using these AI agents as a smart, experienced, and tireless coding assistant. AI agents can now write (or rewrite) entire blocks of code, and even entire systems if we ask.&lt;/p&gt;

&lt;p&gt;The problem is that in this daily use, AI is also affecting architecture.&lt;/p&gt;

&lt;p&gt;When a developer writes code, they are constantly asking, and considering the answer to, questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;How should I organize my classes?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How should I handle caching?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Where should I put this business logic?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What are the external dependencies?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How does this fit into our overall software architecture?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And more&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether developers realize it or not, AI agents are also asking these questions — and implicitly making architecture decisions — with every line of generated code.&lt;/p&gt;

&lt;p&gt;And along with these decisions comes &lt;strong&gt;risk&lt;/strong&gt; — especially when the AI agent (as is typical) doesn’t understand any context of the architecture. Your smart, experienced, and tireless coding assistant is making uninformed decisions that on the surface seem correct — but when viewed from the context of software architecture are adding more debt, more problems, and more hours debugging. That “redundant” logic? You know it handles an edge case you found last year. But the AI, when it decides to quietly delete that code, does not.&lt;/p&gt;

&lt;p&gt;And to make your problems worse, these mistakes aren’t usually immediately obvious. With legacy systems, code coverage is often less than ideal. And even then, software architecture doesn’t usually announce its breakdown loudly. Problems like tight coupling or unscalable modules are often invisible to monitoring and testing tools. Yet they wreak havoc over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Software Architecture Drift
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Architecture drift&lt;/strong&gt; (the slow and nearly invisible erosion away from structured and controlled architecture) is particularly insidious. Consider this &lt;a href="https://vfunction.com/resources/case-study-fortune-100-bank/" rel="noopener noreferrer"&gt;Fortune 100 bank&lt;/a&gt; that struggled with modernizing a massive Java monolith comprising over 8 million lines of code. It’s a familiar story: the system’s complexity was overwhelming, internal modernization attempts took years, and efforts stalled repeatedly due to hidden architectural pitfalls.&lt;/p&gt;

&lt;p&gt;In a recent survey, &lt;a href="https://vfunction.com/resources/report-2025-architecture-in-software-development/" rel="noopener noreferrer"&gt;93% of respondents&lt;/a&gt; reported experiencing negative business outcomes due to misalignment between implemented architecture and documented standards — making the cost of these gaps impossible to ignore.&lt;/p&gt;

&lt;p&gt;Architectural problems may be less visible than code bugs, but they are much more problematic.&lt;/p&gt;

&lt;h3&gt;
  
  
  How AI Can Actually Help Modernize Your Software Architecture
&lt;/h3&gt;

&lt;p&gt;But it doesn’t have to be this way.&lt;/p&gt;

&lt;p&gt;AI can not only understand and follow your architecture decisions, but can help improve them as well. In &lt;strong&gt;brownfield modernization efforts&lt;/strong&gt;, where static diagrams and tribal knowledge fall short and developers and architects are left in the dark, AI isn’t just an assistant. It’s a lifeline.&lt;/p&gt;

&lt;p&gt;Just as AI tools can detect and recommend improvements at the code level, AI can detect and repair architectural problems during your modernization efforts if it is fed with architectural context based on runtime analysis.&lt;/p&gt;

&lt;p&gt;Used properly and with runtime context and preliminary domain driven structural analysis, AI can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Detect and correct architectural antipatterns before they become critical&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Suggest precise refactoring strategies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prioritize what to fix, conserving an engineering team’s limited time (whereas coding assistants help immediately remediate small-scale issues)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Untangle complex dependencies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automate the repair of architectural drift, effectively making the system self-healing&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Effective Prompting for Successful Modernization
&lt;/h3&gt;

&lt;p&gt;So we know AI can be our best friend when modernizing systems. But how do we get started?&lt;/p&gt;

&lt;p&gt;The first step to effective use of AI in software architecture is effective prompting. The results you get are directly tied to the quality of your prompt. And the quality of your prompt is typically a result of giving the AI context and being specific.&lt;/p&gt;

&lt;p&gt;If you are in any way vague in your prompt, the result will most likely be very wrong.&lt;/p&gt;

&lt;p&gt;So what does an effective prompt look like?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Be specific.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don’t prompt “Build a REST API to manage orders.”&lt;/p&gt;

&lt;p&gt;This prompt, while perhaps exaggeratedly bad, leaves significant room for AI interpretation in both architecture and design.&lt;/p&gt;

&lt;p&gt;Instead, prompt specifically with architectural direction:&lt;/p&gt;

&lt;p&gt;“Build a Python REST API to manage orders using Flask and SQLAlchemy. Structure the application with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;a controller layer (Flask routes) for handling HTTP requests,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a service layer for business logic,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and a repository layer for data access using the SQLAlchemy ORM.”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Be thorough.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don’t just mention code logic. Also include non-functional requirements.&lt;/p&gt;

&lt;p&gt;“Extend the Python Flask REST API to support operational robustness and maintainability. Include the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Log every incoming HTTP request and its response status. Log execution time for each request using Python’s built-in logging module. Logs should be structured and include a timestamp, endpoint, status code, and latency.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Validate all incoming request payloads using Pydantic models at the controller layer. Ensure validation errors return standardized JSON error responses with clear messages and appropriate HTTP status codes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implement retry logic with exponential backoff for transient database errors in the repository layer. Use Tenacity to handle retries without duplicating logic in the business layer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure that all error responses follow a consistent JSON schema, including error code, message, and optional details for debugging.”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Always be an architect.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Convey your architecture design and goals, and how they should be incorporated into the system. Be specific and exact.&lt;/p&gt;

&lt;p&gt;“Develop a modular email delivery system for the order system, designed to scale horizontally and can later be separated into its own microservice. The system must follow these architectural goals:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clear Separation of Concerns — structure the codebase into clean layers:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Controller Layer (i.e., the Flask routes): Accepts and validates email send requests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Service Layer: Handles business rules like rate limiting, content templating, and retries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repository Layer: Manages persistence of email send attempts, statuses, and delivery logs using SQLAlchemy.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2. Statelessness:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Do not maintain session or request-specific state between calls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All context (e.g. sender ID, email content, headers) must be carried in each request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Persist all state in external stores (database, cache, or queue) to maintain stateless compute nodes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3. Scalability and Microservice Readiness:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Design each major concern (e.g., send queueing, email rendering, status tracking) as an internal module that could later become an independent service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Avoid hardcoded implementations — interfaces should be defined for each major component (e.g., EmailProvider, EmailQueue, TemplateEngine).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inject all service and repository dependencies via constructors or a simple DI container.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4. Non-functional requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Resilience: Gracefully handle SMTP errors and retry failures using backoff strategies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Observability: Log all email activity with request IDs and delivery metadata.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extensibility: Make it easy to support multiple providers (e.g., SendGrid, SES) behind an interface abstraction.”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remember: prompts effectively are your architecture. Be specific, add context, be thorough, always.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add architectural context to your prompts
&lt;/h3&gt;

&lt;p&gt;An apt reader will notice that the last statement included “add context” … but we haven’t yet addressed that need.&lt;/p&gt;

&lt;p&gt;To add architectural context to our prompts, we need some help. For this example, I’ll use &lt;a href="https://vfunction.com/" rel="noopener noreferrer"&gt;vFunction&lt;/a&gt;, a tool that analyzes application architecture and provides structural guidance to GenAI assistants in refactoring. We’ll use static and dynamic analysis combined with data science to understand the logical domains of your app and identify the optimal boundaries of those domains. This in turn allows us to find architectural issues in complex Java and .NET apps, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Circular dependencies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Anti-patterns&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Architectural technical debt&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Domain boundary violations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dead code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And more&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You then feed that information into your agent to guide its steps, giving your AI agents the information they need to write the code you want. It’s a great example of the kind of information you need to be successful with AI.&lt;/p&gt;

&lt;h3&gt;
  
  
  A step-by-step example
&lt;/h3&gt;

&lt;p&gt;Let’s walk through the steps above to see how we supply architectural context to code assistants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Analyze your app.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start by collecting static and dynamic data from your application. We’ll use vFunction to identify potential logical domains in your application and their boundaries. This baseline allows the tool to identify relevant architectural issues like sub-optimal domain boundaries, inter-domain class dependencies, resource dependencies, high-debt classes, circular dependencies, and shared code across domains. Afterward, you can query the analysis to find errors in need of immediate refactoring, asking questions such as: Which domains contain the highest number of common classes?&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.amazonaws.com%2Fuploads%2Farticles%2F4g3k7euog251fuk1hwcf.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2F4g3k7euog251fuk1hwcf.jpg" alt="Image 3" width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Analysis of a mid-size app and its entangled business domains (represented by spheres) and accompanying technical debt.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review the architectural TODOs&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Next generate a list of prioritized architectural TODOs, each with a contextual explanation and an AI-ready prompt you can use in tools like Amazon Q or GitHub Copilot.&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.amazonaws.com%2Fuploads%2Farticles%2Fdtovmmxxilgge73rnasm.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2Fdtovmmxxilgge73rnasm.jpg" alt="Image 4" width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use the prompt in your AI assistant.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Send the generated prompt into your IDE or code assistant. It will understand the context and help you break up god classes, resolve domain pollution, or implement suggested changes to increase the modularity of your code. For example, in the screen shot above we see suggestions for refactoring a circular flow dependency.&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.amazonaws.com%2Fuploads%2Farticles%2Fuezy945f8bwy09hb0tke.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2Fuezy945f8bwy09hb0tke.jpg" alt="Image 1" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validate and repeat.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Rerun the analysis after applying changes. It will show you whether modularity improved, which TODOs were resolved, which weren’t, and suggest the next step in the refactoring process.&lt;/p&gt;

&lt;p&gt;By combining this insight with your LLMs, you create a powerful, context-aware assistant ready to build and to do the hard work of refactoring.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;AI is Your Partner in Software Architecture&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;AI-powered coding is only part of the story. &lt;strong&gt;The real value comes from using those same AI assistants not just to generate code but as a partner to help you modernize and improve your existing software architecture.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By using  architecture-aware, runtime based context to generate effective, consistent and precise prompts, AI can help you overcome legacy architecture debt, modularize your code, and implement a scalable, cloud-native, modernized system.&lt;/p&gt;

&lt;p&gt;Have a really great day!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>tutorial</category>
      <category>learning</category>
    </item>
    <item>
      <title>Bring Your Own Feed (BYOF): An Engineer's Guide to Effective Threat Intelligence</title>
      <dc:creator>John Vester</dc:creator>
      <pubDate>Wed, 30 Jul 2025 20:31:08 +0000</pubDate>
      <link>https://forem.com/johnjvester/bring-your-own-feed-byof-an-engineers-guide-to-effective-threat-intelligence-4ipf</link>
      <guid>https://forem.com/johnjvester/bring-your-own-feed-byof-an-engineers-guide-to-effective-threat-intelligence-4ipf</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2F89ly4pzzdjruatep37m2.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2F89ly4pzzdjruatep37m2.jpg" alt="Article Image" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As software continues to eat the world, and AI becomes a force multiplier for attackers, those of us tasked with defending our systems have to be more focused, deliberate, and proactive in our approaches. We have to rise up to meet this onslaught of new cyber threats.  &lt;/p&gt;

&lt;p&gt;In this article, we’ll look at &lt;strong&gt;threat intelligence&lt;/strong&gt;, what it is and why it’s important, how &lt;strong&gt;threat intelligence feeds&lt;/strong&gt; can help us in our daily defense, and how we can create &lt;strong&gt;custom threat intelligence feeds&lt;/strong&gt; that match our organizations’ specific needs. &lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Understanding Threat Intelligence&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Threat intelligence&lt;/strong&gt; is all the contextual information we need about potential or active cybersecurity threats to help us understand risks. These pieces of information are called &lt;strong&gt;threat intelligence indicators&lt;/strong&gt;. Examples include malicious IPs, domains, malware hashes, and attacker tactics. &lt;/p&gt;

&lt;p&gt;Threat intelligence is critical—it helps organizations detect, prevent, and respond to threats by enriching the raw security data with indicators and behavioral patterns. The most effective threat intelligence combines technical information with insights about the threat actors’ goals, methods, and infrastructure.&lt;/p&gt;

&lt;p&gt;Threat intelligence is crucial for battling alert fatigue and noise. Too much information creates desensitization. We end up responding slowly to, or even ignoring, critical issues. The goal with threat intelligence is to make it meaningful so that we never miss an important alert.&lt;/p&gt;

&lt;p&gt;There are several types of threat intelligence indicators. Let’s look at each along with its scope and purpose. &lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Threat Intelligence Indicators and Feeds&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Threat intelligence indicators are often grouped into categories, such as atomic (single pieces of information), computed (information derived from analysis), and behavioral (what the attacker is doing).&lt;/p&gt;

&lt;p&gt;We also often group the information into &lt;strong&gt;feeds&lt;/strong&gt;—data streams of threat intelligence indicators that we use to feed our systems ongoing updates about risks and threats. That’s what we’ll focus on here. &lt;/p&gt;

&lt;p&gt;Threat intelligence feeds can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strategic feeds&lt;/strong&gt; - high-level threat trends, emerging risks, and evolving attack vectors, helping with long-term planning and resource prioritization.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Operational feeds&lt;/strong&gt; - active threats, monitoring the tactics, techniques, and procedures (TTPs) used by adversaries, enabling SOC teams to anticipate and defend against attacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Technical feeds&lt;/strong&gt; - precise, actionable data (such as IP addresses, domains, and malware hashes) that can be used immediately to block known threats.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tactical feeds&lt;/strong&gt; - real-time threat data that supports rapid incident response, allowing SOCs to react quickly.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Luckily, you don’t have to build all of these feeds from scratch. Commercial vendors, government agencies, and open-source communities provide pre-built threat intelligence feeds in standard formats such as STIX 2.1 (JSON), OpenloC (XML), and MISP (JSON).&lt;/p&gt;

&lt;p&gt;These feeds vary in scope, quality, and specialization. Some focus on nation-state actors and advanced persistent threats (APTs), while others emphasize malware campaigns, botnets, or phishing infrastructure. Security teams can choose to aggregate multiple feeds to build a comprehensive threat picture appropriate for their organization’s needs.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://otx.alienvault.com/" rel="noopener noreferrer"&gt;AlienVault OTX&lt;/a&gt; - a collaborative threat intelligence platform where security professionals share and consume real-time indicators of compromise (IOCs). It provides access to community-curated threat data, including IPs, domains, malware hashes, and attack patterns.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.infragard.org/" rel="noopener noreferrer"&gt;FBI InfraGard&lt;/a&gt; - a partnership between the FBI and the private sector focused on protecting critical infrastructure through trusted information sharing. InfraGard provides private threat intelligence alerts and sector-specific feeds derived from FBI investigations and partnerships with infrastructure operators. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://cloud.google.com/security/products/threat-intelligence" rel="noopener noreferrer"&gt;Google Threat Intelligence (previously Mandiant)&lt;/a&gt; - delivers high-confidence IOCs, malware signatures, YARA rules, actor profiles, and campaign telemetry. Feeds are accessible via API, STIX/TAXII, and integrations with SIEM/SOAR platforms for automated detection and correlation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Private Threat Intelligence Feeds&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;But what if these feeds don’t give you everything you need? In that case, you need to BYOF! (Bring your own feed.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private threat intelligence feeds&lt;/strong&gt; can be created based on your proprietary organizational needs and added to your threat intelligence systems just like industry feeds. &lt;/p&gt;

&lt;p&gt;Ideally these private feeds are generated by sifting through your (potentially massive amount of) alerts and events, then intelligently surfacing the most relevant indicators. Once you have created your private feed, you can combine it with the standard threat intelligence feeds above. This creates a customized view of threats that allows your security team to zero in and respond to threats quickly.&lt;/p&gt;

&lt;p&gt;But creating these private feeds can be a challenge. You need to build a system that can store, aggregate, analyze, and combine industry feeds with your private feeds as well as display the information to the security team and integrate with other common tools, all while keeping the system reliable, scalable, and secure.&lt;/p&gt;

&lt;p&gt;Most organizations prefer to leverage a solid existing platform and focus their resources on their core competencies. Let’s look at one way this can be done. For our example, we’ll use &lt;a href="https://www.sumologic.com/" rel="noopener noreferrer"&gt;Sumo Logic&lt;/a&gt;—a cloud-based log management and analytic service most people are familiar with. &lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;How to Bring Your Own Feeds to Sumo Logic&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;With Sumo Logic, we can use both existing industry feeds and our own custom feeds. Let’s look at how to add both industry and private feeds through the web UI. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Set Up the Permissions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;First, if you haven’t already, go to the administration menu and create a new role with the threat intel capabilities.&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.amazonaws.com%2Fuploads%2Farticles%2Frtwk83vgdo8h05sj53hi.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.amazonaws.com%2Fuploads%2Farticles%2Frtwk83vgdo8h05sj53hi.png" alt="Image 5" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Navigate to Threat Intelligence Configuration&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now go to the &lt;strong&gt;Configuration&lt;/strong&gt; menu. In the &lt;strong&gt;Logs&lt;/strong&gt; section, click &lt;strong&gt;Threat Intelligence&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.amazonaws.com%2Fuploads%2Farticles%2Fp9ui0kr0plqrr7h78axq.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.amazonaws.com%2Fuploads%2Farticles%2Fp9ui0kr0plqrr7h78axq.png" alt="Image 2" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also just browse directly to &lt;a href="https://service.sumologic.com/threat-intelligence" rel="noopener noreferrer"&gt;https://service.sumologic.com/threat-intelligence&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pre-Built Feeds&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You’ll see right away that Sumo Logic already provides pre-built global threat intelligence feeds: &lt;a href="https://help.sumologic.com/docs/send-data/hosted-collectors/cloud-to-cloud-integration-framework/intel471-threat-intel-source/" rel="noopener noreferrer"&gt;Intel471&lt;/a&gt; and &lt;a href="https://help.sumologic.com/docs/send-data/hosted-collectors/cloud-to-cloud-integration-framework/crowdstrike-threat-intel-source/" rel="noopener noreferrer"&gt;CrowdStrike&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Intel471&lt;/strong&gt; provides threat intelligence focused on adversary behavior gathered from sources like the dark web and criminal forums. Its feed includes actor profiles, early warnings about planned attacks, malware and exploit kit tracking, and context-rich indicators of compromise (IOCs) tied to specific threat actors. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CrowdStrike&lt;/strong&gt; delivers intelligence derived from real-time endpoint and cloud telemetry collected via its Falcon platform. It includes high-confidence IOCs, adversary attribution, and detailed insight into tactics, techniques, and procedures (TTPs) observed during live attacks, often mapped to the &lt;a href="https://attack.mitre.org/" rel="noopener noreferrer"&gt;MITRE ATT&amp;amp;CK&lt;/a&gt; framework. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these feeds give you a great start with a complementary view of the threat landscape: &lt;strong&gt;Intel471&lt;/strong&gt; focused on attacker intent and planning, and &lt;strong&gt;CrowdStrike&lt;/strong&gt; on active execution and observed campaigns.&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.amazonaws.com%2Fuploads%2Farticles%2F0x4ccxyfn71oakkyrpqr.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.amazonaws.com%2Fuploads%2Farticles%2F0x4ccxyfn71oakkyrpqr.png" alt="Image 1" width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Adding a New Custom Indicator (BYOF)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;But we don’t want to just use the pre-built feeds. We want to add our own custom indicator (and eventually feed). So let’s do that next.&lt;/p&gt;

&lt;p&gt;There are three supported formats:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://help.sumologic.com/docs/security/threat-intelligence/upload-formats/#normalized-json-format" rel="noopener noreferrer"&gt;Normalized JSON format&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://help.sumologic.com/docs/security/threat-intelligence/upload-formats/#csv-format" rel="noopener noreferrer"&gt;CSV format&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://help.sumologic.com/docs/security/threat-intelligence/upload-formats/#stix-2x-json-format" rel="noopener noreferrer"&gt;STIX 2.x JSON format&lt;/a&gt; (API use only)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; We’ll use JSON. Here’s an example:&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"indicators"&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"indicator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"192.0.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ipv4-addr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TAXII2Source"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"validFrom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-03-21T12:00:00.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"validUntil"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-03-21T12:00:00.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"threatType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"malicious-activity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"actors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"actor1,actor2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"killChain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reconnaissance"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"fields"&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;"kill_chain_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lockheed-martin-cyber-kill-chain"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"kill_chain_phase"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reconnaissance"&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="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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"indicator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"192.0.2.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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ipv4-addr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TAXII2Source"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"validFrom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-03-21T12:00:00.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"validUntil"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-03-21T12:00:00.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"threatType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"malicious-activity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"actors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"actor3,actor4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"killChain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reconnaissance"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"fields"&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;"kill_chain_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lockheed-martin-cyber-kill-chain"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
       &lt;/span&gt;&lt;span class="nl"&gt;"kill_chain_phase"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reconnaissance"&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="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="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;See the &lt;a href="https://help.sumologic.com/docs/security/threat-intelligence/upload-formats/#required-attributes" rel="noopener noreferrer"&gt;Threat Intelligence Indicators&lt;/a&gt; documentation from Sumo Logic for more details.&lt;/p&gt;

&lt;p&gt;Custom indicators will show up after a few minutes.&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.amazonaws.com%2Fuploads%2Farticles%2Fo1y9dhy2033s8fdmda4m.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.amazonaws.com%2Fuploads%2Farticles%2Fo1y9dhy2033s8fdmda4m.png" alt="Image 3" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Updating Indicators&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As you may have noticed, this isn’t a &lt;em&gt;dynamic&lt;/em&gt; feed that Sumo Logic can query and refresh. Instead, we created a feed that needs periodically updated with the latest threat intelligence. &lt;/p&gt;

&lt;p&gt;Why a push-based model? This is quite common and allows Sumo Logic to maintain secure boundaries (no storage of credentials, no webhook/API at risk for attacks) and remove any reliability risks tied to external systems. This also ensures that ingestion is deliberate, standardized, and under the organization’s control.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Build Your Own Feed&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;With the above, we can now build our own private threat intelligence feed and combine it with the industry feeds above, creating a customized feed that meets our organization’s exact needs.&lt;/p&gt;

&lt;p&gt;Building your own feed requires a plan and careful execution. Here are some questions your plan should address:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What threat indicators do you want to expose to Sumo Logic?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do you expose a single indicator or multiple indicators?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How do you collect the relevant information from your system?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How do you filter and prepare the data?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How often do you upload/update indicators?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, let’s say we have a periodic scan of our S3 buckets to ensure they are not public. But some S3 buckets contain public assets that should have public read access. A smart private feed can compare the list of public buckets against a whitelist and upload only the public buckets not in the list.&lt;/p&gt;

&lt;p&gt;Once you have your answers (and indicators), you build a service that collects, filters, and uploads the indicator files to the Sumo Logic &lt;a href="https://api.sumologic.com/docs/#tag/threatIntelIngestProducer" rel="noopener noreferrer"&gt;API&lt;/a&gt; at regular intervals (or when urgent threats are detected). Sumo Logic will combine this feed with the other selected industry feeds for a customized set of indicators for your organization. &lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Integrating threat intelligence into your security operations is essential for staying ahead of rapidly evolving cyber threats. By leveraging both public and private threat intelligence feeds, we can gain a better understanding of the threat landscape. And ultimately, we can take faster, more precise action.&lt;/p&gt;

&lt;p&gt;Have a really great day!&lt;/p&gt;

</description>
      <category>threatintelligence</category>
      <category>sumologic</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>One Checkbox to Cloud: Migrating from Tosca DEX Agents to E2G</title>
      <dc:creator>John Vester</dc:creator>
      <pubDate>Sat, 05 Jul 2025 20:51:38 +0000</pubDate>
      <link>https://forem.com/johnjvester/one-checkbox-to-cloud-migrating-from-tosca-dex-agents-to-e2g-43de</link>
      <guid>https://forem.com/johnjvester/one-checkbox-to-cloud-migrating-from-tosca-dex-agents-to-e2g-43de</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Fht5m3rn9ut9r77mmr6rq.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2Fht5m3rn9ut9r77mmr6rq.jpg" alt="Article Image" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you saw my &lt;a href="https://dev.to/johnjvester/exploring-cloud-based-testing-with-the-elastic-execution-grid-45o5"&gt;recent article on the Elastic Execution Grid (E2G)&lt;/a&gt;, you know I’ve been exploring newer releases in the Tosca ecosystem. It’s been a great learning experience.&lt;/p&gt;

&lt;p&gt;But I was thinking that for some readers, you might be sitting comfortably with your DEX testing workflows. And you might be a little stuck in the “&lt;a href="https://www.uncoverstrategy.com/blog/3-humorous-examples-of-innovation-resistance" rel="noopener noreferrer"&gt;hey it works fine for me—no need to change&lt;/a&gt;” mindset. Or even sitting on the “sounds like way too much work” excuse. &lt;/p&gt;

&lt;p&gt;If you are, I think you should reconsider. Because not only is it simple to switch to E2G, but by doing so you’ll see some substantial benefits that will be worth your time.&lt;/p&gt;

&lt;p&gt;In this article, I want to look again at the &lt;a href="https://www.tricentis.com/products/automate-continuous-testing-tosca/elastic-execution-grid" rel="noopener noreferrer"&gt;Elastic Execution Grid.&lt;/a&gt; But this time, I’ll walk through how simple the changeover is from DEX to E2G and why I think you should go for the upgrade. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Should I switch to E2G?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;First, let’s talk about why you should switch.&lt;/p&gt;

&lt;p&gt;My first reason for changing—&lt;strong&gt;flexibility&lt;/strong&gt;. Instead of being locked into the expense and time of configuring and maintaining your own fleet of machines, with E2G you have much more flexibility. &lt;/p&gt;

&lt;p&gt;You can pick from three types of agents in E2G. (Note: if you don’t know much about E2G, or its agent types, you can read all the details in my previous article).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Personal Agents&lt;/strong&gt;: your own local agents for one-off runs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Team Agents&lt;/strong&gt;: self-managed VMs (on-prem or cloud) that run under your control&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cloud Agents&lt;/strong&gt;: fully managed, disposable instances offering zero-footprint execution&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s up to you which agent you use for each test, giving you lots of flexibility. &lt;/p&gt;

&lt;p&gt;My next reason to switch—&lt;strong&gt;simplicity&lt;/strong&gt;. As you’ll see below, running tests with E2G is simple. For most cases, XML, scripting, and network configs are no longer needed. Now, just tell E2G what agent type, then check if your playlist can run in parallel or if it needs to be run sequentially. Add some characteristics to your tests, and you’re off. If for some reason you still need to control the hardware/VM (such as specialized hardware, custom middleware, etc.) you can always still choose to use the team agents. &lt;/p&gt;

&lt;p&gt;My third reason to switch—&lt;strong&gt;money&lt;/strong&gt;! If you pick a cloud option, you no longer need to keep your testing machines. That means you can repurpose your hardware, shut off those pay-by-the-hour VMs, and stop patching and maintaining machines you only use when running tests. &lt;/p&gt;

&lt;p&gt;And my final reason? &lt;strong&gt;Scaling&lt;/strong&gt;. When you use the Cloud Agents, you also gain easy scaling. Need more resources? E2G auto-scales your agent pool to match. Need less resources? E2G tears down idle instances. You don’t have to worry about it.&lt;/p&gt;

&lt;p&gt;Now let’s look at the other side. Here are some reasons you may not want to switch.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You have strict requirements for on-prem or air-gapped environments. You can’t run on the cloud if you can’t get to the internet!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You have &lt;strong&gt;highly predictable, always-on workloads&lt;/strong&gt;. In some of these cases, a dedicated DEX VM might be more cost-effective and convenient. It’s worth evaluating to see.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As I’ll mention later, there is a cold-start latency with the first run on E2G. If you have &lt;strong&gt;ultra-low-latency needs&lt;/strong&gt;, you may not be able to handle the start time (~60s or less). If every second truly counts and there’s no workaround, a DEX solution is probably better.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fdoj8otfj59jf6g87ipqi.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.amazonaws.com%2Fuploads%2Farticles%2Fdoj8otfj59jf6g87ipqi.png" alt="Image a" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How can I move from DEX to E2G?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now that you know why (or why not) you should make the move, let’s get into how to move from DEX to E2G.&lt;/p&gt;

&lt;p&gt;First, we all know that infrastructure changes can present risks. It takes many hours—and headaches—to make major changes. But in most cases, it actually takes minimal effort to change from DEX to E2G. Your core tests don’t need to change. While there will be some effort configuring agents (especially if you have a large number), the actual switching is easy. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Team agents&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Your first option is to start with &lt;strong&gt;E2G Team Agents&lt;/strong&gt;. Maybe your organization (or you) just isn’t &lt;a href="https://xkcd.com/908/" rel="noopener noreferrer"&gt;comfortable with cloud yet&lt;/a&gt;. Maybe you have lingering requirements to continue using your boxes. With Team Agents, you still manage your own infrastructure, but E2G manages the Team Agents. So you can retire your old distribution server, but still keep the infrastructure. It’s a baby step to Cloud Agents.&lt;/p&gt;

&lt;p&gt;This move is straightforward.&lt;/p&gt;

&lt;p&gt;1 - Spin down the DEX server. It’s probably safest to keep the machine provisioned, though, until you’re comfortable with the switch.&lt;/p&gt;

&lt;p&gt;2 - Create your E2G Team Agents. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://documentation.tricentis.com/tricentis_cloud/en/content/admin_guide/downloads_and_installations.htm" rel="noopener noreferrer"&gt;Download and install the Tosca Cloud launcher&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Follow the three-step wizard to &lt;a href="https://documentation.tricentis.com/tricentis_cloud/en/content/admin_guide/agents_team.htm" rel="noopener noreferrer"&gt;name the agents, assign them to pool, and define their characteristics&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Ft0leqoe00donkxmphom2.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.amazonaws.com%2Fuploads%2Farticles%2Ft0leqoe00donkxmphom2.png" alt="Image b" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3 - Execute your playlist! E2G will distribute the tests to available agents and report back with the results. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Cloud Agents&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You can also jump straight into Cloud Agents and run your tests on the cloud. No more managing and configuring local hardware. It’s still simple to get started—basically the difference is just a checkbox and some options.&lt;/p&gt;

&lt;p&gt;1 - Open the Playlist Details, find the Agent Characteristics tab, and check the “Cloud-agent” box.&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.amazonaws.com%2Fuploads%2Farticles%2Fys285px50ykptkq11n6j.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.amazonaws.com%2Fuploads%2Farticles%2Fys285px50ykptkq11n6j.png" alt="Image c" width="800" height="871"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2 - Choose your options for run order and recording. If your tests can run in parallel, you could see significant time savings by choosing that option.&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.amazonaws.com%2Fuploads%2Farticles%2F9w6xikzf3d1ww9fmryn6.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.amazonaws.com%2Fuploads%2Farticles%2F9w6xikzf3d1ww9fmryn6.png" alt="Image d" width="800" height="753"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3 - That’s it! Now execute your tests. &lt;/p&gt;

&lt;p&gt;Regardless of whether you choose Cloud, Person, or Team Agents, the results and logs are shown in the E2G dashboard.&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.amazonaws.com%2Fuploads%2Farticles%2Fd3srulut8j15cifwvjvd.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.amazonaws.com%2Fuploads%2Farticles%2Fd3srulut8j15cifwvjvd.png" alt="Image e" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Again, keep in mind that even if you’re using Team Agents, if you ever need specific hardware or configurations, you can always drop back to Team Agents. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Edge cases&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The above clear path is pretty easy. But let’s look at some potential problems I’ve run across that you should watch out for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mismatched characteristics&lt;/strong&gt; — Tag mismatches can cause problems. If you mistype or forget to update a tag, E2G won’t find a matching agent, and your runs might get stuck on “Pending.” &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Network/data access&lt;/strong&gt; — Since Cloud Agents live on Tricentis-managed resources, if your app sits behind a VPN, you’ll need to configure appropriately for access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cold starts&lt;/strong&gt; — The first run of a fresh flow can take a bit of time (~60s or less) while the cloud VM spins up. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom plugins&lt;/strong&gt; — If you use custom plugins, you may need extra packaging or installation scripts. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you’ve accounted for these edge cases, you should be good to go.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As you can see, moving to the Elastic Execution Grid is pretty easy, and I think the benefits are well worth it. Compared to using DEX Agents, E2G is simple and flexible. It’s exciting to stop managing machines and simply “check a box.” I can’t wait to keep exploring! &lt;/p&gt;

&lt;p&gt;For more info, check out this &lt;a href="https://documentation.tricentis.com/cloud/od/en/content/get_started/get_started.htm" rel="noopener noreferrer"&gt;detailed getting started guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Have a really great day!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>testing</category>
      <category>tricentis</category>
    </item>
    <item>
      <title>How to Banish Anxiety, Lower MTTR, and Stay on Budget During Incident Response</title>
      <dc:creator>John Vester</dc:creator>
      <pubDate>Fri, 27 Jun 2025 01:00:15 +0000</pubDate>
      <link>https://forem.com/johnjvester/how-to-banish-anxiety-lower-mttr-and-stay-on-budget-during-incident-response-2ig8</link>
      <guid>https://forem.com/johnjvester/how-to-banish-anxiety-lower-mttr-and-stay-on-budget-during-incident-response-2ig8</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Fr411bq8qsid4ysnhai72.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2Fr411bq8qsid4ysnhai72.jpg" alt="Article Image" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since I started in technology in 1992 (over three decades ago!), I’ve encountered countless scenarios where I was expected to “do more with less.” Whether it meant delivering more with fewer team members or working within constrained hardware resources, this mindset has been a recurring theme.&lt;/p&gt;

&lt;p&gt;One experience stands out from my time as a backend architect on a cloud modernization project. To reduce costs, we were asked to &lt;strong&gt;minimize or eliminate service-level logging&lt;/strong&gt;—logging that we relied on heavily for debugging and incident analysis. The decision was driven by the high cost of log ingestion on our observability platform.&lt;/p&gt;

&lt;p&gt;This worked—until it didn’t.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;We Really Needed Those Logs!&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Inevitably, an unexpected issue arose, and we needed those missing logs. They turned out to be the only way to pinpoint the root cause. Without them, hours ticked by without a solution, uncertainty grew, and anxiety followed the entire team.&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;Sample&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(but&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;real)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;line&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;removed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;during&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;our&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;cost-cutting&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;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-03-21T14:05:03Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"service"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"preference-engine"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ERROR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Worker queue overflow: unable to dispatch to worker pool"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requestId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"admin_42"&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;Had we kept it, a simple structured error log (such as the above) could have been easily filtered in a logging platform with a simple log query (such as the below) and allowed us to understand, diagnose, and fix the problem.&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="nv"&gt;_sourceCategory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;prod/preference-engine &lt;span class="s2"&gt;"Worker queue overflow"&lt;/span&gt;
| count by userId, requestId
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Being told to drastically reduce our logging put the entire project into a vulnerable state.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Lean Doesn’t Have to Mean Starved for Resources&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To be clear, the “do more with less” mindset isn’t inherently bad. Many startups thrive by focusing on key priorities and leveraging lightweight, efficient software. Minimalist design can lead to better quality, provided that key tooling remains in place.&lt;/p&gt;

&lt;p&gt;But this wasn’t the “good” kind of lean. And our deadline to move to the cloud was fixed. We were racing against a browser deprecation date. That meant rewriting services to a cloud-native design, coordinating with client teams, and delivering under pressure. With no time for complete test coverage or deep observability integrations, &lt;strong&gt;we relied on logs to resolve our issues&lt;/strong&gt; and help determine the root cause for unexpected scenarios. That was OK at first, we just inserted the necessary logging while working on each method.&lt;/p&gt;

&lt;p&gt;But when logging was cut back, the team was exposed. Our primary safety net was gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Root Cause Without a Net&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Internal testing went well. As production approached, we felt confident in our new cloud-based architecture. We had resolved known issues in test and met our deadline. &lt;/p&gt;

&lt;p&gt;But we soon realized that our confidence was misplaced and our test coverage was lacking.&lt;/p&gt;

&lt;p&gt;Once we were in production and real customers were using the platform, those pesky unanticipated edge cases emerged. And of course, without detailed logs or sufficient observability, we had no way to investigate the issue. The limited telemetry available simply wasn’t enough to determine what had gone wrong. &lt;/p&gt;

&lt;p&gt;If we had logs for both the backend tests and production customers on the frontend, we could have known what was happening and alerted the team (and the user). It would be a simple log query:&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="nv"&gt;_sourceCategory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;prod/preference-engine OR prod/frontend error
| &lt;span class="nb"&gt;join&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;_sourceCategory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;prod/tester-feedback “queue error” &lt;span class="o"&gt;)&lt;/span&gt;
  on requestId
| fields requestId, _sourceCategory, message
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But without the logs, reproducing the incidents locally was nearly impossible. There was just too much variability in real-world use cases. We attempted to re-enable partial logging, but this just led back to the increased ingestion costs we were asked to cut, without delivering actionable insights.&lt;/p&gt;

&lt;p&gt;In some cases, we couldn’t identify the root cause at all. That’s a tough position to be in: knowing there’s a problem affecting users and being unable to explain it. It created a pervasive sense of helplessness across the team.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;MTTR versus Signal Quality&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Yet another problem was that in our incident retrospectives, mean time to recovery (&lt;a href="https://www.sumologic.com/glossary/mttr" rel="noopener noreferrer"&gt;MTTR&lt;/a&gt;) was being treated as a headline metric. But we found that MTTR was most often a symptom, not a root cause. &lt;/p&gt;

&lt;p&gt;Industry benchmarks usually show elite teams achieve MTTR in under an hour. But what we realized was that speed isn’t just automation—it’s &lt;strong&gt;high-fidelity signals&lt;/strong&gt;. Low-fidelity signals, such as generic 500 errors or delayed alerting from aggregate metrics, don’t really help. They just introduce ambiguity and waste resources (such as precious triage time and logging budget). &lt;/p&gt;

&lt;p&gt;In contrast, detailed, contextual signals—like structured logs with userId, requestId, and a service trace—cut directly to the root cause. Observability platforms can reduce MTTR, but only if the data you ingest is actionable.&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.amazonaws.com%2Fuploads%2Farticles%2Flfk3ls3qnyl0rcg0ainm.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.amazonaws.com%2Fuploads%2Farticles%2Flfk3ls3qnyl0rcg0ainm.png" alt="Image 1" width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your logs aren’t answering these questions, your MTTR isn’t about team speed—it’s about signal clarity.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How Sumo Logic’s Model Could Have Saved The Day&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;So what could have gone differently—and better—during my cloud modernization project?&lt;/p&gt;

&lt;p&gt;First, I really wish we would have had better log analytics and application performance monitoring (APM). And along with that APM, log management, service monitors, alerts, and defined metrics closely aligned with functional success or failure. I wish (on every project) that for every new feature I had an associated metric tied to its success. &lt;/p&gt;

&lt;p&gt;And I want my logs back! In my earlier publication, “&lt;a href="https://dzone.com/articles/devsecops-its-time-to-pay-for-your-demand" rel="noopener noreferrer"&gt;DevSecOps: It’s Time To Pay for Your Demand, Not Ingestion&lt;/a&gt;,” I explored how &lt;a href="https://www.sumologic.com/" rel="noopener noreferrer"&gt;Sumo Logic&lt;/a&gt; disrupted the observability space by offering a pay-per-analysis model. Logs can be ingested continuously, but you only pay when you need to query or analyze them.&lt;/p&gt;

&lt;p&gt;Are you a team without full unit test coverage? Suffering from a lack of real-time alerts or granular metrics? On a tight budget? Withering from lack of logs?&lt;/p&gt;

&lt;p&gt;With zero-cost full ingestion, teams can log as much as they need without worries. And when that incident does finally occur (and it will), analysis can be triggered on-demand, at a justifiable cost directly tied to customer impact or business continuity. The budget folks are happy; you’re happy.&lt;/p&gt;

&lt;p&gt;This approach restores control and lowers anxiety because teams are empowered to investigate thoroughly when it matters most. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;But Wait: You Also Need Machine-Assisted Triage to Clear Up Your Queries&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;But there’s one more step. Modern observability isn’t just about having all that beautiful log data—it’s also about knowing where to look in that data. As mentioned above, you need organized, &lt;strong&gt;high-fidelity signals&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you have unlimited ingestion, you have a ton of data. And when you start looking for information, you need a place to start. To help, Sumo Logic also provides &lt;strong&gt;machine-assisted triage tools&lt;/strong&gt; that automatically group anomalous behavior, detect outliers, and surface correlated signals across services before you write a single query.&lt;/p&gt;

&lt;p&gt;Behind the scenes, Sumo Logic used statistical algorithms and machine learning to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cluster logs&lt;/strong&gt; by similarity (even if phrased differently across nodes).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Detect outliers&lt;/strong&gt; in metrics and logs (e.g., error spikes per service, region, or user cohort).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enrich anomalies&lt;/strong&gt; with metadata (e.g., AWS tags, Kubernetes pod info, deployment markers).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Natural language processing&lt;/strong&gt; clusters logs by semantic similarity, not just string matching.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially useful in the high-volume environment of unlimited ingest. Instead of sifting through tens of thousands of log lines, you get “log signatures”—condensed patterns that represent groups of related events.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Example Workflow&lt;/strong&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;_sourceCategory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;prod/&lt;span class="k"&gt;*&lt;/span&gt; error
| logreduce
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single command clusters noisy log data into actionable buckets like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Error: Worker queue overflow
Error: Auth token expired &lt;span class="k"&gt;for &lt;/span&gt;user &lt;span class="k"&gt;*&lt;/span&gt;
Error: Timeout &lt;span class="k"&gt;in &lt;/span&gt;service &lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once clustered, teams can pivot to deeper context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;| where message matches &lt;span class="s2"&gt;"Auth token expired*"&lt;/span&gt;
| count by userId, region
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result? Fewer blind searches. Faster decision paths. Less anxiety during an incident. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The “do more with less” philosophy doesn’t have to put engineering teams at a disadvantage. But it must be accompanied by the right tools. Without them, even the most capable teams can feel like they’re navigating aimlessly during an incident—leading to frustration and stress.&lt;/p&gt;

&lt;p&gt;My readers may recall my personal mission statement, which I feel can apply to any IT professional:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Focus your time on delivering features/functionality that extends the value of your intellectual property. Leverage frameworks, products, and services for everything else.” — J. Vester&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this article, we looked at how a zero-cost ingestion model aligns with this mission. It helps teams quickly identify root causes, reduce downtime, and lower stress levels—all without breaking the budget. Let’s keep those logs!&lt;/p&gt;

&lt;p&gt;Have a really great day!&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>incident</category>
      <category>analytics</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Exploring Cloud-Based Testing with the Elastic Execution Grid</title>
      <dc:creator>John Vester</dc:creator>
      <pubDate>Sat, 21 Jun 2025 10:42:51 +0000</pubDate>
      <link>https://forem.com/johnjvester/exploring-cloud-based-testing-with-the-elastic-execution-grid-45o5</link>
      <guid>https://forem.com/johnjvester/exploring-cloud-based-testing-with-the-elastic-execution-grid-45o5</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Fmj3q3q55fpoz0w0yhcnr.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2Fmj3q3q55fpoz0w0yhcnr.jpg" alt="Article Image" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You know those regression packs that used to finish while you grabbed coffee? Are they now taking hours? And that testing box you requisitioned six months ago? Is it already maxed out? And do you find yourself complaining about how resources are idling 90% of the day? &lt;/p&gt;

&lt;p&gt;Yes, it’s time to look at cloud-based testing. Which is exactly what I recently started doing. I wanted to find a testing solution that was fast, easy, and gave me flexible capacity. And one that took minimal effort for me to maintain.&lt;/p&gt;

&lt;p&gt;My first trial was the Tricentis &lt;strong&gt;Elastic Execution Grid (E2G)&lt;/strong&gt;. In this article I’ll cover what it is, what it does, and what I thought. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is the Elastic Execution Grid?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The Tricentis &lt;a href="https://www.tricentis.com/products/automate-continuous-testing-tosca/elastic-execution-grid" rel="noopener noreferrer"&gt;Elastic Execution Grid (E2G)&lt;/a&gt; is “a cloud-based environment where you can run and track tests over time.” &lt;/p&gt;

&lt;p&gt;E2G lets you run tests on cloud infrastructure that spins up when you need to run your tests … and spins down when you don’t. With E2G you aren’t required to maintain your own testing infrastructure or pay for idling computing resources. &lt;/p&gt;

&lt;p&gt;Note that E2G is flexible. It allows you to run your tests on your infrastructure or on Tricentis cloud resources. Team agents allow you to use your own infrastructure — whether that’s virtual, physical, or private cloud. In this article, however, I’m concerned only with the cloud agents that run on Tricentis resources. I want to be able to run my tests without providing my own hardware. In this article, I’ll explore these cloud agents, but don’t forget that E2G lets you choose to run on your own infrastructure as well.&lt;/p&gt;

&lt;p&gt;E2G is framework-agnostic. You can use it with Tosca, but also with other frameworks like PowerShell. At its core, E2G is a control plane that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Spins up short‑lived “agents” when a run is queued.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Routes each test to an agent that has the required tooling, then streams logs back in real-time.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I love this idea of zero-footprint testing. With the cloud agents, I can just define a few properties and E2G automatically provisions (and scales) the compute resources necessary to run my test suite. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How does the Elastic Execution Grid work?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let’s look at the architecture to understand how E2G works. E2G consists of four components: agents, agent services, characteristics, and runners.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agents&lt;/strong&gt; are the machines where you run your tests. They host the Agent Service and the Runner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agent services&lt;/strong&gt; receive the tests from the server and hand them to the Runner&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Runners&lt;/strong&gt; are the actual test frameworks that execute the tests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Characteristics define what applications your tests can work with. For example, if your tests work with MS Excel, your agent would have an “Excel” characteristic.&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.amazonaws.com%2Fuploads%2Farticles%2F583xl50rize1fpxmqmfb.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.amazonaws.com%2Fuploads%2Farticles%2F583xl50rize1fpxmqmfb.png" alt="Image 6" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s how it all works together:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Push your tests to E2G&lt;/strong&gt; - You design tests in your framework (Tosca, PowerShell, open‑source tools) and push them to E2G. The service stores your artifacts, queues and runs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Characteristics&lt;/strong&gt; - Each E2G Agent has characteristics as defined above (Excel, SAP, specific browser versions, etc). When you tag a test with its characteristics, E2G dispatches it only to agents that match. This guarantees the right tooling is present without over‑provisioning every box. &lt;a href="https://documentation.tricentis.com/cloud/od/en/content/elastic_execution_grid/elastic_execution_grid_introduction.htm" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Execute agents&lt;/strong&gt; - The Agent Service pulls the next test and hands it to the Runner, which pretends to be a user and executes the test. The Runner inherits the host machine’s permissions, so whatever apps or files your tests touch must already exist (for example, Excel must be installed if the test writes to a spreadsheet).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Collect results&lt;/strong&gt; - When execution finishes, the agent sends back logs, screenshots, and pass/fail status for your review.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;E2G in Action&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let’s try this all out. Once you have &lt;a href="https://www.tricentis.com/software-testing-tool-trial-demo/trial-tosca?utm_source=google&amp;amp;utm_medium=paidsearch&amp;amp;utm_campaign=Tosca_Search_Brand_High_EMEA_EN&amp;amp;utm_term=tosca%20demo&amp;amp;gad_source=1&amp;amp;gclid=EAIaIQobChMIkI36x7e5jAMV9pGDBx2J7A37EAAYASAAEgIFs_D_BwE" rel="noopener noreferrer"&gt;your free trial&lt;/a&gt; you’re ready. It’s a pretty simple process.&lt;/p&gt;

&lt;p&gt;To run a test playlist on a cloud agent, open the Agent Characteristics tab of the Playlist details for the playlist you want to run and check the “Cloud-agent” box. Tosca will know that you need a cloud agent provisioned.&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.amazonaws.com%2Fuploads%2Farticles%2Fszfskt50l9v14o8b4cm5.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.amazonaws.com%2Fuploads%2Farticles%2Fszfskt50l9v14o8b4cm5.png" alt="Image 3" width="800" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click to start your tests and Tosa will schedule them in the Test Run tab of Tosca. You can track the progress of your test suite from here. E2G will scale the cloud resources as needed—I don’t have to worry about any bottlenecks.&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.amazonaws.com%2Fuploads%2Farticles%2F93v88hppz7f8ei4j3t1u.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.amazonaws.com%2Fuploads%2Farticles%2F93v88hppz7f8ei4j3t1u.png" alt="Image 1" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The tests shown here are some of the samples that were provisioned for my trial account. &lt;/p&gt;

&lt;p&gt;E2G can also split a test suite across multiple agents to speed up runs. You can indicate tests that can run in parallel on the playlist. You can also mark tests as dependent on each other to force them to run in a certain sequence.&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.amazonaws.com%2Fuploads%2Farticles%2F1pv00kfs42geb4nca4jx.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.amazonaws.com%2Fuploads%2Farticles%2F1pv00kfs42geb4nca4jx.png" alt="Image 7" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What happens when things go wrong?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;One concern I have with cloud-based testing is debugging. While ephemeral testing infrastructure is easier to manage than dedicated testing machines, using it also means that debugging can be more difficult.&lt;/p&gt;

&lt;p&gt;In E2G, it’s just like debugging local tests. When a playlist is sent, whether through cloud agents or team agents, the outcome is reported in the test run interface. Here you can see pass/fail, progress, and eventual outcome of the playlist.&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.amazonaws.com%2Fuploads%2Farticles%2F6cqutcxbjyteixqx1vkz.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.amazonaws.com%2Fuploads%2Farticles%2F6cqutcxbjyteixqx1vkz.png" alt="Image 5" width="800" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can click in here on a specific test and see details of why your tests passed or failed, including any logs or screen recordings.&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.amazonaws.com%2Fuploads%2Farticles%2Fpmpiy8bofv0be27z8frv.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.amazonaws.com%2Fuploads%2Farticles%2Fpmpiy8bofv0be27z8frv.png" alt="Image 2" width="800" height="286"&gt;&lt;/a&gt;&lt;br&gt;
The ability to click straight into the failing test case makes remediation just about the same as it usually is. I can see situations where I might need more detail … but as a back-up I can always run the tests on my local machine using Tosca’s personal agent. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How secure is E2G?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Another concern I have with cloud-based testing infrastructure is regulatory or policy requirements. Here’s what I found for E2G:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Tricentis is &lt;a href="https://www.tricentis.com/trust/security" rel="noopener noreferrer"&gt;SOC/ISO compatible.&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The VMs used for cloud testing are temporary. As soon as your tests are over, they are terminated. Since they no longer exist, they don’t exist as attack vectors or as a gateway to your infrastructure. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All data is encrypted and transferred via HTTPS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Uploads (test artifacts, results) are stored for 28 days, then deleted&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;My remaining questions&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;There are a couple areas where I still had concerns: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You are default limited to 50 concurrent agents and 50MB artifacts. This could limit your ability to run a large number of tests in parallel or could limit the size of your data files. However, you can request a bump if you need more. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I feel like there are still situations where I will want (or need?) to run a test locally. Just to have that minute control and information. Of course, I can just choose the personal agent with E2G and do just that! So this really is just me getting comfortable with cloud testing. We’ll see if I get more comfortable as time goes on.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Give it a try!&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Cloud-based testing is here and I’m a fan. I don’t expect a magic bullet for all my problems—but I’m excited to finally have a way to manage spikes and wasted resources. Renting 20 agents for 10 minutes seems better than owning two agents forever. And E2G feels like a solid solution. I like the framework flexibility and ease of switching between cloud and local tests in one place. I look forward to exploring it more.&lt;/p&gt;

&lt;p&gt;Have a really great day!&lt;/p&gt;

</description>
      <category>testing</category>
      <category>cloud</category>
      <category>tricentis</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The Missing Infrastructure Layer: Why AI's Next Evolution Requires Distributed Systems Thinking</title>
      <dc:creator>John Vester</dc:creator>
      <pubDate>Fri, 13 Jun 2025 10:27:41 +0000</pubDate>
      <link>https://forem.com/johnjvester/the-missing-infrastructure-layer-why-ais-next-evolution-requires-distributed-systems-thinking-9ig</link>
      <guid>https://forem.com/johnjvester/the-missing-infrastructure-layer-why-ais-next-evolution-requires-distributed-systems-thinking-9ig</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Fz18fdlxvujhmpdvldknp.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2Fz18fdlxvujhmpdvldknp.jpg" alt="Article Image" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The recent announcement of &lt;a href="https://kubemq-aiway.com/" rel="noopener noreferrer"&gt;KubeMQ-Aiway&lt;/a&gt; caught my attention not as another AI platform launch, but as validation of a trend I've been tracking across the industry. After spending the last two decades building distributed systems and the past three years deep in AI infrastructure consulting, the patterns are becoming unmistakable: we're at the same inflection point that microservices faced a decade ago.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Distributed Systems Crisis in AI&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We've been here before. In the early 2010s, as monolithic architectures crumbled under scale pressures, we frantically cobbled together microservices with HTTP calls and prayed our systems wouldn't collapse. It took years to develop proper service meshes, message brokers, and orchestration layers that made distributed systems reliable rather than just functional.&lt;/p&gt;

&lt;p&gt;The same crisis is unfolding with AI systems, but the timeline is compressed. Organizations that started with single-purpose AI models are rapidly discovering they need multiple specialized agents working in concert—and their existing infrastructure simply wasn't designed for this level of coordination complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Traditional Infrastructure Fails AI Agents&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Across my consulting engagements, I'm seeing consistent patterns of infrastructure failure when organizations try to scale AI beyond proof-of-concepts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP Communication Breaks Down:&lt;/strong&gt; Traditional request-response patterns work for stateless operations but fail when AI agents need to maintain context across extended workflows, coordinate parallel processing, or handle operations that take minutes rather than milliseconds. The synchronous nature of HTTP creates cascading failures that bring down entire AI workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context Fragmentation Destroys Intelligence:&lt;/strong&gt; AI agents aren't just processing data—they're maintaining conversational state and building accumulated knowledge. When that context gets lost at service boundaries or fragmented across sessions, the system's collective intelligence degrades dramatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Models are Fundamentally Flawed:&lt;/strong&gt; Most AI implementations share credentials through environment variables or configuration files. This creates lateral movement risks and privilege escalation vulnerabilities that traditional security models weren't designed to handle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architectural Constraints Force Bad Decisions:&lt;/strong&gt; Tool limitations in current AI systems force teams into anti-patterns—building meta-tools, fragmenting capabilities, or implementing complex dynamic loading mechanisms. Each workaround introduces new failure modes and operational complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Evaluating the KubeMQ-Aiway Technical Solution&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;KubeMQ-Aiway is “the industry’s first purpose-built connectivity hub for AI agents and Model-Context-Protocol (MCP) servers. It enables seamless routing, security, and scaling of all interactions—whether synchronous RPC calls or asynchronous streaming—through a unified, multi-tenant-ready infrastructure layer.”  In other words, it’s the hub that manages and routes messages between systems, services, and AI agents.&lt;/p&gt;

&lt;p&gt;Through their early access program, I recently explored KubeMQ-Aiway's architecture. Several aspects stood out as particularly well-designed for these challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unified Aggregation Layer:&lt;/strong&gt; Rather than forcing point-to-point connections between agents, they've created a single integration hub that all agents and MCP servers connect through. This is architecturally sound—it eliminates the N-squared connection problem that kills system reliability at scale. More importantly, it provides a single point of control for monitoring, security, and operational management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multi-Pattern Communication Architecture:&lt;/strong&gt; The platform supports both synchronous and asynchronous messaging natively, with pub/sub patterns and message queuing built-in. This is crucial because AI workflows aren't purely request-response—they're event-driven processes that need fire-and-forget capabilities, parallel processing, and long-running operations. The architecture includes automatic retry mechanisms, load balancing, and connection pooling that are essential for production reliability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Virtual MCP Implementation:&lt;/strong&gt; This is particularly clever—instead of trying to increase tool limits within existing LLM constraints, they've abstracted tool organization at the infrastructure layer. Virtual MCPs allow logical grouping of tools by domain or function while presenting a unified interface to the AI system. It's the same abstraction pattern that made container orchestration successful.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Role-Based Security Model:&lt;/strong&gt; The built-in moderation system implements proper separation of concerns with consumer and administrator roles. More importantly, it handles credential management at the infrastructure level rather than forcing applications to manage secrets. This includes end-to-end encryption, certificate-based authentication, and comprehensive audit logging—security patterns that are proven in distributed systems but rarely implemented correctly in AI platforms.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Technical Architecture Deep Dive&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;What also impresses me is  their attention to distributed systems fundamentals:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Event Sourcing and Message Durability:&lt;/strong&gt; The platform maintains a complete audit trail of agent interactions, which is essential for debugging complex multi-agent workflows. Unlike HTTP-based systems where you lose interaction history, this enables replay and analysis capabilities that are crucial for production systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Circuit Breaker and Backpressure Patterns:&lt;/strong&gt; Built-in failure isolation prevents cascade failures when individual agents malfunction or become overloaded. The backpressure mechanisms ensure that fast-producing agents don't overwhelm slower downstream systems—a critical capability when dealing with AI agents that can generate work at unpredictable rates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service Discovery and Health Checking:&lt;/strong&gt; Agents can discover and connect to other agents dynamically without hardcoded endpoints. The health checking ensures that failed agents are automatically removed from routing tables, maintaining system reliability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context Preservation Architecture:&lt;/strong&gt; Perhaps most importantly, they've solved the context management problem that plagues most AI orchestration attempts. The platform maintains conversational state and working memory across agent interactions, ensuring that the collective intelligence of the system doesn't degrade due to infrastructure limitations.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Production Readiness Indicators&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;From an operational perspective, KubeMQ-Aiway demonstrates several characteristics that distinguish production-ready infrastructure from experimental tooling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Observability:&lt;/strong&gt; Comprehensive monitoring, metrics, and distributed tracing for multi-agent workflows. This is essential for operating AI systems at scale where debugging requires understanding complex interaction patterns.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability Design:&lt;/strong&gt; The architecture supports horizontal scaling of both the infrastructure layer and individual agents without requiring system redesign. This is crucial as AI workloads are inherently unpredictable and bursty.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Operational Simplicity:&lt;/strong&gt; Despite the sophisticated capabilities, the operational model is straightforward—agents connect to a single aggregation point rather than requiring complex service mesh configurations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Market Timing and Competitive Analysis&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The timing of this launch is significant. Most organizations are hitting the infrastructure wall with their AI implementations right now, but existing solutions are either too simplistic (basic HTTP APIs) or too complex (trying to adapt traditional service meshes for AI workloads).&lt;/p&gt;

&lt;p&gt;KubeMQ-Aiway appears to have found the right abstraction level—sophisticated enough to handle complex AI orchestration requirements, but simple enough for development teams to adopt without becoming distributed systems experts.&lt;/p&gt;

&lt;p&gt;Compared to building similar capabilities internally, the engineering effort would be substantial. The distributed systems expertise required, combined with AI-specific requirements, represents months or years of infrastructure engineering work that most organizations can't justify when production AI solutions are available.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Strategic Implications&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;For technology leaders, the emergence of production-ready AI infrastructure platforms changes the strategic calculation around AI implementation. The question shifts from "should we build AI infrastructure" to "which platform enables our AI strategy most effectively."&lt;/p&gt;

&lt;p&gt;Early adopters of proper AI infrastructure are successfully running complex multi-agent systems at production scale while their competitors struggle with basic agent coordination. This gap will only widen as AI implementations become more sophisticated.&lt;/p&gt;

&lt;p&gt;The distributed systems problems in AI won't solve themselves, and application-layer workarounds don't scale. Infrastructure solutions like KubeMQ-Aiway represent how AI transitions from experimental projects to production systems that deliver sustainable business value.&lt;/p&gt;

&lt;p&gt;Organizations that recognize this pattern and invest in proven AI infrastructure will maintain competitive advantage over those that continue trying to solve infrastructure problems at the application layer.&lt;/p&gt;

&lt;p&gt;Have a really great day!&lt;/p&gt;

</description>
      <category>kubemq</category>
      <category>ai</category>
      <category>tutorial</category>
      <category>learning</category>
    </item>
    <item>
      <title>How To Introduce a New API Quickly Using Micronaut</title>
      <dc:creator>John Vester</dc:creator>
      <pubDate>Wed, 28 May 2025 13:27:42 +0000</pubDate>
      <link>https://forem.com/johnjvester/how-to-introduce-a-new-api-quickly-using-micronaut-4h8</link>
      <guid>https://forem.com/johnjvester/how-to-introduce-a-new-api-quickly-using-micronaut-4h8</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2F6dkz9ezuj4pqjh2z2lxt.jpg" 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.amazonaws.com%2Fuploads%2Farticles%2F6dkz9ezuj4pqjh2z2lxt.jpg" alt="Article Image" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the first two articles of this series (&lt;a href="https://dzone.com/articles/introduce-new-api-spring-boot-gradle" rel="noopener noreferrer"&gt;part 1&lt;/a&gt; and &lt;a href="https://dzone.com/articles/build-api-with-spring-boot-and-maven" rel="noopener noreferrer"&gt;part 2&lt;/a&gt;), I demonstrated how quickly an idea can become a reality using Spring Boot, the framework I have used for over 10 years to establish new services. I stepped out of my comfort zone in the last article (&lt;a href="https://dzone.com/articles/introduce-api-quarkus-chatgpt" rel="noopener noreferrer"&gt;part 3&lt;/a&gt;) when I used Quarkus for the first time, which offered a really nice CLI to assist with the development process.&lt;/p&gt;

&lt;p&gt;I would like to close out this short series with another framework that’s new (to me), called &lt;a href="https://micronaut.io/" rel="noopener noreferrer"&gt;Micronaut&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Micronaut is an open-source JDK-based framework focused on lightweight microservices. Under the hood, Micronaut does not rely on reflective programming, but emphasizes an inversion of control (IoC) design which results in less memory usage and a much faster start time. A robust CLI exists too.&lt;/p&gt;

&lt;p&gt;While the service should start fast, the biggest question I have is: “&lt;strong&gt;How quickly can I transform my motivation quotes idea to a reality using Micronaut?&lt;/strong&gt;”&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Getting Started with Micronaut&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As noted above, just like with Spring Boot and Quarkus, Micronaut also has a CLI (&lt;code&gt;mn&lt;/code&gt;). There is also an initializer (called a &lt;a href="https://micronaut.io/launch/" rel="noopener noreferrer"&gt;launcher&lt;/a&gt;), which is very similar to what Spring Boot offers. For this article, we’ll use the CLI, and I’ll use Homebrew to perform the install:&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="nv"&gt;$ &lt;/span&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; micronaut-projects/tap/micronaut
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other installation options can be found &lt;a href="https://micronaut-projects.github.io/micronaut-starter/latest/guide/#installation" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To get started, we’ll issue the &lt;code&gt;mn&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;&lt;span class="nv"&gt;$ &lt;/span&gt;mn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;For MacOS users, you will likely need to visit the Privacy &amp;amp; Security section in System Settings to allow the use of the&lt;/em&gt; &lt;code&gt;mn&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;We’ll simply use &lt;code&gt;create&lt;/code&gt; to interactively initialize a new service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mn&amp;gt; create

Apr 01, 2025 2:52:20 PM org.jline.utils.Log logr
WARNING: Unable to create a system terminal, creating a dumb terminal &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;enable &lt;/span&gt;debug logging &lt;span class="k"&gt;for &lt;/span&gt;more information&lt;span class="o"&gt;)&lt;/span&gt;
What &lt;span class="nb"&gt;type &lt;/span&gt;of application &lt;span class="k"&gt;do &lt;/span&gt;you want to create? &lt;span class="o"&gt;(&lt;/span&gt;enter &lt;span class="k"&gt;for &lt;/span&gt;default&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt; Micronaut Application
 2&lt;span class="o"&gt;)&lt;/span&gt; Micronaut CLI Application
 3&lt;span class="o"&gt;)&lt;/span&gt; Micronaut Serverless Function
 4&lt;span class="o"&gt;)&lt;/span&gt; Micronaut gRPC Application
 5&lt;span class="o"&gt;)&lt;/span&gt; Micronaut Messaging Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We’ll select the &lt;strong&gt;default&lt;/strong&gt; option to create a new application.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Choose your preferred language. &lt;span class="o"&gt;(&lt;/span&gt;enter &lt;span class="k"&gt;for &lt;/span&gt;default&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt; Java
 2&lt;span class="o"&gt;)&lt;/span&gt; Groovy
 3&lt;span class="o"&gt;)&lt;/span&gt; Kotlin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We’ll use &lt;strong&gt;Java&lt;/strong&gt; for this exercise.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Choose your preferred &lt;span class="nb"&gt;test &lt;/span&gt;framework. &lt;span class="o"&gt;(&lt;/span&gt;enter &lt;span class="k"&gt;for &lt;/span&gt;default&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt; JUnit
 2&lt;span class="o"&gt;)&lt;/span&gt; Spock
 3&lt;span class="o"&gt;)&lt;/span&gt; Kotest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We’ll use &lt;strong&gt;JUnit&lt;/strong&gt; for our test framework.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Choose your preferred build tool. &lt;span class="o"&gt;(&lt;/span&gt;enter &lt;span class="k"&gt;for &lt;/span&gt;default&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt; Gradle &lt;span class="o"&gt;(&lt;/span&gt;Groovy&lt;span class="o"&gt;)&lt;/span&gt;
 2&lt;span class="o"&gt;)&lt;/span&gt; Gradle &lt;span class="o"&gt;(&lt;/span&gt;Kotlin&lt;span class="o"&gt;)&lt;/span&gt;
 3&lt;span class="o"&gt;)&lt;/span&gt; Maven
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We’ll plan to use &lt;strong&gt;Gradle (Groovy)&lt;/strong&gt; this time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Choose the target JDK. &lt;span class="o"&gt;(&lt;/span&gt;enter &lt;span class="k"&gt;for &lt;/span&gt;default&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt; 17
 2&lt;span class="o"&gt;)&lt;/span&gt; 21
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We’ll stick with &lt;strong&gt;Java 17&lt;/strong&gt;, since it matches what we’ve used for other articles in this series.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Enter any features to apply. Use tab &lt;span class="k"&gt;for &lt;/span&gt;autocomplete and separate by a space.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For now, we’ll add support for OpenAPI and Swagger and press the &lt;strong&gt;return&lt;/strong&gt; key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openapi swagger-ui
&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;Enter a name &lt;span class="k"&gt;for &lt;/span&gt;the project.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We’ll use the name &lt;code&gt;quotes-micronaut&lt;/code&gt; for our project.&lt;/p&gt;

&lt;p&gt;Now let’s exit out of &lt;code&gt;mn&lt;/code&gt; using Control-C and check out the base directory structure:&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;quotes-micronaut &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
total 88
drwxr-xr-x@ 13 johnvester   416 Apr  1 14:58 &lt;span class="nb"&gt;.&lt;/span&gt;
drwxrwxrwx  93 root        2976 Apr  1 14:58 ..
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;@  1 johnvester   127 Apr  1 14:58 .gitignore
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;@  1 johnvester  1380 Apr  1 14:58 README.md
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;@  1 johnvester  1590 Apr  1 14:58 build.gradle
drwxr-xr-x@  3 johnvester    96 Apr  1 14:58 gradle
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;@  1 johnvester    23 Apr  1 14:58 gradle.properties
&lt;span class="nt"&gt;-rwxr--r--&lt;/span&gt;@  1 johnvester  8762 Apr  1 14:58 gradlew
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;@  1 johnvester  2966 Apr  1 14:58 gradlew.bat
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;@  1 johnvester   367 Apr  1 14:58 micronaut-cli.yml
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;@  1 johnvester   182 Apr  1 14:58 openapi.properties
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;@  1 johnvester    39 Apr  1 14:58 settings.gradle
drwxr-xr-x@  4 johnvester   128 Apr  1 14:58 src
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can open the project in IntelliJ and run the &lt;code&gt;Application&lt;/code&gt; class:&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="se"&gt;\/&lt;/span&gt;  &lt;span class="o"&gt;(&lt;/span&gt;_&lt;span class="o"&gt;)&lt;/span&gt; ___ _ __ ___  _ __   __ _ _   _| |_ 
| |&lt;span class="se"&gt;\/&lt;/span&gt;| | |/ __| &lt;span class="s1"&gt;'__/ _ \| '&lt;/span&gt;_ &lt;span class="se"&gt;\ &lt;/span&gt;/ _&lt;span class="sb"&gt;`&lt;/span&gt; | | | | __|
| |  | | | &lt;span class="o"&gt;(&lt;/span&gt;__| | | &lt;span class="o"&gt;(&lt;/span&gt;_&lt;span class="o"&gt;)&lt;/span&gt; | | | | &lt;span class="o"&gt;(&lt;/span&gt;_| | |_| | |_ 
|_|  |_|_|&lt;span class="se"&gt;\_&lt;/span&gt;__|_|  &lt;span class="se"&gt;\_&lt;/span&gt;__/|_| |_|&lt;span class="se"&gt;\_&lt;/span&gt;_,_|&lt;span class="se"&gt;\_&lt;/span&gt;_,_|&lt;span class="se"&gt;\_&lt;/span&gt;_|
15:01:56.083 &lt;span class="o"&gt;[&lt;/span&gt;main] INFO  io.micronaut.runtime.Micronaut - 
Startup completed &lt;span class="k"&gt;in &lt;/span&gt;648ms. Server Running: http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can validate that the RESTful API is working, too, by calling the URI configured in the &lt;code&gt;QuotesMicronautController&lt;/code&gt; class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Controller&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/quotes-micronaut"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;QuotesMicronautController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uri&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;produces&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text/plain"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Example Response"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We’ll use the following &lt;code&gt;cURL&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;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'http://localhost:8080/quotes-micronaut'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This returns the following text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Example Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The only difference I saw with using the CLI over the launcher is that I wasn’t able to specify a base package. That’s okay, because we can use the CLI to establish the rest of our classes:&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="nv"&gt;$ &lt;/span&gt;mn create-bean quotes.micronaut.repositories.QuotesRepository
&lt;span class="nv"&gt;$ &lt;/span&gt;mn create-bean quotes.micronaut.services.QuotesService
&lt;span class="nv"&gt;$ &lt;/span&gt;mn create-bean quotes.micronaut.controllers.QuotesController
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ll notice we are creating our own controller class. This is simply to follow the same approach I’ve used in my earlier articles. The auto-generated &lt;code&gt;QuotesMicronautController&lt;/code&gt; would have worked just fine.&lt;/p&gt;

&lt;p&gt;To make things less complicated for the injection side of things, we can use &lt;a href="https://projectlombok.org/" rel="noopener noreferrer"&gt;Lombok&lt;/a&gt;, adding the following dependencies to the &lt;code&gt;build.gradle&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;compileOnly&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"org.projectlombok:lombok"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;annotationProcessor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"org.projectlombok:lombok"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Minor Roadblock with OpenAPI Generation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When I looked up the server-side OpenAPI &lt;a href="https://openapi-generator.tech/docs/generators" rel="noopener noreferrer"&gt;generators&lt;/a&gt;, I was excited to see &lt;code&gt;java-micronaut-server&lt;/code&gt; as an option. Upon further review, the &lt;a href="https://openapi-generator.tech/docs/generators/java-micronaut-server/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; indicated this has a stability level of “BETA.” &lt;/p&gt;

&lt;p&gt;The beta version was able to generate the expected Quote model object, but I ran into issues trying to generate an interface or abstract class that my controllers could extend. So I decided to create an issue in the &lt;code&gt;openapi-generator&lt;/code&gt; library (&lt;a href="https://github.com/OpenAPITools/openapi-generator/issues/21089" rel="noopener noreferrer"&gt;link&lt;/a&gt; for those who are interested in the details) and pivot toward another approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Using Cursor AI to Convert My Quarkus Service&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;While sharing this experience with &lt;a href="https://www.linkedin.com/in/alvin-lee-38662843/" rel="noopener noreferrer"&gt;Alvin Lee&lt;/a&gt; (a longtime colleague), he had an idea. Alvin asked, “What if we use &lt;a href="https://www.cursor.com/en" rel="noopener noreferrer"&gt;Cursor AI&lt;/a&gt; to analyze your Quarkus repo and port it to Micronaut for us?”&lt;/p&gt;

&lt;p&gt;I told Alvin to “go for it” and became excited, because this article really had not required the use of AI like the other articles in the series.&lt;/p&gt;

&lt;p&gt;I gave Alvin access to fork my Quarkus repo and within a matter of minutes, the service was completely ported to Micronaut. Let’s quickly review the classes that were created automatically.&lt;/p&gt;

&lt;p&gt;First, let’s review the repository layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Singleton&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;QuotesRepository&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Quote&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;QUOTES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;Quote&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;quote&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The greatest glory in living lies not in never falling, but in rising every time we fall."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
    &lt;span class="nc"&gt;Quote&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;quote&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The way to get started is to quit talking and begin doing."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
    &lt;span class="nc"&gt;Quote&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;quote&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Your time is limited, so don't waste it living someone else's life."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
    &lt;span class="nc"&gt;Quote&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;quote&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"If life were predictable it would cease to be life, and be without flavor."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
    &lt;span class="nc"&gt;Quote&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;quote&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"If you set your goals ridiculously high and it's a failure, you will fail above everyone else's success."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
  &lt;span class="o"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Quote&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getAllQuotes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;QUOTES&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Quote&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getQuoteById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;QUOTES&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; 
      &lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;findFirst&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, let’s take a look at the service layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Singleton&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;QuotesService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;QuotesRepository&lt;/span&gt; &lt;span class="n"&gt;quotesRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="nd"&gt;@Inject&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;QuotesService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;QuotesRepository&lt;/span&gt; &lt;span class="n"&gt;quotesRepository&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;quotesRepository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quotesRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Quote&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getAllQuotes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;quotesRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAllQuotes&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Quote&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getQuoteById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;quotesRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getQuoteById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Quote&lt;/span&gt; &lt;span class="nf"&gt;getRandomQuote&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Quote&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;quotes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quotesRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAllQuotes&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;quotes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ThreadLocalRandom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;current&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;nextInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quotes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()));&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, we can examine the controller that will be the consumer-facing interface to our API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Controller&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/quotes"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;QuotesController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@Inject&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;QuotesService&lt;/span&gt; &lt;span class="n"&gt;quotesService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="nd"&gt;@Get&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Quote&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getAllQuotes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;quotesService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAllQuotes&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@Get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/{id}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Quote&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getQuoteById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@PathVariable&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;quotesService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getQuoteById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@Get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/random"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Quote&lt;/span&gt; &lt;span class="nf"&gt;getRandomQuote&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;quotesService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRandomQuote&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Validating Our Service Locally&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To validate the service locally, we’ll start the service from IntelliJ like we did before:&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="se"&gt;\/&lt;/span&gt;  &lt;span class="o"&gt;(&lt;/span&gt;_&lt;span class="o"&gt;)&lt;/span&gt; ___ _ __ ___  _ __   __ _ _   _| |_ 
| |&lt;span class="se"&gt;\/&lt;/span&gt;| | |/ __| &lt;span class="s1"&gt;'__/ _ \| '&lt;/span&gt;_ &lt;span class="se"&gt;\ &lt;/span&gt;/ _&lt;span class="sb"&gt;`&lt;/span&gt; | | | | __|
| |  | | | &lt;span class="o"&gt;(&lt;/span&gt;__| | | &lt;span class="o"&gt;(&lt;/span&gt;_&lt;span class="o"&gt;)&lt;/span&gt; | | | | &lt;span class="o"&gt;(&lt;/span&gt;_| | |_| | |_ 
|_|  |_|_|&lt;span class="se"&gt;\_&lt;/span&gt;__|_|  &lt;span class="se"&gt;\_&lt;/span&gt;__/|_| |_|&lt;span class="se"&gt;\_&lt;/span&gt;_,_|&lt;span class="se"&gt;\_&lt;/span&gt;_,_|&lt;span class="se"&gt;\_&lt;/span&gt;_|
21:18:54.740 &lt;span class="o"&gt;[&lt;/span&gt;main] INFO  io.micronaut.runtime.Micronaut - 
Startup completed &lt;span class="k"&gt;in &lt;/span&gt;284ms. Server Running: http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With all the code in place, the Micronaut service started in just &lt;strong&gt;284 milliseconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We’ll use the following cURL command to retrieve a random motivational quote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'http://localhost:8080/quotes/random'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I received a &lt;code&gt;200 OK&lt;/code&gt; HTTP response and the following JSON payload:&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your time is limited, so don't waste it living someone else's life."&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;Looks like the port was quick and successful! Now it is time to deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Leveraging Heroku to Deploy the Service&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Since I used Heroku for my prior articles, I wondered if support existed for Micronaut services. &lt;/p&gt;

&lt;p&gt;Although &lt;a href="https://www.heroku.com/blog/simplifying-jvm-app-development-herokus-buildpack-magic/#micronaut-development-framework" rel="noopener noreferrer"&gt;Heroku recently published some updated information&lt;/a&gt; regarding Micronaut support in its Java buildpack, I felt like I could use my existing experience to get things going. Selecting Heroku helps me deploy my services quickly, and I don’t lose time dealing with infrastructure concerns.&lt;/p&gt;

&lt;p&gt;The first thing I needed to do was add the following line to the &lt;code&gt;application.properties&lt;/code&gt; file to make sure the server’s port could be overridden by Heroku:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;micronaut.server.port&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;${PORT:8080}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, I created a &lt;code&gt;system.properties&lt;/code&gt; file to specify we are using Java version 17:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;java.runtime.version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;17&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Knowing that Heroku runs the “stage” Gradle task as part of the deployment, we can specify this in the manifest file we plan to use by adding the following lines to the &lt;code&gt;build.gradle&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;jar&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;manifest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;attributes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
      &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nc"&gt;Main&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Class&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;quotes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;micronaut&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Application&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="nf"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;dependsOn:&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mustRunAfter&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ordinarily, for running apps on Heroku&lt;a href="https://docs.micronaut.io/4.0.5/api/io/micronaut/context/env/Environment.html#HEROKU" rel="noopener noreferrer"&gt;, we w&lt;/a&gt;ould need to add a &lt;code&gt;Procfile&lt;/code&gt;, where we specify the &lt;a href="https://docs.micronaut.io/4.0.5/api/io/micronaut/context/env/Environment.html#HEROKU" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt; environment, reference the path to where the stage-based JARs will reside, and use the port set by Heroku. That file might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;web: java &lt;span class="nv"&gt;$JAVA_OPTS&lt;/span&gt; &lt;span class="nt"&gt;-Dmicronaut&lt;/span&gt;.environments&lt;span class="o"&gt;=&lt;/span&gt;heroku &lt;span class="nt"&gt;-Dserver&lt;/span&gt;.port&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PORT&lt;/span&gt; &lt;span class="nt"&gt;-jar&lt;/span&gt; build/libs/&lt;span class="k"&gt;*&lt;/span&gt;.jar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, on detecting a Micronaut app, the Heroku buildpack defaults to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-Dmicronaut&lt;/span&gt;.server.port&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PORT&lt;/span&gt; &lt;span class="nv"&gt;$JAVA_OPTS&lt;/span&gt; &lt;span class="nt"&gt;-jar&lt;/span&gt; build/libs/&lt;span class="k"&gt;*&lt;/span&gt;.jar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;… and that's exactly what I need. No need for a &lt;code&gt;Procfile&lt;/code&gt; after all! That's pretty slick.&lt;/p&gt;

&lt;p&gt;Now we just need to login to Heroku and create a new application:&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="nv"&gt;$ &lt;/span&gt;heroku login 
&lt;span class="nv"&gt;$ &lt;/span&gt;heroku create
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI responds with the following response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Creating app... &lt;span class="k"&gt;done&lt;/span&gt;, ⬢ aqueous-reef-26810
https://aqueous-reef-26810-4db1994daff4.herokuapp.com/ | 
https://git.heroku.com/aqueous-reef-26810.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Heroku app instance is named &lt;code&gt;aqueous-reef-26810-4db1994daff4&lt;/code&gt;, so my service will run at &lt;a href="https://aqueous-reef-26810-4db1994daff4.herokuapp.com/" rel="noopener noreferrer"&gt;https://aqueous-reef-26810-4db1994daff4.herokuapp.com/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One last thing to do … push the code to Heroku, which deploys the service:&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="nv"&gt;$ &lt;/span&gt;git push heroku main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Switching to Heroku dashboard, we see our service has deployed successfully:&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.amazonaws.com%2Fuploads%2Farticles%2Ff6a3b75drhjr1czfoki4.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.amazonaws.com%2Fuploads%2Farticles%2Ff6a3b75drhjr1czfoki4.png" alt="Image 1" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are now ready to give our service a try from the internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Motivational Quotes in Action&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Using the Heroku app URL, &lt;a href="https://aqueous-reef-26810-4db1994daff4.herokuapp.com/" rel="noopener noreferrer"&gt;https://aqueous-reef-26810-4db1994daff4.herokuapp.com/&lt;/a&gt;, we can now test our Motivational Quotes API using curl commands. &lt;/p&gt;

&lt;p&gt;First, we retrieve the list of quotes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://aqueous-reef-26810-4db1994daff4.herokuapp.com/quotes'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;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;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The greatest glory in living lies not in never falling, but in rising every time we fall."&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The way to get started is to quit talking and begin doing."&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your time is limited, so don't waste it living someone else's life."&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"If life were predictable it would cease to be life, and be without flavor."&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"If you set your goals ridiculously high and it's a failure, you will fail above everyone else's success."&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="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;We can retrieve a single quote by its ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://aqueous-reef-26810-4db1994daff4.herokuapp.com/quotes/4'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"If life were predictable it would cease to be life, and be without flavor."&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;We can retrieve a random motivational quote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s1"&gt;'https://aqueous-reef-26810-4db1994daff4.herokuapp.com/quotes/random'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your time is limited, so don't waste it living someone else's life."&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;We can even view the auto-generated Swagger UI via Heroku:&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.amazonaws.com%2Fuploads%2Farticles%2Fqn38kc18mdnntudrex3a.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.amazonaws.com%2Fuploads%2Farticles%2Fqn38kc18mdnntudrex3a.png" alt="Image 2" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In this article, I had to step outside my comfort zone again—this time working with Micronaut for the very first time. Along the way, I ran into an unexpected issue which caused me to pivot my approach to leverage AI—more specifically: Cursor. Once ready, I was able to use my existing knowledge to deploy the service to Heroku and validate everything was working as expected.&lt;/p&gt;

&lt;p&gt;My readers may recall my personal mission statement, which I feel can apply to any IT professional:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Focus your time on delivering features/functionality that extends the value of your intellectual property. Leverage frameworks, products, and services for everything else.” — J. Vester&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Micronaut offered a fully-functional CLI and a service which started the fastest of all the frameworks in the series. Cursor helped us stay on track by porting our Quarkus service to Micronaut. Like before, Heroku provided a fast and easy way to deploy the service without having to worry about any infrastructure concerns.&lt;/p&gt;

&lt;p&gt;All three key solutions fully adhered to my mission statement, allowing me to not only be able to focus on my idea, but to make it an internet-accessible reality … quickly!&lt;/p&gt;

&lt;p&gt;If you are interested in the source code for this article, it is available on &lt;a href="https://gitlab.com/johnjvester/quotes-micronaut" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Have a really great day!&lt;/p&gt;

</description>
      <category>restapi</category>
      <category>cursor</category>
      <category>micronaut</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
