{"id":4462,"date":"2026-06-30T11:12:28","date_gmt":"2026-06-30T11:12:28","guid":{"rendered":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2026\/06\/30\/building-a-simple-event-driven-application-with-datadog-workflows\/"},"modified":"2026-06-30T11:12:28","modified_gmt":"2026-06-30T11:12:28","slug":"building-a-simple-event-driven-application-with-datadog-workflows","status":"publish","type":"post","link":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2026\/06\/30\/building-a-simple-event-driven-application-with-datadog-workflows\/","title":{"rendered":"Building a Simple Event-Driven Application with Datadog Workflows"},"content":{"rendered":"<div><img data-opt-id=1731818984  fetchpriority=\"high\" decoding=\"async\" width=\"770\" height=\"330\" src=\"https:\/\/devops.com\/wp-content\/uploads\/2020\/05\/How-FaaS-Is-Disrupting-Workflows.jpg\" class=\"attachment-large size-large wp-post-image\" alt=\"Workflows, DevOps, AI, DevOps workflows, code Postman Dynatrace GitLab value Argo Atlassian database Sqlcommenter flow metrics VSM low-code PostgreSQL database JSON\" \/><\/div>\n<p><img data-opt-id=1841722889  fetchpriority=\"high\" decoding=\"async\" width=\"150\" height=\"150\" src=\"https:\/\/devops.com\/wp-content\/uploads\/2020\/05\/How-FaaS-Is-Disrupting-Workflows-150x150.jpg\" class=\"attachment-thumbnail size-thumbnail wp-post-image\" alt=\"Workflows, DevOps, AI, DevOps workflows, code Postman Dynatrace GitLab value Argo Atlassian database Sqlcommenter flow metrics VSM low-code PostgreSQL database JSON\" \/><\/p>\n<p>Back in October 2022, I <a href=\"https:\/\/www.rapdev.io\/blog\/automating-rapdevs-datadog-marketplace-sales-cycle-2\" target=\"_blank\" rel=\"noopener\">wrote a short blog post<\/a> explaining how I automated our Datadog Marketplace sales cycle using a few AWS services and my first-ever Golang program. That basic, event-driven system saved our sales team several hours a week by replacing a manual process with something far more efficient.<\/p>\n<p>Even though the original setup worked well and ran reliably for a couple of years, it still required ongoing maintenance \u2014 such as upgrading Go versions, fixing minor issues from those upgrades and updating the HubSpot SDK I built when their APIs changed. It wasn\u2019t broken, but it was becoming a bit of a time sink. With Datadog Workflows becoming more robust and available, I figured it was time for a refresh. Why not see what it could do?<\/p>\n<h3>Breaking Down the Old Flow<\/h3>\n<p>The original flow followed a pretty typical event-driven architecture pattern: Event producers, a router and a consumer.<\/p>\n<p>Producer: The customer\u2019s Datadog instance, which triggered an event when a trial started. Email (via AWS SES) also played a supporting role here by capturing trial initiation messages.<\/p>\n<p>Router: An SNS topic in AWS, which fanned out the messages to the consumer.<\/p>\n<p>Consumer: A Lambda function that parsed the message and interacted with HubSpot\u2019s APIs.<\/p>\n<p>While this system did its job, it was fairly code-heavy and required occasional tweaks, especially around regex parsing and SDK maintenance.<\/p>\n<h3>Rebuilding With Datadog Workflows<\/h3>\n<p>To recreate the same logic in Datadog, I first needed a way to ingest emails. Luckily, Datadog has a built-in (and often overlooked) feature called the \u2018Email Events API\u2019. This lets you generate a unique email address that pipes incoming messages directly into your Datadog instance as events. Between that and the customer triggering a trial via the Marketplace, I had my event producers.<\/p>\n<p>Next came \u2018parsing\u2019 those events. This was a huge improvement over the AWS version.<\/p>\n<p>Instead of hand-rolling the regex for every single attribute, I used Datadog\u2019s \u2018Grok Parser\u2019 and built-in pipeline processors to normalize the events. This made things more maintainable and much easier to evolve. A few additional processors helped clean up and standardize some attributes for downstream use.<\/p>\n<p>You could argue that this event pipeline acts as both a consumer (processing the raw event) and a producer (outputting a normalized version of the event for downstream systems). Either way, it simplified a lot of the logic I previously had to write in code.<\/p>\n<p><img data-opt-id=1598451419  data-opt-src=\"https:\/\/devops.com\/wp-content\/uploads\/2026\/06\/image1.png\"  decoding=\"async\" class=\"alignnone size-full wp-image-186145\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"\" width=\"729\" height=\"288\" \/><\/p>\n<h3>Routing Events in Datadog<\/h3>\n<p>At the time of writing, Datadog Workflows can\u2019t be triggered directly from an ingested event. To work around this, I set up a monitor that looks for specific attributes \u2014 events from a certain service and a specific @title pattern. It also ignores trials that come from Datadog Partner instances.<\/p>\n<p>This monitor acts as the router, forwarding qualified events to a Datadog Workflow.<\/p>\n<p><img data-opt-id=924544058  data-opt-src=\"https:\/\/devops.com\/wp-content\/uploads\/2026\/06\/image2.png\"  decoding=\"async\" class=\"alignnone size-full wp-image-186146\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"\" width=\"1669\" height=\"348\" \/><\/p>\n<h3>The New Consumer: Datadog Workflow<\/h3>\n<p>Just like the old Lambda function, the Workflow is now the consumer. It takes the normalized event attributes and performs a sequence of steps to create objects in HubSpot \u2014 contacts, deals, products and line items. If the process succeeds, it sends a message to Slack with a link to the new deal in HubSpot. If anything fails, it also notifies the Slack channel with error details.<\/p>\n<p><img data-opt-id=2132409929  data-opt-src=\"https:\/\/devops.com\/wp-content\/uploads\/2026\/06\/image3.png\"  decoding=\"async\" class=\"alignnone wp-image-186147 size-full\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" alt=\"\" width=\"1614\" height=\"790\" \/><\/p>\n<h3>Final Thoughts<\/h3>\n<p>What started as an experiment turned into a functional and surprisingly low-maintenance solution. By using Datadog Workflows, I gained a simpler parsing mechanism and a flow that\u2019s easier for our sales ops team to understand and update themselves. Since it\u2019s a low-code solution, they can tweak it without touching infrastructure or digging into code.<\/p>\n<p>Of course, there are trade-offs. Datadog Workflows aren\u2019t meant to replace full-fledged serverless architectures, especially when it comes to high traffic or strict latency requirements. But for a system like ours, with moderate volume and no SLA constraints, it works just fine \u2014 and it was fun to build.<\/p>\n<p><a href=\"https:\/\/devops.com\/building-a-simple-event-driven-application-with-datadog-workflows\/\" target=\"_blank\" class=\"feedzy-rss-link-icon\">Read More<\/a><\/p>\n<p>\u200b<\/p>","protected":false},"excerpt":{"rendered":"<p>Back in October 2022, I wrote a short blog post explaining how I automated our Datadog Marketplace sales cycle using [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4463,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[5],"tags":[],"class_list":["post-4462","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/4462","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/comments?post=4462"}],"version-history":[{"count":0,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/4462\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media\/4463"}],"wp:attachment":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media?parent=4462"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/categories?post=4462"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/tags?post=4462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}