<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: best alternative to webhooks with Unity Catalog? in Data Governance</title>
    <link>https://community.databricks.com/t5/data-governance/best-alternative-to-webhooks-with-unity-catalog/m-p/136719#M2652</link>
    <description>&lt;P&gt;Greetings&amp;nbsp;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/131116"&gt;@bragoarefur&lt;/a&gt;&amp;nbsp;,&amp;nbsp; Thanks for laying out the context so clearly—your read of the current state is spot on. Below is what the Databricks docs actually say, and a recommendation with an implementation path that avoids polling while staying cloud-agnostic.&lt;/P&gt;
&lt;DIV class="paragraph"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;H3 class="paragraph"&gt;What the docs say&lt;/H3&gt;
&lt;UL&gt;
&lt;LI class="paragraph"&gt;&lt;STRONG&gt;Workspace Model Registry webhooks&lt;/STRONG&gt; are in Public Preview and let you trigger on events such as MODEL_VERSION_CREATED, but they are explicitly not available when using Models in Unity Catalog (UC).&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;The UC migration guide’s “&lt;STRONG&gt;manual approval&lt;/STRONG&gt;” alternative effectively suggests using job notifications to call out to external CI/CD systems for approvals, rather than event-driven registry webhooks; it does not provide an equivalent eventing facility for UC models.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;&lt;STRONG&gt;Models in Unity Catalog&lt;/STRONG&gt; do not have an activity log in the UI; tracking activity requires using audit logs.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="paragraph"&gt;Viable alternatives in UC&lt;/H3&gt;
&lt;DIV class="paragraph"&gt;You identified the two main paths; here’s how they stack up against the platform’s capabilities:&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;&lt;STRONG&gt;Option #1: Poll UC for new model versions.&lt;/STRONG&gt; This works via MLflow client calls (for example, listing model versions), but there’s no native activity log to subscribe to, so you end up implementing your own state tracking and timers. It’s simple, but inefficient and introduces latency and drift.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;&lt;STRONG&gt;Option #2: Consume Databricks audit logs (System Tables).&lt;/STRONG&gt;&lt;BR /&gt;
&lt;UL&gt;
&lt;LI&gt;UC emits audit events for model lifecycle actions, including createModelVersion, finalizeModelVersion, getModelVersion, updateModelVersion, deleteModelVersion, and setRegisteredModelAlias, among others—exactly the signals you need to detect new versions and promotions.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;These are available via the &lt;STRONG&gt;system.access.audit&lt;/STRONG&gt; system table (Public Preview) governed by UC, with a stable schema and retention, and they can be consumed with streaming or scheduled queries. This is Databricks-hosted and consistent across clouds, removing the need to set up cloud-specific storage to receive logs.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;Note that system tables are updated throughout the day (not true real-time). If you need sub-minute latencies, you may still want a narrow, model-specific overlay (e.g., short-interval polling) to bridge the gap for critical models.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="paragraph"&gt;Recommendation&lt;/H3&gt;
&lt;DIV class="paragraph"&gt;Given your requirements and trade-offs, I recommend Option #2—use &lt;STRONG&gt;audit log System Tables&lt;/STRONG&gt; as the backbone, with a small overlay for truly latency-sensitive models:&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;Use &lt;STRONG&gt;system.access.audit&lt;/STRONG&gt; to detect UC model events (e.g., createModelVersion, finalizeModelVersion, setRegisteredModelAlias). It’s scalable, robust, and cloud-agnostic from your perspective because Databricks hosts the storage and shares it via Delta Sharing across clouds.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;For the small subset of models where sub-minute reaction time matters, add a targeted &lt;STRONG&gt;polling overlay&lt;/STRONG&gt; (MLflow client list/search) with short intervals. Keep this scoped to only those models to avoid system-wide inefficiency. The general model activity is not exposed via a UC activity log, so polling would be the only way to get that near-real-time signal.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;If you still require a manual approval step, use &lt;STRONG&gt;job notifications&lt;/STRONG&gt; to fan out to your external CI/CD systems and gate deployment there; this is the UC guide’s recommended approach for manual approvals post-train.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="paragraph"&gt;Reference implementation sketch (System Tables)&lt;/H3&gt;
&lt;DIV class="paragraph"&gt;You can stream from the audit system table and trigger downstream jobs or notifications when specific UC model events arrive. Example in PySpark:&lt;/DIV&gt;
&lt;PRE&gt;&lt;CODE class="markdown-code-python"&gt;from pyspark.sql.functions import col

# Stream audit logs
audit_stream = (
    spark.readStream.table("system.access.audit")
    .where(col("service_name") == "unityCatalog")
    .where(col("action_name").isin(
        "createModelVersion",
        "finalizeModelVersion",
        "setRegisteredModelAlias",
        "updateModelVersion",
        "deleteModelVersion"
    ))
)

# Write matching events to a Bronze table or directly to a trigger function
query = (
    audit_stream.writeStream
    .option("checkpointLocation", "dbfs:/checkpoints/uc_model_events")
    .toTable("prod.ml_ops.uc_model_events_bronze")
)&lt;/CODE&gt;&lt;/PRE&gt;
&lt;DIV class="paragraph"&gt;And a simple SQL view over system.access.audit for scheduled detection:&lt;/DIV&gt;
&lt;PRE&gt;&lt;CODE class="markdown-code-sql"&gt;CREATE OR REPLACE VIEW prod.ml_ops.uc_model_events AS
SELECT
  event_time,
  action_name,
  request_params,
  user_identity.email AS actor
FROM system.access.audit
WHERE service_name = 'unityCatalog'
  AND action_name IN (
    'createModelVersion',
    'finalizeModelVersion',
    'setRegisteredModelAlias',
    'updateModelVersion',
    'deleteModelVersion'
  );&lt;/CODE&gt;&lt;/PRE&gt;
&lt;DIV class="paragraph"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="paragraph"&gt;Operational notes:&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI class="paragraph"&gt;Ensure your workspace is &lt;STRONG&gt;enabled for Unity Catalog&lt;/STRONG&gt; and that metastore/account admins grant USE/SELECT on the system schemas so your pipelines can read system tables.&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;System table data is &lt;STRONG&gt;Databricks-hosted&lt;/STRONG&gt; in the same region as your metastore; you don’t need to configure S3/ABFS/GCS delivery to consume these via SQL/streaming, which addresses cloud-specific storage concerns.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;Expect “updated throughout the day” semantics rather than true real-time; tune trigger intervals and watermarking accordingly, and consider the hybrid overlay for the smallest set of latency-sensitive models.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="paragraph"&gt;What’s missing today&lt;/H3&gt;
&lt;UL&gt;
&lt;LI class="paragraph"&gt;There is currently &lt;STRONG&gt;no webhook equivalent for UC models&lt;/STRONG&gt;—the docs explicitly state UC models do not support registry webhooks.&lt;/LI&gt;
&lt;LI&gt;For &lt;STRONG&gt;manual approval&lt;/STRONG&gt;, the recommended path is post-train job notifications to external CI/CD rather than registry webhooks.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="paragraph"&gt;Bottom line&lt;/H3&gt;
&lt;DIV class="paragraph"&gt;Use the audit log &lt;STRONG&gt;system.access.audit&lt;/STRONG&gt; table for event-driven workflows on UC models, and reserve polling for the few cases where ultra-low latency is critical. This keeps the architecture elegant, scalable, and cloud-agnostic, while acknowledging the current absence of UC webhooks.&lt;/DIV&gt;
&lt;DIV class="paragraph"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="paragraph"&gt;Hope this helps, Louis.&lt;/DIV&gt;</description>
    <pubDate>Thu, 30 Oct 2025 10:03:56 GMT</pubDate>
    <dc:creator>Louis_Frolio</dc:creator>
    <dc:date>2025-10-30T10:03:56Z</dc:date>
    <item>
      <title>best alternative to webhooks with Unity Catalog?</title>
      <link>https://community.databricks.com/t5/data-governance/best-alternative-to-webhooks-with-unity-catalog/m-p/97651#M2235</link>
      <description>&lt;P&gt;&lt;FONT face="arial,helvetica,sans-serif" size="4"&gt;&lt;SPAN&gt;We have been using the feature &lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/databricks/mlflow/model-registry-webhooks" target="_blank" rel="noopener"&gt;&lt;SPAN&gt;MLflow Model Registry Webhooks on Azure Databricks&amp;nbsp;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN&gt;. Webhooks are in public preview, but oddly are deprecated at the same time with the introduction of Unity Catalog. The documentation says "For an alternative, see&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/databricks/machine-learning/manage-model-lifecycle/upgrade-workflows#manual-approval" target="_blank" rel="noopener"&gt;&lt;SPAN&gt;Can I use stage transition requests or trigger webhooks on events?&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN&gt;." but that page does not in fact describe a real alternative. Using webhooks allows us to hook specific events like &lt;/SPAN&gt;&lt;SPAN&gt;MODEL_VERSION_CREATED&lt;/SPAN&gt;&lt;SPAN&gt;. There doesn't appear to be any equivalent feature in Unity Catalog (UC).&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="arial,helvetica,sans-serif" size="4"&gt;After some digging, I see two main alternatives:&lt;/FONT&gt;&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;&lt;FONT face="arial,helvetica,sans-serif" size="4"&gt;&lt;SPAN&gt;Run a periodic job that polls UC for new model versions&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;LI&gt;&lt;FONT face="arial,helvetica,sans-serif" size="4"&gt;&lt;SPAN&gt;Use audit log streaming to detect new model versions&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;&lt;FONT face="arial,helvetica,sans-serif" size="4"&gt;Recommendations? Option #1 is simpler but polling is inefficient and introduces latency. Option #2 is more elegant and scalable but is also complex. For example, audit logging must be turned on; raw audit logs have to go somewhere; Unity Catalog needs to load those audit logs; audit log storage is not cloud-agnostic.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="arial,helvetica,sans-serif" size="4"&gt;Sad to see webhooks going away and hope that Databricks will create a similar capability for Unity Catalog.&lt;/FONT&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 05 Nov 2024 00:36:05 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-governance/best-alternative-to-webhooks-with-unity-catalog/m-p/97651#M2235</guid>
      <dc:creator>bragoarefur</dc:creator>
      <dc:date>2024-11-05T00:36:05Z</dc:date>
    </item>
    <item>
      <title>Re: best alternative to webhooks with Unity Catalog?</title>
      <link>https://community.databricks.com/t5/data-governance/best-alternative-to-webhooks-with-unity-catalog/m-p/136719#M2652</link>
      <description>&lt;P&gt;Greetings&amp;nbsp;&lt;a href="https://community.databricks.com/t5/user/viewprofilepage/user-id/131116"&gt;@bragoarefur&lt;/a&gt;&amp;nbsp;,&amp;nbsp; Thanks for laying out the context so clearly—your read of the current state is spot on. Below is what the Databricks docs actually say, and a recommendation with an implementation path that avoids polling while staying cloud-agnostic.&lt;/P&gt;
&lt;DIV class="paragraph"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;H3 class="paragraph"&gt;What the docs say&lt;/H3&gt;
&lt;UL&gt;
&lt;LI class="paragraph"&gt;&lt;STRONG&gt;Workspace Model Registry webhooks&lt;/STRONG&gt; are in Public Preview and let you trigger on events such as MODEL_VERSION_CREATED, but they are explicitly not available when using Models in Unity Catalog (UC).&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;The UC migration guide’s “&lt;STRONG&gt;manual approval&lt;/STRONG&gt;” alternative effectively suggests using job notifications to call out to external CI/CD systems for approvals, rather than event-driven registry webhooks; it does not provide an equivalent eventing facility for UC models.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;&lt;STRONG&gt;Models in Unity Catalog&lt;/STRONG&gt; do not have an activity log in the UI; tracking activity requires using audit logs.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="paragraph"&gt;Viable alternatives in UC&lt;/H3&gt;
&lt;DIV class="paragraph"&gt;You identified the two main paths; here’s how they stack up against the platform’s capabilities:&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;&lt;STRONG&gt;Option #1: Poll UC for new model versions.&lt;/STRONG&gt; This works via MLflow client calls (for example, listing model versions), but there’s no native activity log to subscribe to, so you end up implementing your own state tracking and timers. It’s simple, but inefficient and introduces latency and drift.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;&lt;STRONG&gt;Option #2: Consume Databricks audit logs (System Tables).&lt;/STRONG&gt;&lt;BR /&gt;
&lt;UL&gt;
&lt;LI&gt;UC emits audit events for model lifecycle actions, including createModelVersion, finalizeModelVersion, getModelVersion, updateModelVersion, deleteModelVersion, and setRegisteredModelAlias, among others—exactly the signals you need to detect new versions and promotions.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;These are available via the &lt;STRONG&gt;system.access.audit&lt;/STRONG&gt; system table (Public Preview) governed by UC, with a stable schema and retention, and they can be consumed with streaming or scheduled queries. This is Databricks-hosted and consistent across clouds, removing the need to set up cloud-specific storage to receive logs.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;Note that system tables are updated throughout the day (not true real-time). If you need sub-minute latencies, you may still want a narrow, model-specific overlay (e.g., short-interval polling) to bridge the gap for critical models.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="paragraph"&gt;Recommendation&lt;/H3&gt;
&lt;DIV class="paragraph"&gt;Given your requirements and trade-offs, I recommend Option #2—use &lt;STRONG&gt;audit log System Tables&lt;/STRONG&gt; as the backbone, with a small overlay for truly latency-sensitive models:&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;Use &lt;STRONG&gt;system.access.audit&lt;/STRONG&gt; to detect UC model events (e.g., createModelVersion, finalizeModelVersion, setRegisteredModelAlias). It’s scalable, robust, and cloud-agnostic from your perspective because Databricks hosts the storage and shares it via Delta Sharing across clouds.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;For the small subset of models where sub-minute reaction time matters, add a targeted &lt;STRONG&gt;polling overlay&lt;/STRONG&gt; (MLflow client list/search) with short intervals. Keep this scoped to only those models to avoid system-wide inefficiency. The general model activity is not exposed via a UC activity log, so polling would be the only way to get that near-real-time signal.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;If you still require a manual approval step, use &lt;STRONG&gt;job notifications&lt;/STRONG&gt; to fan out to your external CI/CD systems and gate deployment there; this is the UC guide’s recommended approach for manual approvals post-train.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="paragraph"&gt;Reference implementation sketch (System Tables)&lt;/H3&gt;
&lt;DIV class="paragraph"&gt;You can stream from the audit system table and trigger downstream jobs or notifications when specific UC model events arrive. Example in PySpark:&lt;/DIV&gt;
&lt;PRE&gt;&lt;CODE class="markdown-code-python"&gt;from pyspark.sql.functions import col

# Stream audit logs
audit_stream = (
    spark.readStream.table("system.access.audit")
    .where(col("service_name") == "unityCatalog")
    .where(col("action_name").isin(
        "createModelVersion",
        "finalizeModelVersion",
        "setRegisteredModelAlias",
        "updateModelVersion",
        "deleteModelVersion"
    ))
)

# Write matching events to a Bronze table or directly to a trigger function
query = (
    audit_stream.writeStream
    .option("checkpointLocation", "dbfs:/checkpoints/uc_model_events")
    .toTable("prod.ml_ops.uc_model_events_bronze")
)&lt;/CODE&gt;&lt;/PRE&gt;
&lt;DIV class="paragraph"&gt;And a simple SQL view over system.access.audit for scheduled detection:&lt;/DIV&gt;
&lt;PRE&gt;&lt;CODE class="markdown-code-sql"&gt;CREATE OR REPLACE VIEW prod.ml_ops.uc_model_events AS
SELECT
  event_time,
  action_name,
  request_params,
  user_identity.email AS actor
FROM system.access.audit
WHERE service_name = 'unityCatalog'
  AND action_name IN (
    'createModelVersion',
    'finalizeModelVersion',
    'setRegisteredModelAlias',
    'updateModelVersion',
    'deleteModelVersion'
  );&lt;/CODE&gt;&lt;/PRE&gt;
&lt;DIV class="paragraph"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="paragraph"&gt;Operational notes:&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI class="paragraph"&gt;Ensure your workspace is &lt;STRONG&gt;enabled for Unity Catalog&lt;/STRONG&gt; and that metastore/account admins grant USE/SELECT on the system schemas so your pipelines can read system tables.&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;System table data is &lt;STRONG&gt;Databricks-hosted&lt;/STRONG&gt; in the same region as your metastore; you don’t need to configure S3/ABFS/GCS delivery to consume these via SQL/streaming, which addresses cloud-specific storage concerns.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV class="paragraph"&gt;Expect “updated throughout the day” semantics rather than true real-time; tune trigger intervals and watermarking accordingly, and consider the hybrid overlay for the smallest set of latency-sensitive models.&lt;/DIV&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="paragraph"&gt;What’s missing today&lt;/H3&gt;
&lt;UL&gt;
&lt;LI class="paragraph"&gt;There is currently &lt;STRONG&gt;no webhook equivalent for UC models&lt;/STRONG&gt;—the docs explicitly state UC models do not support registry webhooks.&lt;/LI&gt;
&lt;LI&gt;For &lt;STRONG&gt;manual approval&lt;/STRONG&gt;, the recommended path is post-train job notifications to external CI/CD rather than registry webhooks.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 class="paragraph"&gt;Bottom line&lt;/H3&gt;
&lt;DIV class="paragraph"&gt;Use the audit log &lt;STRONG&gt;system.access.audit&lt;/STRONG&gt; table for event-driven workflows on UC models, and reserve polling for the few cases where ultra-low latency is critical. This keeps the architecture elegant, scalable, and cloud-agnostic, while acknowledging the current absence of UC webhooks.&lt;/DIV&gt;
&lt;DIV class="paragraph"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV class="paragraph"&gt;Hope this helps, Louis.&lt;/DIV&gt;</description>
      <pubDate>Thu, 30 Oct 2025 10:03:56 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-governance/best-alternative-to-webhooks-with-unity-catalog/m-p/136719#M2652</guid>
      <dc:creator>Louis_Frolio</dc:creator>
      <dc:date>2025-10-30T10:03:56Z</dc:date>
    </item>
  </channel>
</rss>

