{"id":40583,"date":"2023-01-26T16:23:19","date_gmt":"2023-01-26T15:23:19","guid":{"rendered":"https:\/\/www.inovex.de\/?p=40583"},"modified":"2023-01-26T16:23:19","modified_gmt":"2023-01-26T15:23:19","slug":"datadog-events-streaming-job","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/","title":{"rendered":"Using Datadog Events to Observe Your Streaming Job"},"content":{"rendered":"<p>Whenever you operate long-running streaming jobs that consume data, do aggregations or sort of business logic, and produce some kind of result, you might have asked yourself the following question: How can I get notified if something \u201cspecial\u201c happens? For example, data comes late, duplicates are sent, or an event is sorted out because of bad data quality. In this article, I describe one possible solution with the help of Datadog events, Microsoft Teams, and the Python client API.<\/p>\n<p><!--more--><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/#Project-description-and-architecture\" >Project description and architecture<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/#Dont-confuse-it-with-alerting\" >Don\u2019t confuse it with alerting<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/#Implementation\" >Implementation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/#Alternative-solutions\" >Alternative solutions<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/#Summary-Using-Datadog-Events-to-Observe-Your-Streaming-Job\" >Summary: Using Datadog Events to Observe Your Streaming Job<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Project-description-and-architecture\"><\/span>Project description and architecture<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>In one of our current projects, we build a \u201cdigital twin\u201c platform for our customer&#8217;s stores. The stores are equipped with different kinds of sensors that measure different aspects of the real world. All those sensors send their raw data to Kafka topics that we consume with long-running Spark Structured Streaming jobs. There are multiple layers of data aggregations, and multiple jobs doing those processing steps: from the pure ingestion of the raw data, over-flattening highly nested data to aggregating and enriching the data with metadata for special use cases.<\/p>\n<figure id=\"attachment_40585\" aria-describedby=\"caption-attachment-40585\" style=\"width: 1110px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-40585\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Bildschirm\u00adfoto-2022-12-19-um-09.30.50.png\" alt=\"High-level Overview of the Architecture, from sensor to Hive\" width=\"1110\" height=\"706\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Bildschirm\u00adfoto-2022-12-19-um-09.30.50.png 1818w, https:\/\/www.inovex.de\/wp-content\/uploads\/Bildschirm\u00adfoto-2022-12-19-um-09.30.50-300x191.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/Bildschirm\u00adfoto-2022-12-19-um-09.30.50-1024x651.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/Bildschirm\u00adfoto-2022-12-19-um-09.30.50-768x488.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/Bildschirm\u00adfoto-2022-12-19-um-09.30.50-1536x977.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/Bildschirm\u00adfoto-2022-12-19-um-09.30.50-400x254.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Bildschirm\u00adfoto-2022-12-19-um-09.30.50-360x229.png 360w\" sizes=\"auto, (max-width: 1110px) 100vw, 1110px\" \/><figcaption id=\"caption-attachment-40585\" class=\"wp-caption-text\">High-level architecture overview<\/figcaption><\/figure>\n<p>The overall goal of this project is to enable better and faster business decisions and to optimize various operational processes in and around the stores. To ensure a robust application, we catch several situations in our data explicitly. These situations should not influence the further processing of following events, but we still want to be notified about them, so that we for example can communicate with our stakeholders (that the data of a specific store will not be available right now) or the manufacturer of a sensor (when something seems to be broken on the sensor itself).<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Dont-confuse-it-with-alerting\"><\/span>Don\u2019t confuse it with alerting<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The mentioned \u201cspecial situations\u201c, we want to get noticed about, do not break anything in our Spark job. They do not result in any exception or unexpected state. That is the reason why we cannot rely on regular alerting that listens to some predefined metrics like memory or CPU consumption and alerts us automatically. Instead, we need to define those situations and corresponding reaction behavior in our application itself. What does that look like?<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Implementation\"><\/span>Implementation<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>The first step in this process is to implement the logic to recognize the type of event you want to get notified about. In the following example, we want to see if a received event contains bad-quality data. To keep it simple, we assume that the event consists of multiple data points of the same type, depending on the size of the store:<\/p>\n<pre class=\"lang:default decode:true\">{\"store_id\": \"store1\", \"data_points\": [1, 7, 3, 1, 2, 9, 8, 9, 9, 4, 2]}\r\n{\"store_id\": \"store2\", \"data_points\": [1, 7, 3]}\r\n{\"store_id\": \"store3\", \"data_points\": [42]}<\/pre>\n<p>Based on a simple analysis of historical data we can assume that there must be at least 10 data points in every received event. Otherwise, it is of bad quality and will be sorted out:<\/p>\n<pre class=\"lang:python decode:true\">alerting_threshold = 10\r\n \r\nfew_elements = (\r\n   input_df.withColumn(\"n_elements\", func.size(\"data_points\"))\r\n   .filter(func.col(\"n_elements\") &lt; alerting_threshold)\r\n   .select(\"store_id\", \"n_elements\")\r\n   .collect()\r\n)<\/pre>\n<p>To send an event to Datadog we first need to configure the API client:<\/p>\n<pre class=\"lang:python decode:true\">from datadog_api_client import ApiClient, Configuration\r\nfrom datadog_api_client.v1.api.events_api import EventsApi\r\nfrom datadog_api_client.v1.model.event_create_request import EventCreateRequest\r\n \r\nconfiguration = Configuration()\r\nconfiguration.proxy = \"http:\/\/example.proxy.my.domain:8000\"\r\nconfiguration.api_key[\"apiKeyAuth\"] = \"&lt;fill in your API key here&gt;\"\r\n# Are you running your Datadog in the US or EU?\r\nconfiguration.server_variables[\"site\"] = \"datadoghq.eu\"\r\n\r\ndatadog_api_client = ApiClient(configuration)\r\ndatadog_api_instance = EventsApi(datadog_api_client)\r\n\r\ndatadog_default_tags = [\r\n   \"team:my-example-team\",\r\n   \"job:my-spark-job\",\r\n   \"event_type:spark-job-notification\",\r\n   \"env:prod\"\r\n]<\/pre>\n<p>For authentication against Datadog you just need an appropriate API key that you created beforehand in your Datadog account. In our case, the platform team manages permissions and authentication and thus provided the API key to us.<\/p>\n<p>Another important aspect here is the choice of appropriate tags. Tags are used in Datadog to find your events and can be used to route them to the right place. We defined different types of tags to group them logically: the team, the Spark job from where the notification was sent, an event type, and the environment (dev, stage, production). Based on those tags we can browse our events in the Datadog web interface later.<\/p>\n<p>For every Spark micro batch, we run through this logic and collect all the information we need to build a message text that will be sent to Datadog:<\/p>\n<pre class=\"lang:python decode:true\">from datadog_api_client.v1.model.event_create_request import EventCreateRequest\r\n \r\nif few_elements:\r\n   message = \"\"\r\n   for row in few_elements:\r\n       message += f\"Found only {row.n_elements} data points in store '{row.store_id}'\\n\"\r\n \r\n   datadog_api_instance.create_event(\r\n       body=EventCreateRequest(\r\n           title=f\"Your job found only a few elements!\",\r\n           text=message,\r\n           tags=datadog_default_tags\r\n           + [\r\n               \"source:my.kafka.input.topic\",\r\n               \"target:my.kafka.output.topic\",\r\n           ],\r\n       )\r\n   )<\/pre>\n<p>Let\u2019s try to find our event we just sent in the Datadog event explorer. Please note the query over our chosen tags:<\/p>\n<figure id=\"attachment_40593\" aria-describedby=\"caption-attachment-40593\" style=\"width: 1420px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-40593 \" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_1-1.png\" alt=\"Datadog web UI, Event explorer\" width=\"1420\" height=\"334\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_1-1.png 5096w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_1-1-300x71.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_1-1-1024x241.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_1-1-768x181.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_1-1-1536x362.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_1-1-2048x482.png 2048w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_1-1-1920x452.png 1920w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_1-1-400x94.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_1-1-360x85.png 360w\" sizes=\"auto, (max-width: 1420px) 100vw, 1420px\" \/><figcaption id=\"caption-attachment-40593\" class=\"wp-caption-text\">Datadog event explorer<\/figcaption><\/figure>\n<p>Until here, we sent our events through the Datadog API to Datadog and we found them in the event browser. But how do we get notified automatically in Microsoft Teams now? \u201cDatadog monitors\u201c are the key. Monitors define some kind of query and thresholds that should be monitored. If the defined thresholds are exceeded, Datadog sends an alert to the configured target:<\/p>\n<figure id=\"attachment_40595\" aria-describedby=\"caption-attachment-40595\" style=\"width: 1421px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-40595 \" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_2.png\" alt=\"Datadog web UI, monitor configuration\" width=\"1421\" height=\"597\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_2.png 5054w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_2-300x126.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_2-1024x430.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_2-768x323.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_2-1536x646.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_2-2048x861.png 2048w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_2-1920x807.png 1920w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_2-400x168.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_2-360x151.png 360w\" sizes=\"auto, (max-width: 1421px) 100vw, 1421px\" \/><figcaption id=\"caption-attachment-40595\" class=\"wp-caption-text\">Datadog monitor configuration<\/figcaption><\/figure>\n<p>Please note what the query looks like: We query the tags and simply count the number of events, grouped by event ID. That is important because otherwise, Datadog would only send one notification for every evaluation window. That means if multiple events occur in the same window, it would only send one single alert. With the grouping, we ensure that every single event gets alerted separately.<\/p>\n<p>Also noteworthy: The smallest possible evaluation window is 5 minutes. Depending on the time your event arrives in Datadog, you may have to wait up to 5 minutes to be alerted!<\/p>\n<p>There are a lot of different target systems to which your alert can be sent to. That could be an Opsgenie instance, Microsoft Teams, Slack, etc. Every target must first be configured as an integration in Datadog. Integrations are managed by our central platform team, but in this case, it is as simple as adding a new Teams hook with a given webhook URL that you can copy from the corresponding Teams channel settings. In our case, we chose a Microsoft Teams integration so that we get alerts in different Teams channels, according to the configured message template:<\/p>\n<figure id=\"attachment_40603\" aria-describedby=\"caption-attachment-40603\" style=\"width: 1421px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-40603 \" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_3.png\" alt=\"Datadog web UI, monitor message template\" width=\"1421\" height=\"550\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_3.png 4650w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_3-300x116.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_3-1024x396.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_3-768x297.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_3-1536x595.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_3-2048x793.png 2048w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_3-1920x743.png 1920w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_3-400x155.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/screenshot_3-360x139.png 360w\" sizes=\"auto, (max-width: 1421px) 100vw, 1421px\" \/><figcaption id=\"caption-attachment-40603\" class=\"wp-caption-text\">Datadog monitor message template<\/figcaption><\/figure>\n<p>We have different types of alerts or notifications (with different target groups and different purposes) and for every type, we have a separate Teams channel. With the help of the defined tags, we can control which event should be routed to which Teams channel.<\/p>\n<p>Please keep in mind that the text field of a Datadog event is limited to 4.000 characters. We figured out two different strategies to overcome this limitation:<\/p>\n<ul>\n<li>Truncate the message text (if it does not contain very critical details at the end)<\/li>\n<li>Build some kind of pagination, where the message is split up into chunks and sent separately<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Alternative-solutions\"><\/span>Alternative solutions<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>I\u2019m pretty sure there are a lot more options to achieve the functionality of getting notified about events in your application. I just want to mention two more options that work a little bit differently.<\/p>\n<p>You could write custom metrics for Datadog and set alerts based on those metrics. This approach was not suitable to our use case because a metric is always a number and no free text can be added. But whenever you have things that can be \u201ccounted\u201c or \u201csummarized\u201c in one number, that could be a good option.<\/p>\n<p>Another idea is to write all the needed information in your application logs (probably you want to do this anyway) and ship them to Datadog. There you could configure a monitor based on your logs. This approach can be very expensive depending on the number of logs and the cardinality of the tags you ship to Datadog. Furthermore, it was not supported by our platform team at the time of writing.<\/p>\n<p>We decided to use the event-based approach for simplicity and ease of use.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Summary-Using-Datadog-Events-to-Observe-Your-Streaming-Job\"><\/span>Summary: Using Datadog Events to Observe Your Streaming Job<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>I showed how we use Datadog and the Python client API to observe different types of events occurring in our Spark Structured streaming pipelines. Those events are not breaking anything in our applications, but are worth being notified about. So instead of utilizing our already existing default monitoring\/alerting mechanisms that listen to different \u201ctechnical\u201c metrics like CPU and memory usage, we instead decided to send explicit events from our code to Datadog.<\/p>\n<p>This is pretty simple and also helps in understanding the code itself because special situations that can occur while processing the incoming events are explicitly expressed as a piece of code that notify about the event.<\/p>\n<p>Please note that sending messages directly to Microsoft Teams was just a \u201cquick win\u201c solution for us. A more sophisticated approach would be to synchronize your Datadog events to a full incident management system like Opsgenie with the Opsgenie integration. There you can handle the notifications together with alerts and all kinds of incidents in one central platform.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Whenever you operate long-running streaming jobs that consume data, do aggregations or sort of business logic, and produce some kind of result, you might have asked yourself the following question: How can I get notified if something \u201cspecial\u201c happens? For example, data comes late, duplicates are sent, or an event is sorted out because of [&hellip;]<\/p>\n","protected":false},"author":206,"featured_media":41597,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[77,71,385,377,66,105,908],"service":[414,411,432],"coauthors":[{"id":206,"display_name":"Julian Seither","user_nicename":"jseither"}],"class_list":["post-40583","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-big-data","tag-cloud","tag-data-engineering","tag-development","tag-devops","tag-spark","tag-stream-processing","service-cloud","service-data-engineering","service-devops"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Using Datadog Events to Observe Your Streaming Job - inovex GmbH<\/title>\n<meta name=\"description\" content=\"This article describes how you can send custom events to Datadog to observe your streaming application in Python.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using Datadog Events to Observe Your Streaming Job - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"This article describes how you can send custom events to Datadog to observe your streaming application in Python.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2023-01-26T15:23:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/datadog-events-blog.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1440\" \/>\n\t<meta property=\"og:image:height\" content=\"810\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Julian Seither\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/datadog-events-blog-1024x576.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Julian Seither\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"8\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Julian Seither\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/datadog-events-streaming-job\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/datadog-events-streaming-job\\\/\"},\"author\":{\"name\":\"Julian Seither\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/0a3268d44503c4d0d32fbeb6f1129b94\"},\"headline\":\"Using Datadog Events to Observe Your Streaming Job\",\"datePublished\":\"2023-01-26T15:23:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/datadog-events-streaming-job\\\/\"},\"wordCount\":1386,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/datadog-events-streaming-job\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/datadog-events-blog.png\",\"keywords\":[\"Big Data\",\"Cloud\",\"Data Engineering\",\"Development\",\"DevOps\",\"Spark\",\"Stream Processing\"],\"articleSection\":[\"Analytics\",\"Applications\",\"English Content\",\"General\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/datadog-events-streaming-job\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/datadog-events-streaming-job\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/datadog-events-streaming-job\\\/\",\"name\":\"Using Datadog Events to Observe Your Streaming Job - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/datadog-events-streaming-job\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/datadog-events-streaming-job\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/datadog-events-blog.png\",\"datePublished\":\"2023-01-26T15:23:19+00:00\",\"description\":\"This article describes how you can send custom events to Datadog to observe your streaming application in Python.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/datadog-events-streaming-job\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/datadog-events-streaming-job\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/datadog-events-streaming-job\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/datadog-events-blog.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/datadog-events-blog.png\",\"width\":1440,\"height\":810,\"caption\":\"The datadog logo in white on purple background with orange shapes alluding to a time series graph\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/datadog-events-streaming-job\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using Datadog Events to Observe Your Streaming Job\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/0a3268d44503c4d0d32fbeb6f1129b94\",\"name\":\"Julian Seither\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/cropped-36713720_1746291525467658_8163086856494252032_n-96x96.jpg35f978bb618834bfd2353e7390e16e33\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/cropped-36713720_1746291525467658_8163086856494252032_n-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/cropped-36713720_1746291525467658_8163086856494252032_n-96x96.jpg\",\"caption\":\"Julian Seither\"},\"description\":\"I'm a Data Engineer and Architect, interested in designing and implementing various types of data platforms and streaming applications in the cloud as well as on premise.\",\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/julian-seither-34ba40139\\\/\"],\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/jseither\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Using Datadog Events to Observe Your Streaming Job - inovex GmbH","description":"This article describes how you can send custom events to Datadog to observe your streaming application in Python.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/","og_locale":"de_DE","og_type":"article","og_title":"Using Datadog Events to Observe Your Streaming Job - inovex GmbH","og_description":"This article describes how you can send custom events to Datadog to observe your streaming application in Python.","og_url":"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2023-01-26T15:23:19+00:00","og_image":[{"width":1440,"height":810,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/datadog-events-blog.png","type":"image\/png"}],"author":"Julian Seither","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/datadog-events-blog-1024x576.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Julian Seither","Gesch\u00e4tzte Lesezeit":"8\u00a0Minuten","Written by":"Julian Seither"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/"},"author":{"name":"Julian Seither","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/0a3268d44503c4d0d32fbeb6f1129b94"},"headline":"Using Datadog Events to Observe Your Streaming Job","datePublished":"2023-01-26T15:23:19+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/"},"wordCount":1386,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/datadog-events-blog.png","keywords":["Big Data","Cloud","Data Engineering","Development","DevOps","Spark","Stream Processing"],"articleSection":["Analytics","Applications","English Content","General"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/","url":"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/","name":"Using Datadog Events to Observe Your Streaming Job - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/datadog-events-blog.png","datePublished":"2023-01-26T15:23:19+00:00","description":"This article describes how you can send custom events to Datadog to observe your streaming application in Python.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/datadog-events-blog.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/datadog-events-blog.png","width":1440,"height":810,"caption":"The datadog logo in white on purple background with orange shapes alluding to a time series graph"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/datadog-events-streaming-job\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Using Datadog Events to Observe Your Streaming Job"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/0a3268d44503c4d0d32fbeb6f1129b94","name":"Julian Seither","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/wp-content\/uploads\/cropped-36713720_1746291525467658_8163086856494252032_n-96x96.jpg35f978bb618834bfd2353e7390e16e33","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/cropped-36713720_1746291525467658_8163086856494252032_n-96x96.jpg","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/cropped-36713720_1746291525467658_8163086856494252032_n-96x96.jpg","caption":"Julian Seither"},"description":"I'm a Data Engineer and Architect, interested in designing and implementing various types of data platforms and streaming applications in the cloud as well as on premise.","sameAs":["https:\/\/www.linkedin.com\/in\/julian-seither-34ba40139\/"],"url":"https:\/\/www.inovex.de\/de\/blog\/author\/jseither\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/40583","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/206"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=40583"}],"version-history":[{"count":5,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/40583\/revisions"}],"predecessor-version":[{"id":40610,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/40583\/revisions\/40610"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/41597"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=40583"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=40583"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=40583"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=40583"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}