<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://www.kerski.tech//feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.kerski.tech//" rel="alternate" type="text/html" /><updated>2026-09-07T10:02:25+00:00</updated><id>https://www.kerski.tech//feed.xml</id><title type="html">John Kerski’s Blog</title><subtitle>A blog about technology like Microsoft Power Automate, Power BI, Azure, and more.
</subtitle><author><name>John Kerski</name></author><entry><title type="html">Five Years of Bringing DataOps to Power BI and Fabric</title><link href="https://www.kerski.tech//bringing-dataops-to-power-bi-and-fabric-year-five/" rel="alternate" type="text/html" title="Five Years of Bringing DataOps to Power BI and Fabric" /><published>2026-07-26T00:00:00+00:00</published><updated>2026-07-26T00:00:00+00:00</updated><id>https://www.kerski.tech//bringing-dataops-to-power-bi-and-fabric-year-five</id><content type="html" xml:base="https://www.kerski.tech//bringing-dataops-to-power-bi-and-fabric-year-five/">&lt;p&gt;It has been five years since I &lt;a href=&quot;https://blog.kerski.tech/bringing-dataops-to-power-bi/&quot; target=&quot;_blank&quot;&gt;started this blog&lt;/a&gt;, but somehow it feels like almost a decade has passed since 2021.&lt;/p&gt;

&lt;p&gt;When I launched the blog, my goal was simple: bring DataOps principles to Power BI. Today, with Microsoft Fabric and AI reshaping the landscape, the application of those principles has expanded significantly.&lt;/p&gt;

&lt;p&gt;Over the past month, I’ve been reflecting on how DataOps principles are showing up throughout Fabric and Power BI.&lt;/p&gt;

&lt;h3 id=&quot;improving-cycle-times&quot;&gt;Improving Cycle Times&lt;/h3&gt;

&lt;p&gt;Whether it was intentional design or a happy accident, the introduction of &lt;a href=&quot;https://learn.microsoft.com/en-us/power-bi/developer/projects/projects-overview/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;Power BI Project files&lt;/a&gt; at the dawn of mainstream AI adoption dramatically accelerated how we build Power BI solutions.&lt;/p&gt;

&lt;p&gt;Today, we’re not only developing semantic models and reports more efficiently, but we’re also building user interfaces with &lt;a href=&quot;https://learn.microsoft.com/en-us/fabric/apps/overview/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;Fabric Apps&lt;/a&gt; and custom JavaScript applications layered on top of Power BI and Fabric.&lt;/p&gt;

&lt;p&gt;AI has further accelerated solution development across the Fabric platform. It has enabled my teams and me to build projects such as &lt;a href=&quot;https://pqlint.com/&quot; target=&quot;_blank&quot;&gt;Power Query Lint&lt;/a&gt; and &lt;a href=&quot;https://powerbi.games&quot; target=&quot;_blank&quot;&gt;Power Query Escape Room&lt;/a&gt;, both powered by &lt;a href=&quot;https://learn.microsoft.com/en-us/fabric/real-time-intelligence/overview/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;Fabric Real-Time Intelligence&lt;/a&gt; and &lt;a href=&quot;https://learn.microsoft.com/en-us/fabric/database/sql/overview&quot; target=&quot;_blank&quot;&gt;Fabric SQL&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;reuse&quot;&gt;Reuse&lt;/h3&gt;

&lt;p&gt;Outside of AI, features such as &lt;a href=&quot;https://learn.microsoft.com/en-us/power-bi/transform-model/desktop-user-defined-functions/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;User-Defined Functions (UDFs)&lt;/a&gt;, &lt;a href=&quot;https://learn.microsoft.com/en-us/power-bi/developer/projects/projects-dataset/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;TMDL View&lt;/a&gt;, and &lt;a href=&quot;https://learn.microsoft.com/en-us/power-bi/transform-model/dax-query-view/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;DAX Query View&lt;/a&gt; are finally making it easier to reuse logic and share code across teams.&lt;/p&gt;

&lt;p&gt;For years, reusability has been a challenge in Power BI development. These capabilities represent meaningful progress toward standardizing and sharing patterns, which is a core DataOps principle.&lt;/p&gt;

&lt;h3 id=&quot;quality-is-paramount&quot;&gt;Quality Is Paramount&lt;/h3&gt;

&lt;p&gt;Testing is now becoming a first-class citizen within semantic models.&lt;/p&gt;

&lt;p&gt;User-Defined Functions have opened the door for automated testing scenarios, and they enabled my team to develop &lt;a href=&quot;https://daxlib.org/package/PQL.Assert/&quot; target=&quot;_blank&quot;&gt;PQL.Assert&lt;/a&gt;, which we shared with the community to help automate semantic model testing.&lt;/p&gt;

&lt;p&gt;As DataOps practitioners know, quality cannot be an afterthought. The faster we can build, the more important automated validation becomes.&lt;/p&gt;

&lt;h3 id=&quot;room-for-improvement&quot;&gt;Room for Improvement&lt;/h3&gt;

&lt;p&gt;With all these advances, it’s easy to become complacent. Success can sometimes blind us to the opportunities that still exist.&lt;/p&gt;

&lt;p&gt;However, complacency eventually leads to missed opportunities. While Microsoft has made tremendous progress, there are still several improvements that could further strengthen the application of DataOps principles within Fabric and Power BI.&lt;/p&gt;

&lt;p&gt;Here is my wish list for 2026.&lt;/p&gt;

&lt;h3 id=&quot;1-azure-key-vault-as-a-fabric-artifact&quot;&gt;1. &lt;a href=&quot;https://community.fabric.microsoft.com/t5/Fabric-Ideas/Providing-Azure-Key-Vault-Access-in-Microsoft-Fabric/idi-p/4514477)&quot; target=&quot;_blank&quot;&gt;Azure Key Vault as a Fabric Artifact&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;This has been a frustration of mine for years, and it is clearly something many in the community have been asking for.&lt;/p&gt;

&lt;p&gt;When Variables were introduced, I hoped they would become the foundation for securely storing secrets within Fabric tenants. Unfortunately, that hasn’t happened.&lt;/p&gt;

&lt;p&gt;Today, obtaining and managing an &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/key-vault/general/overview/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;Azure Key Vault&lt;/a&gt; can still be a bureaucratic process or a bridge too far for many organizations. As a result, some practitioners take the path of least resistance and store secrets directly in &lt;a href=&quot;https://learn.microsoft.com/en-us/power-query/power-query-what-is-power-query/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;Power Query&lt;/a&gt;, &lt;a href=&quot;https://learn.microsoft.com/en-us/power-bi/transform-model/dataflows/dataflows-introduction-self-service/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;Dataflows&lt;/a&gt;, or other places where they do not belong.&lt;/p&gt;

&lt;p&gt;Yes, secrets can be passed from a pipeline, but that process is still cumbersome and ultimately depends on having a Key Vault.&lt;/p&gt;

&lt;p&gt;In the age of AI, this becomes even more important.&lt;/p&gt;

&lt;p&gt;Imagine if Fabric included a native Key Vault artifact. We could reference secrets securely within the Fabric ecosystem, and AI-powered code reviews could identify exposed credentials and automatically recommend moving them into a governed secret store. It would improve security while simplifying development.&lt;/p&gt;

&lt;h3 id=&quot;2-break-up-expressionstmdl&quot;&gt;2. &lt;a href=&quot;https://community.fabric.microsoft.com/t5/Fabric-Ideas/Break-Up-expressions-tmdl-in-PBIP/idi-p/5306785#M168995&quot; target=&quot;_blank&quot;&gt;Break Up expressions.tmdl&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Let’s face it: tokens are the currency of AI.&lt;/p&gt;

&lt;p&gt;When an agent has to read a 2,000-line &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;expressions.tmdl&lt;/code&gt; file just to update a single function or table, we’re wasting tokens and increasing processing overhead.&lt;/p&gt;

&lt;p&gt;The rapid growth of User Defined Functions has made this file even larger, which can create challenges in Visual Studio Code and increase merge conflicts during parallel development.&lt;/p&gt;

&lt;p&gt;A more modular approach that stores tables, parameters, and functions in separate files would reduce merge conflicts, improve Git workflows, and make AI-assisted development significantly more efficient.&lt;/p&gt;

&lt;h3 id=&quot;3-native-regular-expression-support-in-power-query&quot;&gt;3. &lt;a href=&quot;https://community.fabric.microsoft.com/t5/Fabric-Ideas/Regex-in-PowerQuery/idi-p/4515143&quot; target=&quot;_blank&quot;&gt;Native Regular Expression Support in Power Query&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;The community first requested regex support years ago, and it remains one of the most obvious gaps in the Power Query language.&lt;/p&gt;

&lt;p&gt;There are workarounds involving HTML and JavaScript, but they do not work reliably in the service. Many of my teams have resorted to using &lt;a href=&quot;https://youtu.be/-Fk0wUY0CKk?si=eYqqRLN7vUeJiwUg&quot; target=&quot;_blank&quot;&gt;Azure AI Foundry or external services&lt;/a&gt; simply to perform regex operations.&lt;/p&gt;

&lt;p&gt;This feels unnecessary when .NET already provides robust regex functionality that could be surfaced directly through Power Query.&lt;/p&gt;

&lt;p&gt;Regular expressions are a foundational capability for data transformation and should not require external dependencies.&lt;/p&gt;

&lt;h3 id=&quot;4-oauth-support-for-post-requests-in-webcontents&quot;&gt;4. &lt;a href=&quot;https://community.fabric.microsoft.com/t5/Fabric-Ideas/OAuth-Support-for-POST-Requests-in-Web-Contents/idi-p/5306789#M168996&quot; target=&quot;_blank&quot;&gt;OAuth Support for POST Requests in Web.Contents&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;If we cannot have a native Key Vault artifact and we still need external services for capabilities like regex, then we need better authentication support in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Web.Contents&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Today, many APIs require POST requests that include payloads and OAuth authentication. In practice, developers often end up using anonymous connections alongside API keys and then face the challenge of securing those keys.&lt;/p&gt;

&lt;p&gt;It is a cascading problem that creates unnecessary complexity and security concerns.&lt;/p&gt;

&lt;p&gt;Supporting OAuth-authenticated POST requests natively would remove a significant friction point for Power BI and Fabric developers.&lt;/p&gt;

&lt;h3 id=&quot;5-skills-as-a-fabric-artifact-or-environment-resource&quot;&gt;5. &lt;a href=&quot;https://community.fabric.microsoft.com/t5/Fabric-Ideas/Skills-as-a-Fabric-Artifact-or-Environment-Resource/idi-p/5306790#M168997&quot; target=&quot;_blank&quot;&gt;Skills as a Fabric Artifact or Environment Resource&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Skills have quickly become an essential part of AI-enabled development.&lt;/p&gt;

&lt;p&gt;However, they have also created a version-control challenge.&lt;/p&gt;

&lt;p&gt;Today, skills files are often copied to individual developer machines. While convenient, this also means that different developers can experience different outcomes based on local configuration differences.&lt;/p&gt;

&lt;p&gt;This is not an unsolved problem. The software industry has managed package dependencies for decades through ecosystems like npm and PyPI.  In fact, Microsoft has produced &lt;a href=&quot;https://microsoft.github.io/apm/&quot; target=&quot;_blank&quot;&gt;the agent package manager&lt;/a&gt; to solve this problem for agents and skills.&lt;/p&gt;

&lt;p&gt;I’d love to see skills, agents, and MCP configuration become first-class artifacts, or perhaps part of a Fabric Environment, so they can be versioned, managed, shared, and governed consistently across teams in the service and locally.&lt;/p&gt;

&lt;p&gt;Even more importantly, I would love Fabric Copilot and related AI experiences to automatically leverage those skills so that AI interactions align with established standards and best practices.&lt;/p&gt;

&lt;h3 id=&quot;6-github-app-connections-for-fabric-git-integration&quot;&gt;6. &lt;a href=&quot;https://community.fabric.microsoft.com/t5/Fabric-Ideas/GitHub-App-Connections-for-Fabric-Git-Integration/idi-p/5306794#M168998&quot; target=&quot;_blank&quot;&gt;GitHub App Connections for Fabric Git Integration&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/fabric/cicd/git-integration/intro-to-git-integration/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;Git integration&lt;/a&gt; is critical for DataOps.&lt;/p&gt;

&lt;p&gt;While &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/devops/user-guide/what-is-azure-devops/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;Azure DevOps&lt;/a&gt; integration is excellent, GitHub integration still relies heavily on &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;Personal Access Tokens (PATs)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I would love to see support for GitHub App connections that eliminate the need to manage, rotate, and secure PATs manually. It would simplify administration and align better with modern GitHub security practices.&lt;/p&gt;

&lt;h3 id=&quot;7-extend-user-data-functions-to-be-more-like-azure-functions&quot;&gt;7. &lt;a href=&quot;https://community.fabric.microsoft.com/t5/Fabric-Ideas/Extend-User-Data-Functions-to-Be-More-Like-Azure-Functions/idi-p/5306804#M168999&quot; target=&quot;_blank&quot;&gt;Extend User Data Functions to Be More Like Azure Functions&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;I am a big fan of &lt;a href=&quot;https://learn.microsoft.com/en-us/fabric/data-engineering/user-data-functions/user-data-functions-overview&quot; target=&quot;_blank&quot;&gt;User Data Functions&lt;/a&gt; (not to be confused with User Defined Functions in DAX) and their writeback capabilities.&lt;/p&gt;

&lt;p&gt;However, as Fabric increasingly becomes the backend platform for storing, processing, and orchestrating data for front-end applications, something Fabric Apps is making increasingly apparent, we need more of the capabilities offered by &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/azure-functions/functions-overview/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;Azure Functions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I would love to see support for additional runtimes such as Node.js, TypeScript, and PowerShell, along with features like deployment slots.&lt;/p&gt;

&lt;p&gt;Azure Functions are incredibly powerful, but many organizations struggle with the overhead of provisioning Azure resources. Bringing more of those capabilities directly into Fabric would lower barriers to adoption and accelerate innovation.&lt;/p&gt;

&lt;h3 id=&quot;8-expand-fabric-apps-beyond-entra-only-internal-applications&quot;&gt;8. Expand Fabric Apps Beyond Entra-only Internal Applications&lt;/h3&gt;

&lt;p&gt;Fabric Apps have introduced an exciting possibility: JavaScript applications backed entirely by Fabric.&lt;/p&gt;

&lt;p&gt;With existing data layers, &lt;a href=&quot;https://learn.microsoft.com/en-us/fabric/data-warehouse/graphql-api/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;GraphQL&lt;/a&gt; support, and User Data Functions acting as an API layer, Microsoft has an opportunity to think beyond internal enterprise applications.&lt;/p&gt;

&lt;p&gt;Fabric Apps already provide application hosting and static content hosting. The next step is enabling organizations to build truly customer-facing applications within Fabric.&lt;/p&gt;

&lt;p&gt;Imagine being able to designate an application or workspace for public consumption while supporting authentication providers beyond &lt;a href=&quot;https://learn.microsoft.com/en-us/entra/fundamentals/whatis/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;Microsoft Entra ID&lt;/a&gt;. Organizations could build and publish customer-facing data applications directly from Fabric without introducing additional hosting platforms.&lt;/p&gt;

&lt;p&gt;Today, solutions like &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/static-web-apps/overview/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;Azure Static Web Apps&lt;/a&gt; and Vercel fill this gap. However, once a project extends beyond the Fabric boundary, adoption often slows as teams encounter additional security reviews, coordination efforts, and infrastructure costs.&lt;/p&gt;

&lt;p&gt;Bringing these capabilities closer to Fabric could dramatically simplify the path from analytics solution to external-facing application.&lt;/p&gt;

&lt;h2 id=&quot;looking-back-and-forward&quot;&gt;Looking Back and Forward&lt;/h2&gt;

&lt;p&gt;Despite the opportunities I’ve outlined, I am genuinely pleased with the progress Microsoft has made over the past five years.&lt;/p&gt;

&lt;p&gt;Many of the capabilities we have today, from Power BI Project Files to TMDL, DAX Query View, User-Defined Functions, and AI-assisted development, have fundamentally improved how we apply DataOps principles in Power BI and Fabric.&lt;/p&gt;

&lt;p&gt;I also deeply appreciate the generosity of the data community. Whether through open-source projects, blog posts, conference sessions, or GitHub repositories, practitioners continue to share best practices and push the ecosystem forward.&lt;/p&gt;

&lt;p&gt;The next five years will likely move even faster than the last five.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would you like to see improved in Fabric and Power BI?&lt;/strong&gt; Let me know on &lt;a href=&quot;https://www.linkedin.com/in/john-kerski-41a697100&quot; target=&quot;_blank&quot;&gt;LinkedIn&lt;/a&gt; or &lt;a href=&quot;https://twitter.com/jkerski&quot; target=&quot;_blank&quot;&gt;Twitter/X&lt;/a&gt;.&lt;/p&gt;</content><author><name>John Kerski</name></author><category term="Power BI" /><category term="Fabric" /><category term="DataOps" /><category term="Testing" /><category term="AI" /><summary type="html">It has been five years since I started this blog, but somehow it feels like almost a decade has passed since 2021.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.kerski.tech//assets/img/posts/year-5.jpg" /><media:content medium="image" url="https://www.kerski.tech//assets/img/posts/year-5.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Building an Apache Arrow Parser for Power BI’s ExecuteDaxQueries Endpoint</title><link href="https://www.kerski.tech//executedaxqueries-arrow-parser/" rel="alternate" type="text/html" title="Building an Apache Arrow Parser for Power BI’s ExecuteDaxQueries Endpoint" /><published>2026-07-17T00:00:00+00:00</published><updated>2026-07-17T00:00:00+00:00</updated><id>https://www.kerski.tech//executedaxqueries-arrow-parser</id><content type="html" xml:base="https://www.kerski.tech//executedaxqueries-arrow-parser/">&lt;p&gt;One of the biggest advantages of Large Language Models is that, when used effectively, they can help carry an idea from planning to implementation, testing, and deployment.&lt;/p&gt;

&lt;p&gt;Recently, Microsoft introduced the &lt;a href=&quot;https://learn.microsoft.com/en-us/rest/api/power-bi/datasets/execute-dax-queries?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;ExecuteDaxQueries endpoint&lt;/a&gt; for the &lt;a href=&quot;https://learn.microsoft.com/en-us/rest/api/power-bi/?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;Power BI REST API&lt;/a&gt;. This endpoint enables you to execute DAX queries programmatically against Power BI semantic models/datasets and retrieve results in a structured format, making it ideal for automation, testing, and integration scenarios. While many will ask, “Didn’t we already have ExecuteQueries?” the answer is yes, but the new endpoint adds some important capabilities, including support for &lt;a href=&quot;https://learn.microsoft.com/en-us/dax/info-functions-dax?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;INFO functions&lt;/a&gt; and preservation of native data types that were previously lost in the JSON output returned by ExecuteQueries.&lt;/p&gt;

&lt;p&gt;For years, I’ve used ExecuteQueries in a &lt;a href=&quot;https://github.com/kerski/powerquery-connector-pbi-rest-api-commercial&quot; target=&quot;_blank&quot;&gt;custom Power BI REST API connector&lt;/a&gt; that I shared with the community. However, when it came to leveraging &lt;a href=&quot;https://learn.microsoft.com/en-us/dax/dax-user-defined-functions?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;UDFs&lt;/a&gt; alongside INFO functions, we hit a wall. ExecuteDaxQueries opened the door, but there was a challenge: the response is returned in &lt;a href=&quot;https://arrow.apache.org/docs/format/Columnar.html#ipc-streaming-format&quot; target=&quot;_blank&quot;&gt;Apache Arrow IPC format&lt;/a&gt;, and &lt;a href=&quot;https://learn.microsoft.com/en-us/power-query/power-query-what-is-power-query?wt.mc_id=MVP_369005&quot; target=&quot;_blank&quot;&gt;Power Query&lt;/a&gt; has no native Arrow parser.&lt;/p&gt;

&lt;p&gt;The idea of building an Arrow parser by hand was daunting. Instead, I took an AI-Driven Development (AIDD) approach using a template from &lt;a href=&quot;https://github.com/ericelliott&quot; target=&quot;_blank&quot;&gt;Eric Elliott&lt;/a&gt; and guided the process with a test-first mindset. The goal was simple: build an Apache Arrow IPC parser for Power Query while continuously validating results against Python-based parsers and parity tests. After several rounds of planning, implementation, testing, and refinement, I believe we now have a working solution.&lt;/p&gt;

&lt;p&gt;The result is a pre-release version of the connector that supports ExecuteDaxQueries, including Apache Arrow parsing, and it’s available now.&lt;/p&gt;

&lt;h2 id=&quot;resources&quot;&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kerski/powerquery-connector-pbi-rest-api-commercial/releases/tag/v-2.2.0-beta&quot; target=&quot;_blank&quot;&gt;Pre-Release Download (v2.2.0-beta)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kerski/powerquery-connector-pbi-rest-api-commercial#power-query-custom-data-connector-for-power-bi-rest-apis-commercial&quot; target=&quot;_blank&quot;&gt;Connector Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ll be sharing a video soon that walks through the connector and explains how it can help Power BI developers interact with APIs more effectively. For organizations in Commercial, GCC, and DoD tenants, this also creates new opportunities for testing, automation, and governance scenarios.&lt;/p&gt;

&lt;p&gt;In the meantime, give it a try and let me know what you think.&lt;/p&gt;</content><author><name>John Kerski</name></author><category term="Power BI" /><category term="Fabric" /><category term="DataOps" /><category term="Testing" /><category term="AI" /><summary type="html">One of the biggest advantages of Large Language Models is that, when used effectively, they can help carry an idea from planning to implementation, testing, and deployment.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.kerski.tech//assets/img/posts/execute-dax-queries.jpg" /><media:content medium="image" url="https://www.kerski.tech//assets/img/posts/execute-dax-queries.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Why User Defined Functions (UDFs) Changed Testing in Power BI</title><link href="https://www.kerski.tech//udfs-and-reuse/" rel="alternate" type="text/html" title="Why User Defined Functions (UDFs) Changed Testing in Power BI" /><published>2026-06-20T00:00:00+00:00</published><updated>2026-06-20T00:00:00+00:00</updated><id>https://www.kerski.tech//udfs-and-reuse</id><content type="html" xml:base="https://www.kerski.tech//udfs-and-reuse/">&lt;p&gt;User Defined Functions (UDFs) are, in my opinion, the biggest update to Power BI Desktop since PBIP.&lt;/p&gt;

&lt;p&gt;That may sound dramatic, but if you care about DataOps, semantic model quality, and reusable development patterns, UDFs fundamentally change what is possible with DAX.&lt;/p&gt;

&lt;p&gt;Reuse is one of the core principles of DataOps. For years we have been able to build reusable patterns in Power Query, PowerShell, Python, YAML, and infrastructure automation. But DAX was always missing a key capability: reusable logic that could live &lt;em&gt;inside&lt;/em&gt; the semantic model itself.&lt;/p&gt;

&lt;p&gt;Until now.&lt;/p&gt;

&lt;h2 id=&quot;the-problem-weve-had-for-years&quot;&gt;The Problem We’ve Had for Years&lt;/h2&gt;

&lt;p&gt;Testing semantic models has always been harder than it should be.&lt;/p&gt;

&lt;p&gt;I’ve seen teams create entire ecosystems around testing:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Separate DAX query libraries&lt;/li&gt;
  &lt;li&gt;Python validation scripts&lt;/li&gt;
  &lt;li&gt;YAML configuration for test orchestration&lt;/li&gt;
  &lt;li&gt;PowerShell execution frameworks&lt;/li&gt;
  &lt;li&gt;Custom CI/CD runners in Azure Pipelines and GitHub Actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of that just to validate whether a semantic model was behaving correctly.&lt;/p&gt;

&lt;p&gt;The bigger problem was consistency.&lt;/p&gt;

&lt;p&gt;Every team built testing differently. Every organization defined “quality” differently. Some teams had robust automation. Others had manual spot checks. Some validated measures. Others validated refreshes. Some validated nothing at all.&lt;/p&gt;

&lt;p&gt;Testing maturity became subjective.&lt;/p&gt;

&lt;p&gt;And because these tests lived &lt;em&gt;outside&lt;/em&gt; the model, they constantly drifted from the thing they were actually validating.&lt;/p&gt;

&lt;h2 id=&quot;why-udfs-matter&quot;&gt;Why UDFs Matter&lt;/h2&gt;

&lt;p&gt;UDFs finally give us a native way to build reusable testing patterns directly into the semantic model.&lt;/p&gt;

&lt;p&gt;That changes everything.&lt;/p&gt;

&lt;p&gt;Now we can:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Standardize testing patterns&lt;/li&gt;
  &lt;li&gt;Reuse assertions across models&lt;/li&gt;
  &lt;li&gt;Keep tests versioned with the model&lt;/li&gt;
  &lt;li&gt;Eliminate orchestration complexity&lt;/li&gt;
  &lt;li&gt;Build portable testing libraries&lt;/li&gt;
  &lt;li&gt;Make testing part of the semantic model itself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a massive leap forward for DataOps in Power BI.&lt;/p&gt;

&lt;p&gt;When UDFs became available, my team immediately saw the opportunity.&lt;/p&gt;

&lt;p&gt;We wanted a comprehensive testing framework that lived &lt;em&gt;inside&lt;/em&gt; the model instead of around it.&lt;/p&gt;

&lt;p&gt;That’s how &lt;strong&gt;PQL.Assert&lt;/strong&gt; was born.&lt;/p&gt;

&lt;h2 id=&quot;introducing-pqlassert&quot;&gt;Introducing PQL.Assert&lt;/h2&gt;

&lt;p&gt;PQL.Assert is a reusable testing library for Power BI semantic models built using DAX User Defined Functions.&lt;/p&gt;

&lt;p&gt;The goal was simple:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Standardize semantic model testing&lt;/li&gt;
  &lt;li&gt;Make assertions reusable&lt;/li&gt;
  &lt;li&gt;Reduce pipeline complexity&lt;/li&gt;
  &lt;li&gt;Encourage automated testing adoption&lt;/li&gt;
  &lt;li&gt;Bring software engineering testing practices into BI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of every team reinventing testing from scratch, PQL.Assert provides a common schema and reusable assertion framework directly within the model.&lt;/p&gt;

&lt;p&gt;Since launching in February 2026, PQL.Assert has already surpassed 1,800 downloads, which tells me the Power BI community understands the value and has been waiting for something like this.&lt;/p&gt;

&lt;h2 id=&quot;but-why-would-i-test&quot;&gt;“But Why Would I Test?”&lt;/h2&gt;

&lt;p&gt;Because AI is accelerating semantic model development faster than ever.&lt;/p&gt;

&lt;p&gt;Models are now being generated, modified, and optimized at a pace we simply have not seen before. Copilot experiences, Fabric workloads, agents, and automation are all increasing how quickly BI solutions are created.&lt;/p&gt;

&lt;p&gt;But speed without validation is dangerous.&lt;/p&gt;

&lt;p&gt;How do you know a generated measure is correct?&lt;/p&gt;

&lt;p&gt;How do you know a schema change did not break downstream logic?&lt;/p&gt;

&lt;p&gt;How do you prove a semantic model is trustworthy?&lt;/p&gt;

&lt;p&gt;Testing.&lt;/p&gt;

&lt;h2 id=&quot;semantic-models-are-the-foundation&quot;&gt;Semantic Models Are the Foundation&lt;/h2&gt;

&lt;p&gt;Enterprise BI without testing practices cannot honestly claim that decisions are being made on a fully validated foundation.&lt;/p&gt;

&lt;p&gt;Our reports rely on semantic models.&lt;/p&gt;

&lt;p&gt;Our agents rely on semantic models.&lt;/p&gt;

&lt;p&gt;Our Fabric implementations rely on semantic models.&lt;/p&gt;

&lt;p&gt;Even AI experiences like Rayfin ultimately depend on trustworthy semantic models underneath the surface.&lt;/p&gt;

&lt;p&gt;Everything stacks on top of that foundation.&lt;/p&gt;

&lt;p&gt;Without testing and automated validation, organizations are effectively building analytical systems on assumptions instead of guarantees.&lt;/p&gt;

&lt;p&gt;That becomes even more risky as AI-generated content increases.&lt;/p&gt;

&lt;p&gt;Testing is no longer optional, it’s necessary.&lt;/p&gt;

&lt;h2 id=&quot;learn-more&quot;&gt;Learn More&lt;/h2&gt;

&lt;p&gt;If you want to get started with semantic model testing using PQL.Assert, check out the setup documentation and examples below.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/clientfirsttech/PQL.Assert&quot; target=&quot;_blank&quot;&gt;PQL.Assert GitHub Repo&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.red-gate.com/simple-talk/data-analytics/powerbi/never-ship-a-broken-semantic-model-again-how-to-build-automated-tests-in-power-bi-with-user-defined-functions/&quot; target=&quot;_blank&quot;&gt;Tutorial&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=DQ-6x6CpoKI&amp;amp;list=PLzv1wQZnGKJcfkGFVYEpbQ6YNuJ_GAgqm&quot; target=&quot;_blank&quot;&gt;AI-Enabled Power BI Tester&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><author><name>John Kerski</name></author><category term="Power BI" /><category term="Fabric" /><category term="DataOps" /><category term="Testing" /><summary type="html">User Defined Functions (UDFs) are, in my opinion, the biggest update to Power BI Desktop since PBIP.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.kerski.tech//assets/img/posts/udfs-ga.jpg" /><media:content medium="image" url="https://www.kerski.tech//assets/img/posts/udfs-ga.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">How DataOps principles help to reduce GenAI risk and improve data quality</title><link href="https://www.kerski.tech//ai-in-data-lessons-from-genai/" rel="alternate" type="text/html" title="How DataOps principles help to reduce GenAI risk and improve data quality" /><published>2026-05-09T00:00:00+00:00</published><updated>2026-05-09T00:00:00+00:00</updated><id>https://www.kerski.tech//ai-in-data-lessons-from-genai</id><content type="html" xml:base="https://www.kerski.tech//ai-in-data-lessons-from-genai/">&lt;p&gt;Over the past several articles, I’ve shared how my teams and I have navigated deployments and consulting projects with Fabric, Power BI, and Azure, where using AI has become essential for efficiency. The rapid adoption of tools like Claude for updating Power BI Semantic Models, the FabricNotebook agent for notebooks, and custom agents for enabling data chat has made it clear that GenAI is now a core part of the data landscape.&lt;/p&gt;

&lt;p&gt;However, these advances also highlight the growing importance of DataOps principles. Without strong DataOps practices, AI can just as easily introduce new risks and undermine trust in your data solutions as it can accelerate productivity. I’ve compiled nine practical tips to help teams reduce GenAI risk and improve data quality. Read the full article on &lt;a href=&quot;https://www.red-gate.com/simple-talk/ai/how-dataops-helps-reduce-gen-ai-risk-improve-data-quality/&quot; target=&quot;_blank&quot;&gt;Simple Talk&lt;/a&gt; to learn more.&lt;/p&gt;

&lt;p&gt;Share your thoughts on &lt;a href=&quot;https://www.linkedin.com/in/john-kerski-41a697100&quot; target=&quot;_blank&quot;&gt;LinkedIn&lt;/a&gt; or &lt;a href=&quot;https://twitter.com/jkerski&quot; target=&quot;_blank&quot;&gt;Twitter/X&lt;/a&gt;.&lt;/p&gt;</content><author><name>John Kerski</name></author><category term="ai" /><category term="data" /><summary type="html">Over the past several articles, I’ve shared how my teams and I have navigated deployments and consulting projects with Fabric, Power BI, and Azure, where using AI has become essential for efficiency. The rapid adoption of tools like Claude for updating Power BI Semantic Models, the FabricNotebook agent for notebooks, and custom agents for enabling data chat has made it clear that GenAI is now a core part of the data landscape.</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.kerski.tech//assets/img/posts/dataops-and-ai.jpg" /><media:content medium="image" url="https://www.kerski.tech//assets/img/posts/dataops-and-ai.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">5 Ways Microsoft Fabric Is Embracing Simplicity</title><link href="https://www.kerski.tech//simplicity/" rel="alternate" type="text/html" title="5 Ways Microsoft Fabric Is Embracing Simplicity" /><published>2026-04-02T00:00:00+00:00</published><updated>2026-04-02T00:00:00+00:00</updated><id>https://www.kerski.tech//simplicity</id><content type="html" xml:base="https://www.kerski.tech//simplicity/">&lt;h2 id=&quot;5-ways-microsoft-fabric-is-embracing-simplicity&quot;&gt;5 Ways Microsoft Fabric Is Embracing Simplicity&lt;/h2&gt;

&lt;p&gt;The last couple of weeks have been exciting to watch in the Microsoft Fabric space. These are a few of the announcements that I think help us move closer to a core DataOps principle of simplicity:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Simplicity:&lt;/strong&gt;&lt;br /&gt;
We believe that continuous attention to technical excellence and good design enhances agility; likewise simplicity, the art of maximizing the amount of work not done, is essential.&lt;/p&gt;

  &lt;p&gt;— &lt;em&gt;DataOps Manifesto&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;mirroring-for-sharepoint-lists&quot;&gt;&lt;a href=&quot;https://blog.fabric.microsoft.com/en-us/blog/fabric-march-2026-feature-summary?ft=All#post-34196-_Toc224559704&quot; target=&quot;_blank&quot;&gt;Mirroring for SharePoint Lists&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;In the past, I have written about pulling data from SharePoint, and this has the potential to eliminate the need to learn that pesky OData syntax or deal with the slow V1 or V2 SharePoint list connectors. The ability to surface SharePoint list data into Power BI just got simpler.&lt;/p&gt;

&lt;h2 id=&quot;excel-shortcuts&quot;&gt;&lt;a href=&quot;https://azure.microsoft.com/en-us/blog/fabcon-and-sqlcon-2026-unifying-databases-and-fabric-on-a-single-data-platform/#see-more-fabric-innovation&quot; target=&quot;_blank&quot;&gt;Excel Shortcuts&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;You cannot take the Finance team away from Excel, but you can now mirror the Excel data they manage. This should make handling version history and schema much easier, and it helps us avoid the slow SharePoint.Files connector.&lt;/p&gt;

&lt;h2 id=&quot;compare-code-changes&quot;&gt;&lt;a href=&quot;https://blog.fabric.microsoft.com/en-us/blog/fabric-march-2026-feature-summary?ft=All#post-34196-_Toc224559588&quot; target=&quot;_blank&quot;&gt;Compare Code Changes&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;This is the question I kept getting in presentations on Git integration: ‘Can I see what changed in the service without going to Azure DevOps or GitHub?’ Now I can say yes, and life is a little simpler.&lt;/p&gt;

&lt;h2 id=&quot;fabric-notebook-auto-binding-for-lakehouses&quot;&gt;&lt;a href=&quot;https://blog.fabric.microsoft.com/en-us/blog/fabric-notebooks-support-lakehouse-auto-binding-in-git-preview?ft=All&quot; target=&quot;_blank&quot;&gt;Fabric Notebook Auto Binding for Lakehouses&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Ever move a notebook to another workspace and wonder why it is not behaving correctly, only to realize it is pointing to the wrong lakehouse? Yep, been there. This feature makes deployments across workspaces much simpler.&lt;/p&gt;

&lt;h2 id=&quot;workspace-tags&quot;&gt;&lt;a href=&quot;https://blog.fabric.microsoft.com/en-us/blog/find-and-manage-workspaces-faster-with-workspace-tags-generally-available?ft=All&quot; target=&quot;_blank&quot;&gt;Workspace Tags&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Workspace sprawl got you struggling to find where you need to go? Workspace tags help make managing and locating workspaces simpler. This is especially helpful when you have multiple workspaces for the same project, like dev, test, and prod.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;I know I spend a lot of time writing about how Microsoft can make things harder for DataOps practitioners, but this time they are clearly moving in the right direction and making things simpler.&lt;/p&gt;

&lt;p&gt;Which of these five Fabric features do you think will have the biggest impact on simplifying your data workflows? Are there other areas where you’d like to see Microsoft continue embracing the DataOps principle of simplicity? Share your thoughts on &lt;a href=&quot;https://www.linkedin.com/in/john-kerski-41a697100&quot; target=&quot;_blank&quot;&gt;LinkedIn&lt;/a&gt; or &lt;a href=&quot;https://twitter.com/jkerski&quot; target=&quot;_blank&quot;&gt;Twitter/X&lt;/a&gt;.&lt;/p&gt;</content><author><name>John Kerski</name></author><category term="ai" /><category term="powerbi" /><summary type="html">5 Ways Microsoft Fabric Is Embracing Simplicity</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.kerski.tech//assets/img/posts/simplicity.jpg" /><media:content medium="image" url="https://www.kerski.tech//assets/img/posts/simplicity.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">UDFs in GCC and DoD: A big step for reusable, testable semantic models</title><link href="https://www.kerski.tech//udfs/" rel="alternate" type="text/html" title="UDFs in GCC and DoD: A big step for reusable, testable semantic models" /><published>2026-03-31T00:00:00+00:00</published><updated>2026-03-31T00:00:00+00:00</updated><id>https://www.kerski.tech//udfs</id><content type="html" xml:base="https://www.kerski.tech//udfs/">&lt;h2 id=&quot;udfs-in-gcc-and-dod-a-big-step-for-reusable-testable-semantic-models&quot;&gt;UDFs in GCC and DoD: A big step for reusable, testable semantic models&lt;/h2&gt;

&lt;p&gt;Thanks to the Microsoft team, we recently got &lt;a href=&quot;https://learn.microsoft.com/en-us/power-bi/transform-model/desktop-user-defined-functions-overview?wt.mc_id=MVP_36900&quot; target=&quot;_blank&quot;&gt;User Defined Function (UDF)&lt;/a&gt; support in GCC and DoD sovereign tenants.&lt;/p&gt;

&lt;p&gt;Why is that so important? If you have seen what &lt;a href=&quot;https://daxlib.org&quot; target=&quot;_blank&quot;&gt;DAXLib&lt;/a&gt; offers with SVG image and chart generation, or if you are trying to simplify and reuse measures, UDFs unlock a lot of value. Even better, many of these UDFs are open source under the MIT License, which makes it easier to adopt and adapt them for your own needs.&lt;/p&gt;

&lt;p&gt;For my teams, this fits directly into how we approach testing. We have been using &lt;a href=&quot;https://daxlib.org/package/PQL.Assert/&quot; target=&quot;_blank&quot;&gt;PQL.Assert&lt;/a&gt; along with Power Automate to validate semantic models and catch issues early. With continued government investment in G3 and G5 licenses, Power BI and Power Automate already give us a solid way to automate data refreshes. Now we can go a step further and validate that those refreshes did not introduce any issues into the semantic model.&lt;/p&gt;

&lt;p&gt;It also changes how we think about production issues. When something breaks, we do not just fix it. We add a test for it. Over time, that builds a safety net that helps prevent the same issue from happening again.&lt;/p&gt;

&lt;p&gt;If you want to learn more about testing semantic models, check out the first three parts of the series:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://youtu.be/DQ-6x6CpoKI&quot; target=&quot;_blank&quot;&gt;Intro&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://youtu.be/f_9fnJgMZWE&quot; target=&quot;_blank&quot;&gt;Naming&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://youtu.be/NMSGRRWo89Q&quot; target=&quot;_blank&quot;&gt;Power Automate&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I cannot always say features work in GCC or DoD, especially when it comes to Fabric, but this is one you can try today to make your semantic models and reports better.&lt;/p&gt;</content><author><name>John Kerski</name></author><category term="ai" /><category term="powerbi" /><summary type="html">UDFs in GCC and DoD: A big step for reusable, testable semantic models</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.kerski.tech//assets/img/posts/udf-gcc.jpg" /><media:content medium="image" url="https://www.kerski.tech//assets/img/posts/udf-gcc.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The AI-Enabled Power BI Tester</title><link href="https://www.kerski.tech//ai-enabled-power-bi-tester/" rel="alternate" type="text/html" title="The AI-Enabled Power BI Tester" /><published>2026-02-22T00:00:00+00:00</published><updated>2026-02-22T00:00:00+00:00</updated><id>https://www.kerski.tech//ai-enabled-power-bi-tester</id><content type="html" xml:base="https://www.kerski.tech//ai-enabled-power-bi-tester/">&lt;h2 id=&quot;the-ai-enabled-power-bi-tester&quot;&gt;The AI-Enabled Power BI Tester&lt;/h2&gt;

&lt;p&gt;If you’ve followed my blog over the years, you’ll notice I emphasize the importance of testing your semantic models. DataOps stresses the principle of “Quality is Paramount” so that when we change our Power Query, DAX, or refresh our data, we can automatically check for issues whether we are developing the solution or publishing to production. Too many times have I seen the “Publish and Pray” method of Power BI development where we hope nothing goes wrong… hope is not a strategy. Furthermore, how do we expect our younger or newer team members to contribute positively and quickly if they have no safety checks? When they make a change, it should not negatively impact the model or its customers.&lt;/p&gt;

&lt;p&gt;From the customer perspective, people will often forgive you when you make a mistake. But when they experience the same mistake again in production just days or weeks later, they lose trust.&lt;/p&gt;

&lt;p&gt;Admittedly, Microsoft has made testing difficult in the past. But when the DAX Query View was released, this led me to identify a &lt;a href=&quot;https://blog.kerski.tech/bringing-dataops-to-power-bi-part36/&quot; target=&quot;_blank&quot;&gt;DAX Query View Testing Pattern&lt;/a&gt;. While this was a step forward, executing the tests still required consistent syntax and setup. What if we could standardize some of the common tests and, better yet, leverage AI to build and run these tests? Enter &lt;a href=&quot;https://learn.microsoft.com/en-us/power-bi/transform-model/desktop-user-defined-functions-overview&quot; target=&quot;_blank&quot;&gt;User Defined Functions (UDFs)&lt;/a&gt;, and the nuget of UDFs… &lt;a href=&quot;https://daxlib.org/&quot; target=&quot;_blank&quot;&gt;DAX Lib&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Over the past few months, my team and I have built a set of functions to aid in using the DAX Query View Testing Pattern while promoting reuse and allowing AI to assist. This library is called &lt;a href=&quot;https://daxlib.org/package/PQL.Assert/&quot; target=&quot;_blank&quot;&gt;PQL.Assert&lt;/a&gt;. Assert is a common term used in testing where you assert a certain behavior, like “I assert this column in this table is distinct.” And if that assertion fails, then the test result indicates as such.&lt;/p&gt;

&lt;p&gt;We’ve published the open-source library (yes, it’s free under MIT License) &lt;a href=&quot;https://daxlib.org/package/PQL.Assert/&quot; target=&quot;_blank&quot;&gt;at this link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can also follow our &lt;a href=&quot;https://www.youtube.com/playlist?list=PLzv1wQZnGKJcfkGFVYEpbQ6YNuJ_GAgqm&quot; target=&quot;_blank&quot;&gt;video series demonstrating PQL.Assert&lt;/a&gt; to see it in action.&lt;/p&gt;

&lt;p&gt;Let me know your thoughts on &lt;a href=&quot;https://www.linkedin.com/in/john-kerski-41a697100&quot; target=&quot;_blank&quot;&gt;LinkedIn&lt;/a&gt; or &lt;a href=&quot;https://twitter.com/jkerski&quot; target=&quot;_blank&quot;&gt;Twitter/X&lt;/a&gt;.&lt;/p&gt;</content><author><name>John Kerski</name></author><category term="ai" /><category term="powerbi" /><summary type="html">The AI-Enabled Power BI Tester</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.kerski.tech//assets/img/posts/ai-enabled-tester.jpg" /><media:content medium="image" url="https://www.kerski.tech//assets/img/posts/ai-enabled-tester.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">The AI-Enabled Power BI Developer</title><link href="https://www.kerski.tech//ai-enabled-power-bi-developer/" rel="alternate" type="text/html" title="The AI-Enabled Power BI Developer" /><published>2026-01-29T00:00:00+00:00</published><updated>2026-01-29T00:00:00+00:00</updated><id>https://www.kerski.tech//ai-enabled-power-bi-developer</id><content type="html" xml:base="https://www.kerski.tech//ai-enabled-power-bi-developer/">&lt;h2 id=&quot;the-ai-enabled-power-bi-developer&quot;&gt;The AI-Enabled Power BI Developer&lt;/h2&gt;

&lt;p&gt;Over the past year, the amount of time I’ve spent working with AI to build solutions has steadily increased. With low-code tools like Power BI, there appears to be a paradigm shift from the classic “clicky, clicky, draggy, droppy” to “chatty, chatty, checky, choosey.” In other words, we are spending less time using our mouse and instead using &lt;a href=&quot;https://github.com/microsoft/vscode/wiki/VS-Code-Speech&quot; target=&quot;_blank&quot;&gt;our mouth&lt;/a&gt; to explain to these AI tools what to create and what to modify.&lt;/p&gt;

&lt;p&gt;Based on what my teams and I have learned so far, I wanted to share this approach using GitHub Copilot. Through my company’s Power Query Lint YouTube Channel, we started a series called &lt;a href=&quot;https://www.youtube.com/playlist?list=PLzv1wQZnGKJdLZNWIJ3O4ONKRRrmgukbX&quot; target=&quot;_blank&quot;&gt;“The AI-Enabled Power BI Developer”&lt;/a&gt;.&lt;/p&gt;

&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/videoseries?list=PLzv1wQZnGKJdLZNWIJ3O4ONKRRrmgukbX&quot; title=&quot;The AI-Enabled Power BI Developer&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;Our goal with this series is to show how to leverage AI as a Power BI Developer while having the guardrails of version control to ensure you can roll back or review any changes that AI may make.&lt;/p&gt;

&lt;p&gt;Let me know your thoughts on &lt;a href=&quot;https://www.linkedin.com/in/john-kerski-41a697100&quot; target=&quot;_blank&quot;&gt;LinkedIn&lt;/a&gt; or &lt;a href=&quot;https://twitter.com/jkerski&quot; target=&quot;_blank&quot;&gt;Twitter/X&lt;/a&gt;.&lt;/p&gt;</content><author><name>John Kerski</name></author><category term="ai" /><category term="powerbi" /><summary type="html">The AI-Enabled Power BI Developer</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.kerski.tech//assets/img/posts/ai-enabled.jpg" /><media:content medium="image" url="https://www.kerski.tech//assets/img/posts/ai-enabled.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bringing DataOps to Fabric’s Real-Time Capabilities</title><link href="https://www.kerski.tech//bringing-dataops-to-fabric-real-time-capabilities/" rel="alternate" type="text/html" title="Bringing DataOps to Fabric’s Real-Time Capabilities" /><published>2025-12-07T00:00:00+00:00</published><updated>2025-12-07T00:00:00+00:00</updated><id>https://www.kerski.tech//bringing-dataops-to-fabric-real-time-capabilities</id><content type="html" xml:base="https://www.kerski.tech//bringing-dataops-to-fabric-real-time-capabilities/">&lt;h2 id=&quot;bringing-dataops-to-fabrics-real-time-capabilities&quot;&gt;Bringing DataOps to Fabric’s Real-Time Capabilities&lt;/h2&gt;

&lt;p&gt;Over the past year, I have been working with Eventhouses to build analytic solutions that react to real-time events occurring in Fabric as well as monitoring third-party applications that can ship results to Event Streams.&lt;/p&gt;

&lt;p&gt;If you’ve been following my blog for a while, you know that I’ve emphasized version control, testing (many are probably sick of me talking about testing), and orchestration (automated deployments). With that, I want to talk about the state of Fabric Real-time supporting version control and testing, key tenets to practicing DataOps. For the uninitiated, this includes Eventhouse (aka Azure Data Explorer), Event Streams, and Real-time Dashboards in Fabric.&lt;/p&gt;

&lt;p&gt;I will caveat that I am new to Fabric Real-time and was surprised during my research that the underlying technology for Eventhouses (Azure Data Explorer and Kusto) turned 10 years old recently (so Power BI and Eventhouse are nearly the same age). However, I am not new to version control, testing, and orchestration, so my perspectives come from through the DataOps lens. Here are my thoughts:&lt;/p&gt;

&lt;h3 id=&quot;version-control&quot;&gt;Version Control&lt;/h3&gt;

&lt;p&gt;Eventhouses support Git Integration, which is a great start. Figure 1 shows an example of the .kql script that gets pushed to Git for the Eventhouse I have to support the series I have on Making Your Power BI Teams More Analytic. Can you guess what’s wrong with this from a version control perspective?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/dataops-real-time/Figure1.png&quot; alt=&quot;Eventhouse KQL Script in Git&quot; class=&quot;center-image&quot; /&gt;
&lt;em class=&quot;center-text-figure&quot;&gt;Figure 1: Eventhouse .kql script pushed to Git&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It’s one large file and version control fares much better with separate files. When you look at Power BI’s move to version control, the TMDL format separates tables, functions, relationships, etc. into their own files. Even the PBIR format for Power BI has navigated away from one large report.json file that represents the report to multiple json files to represent each visual and page. Eventhouse should follow this best practice. For example, if it saved each file like the structure shown in Figure 2, we could more easily integrate changes amongst teams and better track changes to the files.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/dataops-real-time/Figure2.png&quot; alt=&quot;Proposed KQL Structure&quot; class=&quot;center-image&quot; /&gt;
&lt;em class=&quot;center-text-figure&quot;&gt;Figure 2: Eventhouse File Structure in Fabric Service&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here is the &lt;a href=&quot;https://community.fabric.microsoft.com/t5/Fabric-Ideas/Eventhouse-Smaller-Files-for-Git-Integration/idi-p/4894983&quot; target=&quot;_blank&quot;&gt;Fabric Idea&lt;/a&gt; if you’d like to vote for it.&lt;/p&gt;

&lt;h3 id=&quot;testing&quot;&gt;Testing&lt;/h3&gt;

&lt;p&gt;When I realized that Eventhouse’s technology was over 10 years old, I was like surely someone has written about Unit Tests and Integration Tests. I found these posts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.eraneos.com/articles/azure-data-explorer-ci-cd/&quot; target=&quot;_blank&quot;&gt;Eraneos: Azure Data Explorer CI/CD&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/blog/azuredataexplorer/an-approach-to-unit-testing-adx-functions/3428393&quot; target=&quot;_blank&quot;&gt;Microsoft Learn: An Approach to Unit Testing ADX Functions&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/@jeroenverhaeghe/writing-system-tests-against-adx-in-net-530b6d93f47a&quot; target=&quot;_blank&quot;&gt;Writing System Tests Against ADX in .NET&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also came across Kusto Explorer and a docker container where testing could occur.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/azure/data-explorer/kusto-emulator-install&quot; target=&quot;_blank&quot;&gt;Kusto Emulator Install&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://hub.docker.com/r/microsoft/kusto&quot; target=&quot;_blank&quot;&gt;Docker Container for Kusto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s very important that with Event Streams being the source of data feeding these Eventhouses, we test the transformations that occur in update policies. There seems to be sizable effort to build tests and structure your KQL to support testing. Update Policies must use Functions instead of raw queries, forcing the concept of Separation of Concerns. For example, let’s say I need to add a column to a bronze table based on some logic before having it moved to silver. The update policy could look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-kql&quot;&gt;.alter table SilverTable policy update 
@&apos;[{&quot;Source&quot;: &quot;BronzeTable&quot;, &quot;Query&quot;: &quot;BronzeTable | extend NewColumn = iff(Amount &amp;gt; 1000, \&quot;High\&quot;, \&quot;Low\&quot;)&quot;, &quot;IsEnabled&quot;: true}]&apos;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But to support testing it should look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-kql&quot;&gt;.create-or-alter function fnAddNewColumn() {
    BronzeTable 
    | extend NewColumn = iff(Amount &amp;gt; 1000, &quot;High&quot;, &quot;Low&quot;)
}

.alter table SilverTable policy update 
@&apos;[{&quot;Source&quot;: &quot;BronzeTable&quot;, &quot;Query&quot;: &quot;fnAddNewColumn()&quot;, &quot;IsEnabled&quot;: true}]&apos;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And then the code could be tested like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;////////////////////////////////////////////////////////////////////////////////
// Step 1: Clean up existing tables
.drop table BronzeTable ifexists 
.drop table TestResults ifexists

////////////////////////////////////////////////////////////////////////////////
// Step 2: Create the source table
.create table BronzeTable (Name:string, Amount:int)

////////////////////////////////////////////////////////////////////////////////
// Step 3: Load sample data into BronzeTable
.ingest inline into table BronzeTable &amp;lt;|
Alice,500
Bob,2000

////////////////////////////////////////////////////////////////////////////////
// Step 4: Create a “pure-ish” function that reads BronzeTable
.create-or-alter function fnAddNewColumn() {
    BronzeTable
    | extend NewColumn = iff(Amount &amp;gt; 1000, &quot;High&quot;, &quot;Low&quot;)
}

////////////////////////////////////////////////////////////////////////////////
// Step 5: Create the test results table
.create table TestResults (TestName:string, Name:string, Expected:string)

////////////////////////////////////////////////////////////////////////////////
// Step 6: Ingest test assertions
.ingest inline into table TestResults &amp;lt;|
&quot;Alice Amount Check&quot;,&quot;Alice&quot;,&quot;Low&quot;
&quot;Bob Amount Check&quot;,&quot;Bob&quot;,&quot;High&quot;

////////////////////////////////////////////////////////////////////////////////
// Step 7: Run the tests and output TestName, Actual, Expected, Result
fnAddNewColumn
| join kind=inner TestResults on Name
| project TestName, Actual=NewColumn, Expected, Result=iif(NewColumn==Expected,&quot;Pass&quot;,&quot;Fail&quot;)

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Therefore the output looks like Figure 3.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/dataops-real-time/Figure3.png&quot; alt=&quot;Test Results&quot; class=&quot;center-image&quot; /&gt;
&lt;em class=&quot;center-text-figure&quot;&gt;Figure 3: Test Results&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But how do you run a bunch of these tests with a command line like “kql test” like “npm test”, like in the Javascript world? There is a dearth of libraries supporting KQL testing. I’ll be writing more about this, but if you know of a library, I am all ears.&lt;/p&gt;

&lt;h3 id=&quot;orchestration&quot;&gt;Orchestration&lt;/h3&gt;

&lt;p&gt;I have been pleased with Event Streams and Eventhouse’s support with Deployment Pipelines, and I have been happy using Deployment Pipelines with the autobinding that occurs for deploying. Real-time Dashboards do need some work, however, with parameters. Autobinding does not always work and you’ll often get the issue below when deploying the dashboard, leading you to manually reset the parameter.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/img/posts/dataops-real-time/Figure4.png&quot; alt=&quot;Common Error&quot; class=&quot;center-image&quot; /&gt;
&lt;em class=&quot;center-text-figure&quot;&gt;Figure 4: Common Deployment Error&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That’s enough for now, and don’t think I am sour on Fabric Real-time. I find value in its capabilities, and I wouldn’t have come out with my series Making Your Power BI Teams More Analytic if I didn’t find value. I also see value in the Eventhouses built into the &lt;a href=&quot;https://learn.microsoft.com/en-us/fabric/real-time-intelligence/monitor-Eventhouse&quot; target=&quot;_blank&quot;&gt;new monitoring feature&lt;/a&gt; in Fabric. If you’re not getting more familiar with real-time, I highly suggest doing so. I just want it to be better.&lt;/p&gt;

&lt;p&gt;Did I miss something? Let me know your thoughts on &lt;a href=&quot;https://www.linkedin.com/in/john-kerski-41a697100&quot; target=&quot;_blank&quot;&gt;LinkedIn&lt;/a&gt; or &lt;a href=&quot;https://twitter.com/jkerski&quot; target=&quot;_blank&quot;&gt;Twitter/X&lt;/a&gt;&lt;/p&gt;</content><author><name>John Kerski</name></author><category term="dataops" /><category term="real-time" /><summary type="html">Bringing DataOps to Fabric’s Real-Time Capabilities</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.kerski.tech//assets/img/posts/pole-real-time.jpg" /><media:content medium="image" url="https://www.kerski.tech//assets/img/posts/pole-real-time.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Agents are the Pupils, We are the Teachers</title><link href="https://www.kerski.tech//teaching-agents/" rel="alternate" type="text/html" title="Agents are the Pupils, We are the Teachers" /><published>2025-11-23T00:00:00+00:00</published><updated>2025-11-23T00:00:00+00:00</updated><id>https://www.kerski.tech//teaching-agents</id><content type="html" xml:base="https://www.kerski.tech//teaching-agents/">&lt;h2 id=&quot;agents-are-the-pupils-we-are-the-teachers&quot;&gt;Agents are the Pupils, We are the Teachers&lt;/h2&gt;

&lt;p&gt;Agents are everywhere. If you haven’t been inundated at conferences, ads, videos, or social media posts… count yourself lucky. From the Microsoft perspective, there are a myriad of options. Fabric has Data Agents, SharePoint has SharePoint Agents, Copilot Studio lets you build more agents, and as I am writing, there is probably &lt;a href=&quot;https://news.microsoft.com/ignite-2025-book-of-news/?msockid=30c67d7873656ce50a866b0272b56d15&quot; target=&quot;_blank&quot;&gt;a new agent being announced&lt;/a&gt;. Under the hood, you can think of agents as consisting of three components:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A large language model – This is a model (e.g., GPT-4.0) and allows the agent to consume and respond to prompts.&lt;/li&gt;
  &lt;li&gt;A data source – This is what builds context to answer those questions. This can be a set of files, a database, or other agents.&lt;/li&gt;
  &lt;li&gt;Agent Instructions – This is a setting that empowers the builder of the agent to tailor how the agent should behave and provide context to help the agent answer questions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After spending some years working with Large Language Models (LLMs) and recently agents, and seeing others work with them, there is an investment of time to get them to perform as expected.&lt;/p&gt;

&lt;p&gt;This has created three critical things to consider when building an agent:&lt;/p&gt;

&lt;p&gt;1) &lt;strong&gt;Return on Investment (ROI)&lt;/strong&gt; – What is the ROI of creating an agent? You and/or your company are spending resources to build and maintain this agent, so will this agent result in cost savings, increased revenue, a redirection of resources, or some other altruistic outcome? If you can’t answer those questions definitively or have no way to track the metric(s) behind the ROI, you’re increasing the risk of failure.&lt;/p&gt;

&lt;p&gt;2) &lt;strong&gt;Agents are Software&lt;/strong&gt; – A wonderful book by Alan Cooper, &lt;a href=&quot;https://openlibrary.org/books/OL52849M/The_inmates_are_running_the_asylum&quot; target=&quot;_blank&quot;&gt;Inmates are Running the Asylum&lt;/a&gt;, had this inquiry that stuck with me years ago: What do you get when you combine a computer and a car… a computer. Therefore, we can’t lose perspective that when we combine data and LLMs, you have a computer. We tend to, and I fall victim to this, anthropomorphize agents, thinking they are not software. LLMs were built with code and trained with code, and you’re adding context built by code (e.g., a SQL database built with T-SQL or that semantic model built in Power Query). Computers are built by imperfect beings and therefore can act imperfectly.&lt;/p&gt;

&lt;p&gt;3) &lt;strong&gt;Testing Is Fundamental, and You Are the Teacher&lt;/strong&gt; – You should think of an agent as a student in school. A student has the capacity to learn and understands (to an extent) the language for the teacher to impart lessons via instructions. But to make sure the student has grasped the lessons, what does the teacher do to measure how well the student understood the instructions? The teacher gives the student a test. And that test isn’t done just once; over the course of years, tests are applied to make sure the student is progressing.&lt;/p&gt;

&lt;p&gt;This process of &lt;a href=&quot;https://en.wikipedia.org/wiki/Educational_assessment&quot; target=&quot;_blank&quot;&gt;Educational Assessment&lt;/a&gt; means we are the teachers of agents, and we must test and continually test. As new data sources or updated data sources arrive for the agent, we should be testing. As new agent instructions are provided, we should be testing. For example, we should make sure an agent responds appropriately to a question like “show me Alice’s salary?” or “Tell me a joke” in a corporate setting. This is not only prudent but also mitigates the risk your agent does not use something like a curse word, cause data leakage, or provide the wrong answer.&lt;/p&gt;

&lt;p&gt;With these three considerations in mind, I have noticed agents offered by Microsoft have opportunities and challenges to support these considerations. For example, let’s look at Fabric Agents:&lt;/p&gt;

&lt;h3 id=&quot;fabric-data-agents&quot;&gt;Fabric Data Agents&lt;/h3&gt;

&lt;h4 id=&quot;roi&quot;&gt;ROI&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Opportunities&lt;/strong&gt; – &lt;a href=&quot;https://learn.microsoft.com/en-us/fabric/fundamentals/workspace-monitoring-overview&quot; target=&quot;_blank&quot;&gt;Workspace Monitoring&lt;/a&gt;, recently introduced by Microsoft, is giving us diagnostic data like what DAX query was used by an agent when given a prompt. Chris Webb wrote &lt;a href=&quot;https://blog.crossjoin.co.uk/2025/11/02/monitoring-the-dax-queries-generated-when-the-power-bi-copilot-index-is-built/&quot; target=&quot;_blank&quot;&gt;an excellent blog&lt;/a&gt; on the subject. This allows us to get some telemetry to show if you have ROI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenges&lt;/strong&gt; – Fabric Data Agents lack a built-in qualitative feedback mechanism. We should easily be able to incorporate a Microsoft Form that saves feedback to a Fabric SQL database to understand if the end user is finding value. I will note Copilot Studio (another agent building tool) does have &lt;a href=&quot;https://learn.microsoft.com/en-us/power-platform/release-plan/2025wave1/microsoft-copilot-studio/collect-thumbs-up-or-down-feedback-comments-agents&quot; target=&quot;_blank&quot;&gt;this feature&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;testing&quot;&gt;Testing&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Opportunities&lt;/strong&gt; – The &lt;a href=&quot;https://learn.microsoft.com/en-us/fabric/data-science/fabric-data-agent-sdk&quot; target=&quot;_blank&quot;&gt;Fabric Data Agent SDK&lt;/a&gt; allows you to test in a Fabric Notebook and save results to the lakehouse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenges&lt;/strong&gt; – The Fabric Data Agent SDK only runs in a notebook, which leads to more capacity utilization. I would prefer to run these tests in a build agent (much cheaper). This leads us to another challenge I hope is rectified soon: service principal support. We should be able to automate testing with these agents using different service principals representing different personas.&lt;/p&gt;

&lt;p&gt;Fabric Data Agents are not the exception; SharePoint Agents also lack an API to automate testing. I could go on, but this isn’t a blog to air my grievances with Microsoft’s current state of agent development. Rather, I want to emphasize that you need to consider these three concepts when evaluating agents, regardless of the company that provides them or whether the product is in preview or generally available.&lt;/p&gt;

&lt;p&gt;And I know these aren’t the only considerations. Which ones should I include? Let me know your thoughts on &lt;a href=&quot;https://www.linkedin.com/in/john-kerski-41a697100&quot; target=&quot;_blank&quot;&gt;LinkedIn&lt;/a&gt; or &lt;a href=&quot;https://twitter.com/jkerski&quot; target=&quot;_blank&quot;&gt;Twitter/X&lt;/a&gt;.&lt;/p&gt;</content><author><name>John Kerski</name></author><category term="dataops" /><category term="agents" /><summary type="html">Agents are the Pupils, We are the Teachers</summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.kerski.tech//assets/img/posts/agents.jpg" /><media:content medium="image" url="https://www.kerski.tech//assets/img/posts/agents.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>