{"id":483,"date":"2024-01-09T07:22:41","date_gmt":"2024-01-09T06:22:41","guid":{"rendered":"https:\/\/www.syntera.ch\/blog\/?p=483"},"modified":"2024-02-15T08:07:24","modified_gmt":"2024-02-15T07:07:24","slug":"implementing-fabric-eventstream-data-activator-with-real-world-data","status":"publish","type":"post","link":"https:\/\/www.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/","title":{"rendered":"Implementing Fabric Eventstream &#038; Data Activator With Real World Data"},"content":{"rendered":"\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-f56f613f wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><div class=\"wp-block-post-author has-medium-font-size\"><div class=\"wp-block-post-author__avatar\"><img alt='' src='https:\/\/secure.gravatar.com\/avatar\/bd3589b8a6ccc62e37c3cee8f8e06c73a4085816337ad7d6c154e30dc60cc4c1?s=48&#038;d=mm&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/bd3589b8a6ccc62e37c3cee8f8e06c73a4085816337ad7d6c154e30dc60cc4c1?s=96&#038;d=mm&#038;r=g 2x' class='avatar avatar-48 photo' height='48' width='48' \/><\/div><div class=\"wp-block-post-author__content\"><p class=\"wp-block-post-author__byline\">LEAD DATA ENGINEERING<\/p><p class=\"wp-block-post-author__name\">Dominic Schranz<\/p><\/div><\/div><\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-top is-layout-flow wp-block-column-is-layout-flow\">\n<ul class=\"wp-block-outermost-social-sharing alignright has-small-icon-size has-icon-color is-style-logos-only is-content-justification-left is-layout-flex wp-container-outermost-social-sharing-is-layout-fa5e4718 wp-block-outermost-social-sharing-is-layout-flex\"><li style=\"color: #1a4548\" class=\"outermost-social-sharing-link outermost-social-sharing-link-linkedin has-primary-color wp-block-outermost-social-sharing-link\">\n\t<a href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fwww.syntera.ch%2Fblog%2F2024%2F01%2F09%2Fimplementing-fabric-eventstream-data-activator-with-real-world-data%2F&#038;title=Implementing%20Fabric%20Eventstream%20%26%23038%3B%20Data%20Activator%20With%20Real%20World%20Data\" aria-label=\"Share on LinkedIn\" rel=\"noopener nofollow\" target=\"_blank\" class=\"wp-block-outermost-social-sharing-link-anchor\">\n\t\t<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z\"><\/path><\/svg>\t\t<span class=\"wp-block-outermost-social-sharing-link-label screen-reader-text\">\n\t\t\tShare on LinkedIn\t\t<\/span>\n\t<\/a>\n<\/li>\n\n\n<li style=\"color: #1a4548\" class=\"outermost-social-sharing-link outermost-social-sharing-link-mail has-primary-color wp-block-outermost-social-sharing-link\">\n\t<a href=\"mailto:?subject=Implementing%20Fabric%20Eventstream%20%26%23038%3B%20Data%20Activator%20With%20Real%20World%20Data&#038;body=Implementing%20Fabric%20Eventstream%20%26%23038%3B%20Data%20Activator%20With%20Real%20World%20Data%20&mdash;%20https%3A%2F%2Fwww.syntera.ch%2Fblog%2F2024%2F01%2F09%2Fimplementing-fabric-eventstream-data-activator-with-real-world-data%2F\" aria-label=\"Email this Page\"  class=\"wp-block-outermost-social-sharing-link-anchor\">\n\t\t<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M20,4H4C2.895,4,2,4.895,2,6v12c0,1.105,0.895,2,2,2h16c1.105,0,2-0.895,2-2V6C22,4.895,21.105,4,20,4z M20,8.236l-8,4.882 L4,8.236V6h16V8.236z\"><\/path><\/svg>\t\t<span class=\"wp-block-outermost-social-sharing-link-label screen-reader-text\">\n\t\t\tEmail this Page\t\t<\/span>\n\t<\/a>\n<\/li>\n\n\n<li style=\"color: #1a4548\" class=\"outermost-social-sharing-link outermost-social-sharing-link-whatsapp has-primary-color wp-block-outermost-social-sharing-link\">\n\t<a href=\"https:\/\/api.whatsapp.com\/send?text=Implementing%20Fabric%20Eventstream%20%26%23038%3B%20Data%20Activator%20With%20Real%20World%20Data%20&mdash;%20https%3A%2F%2Fwww.syntera.ch%2Fblog%2F2024%2F01%2F09%2Fimplementing-fabric-eventstream-data-activator-with-real-world-data%2F\" aria-label=\"Share on WhatsApp\" rel=\"noopener nofollow\" target=\"_blank\" class=\"wp-block-outermost-social-sharing-link-anchor\">\n\t\t<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M 12.011719 2 C 6.5057187 2 2.0234844 6.478375 2.0214844 11.984375 C 2.0204844 13.744375 2.4814687 15.462563 3.3554688 16.976562 L 2 22 L 7.2324219 20.763672 C 8.6914219 21.559672 10.333859 21.977516 12.005859 21.978516 L 12.009766 21.978516 C 17.514766 21.978516 21.995047 17.499141 21.998047 11.994141 C 22.000047 9.3251406 20.962172 6.8157344 19.076172 4.9277344 C 17.190172 3.0407344 14.683719 2.001 12.011719 2 z M 12.009766 4 C 14.145766 4.001 16.153109 4.8337969 17.662109 6.3417969 C 19.171109 7.8517969 20.000047 9.8581875 19.998047 11.992188 C 19.996047 16.396187 16.413812 19.978516 12.007812 19.978516 C 10.674812 19.977516 9.3544062 19.642812 8.1914062 19.007812 L 7.5175781 18.640625 L 6.7734375 18.816406 L 4.8046875 19.28125 L 5.2851562 17.496094 L 5.5019531 16.695312 L 5.0878906 15.976562 C 4.3898906 14.768562 4.0204844 13.387375 4.0214844 11.984375 C 4.0234844 7.582375 7.6067656 4 12.009766 4 z M 8.4765625 7.375 C 8.3095625 7.375 8.0395469 7.4375 7.8105469 7.6875 C 7.5815469 7.9365 6.9355469 8.5395781 6.9355469 9.7675781 C 6.9355469 10.995578 7.8300781 12.182609 7.9550781 12.349609 C 8.0790781 12.515609 9.68175 15.115234 12.21875 16.115234 C 14.32675 16.946234 14.754891 16.782234 15.212891 16.740234 C 15.670891 16.699234 16.690438 16.137687 16.898438 15.554688 C 17.106437 14.971687 17.106922 14.470187 17.044922 14.367188 C 16.982922 14.263188 16.816406 14.201172 16.566406 14.076172 C 16.317406 13.951172 15.090328 13.348625 14.861328 13.265625 C 14.632328 13.182625 14.464828 13.140625 14.298828 13.390625 C 14.132828 13.640625 13.655766 14.201187 13.509766 14.367188 C 13.363766 14.534188 13.21875 14.556641 12.96875 14.431641 C 12.71875 14.305641 11.914938 14.041406 10.960938 13.191406 C 10.218937 12.530406 9.7182656 11.714844 9.5722656 11.464844 C 9.4272656 11.215844 9.5585938 11.079078 9.6835938 10.955078 C 9.7955938 10.843078 9.9316406 10.663578 10.056641 10.517578 C 10.180641 10.371578 10.223641 10.267562 10.306641 10.101562 C 10.389641 9.9355625 10.347156 9.7890625 10.285156 9.6640625 C 10.223156 9.5390625 9.737625 8.3065 9.515625 7.8125 C 9.328625 7.3975 9.131125 7.3878594 8.953125 7.3808594 C 8.808125 7.3748594 8.6425625 7.375 8.4765625 7.375 z\"><\/path><\/svg>\t\t<span class=\"wp-block-outermost-social-sharing-link-label screen-reader-text\">\n\t\t\tShare on WhatsApp\t\t<\/span>\n\t<\/a>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Understanding a tool&#8217;s utility is directly proportional to our knowledge of its use. This blog post aims to evaluate the advantages and disadvantages of using Fabric Eventstream &amp; Data Activator with real-world data. We aim to achieve this while minimizing infrastructure requirements and costs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In essence, this post demonstrates how to implement continuous location data from the International Space Station (ISS) by:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Setting up an Azure Function in Python.<\/li>\n\n\n\n<li>Sending data directly to Eventstream, bypassing the need for a dedicated Event Hub.<\/li>\n\n\n\n<li>Utilizing Data Activator for notifications on specific location changes.<br><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ultimately, this will allow us to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Assess performance, limitations, response times<\/li>\n\n\n\n<li>Extracting guidance on how to use Fabric<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">This post is structured into three main sections: an introduction, a detailed walkthrough complete with code implementation, and a closing section focusing on key learnings.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Introduction<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">The capabilities and potential applications of Fabric are vast and can sometimes seem overwhelming. In this blog, we focus on a real-life example involving continuous data: the location of the International Space Station (ISS). For our purposes, consider the ISS as an IoT device, regularly transmitting its location. Our goal is to ingest this data and send notifications when specific conditions are met.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Utilizing the ISS data serves two primary purposes. Firstly, it eliminates the need to set up an IoT device or create a function for generating sample data points. The data is already generated and accessible to anyone. There is nothing wrong with simulated datasets but real world cases are much more engaging, enable deeper understanding and the data points represent an observable state of our environment &#8211; which makes them more tangible. Additionally, the ISS follows a predictable orbital pattern, allowing us to verify the accuracy and latency of our architecture. This recurring pattern allows us to test cyclic events and compare the results over time.<\/p>\n\n\n\n<h6 class=\"wp-block-heading\">Requirements<\/h6>\n\n\n\n<p class=\"wp-block-paragraph\">The following technologies are used to implement the solution.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Microsoft Fabric (Trial or Paid)<\/li>\n\n\n\n<li>Azure Subscription (Free or Paid) to host the Azure Function<\/li>\n\n\n\n<li>Visual Studio Code with Azure Tools Extension to create and test the Azure Function<\/li>\n\n\n\n<li>Python 3.9.* to create a local Environment<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If you want to follow along:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All requirements are free of cost as the Fabric Trial is available for 60 Days and the cost for running the Azure function used for a limited time is running within the monthly free grant of 1 million requests and 400,000 GB-s of resource consumption per month per subscription <a href=\"https:\/\/azure.microsoft.com\/en-us\/pricing\/details\/functions\/\">Lin<\/a><a href=\"https:\/\/azure.microsoft.com\/en-us\/pricing\/details\/functions\/\" target=\"_blank\" rel=\"noreferrer noopener\">k<\/a>). You can also use a Fabric Capacity but be aware that Microsoft recommends to have at least an F4 SKU for using Eventstream (<a href=\"https:\/\/learn.microsoft.com\/en-us\/fabric\/real-time-analytics\/event-streams\/overview)\">Lin<\/a><a href=\"https:\/\/learn.microsoft.com\/en-us\/fabric\/real-time-analytics\/event-streams\/overview)\" target=\"_blank\" rel=\"noreferrer noopener\">k<\/a>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To create the Azure Function locally, you need to have <a href=\"https:\/\/www.python.org\/downloads\/\">Python<\/a> installed. In this example, Python 3.9. is used. However, there are more versions of Python which are supported by Azure Functions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Make sure to delete the resources after you are finished so you don&#8217;t incur accidental cost.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">How-To<\/h4>\n\n\n\n<h6 class=\"wp-block-heading\">Create A Fabric Workspace with an EventStream<\/h6>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Navigate to <a href=\"https:\/\/app.powerbi.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/app.powerbi.com\/<\/a> <\/li>\n\n\n\n<li>Create a new Fabric Workspace<\/li>\n\n\n\n<li>Select either Trial or Fabric Capacity <\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"864\" height=\"913\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Workspace1.png\" alt=\"\" class=\"wp-image-486\" style=\"width:700px\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Workspace1.png 864w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Workspace1-284x300.png 284w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Workspace1-768x812.png 768w\" sizes=\"auto, (max-width: 864px) 100vw, 864px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"859\" height=\"951\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Workspace2.png\" alt=\"\" class=\"wp-image-487\" style=\"width:700px\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Workspace2.png 859w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Workspace2-271x300.png 271w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Workspace2-768x850.png 768w\" sizes=\"auto, (max-width: 859px) 100vw, 859px\" \/><figcaption class=\"wp-element-caption\">Fabric Workspace Configuration<\/figcaption><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>In the new Workspace, set up an Eventstream resource via &#8220;New &gt; More options &gt; Eventstream&#8221; and name it &#8220;ISS_Position&#8221;.<\/li>\n\n\n\n<li>In your newly created Eventstream, press on &#8220;New Source&#8221;.\n<ul class=\"wp-block-list\">\n<li>For the source, select &#8220;Custom App&#8221;<\/li>\n\n\n\n<li>Name the source &#8220;ISS_Azure_Function&#8221;<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-f56f613f wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\">\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"575\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Plain_eventstream-1024x575.png\" alt=\"\" class=\"wp-image-489\" style=\"width:584px;height:auto\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Plain_eventstream-1024x575.png 1024w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Plain_eventstream-300x168.png 300w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Plain_eventstream-768x431.png 768w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Plain_eventstream-1536x862.png 1536w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Plain_eventstream-2048x1150.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Empty Eventstream<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\">\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"328\" height=\"466\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/custom-app.png\" alt=\"\" class=\"wp-image-488\" style=\"width:229px;height:auto\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/custom-app.png 328w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/custom-app-211x300.png 211w\" sizes=\"auto, (max-width: 328px) 100vw, 328px\" \/><figcaption class=\"wp-element-caption\">Add new source<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<ol class=\"wp-block-list\" start=\"6\">\n<li>Select the source and navigate to <strong>Details &gt; Keys<\/strong> pane. Here we have everything we need to allow the Azure Function to send data to our Eventstream.<\/li>\n\n\n\n<li>Take a note of both the &#8220;Event hub name&#8221; and the &#8220;Connection string-primary key&#8221;. This will be needed later.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"619\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/details_eventstreamsource-1024x619.png\" alt=\"\" class=\"wp-image-490\" style=\"object-fit:cover\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/details_eventstreamsource-1024x619.png 1024w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/details_eventstreamsource-300x181.png 300w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/details_eventstreamsource-768x464.png 768w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/details_eventstreamsource-1536x928.png 1536w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/details_eventstreamsource.png 1843w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Source Details &gt; Keys<\/figcaption><\/figure>\n\n\n\n<h6 class=\"wp-block-heading\">Create the Azure Function<\/h6>\n\n\n\n<p class=\"wp-block-paragraph\">The Azure Function can be created in many ways, for this example we are using VS Code.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open a new and empty VS Code Window.<\/li>\n\n\n\n<li>If you don&#8217;t have the Azure Tools extension yet, navigate to the VS Code extensions (Ctrl+Shift+X) and search for &#8220;Azure Tools&#8221; from Microsoft.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"418\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Azure-Tools-Extension-1024x418.png\" alt=\"\" class=\"wp-image-492\" style=\"width:700px\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Azure-Tools-Extension-1024x418.png 1024w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Azure-Tools-Extension-300x122.png 300w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Azure-Tools-Extension-768x313.png 768w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Azure-Tools-Extension-1536x627.png 1536w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Azure-Tools-Extension.png 1642w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Azure Tools Extension<\/figcaption><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Navigate to the Azure extension and sign in to Azure with your account.<\/li>\n\n\n\n<li>In the Azure Extension under your subscription, right click on &#8220;Function App &#8221; and select &#8220;Create a Function App in Azure&#8221;.<\/li>\n\n\n\n<li>Enter a globally unique name for your function, select Python 3.9. as your runtime stack and a location in which you want to host your function.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Note: This sets up everything you need but has less control over which resources are created and how they are named. If you want to have more control, create the resources directly in the Azure Portal.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"329\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/create-function-app-1-1024x329.png\" alt=\"\" class=\"wp-image-494\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/create-function-app-1-1024x329.png 1024w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/create-function-app-1-300x96.png 300w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/create-function-app-1-768x247.png 768w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/create-function-app-1-1536x494.png 1536w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/create-function-app-1.png 1738w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Creating a Function App<\/figcaption><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"6\">\n<li>Wait until the resource is created and then in VS Code  in the Azure Extension on the bottom left at &#8220;WORKSPACE&#8221;, click on the Azure Functions icon and select &#8220;Create Function&#8230;&#8221;.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"673\" height=\"337\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Local-Workspace.png\" alt=\"\" class=\"wp-image-495\" style=\"width:700px\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Local-Workspace.png 673w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Local-Workspace-300x150.png 300w\" sizes=\"auto, (max-width: 673px) 100vw, 673px\" \/><figcaption class=\"wp-element-caption\">Creating the function<\/figcaption><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"7\">\n<li>Select your Folder that will contain your function, you can create an empty one wherever you like<\/li>\n\n\n\n<li>Select Python, Model V2<\/li>\n\n\n\n<li>Select your Python 3.9.* Version<\/li>\n\n\n\n<li>For the Function Template, Select &#8220;Skip for now&#8221;<\/li>\n\n\n\n<li>Open in current window<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Visual Studio Code is now finishing the setup of your local Function. After it is finished, you should see some files created in your selected folder.<\/p>\n\n\n\n<h6 class=\"wp-block-heading\">The Code<\/h6>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Add a new file &#8220;function_app.py&#8221; in your root folder.<\/li>\n\n\n\n<li>Add the copy and paste the code below in the &#8220;function_app.py&#8221; file. This code gets data from an API to get the current position of the ISS. It specifies a timer which runs the function every 10 seconds and sends the result to your event hub.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>import logging\nimport os\nimport requests\nimport json\nimport datetime\nimport azure.functions as func\n\nurl = \"http:\/\/api.open-notify.org\/iss-now.json\"\n\ndef request_iss_position(url):\n    response = requests.get(url)\n    return response.text\n\ndef transform_iss_data(iss_data_json):\n    try:\n        iss_data = json.loads(iss_data_json)\n        iss_data_timestamp = iss_data&#91;\"timestamp\"]\n        iss_data_longitude = float(iss_data&#91;\"iss_position\"]&#91;\"longitude\"])\n        iss_data_latitude = float(iss_data&#91;\"iss_position\"]&#91;\"latitude\"])\n        iss_event = json.dumps(\n                                {\n                                    \"timestamp\": iss_data_timestamp,\n                                    \"longitude\":  iss_data_longitude,\n                                    \"latitude\": iss_data_latitude\n                                }\n                            )\n        \n    except:\n        print(\"could not pars iss_data\")\n        iss_event = None\n    finally:\n        return iss_event\n\napp = func.FunctionApp()\n\n@app.function_name(name=\"get_IssPosition\")\n@app.schedule(schedule=\"*\/10 * * * * *\", arg_name=\"myTimer\", run_on_startup=True) \n@app.event_hub_output(arg_name=\"event\",\n                      event_hub_name=\"event_hub_name\",\n                      connection=\"connection\")\ndef get_IssPosition(myTimer: func.TimerRequest, event: func.Out&#91;str])-&gt; None :\n    utc_timestamp = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat()\n    \n    if myTimer.past_due:\n        logging.info('The timer is past due!')\n        \n    data = request_iss_position(url)\n    logging.info(f\"ISS Data: {data}\")\n    event.set(transform_iss_data(data))\n    logging.info('Python timer trigger function ran at %s', utc_timestamp)<\/code><\/pre>\n\n\n\n<div style=\"height:41px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"558\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/function_app-1-1024x558.png\" alt=\"\" class=\"wp-image-498\" style=\"object-fit:cover\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/function_app-1-1024x558.png 1024w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/function_app-1-300x164.png 300w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/function_app-1-768x419.png 768w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/function_app-1-1536x838.png 1536w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/function_app-1.png 1834w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">function_app.py<\/figcaption><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Because we used the requests library, it needs to be added to the requirements.txt file. Add &#8220;requests&#8221; to requirements.txt.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"562\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/requirements.txt-1024x562.png\" alt=\"\" class=\"wp-image-499\" style=\"width:700px\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/requirements.txt-1024x562.png 1024w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/requirements.txt-300x165.png 300w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/requirements.txt-768x422.png 768w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/requirements.txt.png 1138w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Requirements.txt<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In the code there are two references to variables which the Function is reading either from local.settings.json or from the application settings in Azure, depending on where you run it. If you want to have the ability to run the function locally in Debug mode, in the local.settings.json, add two new entries and copy the values from your Eventstream source (Back in step 7. of chapter &#8220;Create A Fabric Workspace with an EventStream&#8221;):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&#8220;event hub name&#8221;: the name of your event hub <\/li>\n\n\n\n<li>&#8220;connection&#8221;: your primary connection string<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"430\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/local-settings-1024x430.png\" alt=\"\" class=\"wp-image-500\" style=\"width:700px\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/local-settings-1024x430.png 1024w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/local-settings-300x126.png 300w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/local-settings-768x323.png 768w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/local-settings.png 1474w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">local.settings.json<\/figcaption><\/figure>\n\n\n\n<h6 class=\"wp-block-heading\">Deployment<\/h6>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In VS Code in the Azure Extension on the bottom left at &#8220;WORKSPACE&#8221;, click on the Azure Functions icon and select &#8220;Deploy to Function App&#8221;.<\/li>\n\n\n\n<li>Navigate to your function App in the Azure Portal via portal.azure.com or via the context menu.<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-f56f613f wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"601\" height=\"822\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/deploy-to-function-app-.png\" alt=\"\" class=\"wp-image-501\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/deploy-to-function-app-.png 601w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/deploy-to-function-app--219x300.png 219w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><figcaption class=\"wp-element-caption\">Deploy to Function app<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"676\" height=\"999\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Open-in-Portal.png\" alt=\"\" class=\"wp-image-502\" style=\"width:405px;height:auto\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Open-in-Portal.png 676w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Open-in-Portal-203x300.png 203w\" sizes=\"auto, (max-width: 676px) 100vw, 676px\" \/><figcaption class=\"wp-element-caption\">Open in Portal<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>In your Azure Function under &#8220;Configuration&#8221;, add two new Application settings and copy the values from your Eventstream source (Back in step 7. of chapter &#8220;Create A Fabric Workspace with an EventStream&#8221;):\n<ul class=\"wp-block-list\">\n<li>&#8220;event hub name&#8221;: the name of your event hub <\/li>\n\n\n\n<li>&#8220;connection&#8221;: your primary connection string<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Note: <\/strong>It is generally advised to store this information in Key Vault and reference it via the Application Settings. For brevity, this is not included in the blog. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As soon as this configuration is set, you should be able to receive data in your Eventstream.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"690\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/applicationSettingsadded-1024x690.png\" alt=\"\" class=\"wp-image-503\" style=\"object-fit:cover\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/applicationSettingsadded-1024x690.png 1024w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/applicationSettingsadded-300x202.png 300w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/applicationSettingsadded-768x518.png 768w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/applicationSettingsadded-1536x1036.png 1536w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/applicationSettingsadded.png 1572w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Application settings<\/figcaption><\/figure>\n\n\n\n<h6 class=\"wp-block-heading\">Add data activator<\/h6>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Note: <\/strong>As of the writing of this blog, Data Activator is still in preview.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Make sure if your data is streaming before you move further. In you Eventstream, click in the middle element named &#8220;ISS_Position&#8221;. The data preview should now be populated with the incoming data from your function.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"549\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Data-Incoming-1024x549.png\" alt=\"\" class=\"wp-image-505\" style=\"object-fit:cover\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Data-Incoming-1024x549.png 1024w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Data-Incoming-300x161.png 300w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Data-Incoming-768x412.png 768w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Data-Incoming-1536x824.png 1536w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/Data-Incoming-2048x1099.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Streaming data preview<\/figcaption><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In your Eventstream Resource, select new Destination &gt; Reflex.<\/li>\n\n\n\n<li>Open your newly created Reflex Resource.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"828\" height=\"490\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/new-reflex-1.png\" alt=\"\" class=\"wp-image-510\" style=\"width:700px\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/new-reflex-1.png 828w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/new-reflex-1-300x178.png 300w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/new-reflex-1-768x454.png 768w\" sizes=\"auto, (max-width: 828px) 100vw, 828px\" \/><figcaption class=\"wp-element-caption\">New Reflex resource<\/figcaption><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li>Create a new Object, select &#8220;System.Source.Type&#8221; as your ID Column.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"417\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/NewObject-4-1024x417.png\" alt=\"\" class=\"wp-image-514\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/NewObject-4-1024x417.png 1024w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/NewObject-4-300x122.png 300w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/NewObject-4-768x313.png 768w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/NewObject-4-1536x626.png 1536w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/NewObject-4-2048x835.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li>Create a new Trigger and select your Longitute field.<\/li>\n\n\n\n<li>In &#8220;Detect&#8221;, choose &#8220;Numeric&#8221; &gt; &#8220;Becomes Greater than&#8221; &#8212; &#8220;5.9564&#8221; &#8212; &#8220;Each Time&#8221;.<\/li>\n\n\n\n<li>in Act, choose &#8220;Send Teams Message&#8221;. If you want to, you can customize the Message.<\/li>\n\n\n\n<li>Safe the Trigger and test it with &#8220;Send me a test alert&#8221;.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1012\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/triggerconfig-1-1024x1012.png\" alt=\"\" class=\"wp-image-517\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/triggerconfig-1-1024x1012.png 1024w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/triggerconfig-1-300x297.png 300w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/triggerconfig-1-768x759.png 768w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/triggerconfig-1.png 1315w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"400\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/image-3-1024x400.png\" alt=\"\" class=\"wp-image-521\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/image-3-1024x400.png 1024w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/image-3-300x117.png 300w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/image-3-768x300.png 768w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/image-3.png 1240w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Trigger definition<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You should now be notified whenever the longitude of the ISS gets above the value of 5.5723. If you can&#8217;t see any trigger activations in the detect part, wait for more data to come in or adjust the value for the notification.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The notification in Teams looks like this:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"809\" height=\"1024\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/teams.message-809x1024.png\" alt=\"\" class=\"wp-image-523\" style=\"width:700px\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/teams.message-809x1024.png 809w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/teams.message-237x300.png 237w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/teams.message-768x972.png 768w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/teams.message.png 1020w\" sizes=\"auto, (max-width: 809px) 100vw, 809px\" \/><figcaption class=\"wp-element-caption\">Data Activator Teams notification<\/figcaption><\/figure>\n\n\n\n<h6 class=\"wp-block-heading\">Clean up<\/h6>\n\n\n\n<p class=\"wp-block-paragraph\">If you have been following along, please make sure to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Delete your Azure Resources, best is to delete the whole resource group.<\/li>\n\n\n\n<li>Delete your Fabric Workspace.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Alternatively, you can stop the Azure Function and restart as soon as you need it. The same works for your paid Fabric Capacity if you are in the pay-as-you-go model. But be aware that this potentially impacts multiple workspaces.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"424\" src=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/delete-resource-group-1024x424.png\" alt=\"\" class=\"wp-image-526\" srcset=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/delete-resource-group-1024x424.png 1024w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/delete-resource-group-300x124.png 300w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/delete-resource-group-768x318.png 768w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/delete-resource-group-1536x636.png 1536w, https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/delete-resource-group-2048x847.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Deleting Azure Resources<\/figcaption><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Final Thoughts<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Implementing the continuous location tracking of the ISS has highlighted three key insights into working with Eventstream and Data Activator in Fabric. These should serve as practical guidance for your own projects.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Simplified Architecture with Direct Data Feeding<\/strong><br>There&#8217;s no inherent need to create, maintain, and pay for a dedicated Event Hub to utilize Eventstream in Fabric. The data source itself can act as an Event Hub, allowing you to directly send data to the generated endpoint. This approach not only simplifies your architecture but also helps in reducing costs. While there might be scenarios where a dedicated Event Hub is beneficial, it&#8217;s important to understand that it&#8217;s not a necessity by default.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><strong>Latency Considerations<\/strong><\/strong><br>Consider the latency from the producer of the data to the notification of the user. In the presented case, the average notification time was around 3-4 minutes, with a maximum delay of 6 minutes. This time frame is generally acceptable for many applications, particularly in analytics. However, for situations requiring faster response times, alternative solutions might be more appropriate. It&#8217;s important to align the technology with the specific speed requirements of your project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><strong>Leveraging Eventstream&#8217;s Analytical Capabilities<\/strong><\/strong><br>Eventstream excels in creating alerts based on aggregated data. Immediate actions triggered by single event thresholds can be efficiently managed directly within Azure Functions, significantly reducing latency. However, remember that these functions typically process events in isolation, without additional context. In contrast, Fabric is geared more towards analytical workloads, offering a comprehensive view across multiple data points. To fully harness the power of streaming data, consider detecting aggregations and tumbling windows across various data points.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">More about Fabric:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.syntera.ch\/blog\/2023\/09\/26\/why-enterprises-using-power-bi-should-be-excited-about-ms-fabric\/\">Why Enterprises using Power BI should be excited about MS Fabric &#8211; Syntera<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.syntera.ch\/blog\/2023\/10\/18\/how-to-access-azure-key-vault-secrets-from-fabric-notebook\/\">How-To Access Azure Key Vault Secrets from Fabric Notebook &#8211; Syntera<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Understanding a tool&#8217;s utility is directly proportional to our knowledge of its use. This blog post aims to evaluate the advantages and disadvantages of using Fabric Eventstream &amp; Data Activator with real-world data. We aim to achieve this while minimizing infrastructure requirements and costs. In essence, this post demonstrates how to implement continuous location data [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":529,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[35],"class_list":["post-483","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-engineering","tag-fabric"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Implementing Fabric Eventstream &amp; Data Activator With Real World Data - Syntera<\/title>\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.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Implementing Fabric Eventstream &amp; Data Activator With Real World Data - Syntera\" \/>\n<meta property=\"og:description\" content=\"Understanding a tool&#8217;s utility is directly proportional to our knowledge of its use. This blog post aims to evaluate the advantages and disadvantages of using Fabric Eventstream &amp; Data Activator with real-world data. We aim to achieve this while minimizing infrastructure requirements and costs. In essence, this post demonstrates how to implement continuous location data [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/\" \/>\n<meta property=\"og:site_name\" content=\"Syntera\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-09T06:22:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-02-15T07:07:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/titlepicture.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1280\" \/>\n\t<meta property=\"og:image:height\" content=\"720\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Dominic Schranz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dominic Schranz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/\",\"url\":\"https:\/\/www.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/\",\"name\":\"Implementing Fabric Eventstream & Data Activator With Real World Data - Syntera\",\"isPartOf\":{\"@id\":\"https:\/\/www.syntera.ch\/blog\/#website\"},\"datePublished\":\"2024-01-09T06:22:41+00:00\",\"dateModified\":\"2024-02-15T07:07:24+00:00\",\"author\":{\"@id\":\"https:\/\/www.syntera.ch\/blog\/#\/schema\/person\/e038d1dcebeca2193c5503f78783988d\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.syntera.ch\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Implementing Fabric Eventstream &#038; Data Activator With Real World Data\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.syntera.ch\/blog\/#website\",\"url\":\"https:\/\/www.syntera.ch\/blog\/\",\"name\":\"Syntera\",\"description\":\"translating data into business value.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.syntera.ch\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.syntera.ch\/blog\/#\/schema\/person\/e038d1dcebeca2193c5503f78783988d\",\"name\":\"Dominic Schranz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.syntera.ch\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bd3589b8a6ccc62e37c3cee8f8e06c73a4085816337ad7d6c154e30dc60cc4c1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bd3589b8a6ccc62e37c3cee8f8e06c73a4085816337ad7d6c154e30dc60cc4c1?s=96&d=mm&r=g\",\"caption\":\"Dominic Schranz\"},\"url\":\"https:\/\/www.syntera.ch\/blog\/author\/domi\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Implementing Fabric Eventstream & Data Activator With Real World Data - Syntera","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.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/","og_locale":"en_US","og_type":"article","og_title":"Implementing Fabric Eventstream & Data Activator With Real World Data - Syntera","og_description":"Understanding a tool&#8217;s utility is directly proportional to our knowledge of its use. This blog post aims to evaluate the advantages and disadvantages of using Fabric Eventstream &amp; Data Activator with real-world data. We aim to achieve this while minimizing infrastructure requirements and costs. In essence, this post demonstrates how to implement continuous location data [&hellip;]","og_url":"https:\/\/www.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/","og_site_name":"Syntera","article_published_time":"2024-01-09T06:22:41+00:00","article_modified_time":"2024-02-15T07:07:24+00:00","og_image":[{"width":1280,"height":720,"url":"https:\/\/www.syntera.ch\/blog\/wp-content\/uploads\/2024\/01\/titlepicture.png","type":"image\/png"}],"author":"Dominic Schranz","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Dominic Schranz","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/","url":"https:\/\/www.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/","name":"Implementing Fabric Eventstream & Data Activator With Real World Data - Syntera","isPartOf":{"@id":"https:\/\/www.syntera.ch\/blog\/#website"},"datePublished":"2024-01-09T06:22:41+00:00","dateModified":"2024-02-15T07:07:24+00:00","author":{"@id":"https:\/\/www.syntera.ch\/blog\/#\/schema\/person\/e038d1dcebeca2193c5503f78783988d"},"breadcrumb":{"@id":"https:\/\/www.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.syntera.ch\/blog\/2024\/01\/09\/implementing-fabric-eventstream-data-activator-with-real-world-data\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.syntera.ch\/blog\/"},{"@type":"ListItem","position":2,"name":"Implementing Fabric Eventstream &#038; Data Activator With Real World Data"}]},{"@type":"WebSite","@id":"https:\/\/www.syntera.ch\/blog\/#website","url":"https:\/\/www.syntera.ch\/blog\/","name":"Syntera","description":"translating data into business value.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.syntera.ch\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.syntera.ch\/blog\/#\/schema\/person\/e038d1dcebeca2193c5503f78783988d","name":"Dominic Schranz","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.syntera.ch\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/bd3589b8a6ccc62e37c3cee8f8e06c73a4085816337ad7d6c154e30dc60cc4c1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bd3589b8a6ccc62e37c3cee8f8e06c73a4085816337ad7d6c154e30dc60cc4c1?s=96&d=mm&r=g","caption":"Dominic Schranz"},"url":"https:\/\/www.syntera.ch\/blog\/author\/domi\/"}]}},"_links":{"self":[{"href":"https:\/\/www.syntera.ch\/blog\/wp-json\/wp\/v2\/posts\/483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.syntera.ch\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.syntera.ch\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.syntera.ch\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.syntera.ch\/blog\/wp-json\/wp\/v2\/comments?post=483"}],"version-history":[{"count":14,"href":"https:\/\/www.syntera.ch\/blog\/wp-json\/wp\/v2\/posts\/483\/revisions"}],"predecessor-version":[{"id":599,"href":"https:\/\/www.syntera.ch\/blog\/wp-json\/wp\/v2\/posts\/483\/revisions\/599"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.syntera.ch\/blog\/wp-json\/wp\/v2\/media\/529"}],"wp:attachment":[{"href":"https:\/\/www.syntera.ch\/blog\/wp-json\/wp\/v2\/media?parent=483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.syntera.ch\/blog\/wp-json\/wp\/v2\/categories?post=483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.syntera.ch\/blog\/wp-json\/wp\/v2\/tags?post=483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}