v2.3.0
Release Changelog
v2.3.0
Release Availability Date
30-SEP-2026
Recommended Versions
- CLI/SDK: 1.7.0.12
- Remote Executor: v2.3.0-cloud, v2.2.2-cloud, v2.2.1-cloud, v2.2.0-cloud, v2.1.5-cloud, v2.1.4-cloud, v2.1.3-cloud, v2.1.2-cloud, v2.1.1-cloud, v2.1.0-cloud
- On-Prem Versions:
- Helm: 2.0.62
- API Gateway: TBD
- Actions: v0.7.3
New Feature Highlights
- Context (Public Beta) — the Context module is now in public beta, enabling you to build data agents on top of your DataHub context.
- Context Evals — part of the Context module: root cause analysis, generation of evals, domain-oriented eval grouping, support for externally run evals, and improved resolution workflows in the product. Available under Context → Validation.
- Context Generation — part of the Context module: an improved assistant experience for configuring the generation of context from BI dashboards, query history, and more.
- Context Feedback (Private Beta) — part of the Context module: surfaces feedback collected through user conversations about missing, incorrect, or invalid context, so you can improve your DataHub context going forward. Available under Context → Validation.
- Dark Mode (Public Beta) — a dark color theme across the app. Turn it on under Settings → Appearance.
- Ask DataHub Charts & Graphs — data retrieved in Ask DataHub can be visualized as bar charts, line graphs, and metric highlights.
- Ask DataHub Proposal Support — Ask DataHub can now propose changes to descriptions, tags, domains, structured properties, glossary terms, and documents.
- Ask DataHub & Custom Agents (Context) available in the MCP Server — ask agent-to-agent questions to Ask DataHub or Custom Agents via the MCP server. Manage under Settings → AI → MCP Servers.
- Metrics as first-class lineage citizens — Metrics and Semantic Models are now discoverable in global search and fully participate in lineage: charts, dashboards, and datasets can consume a Metric as an upstream, with column-level lineage modeled through metric upstreams.
- Two new ingestion sources — IBM/HCL Informix and Monte Carlo.
- Structured Properties management — creating, editing, and viewing a structured property moves from a side drawer to a dedicated page. Allowed values can be reordered by drag and drop, each with an optional description. Leaving the page with unsaved edits prompts before discarding them. The properties table adds Type and Platforms columns.
Product
- Data products in search — data products are now filterable in global search.
- Note on Data Product events - upon upgrade there is a one-time search update so Data Product filters work on member assets. This update triggers change log event (RESTATE) on data products themselves, and possibly writes on member assets (dataProducts). There is no user action required.
- Custom Branding — logo drag-and-drop upload, light brand colors updated for accessible contrast, and a dedicated Favicon field in Appearance settings. The logo is only reused as the browser-tab favicon when it is a standalone symbol; upload a square favicon under Settings → Appearance → Branding to keep a custom tab icon when "Logo includes organization name" is enabled.
- Compliance forms — forms can be assigned to owners of a specific ownership type.
- Deprecation dates — the deprecation date input is now editable.
- Internationalization - Simplified Chinese and Russian languages supported in public beta.
AI / Ask DataHub
- Agent visibility — agents marked "Show in Ask DataHub Chat" are now visible to all users, not only admins.
- New Manage Evals platform privilege — gates managing all evals and eval actions.
- Semantic anchors — the Context module now supports creating Semantic Anchor documents that incorporate LookML definitions, with incremental runs enabled by default.
Platform
- OpenSearch 3.x — supported via a unified OpenSearch client shim.
- Metrics and semantic models in global search — both entity types are now searchable.
- Native semantic content — an MCL hook maintains semantic content for bridge-covered entities.
- Structured properties in search — oversized structured property values can optionally be omitted from search documents.
- GraphQL worker pool — pinned to 8-core defaults, with optional processor-scaled concurrency and a configurable queue size.
- AWS IRSA — GMS owns a single process-wide default credentials provider, constructed and closed once per process.
- Timeseries read authorization — dataset profile, usage and operations timeseries now enforce the matching View privileges on Rest.li and OpenAPI as well as GraphQL. See Breaking Changes.
- Support login —
ticket_idis required when using sudo on support login. - SPARQL endpoint — unanchored closures, built-in predicate IRIs, default prefixes and friendlier error messages.
- Configuration — per-operation configuration reads via config enrichment, and per-tenant configuration resolved from the config service.
- Multi-tenancy flags split — propagation, database and search flags are now independent.
- Access tokens — never-expiring tokens are disabled by default and allowed durations are configurable. See Breaking Changes.
Ingestion
New ingestion sources:
- IBM/HCL Informix — new connector.
- Monte Carlo — new connector.
Connector improvements:
- Snowflake - password login is deprecated: the CLI and UI now warn when a recipe uses a username and password, and there's a guide for moving to key-pair auth.
- BigQuery — support for BigQuery Sharing linked datasets and multi-column partition info; the profiler moves into its own package with added SQL and identifier guards.
- Cube — Cube views are ingested as Semantic Models.
- Dataplex — supports the Dataplex Metadata Export API extraction method.
- Metabase — column-level lineage, model ingestion, collection tags and containers, plus general hardening.
- MicroStrategy — project schema is ingested as a Semantic Model.
- Power BI — resolves BigQuery
EXTERNAL_QUERYfederation lineage. - SAP Analytics Cloud — column-level lineage to SAP Datasphere for DWC live models, and SAC → SAP Datasphere live-model lineage.
- SAP Datasphere — calculated column formulas are surfaced in the column description.
- Sigma — Sigma Dataset lineage is now recovered from Sigma's connection metadata rather than SQL. See Breaking Changes.
- Kafka Connect — SQL Server is treated as a three-level platform. See Breaking Changes.
Ingestion infrastructure:
- Connector support statuses have been updated and refreshed; each source has been assigned as Alpha, Beta, or GA.
- Configurable SQL lineage timeout.
- Structured properties settings can be ingested from the Python SDK.
- Secret masking — stdin envelope secrets are registered on receipt.
Breaking Changes
MCP server: the
?token=query parameter no longer works — every MCP endpoint takes the access token in theAuthorization: Bearer <token>header only, and a request with atokenquery parameter gets a400 Bad Requestexplaining the header form. A token in a URL persists in proxy and CDN logs, browser history andRefererheaders. Action: point MCP clients at the plain URL and send the header. Clients that cannot set headers can usemcp-remotewith--header "Authorization: Bearer <token>".Metric upstreams and lineage privileges — charts, dashboards and datasets may take a Metric as an upstream, stored on the shared
upstreamMetricsaspect. OpenAPI and Rest.li writes ofupstreamMetricsrequire Edit Lineage or Edit Entity on the consumer and on each destination Metric. A dataset cannot both consume a Metric viaupstreamMetricsand appear on that Metric'smetricUpstreams.datasetUpstreams. Action: automation that sent unsupportedupdateLineagepairs now receives an error instead of a silent no-op. UsemetricUpstreamsto attach a dataset to a Metric, and grant Edit Lineage to any client writingupstreamMetricsoutside the UI.Sigma ingestion: dataset lineage route changed (#19815) — Sigma ended dataset-as-data-source support on 2026-09-15 and dataset-backed workbook elements no longer return SQL, so Sigma Dataset lineage URNs are built from
connection_to_platform_maprather thanchart_sources_platform_mapping.envandplatform_instancenow come from the recipe unless a mapping entry supplies them, adding an entry makes itsenvauthoritative (defaulting toPROD), and identifier casing changes on platforms other than Snowflake. Action: add the SigmaconnectionIdtoconnection_to_platform_mapwith theenvandplatform_instanceyour warehouse connector used, plusconvert_urns_to_lowercase: trueif you want the previous spelling for those table names. The connector warns when a mapping'senvorplatform_instanceno longer applies.Structured property hard-delete requires a soft-delete first (#19445) — hard-deleting an active structured property, or deleting its
propertyDefinitionaspect directly, is now rejected across the UI, GraphQL, OpenAPI, Rest.li and the CLI. Hard deletion left the property's qualified name in the search index mappings, so the name could not be reused until affected indices were reindexed. The UI delete flow performs both steps automatically. Action: where automation issued a single hard delete, soft-delete then hard-delete. To reuse a name burned by an earlier hard delete, run SystemUpdate withELASTICSEARCH_INDEX_BUILDER_MAPPINGS_REINDEX=true.Timeseries read authorization — dataset profile, usage and operations timeseries (and dashboard/chart usage statistics) require the matching View Dataset Profile / Usage / Operations privileges on Rest.li and OpenAPI as well as GraphQL. Dedicated timeseries APIs also require Get Timeseries Aspect API when REST API authorization is enabled. Single-aspect GET/HEAD returns 403 without the privilege; assembled entity GET omits the aspect. Action: grant the View Dataset Profile / Usage / Operations privileges, or rely on the default
view-dataset-sensitivepolicy, for any API client that previously read these aspects with only entity GET.Role and group membership writes are authorized at the aspect layer — adding a role to a user or group (
roleMembership) requires Manage Policies; adding a user to a group requires Edit Group Members; adding a corpGroup owner requires Edit Owners. When the acting user is the one being added, both require Manage Users & Groups. Only additions are checked. Previously Edit Entity on a user was enough to grant that user the Admin role. Action: grant Manage Policies to automation that writesroleMembershipoutside the UI. Group-membership sync (LDAP, Okta, Azure AD,datahub user upsert) needs Edit Group Members or Manage Users & Groups, not Manage Policies. Group owners can no longer add themselves to groups they own.Analytics API requires its own privilege —
POST /openapi/v2/analytics/datahub_usage_events/_searchnow requires Analytics API access or Manage System Operations. It previously accepted View Analytics, which every user holds by default, even though the endpoint forwards a caller-supplied search request to the search engine. Action: grant Analytics API access to any service account or script calling this endpoint. The in-app analytics dashboard still works with View Analytics.Compliance form assignment requires Manage Compliance Forms —
batchAssignForm,batchRemoveFormandcreateDynamicFormAssignment, and any write to a form'sformsordynamicFormAssignmentaspect, now require the Manage Compliance Forms platform privilege. Writes that only change prompt completion or verification state are unaffected, so assignees can still complete forms. These mutations previously performed no authorization check. Action: grant Manage Compliance Forms to automation that assigns or unassigns forms outside the UI.Asset summary settings writes are authorized (#19745) —
updateAssetSettingsand any write to theassetSettingsaspect require Edit Entity or Manage Asset Summary on the target asset. The GraphQL mutation previously performed no authorization check, so any authenticated user could change any asset's summary template. Action: grant Manage Asset Summary or Edit Entity to automation writingassetSettingsoutside the UI. Note that OpenAPI and Rest.li still authorize this as a generic entity update, so Manage Asset Summary alone is not sufficient there.Never-expiring access tokens are disabled by default — allowed finite durations are configured as a comma-separated ISO-8601 list (
ACCESS_TOKEN_ALLOWED_DURATIONS, defaultPT1H,P1D,P7D,P30D,P90D,P180D,P365D). Exactly one of GraphQLdurationordurationIsomust be provided on create. Already-issued tokens, including never-expiring ones, keep working — this is create-time policy only. Action: setACCESS_TOKEN_ALLOW_NO_EXPIRY=trueto allow never-expire tokens again, or setACCESS_TOKEN_ALLOWED_DURATIONSto customize available TTLs.OpenAPI entity create authorization is per-URN (#18944) —
createEntity/createGenericEntitiesand aligned batch paths authorize each URN after building the MCP batch, using entity existence to choose Create vs Edit privileges. A principal with only Create Entity can no longer overwrite an existing entity via create/UPSERT. Action: grant Edit Entity to callers that update existing entities or use defaultcreateAspect; keep create-only policies for true creates.Domain-scoped create and domain writes (#18944) — ingest-time authorization evaluates domain-scoped Create Entity / Edit Entity policies against proposed
domainswhen establishing domains on a new entity. AdomainsPATCH always requires Edit Entity, and domain-scoped Edit must allow both the before and after domain membership. Action: domain-separated writers must include matchingdomainsin the create; grant Edit on both source and destination domains before moving assets between domains with a domains PATCH.Group member removal now removes unmigrated members (#18982) —
removeGroupMembersremoves members holding only the legacygroupMembershipaspect. Previously the mutation stripped onlynativeGroupMembership, reported success, and left the user in the group with access intact. Action: none required.MySQL, MariaDB, Doris and TiDB profiling limits are enforced (#18699) —
profiling.profile_table_row_limitandprofiling.profile_table_size_limitwere previously accepted and ignored on these sources. Action: re-check any value already set in your recipe before upgrading, as it will start filtering profiles. Both default tonullon these sources, so nothing changes unless you set them.sql-queriesreports total failure (#19099) — a run where every input line is unparseable or every query fails now reports failure and exits non-zero instead of completing successfully with nothing to show. Individual bad rows are still skipped and counted.enable_lazy_schema_loadingis removed, and two report fields are renamed:num_queries_processed_sequential→num_queries_processed,num_temp_tables_detected→num_temp_table_matches. Action: removeenable_lazy_schema_loadingfrom your recipe.Python SDK circuit breakers move to
DataHubGraph(#18548) —BaseApiand itsAssertion/Operationsubclasses query GMS throughDataHubGraphinstead of agqlclient, gaining OAuth, PAT, system auth and mTLS. Thetransport=constructor argument is replaced bygraph=,.clientby.graph, and GraphQL errors raiseGraphErrorinstead ofTransportQueryError. Action: update constructor calls and error handling.Kafka Connect treats SQL Server as three-level — JDBC sink connectors default the schema to
dbowhenschema.nameis unset, so sink URNs change fromdatabase.tabletodatabase.dbo.table. JDBC source connectors drop a dataset with a warning when the schema cannot be resolved, rather than emitting a two-level URN. Oracle JDBC sinks now emitschema.table. Action: none if your SQL Server assets were ingested with schema in the URN. If a source connector starts warning about a missing schema, setschema.nameon the connector or usegeneric_connectorsto force the mapping.Elasticsearch ingestion requires
opensearch-py3.x —acryl-datahub[elasticsearch]now requiresopensearch-py>=3.0.0,<4.0.0. The 3.x client still talks to OpenSearch 2 clusters. Action: none if you install via the extra; if you pinopensearch-pyyourself, raise the floor.The legacy Great Expectations SQL profiler is removed — the SQLAlchemy profiler, default since v1.1.0 and at feature parity, is now the only SQL profiler. The
profiling.methodoption and theacryl-datahub[profiling-ge]extra no longer exist; recipes that still setprofiling.methodemit a deprecation warning and profile with SQLAlchemy. For Unity Catalog,profiling.method: geis rejected. Action: removeprofiling.methodfrom recipes and drop theprofiling-geextra. This does not affect the separate Great Expectations integration that ingests GX validation results into DataHub.
Deprecations
The operational dashboard under
/admin/dashboardis being removed. It proxied an internal Grafana dashboard and has no equivalent after the migration to a new observability stack. Operational signals remain available through the DataHub public APIs, with published SLOs as the forward-looking replacement. Behavior is controlled per instance byGRAFANA_DASHBOARD_MODE:Release Mode What customers see 2.2 TOMBSTONE410 Gonewith a deprecation notice pointing at the public APIs2.3.0 DISABLED404— the path no longer responds2.4.0 — the proxy and its configuration are deleted The default remains
ENABLEDin this release, so nothing changes until an instance is flipped.
Security / Dependencies
- transformers: bumped to 5.17.0 to address CVE-2026-9856.
- Apache Parquet: bumped to 1.18.1 to address CVE-2026-73334.
- mariadb-java-client: bumped to 2.7.14 to address CVE-2026-55856, CVE-2026-55857 and CVE-2026-55858.
- cryptography: bumped to 50.0.1 in the integrations service to address CVE-2026-69247.
- cryptography / pyOpenSSL: ingestion floors raised to address CVE-2026-69247 and CVE-2026-27459.
- Spring Framework / Boot / Security: bumped to 7.0.9, 4.0.8 and 7.0.7 respectively.
- httpclient5, Spring Boot and the OpenTelemetry agent: bumped for reported CVEs.
- nltk: bumped 3.10.0 → 3.10.3.
- gitpython: bumped to 3.1.61 in the Cloud image lockfiles.
- setuptools: the Python package layer is refreshed in the executor and actions images to address CVE-2025-47273.
- curl: base image packages refreshed to address reported curl CVEs.
- mcp and json-repair: bumped for security fixes.
- Executor CVE gating: the executor image now gates and tracks CVEs as part of the build.
Known Issues
- None known at release time.