mirror of
				https://github.com/open-metadata/OpenMetadata.git
				synced 2025-10-31 02:29:03 +00:00 
			
		
		
		
	Added exception handling in dashboard sources (#10573)
* added exception handling in dashboard * updated process owner logic * Added redash source for fixes
This commit is contained in:
		
							parent
							
								
									47585e035a
								
							
						
					
					
						commit
						682626ffe8
					
				| @ -274,10 +274,36 @@ class DashboardServiceSource(TopologyRunnerMixin, Source, ABC): | ||||
|             entity=DashboardService, config=config | ||||
|         ) | ||||
| 
 | ||||
|     def process_owner(self, dashboard_details: dict):  # pylint: disable=unused-argument | ||||
|     def process_owner(self, dashboard_details): | ||||
|         try: | ||||
|             owner = self.get_owner_details(  # pylint: disable=assignment-from-none | ||||
|                 dashboard_details=dashboard_details | ||||
|             ) | ||||
|             if owner and self.source_config.overrideOwner: | ||||
|                 self.metadata.patch_owner( | ||||
|                     entity=Dashboard, | ||||
|                     entity_id=self.context.dashboard.id, | ||||
|                     owner=owner, | ||||
|                     force=True, | ||||
|                 ) | ||||
|         except Exception as exc: | ||||
|             logger.debug(traceback.format_exc()) | ||||
|             logger.warning(f"Error processing owner for {dashboard_details}: {exc}") | ||||
| 
 | ||||
|     def get_owner_details(  # pylint: disable=useless-return | ||||
|         self, dashboard_details  # pylint: disable=unused-argument | ||||
|     ) -> Optional[EntityReference]: | ||||
|         """Get dashboard owner | ||||
| 
 | ||||
|         Args: | ||||
|             dashboard_details: | ||||
|         Returns: | ||||
|             Optional[EntityReference] | ||||
|         """ | ||||
|         logger.debug( | ||||
|             f"Processing ownership is not supported for {self.service_connection.type.name}" | ||||
|         ) | ||||
|         return None | ||||
| 
 | ||||
|     @staticmethod | ||||
|     def _get_add_lineage_request( | ||||
|  | ||||
| @ -27,7 +27,6 @@ from metadata.generated.schema.api.data.createChart import CreateChartRequest | ||||
| from metadata.generated.schema.api.data.createDashboard import CreateDashboardRequest | ||||
| from metadata.generated.schema.api.lineage.addLineage import AddLineageRequest | ||||
| from metadata.generated.schema.entity.data.chart import Chart | ||||
| from metadata.generated.schema.entity.data.dashboard import Dashboard | ||||
| from metadata.generated.schema.entity.services.connections.dashboard.domoDashboardConnection import ( | ||||
|     DomoDashboardConnection, | ||||
| ) | ||||
| @ -95,8 +94,10 @@ class DomodashboardSource(DashboardServiceSource): | ||||
|     def get_dashboard_details(self, dashboard: DomoDashboardDetails) -> dict: | ||||
|         return dashboard | ||||
| 
 | ||||
|     def get_owner_details(self, owners: List[DomoOwner]) -> Optional[EntityReference]: | ||||
|         for owner in owners: | ||||
|     def get_owner_details( | ||||
|         self, dashboard_details: DomoDashboardDetails | ||||
|     ) -> Optional[EntityReference]: | ||||
|         for owner in dashboard_details.owners: | ||||
|             try: | ||||
|                 owner_details = self.client.users_get(owner.id) | ||||
|                 if owner_details.get("email"): | ||||
| @ -112,18 +113,6 @@ class DomodashboardSource(DashboardServiceSource): | ||||
|                 ) | ||||
|         return None | ||||
| 
 | ||||
|     def process_owner( | ||||
|         self, dashboard_details: DomoDashboardDetails | ||||
|     ) -> Optional[Dashboard]: | ||||
|         owner = self.get_owner_details(owners=dashboard_details.owners) | ||||
|         if owner and self.source_config.overrideOwner: | ||||
|             self.metadata.patch_owner( | ||||
|                 entity=Dashboard, | ||||
|                 entity_id=self.context.dashboard.id, | ||||
|                 owner=owner, | ||||
|                 force=True, | ||||
|             ) | ||||
| 
 | ||||
|     def yield_dashboard( | ||||
|         self, dashboard_details: DomoDashboardDetails | ||||
|     ) -> Iterable[CreateDashboardRequest]: | ||||
|  | ||||
| @ -182,18 +182,6 @@ class LookerSource(DashboardServiceSource): | ||||
| 
 | ||||
|         return self._owners_ref.get(dashboard_details.user_id) | ||||
| 
 | ||||
|     def process_owner( | ||||
|         self, dashboard_details: LookerDashboard | ||||
|     ) -> Optional[MetadataDashboard]: | ||||
|         owner = self.get_owner_details(dashboard_details=dashboard_details) | ||||
|         if owner and self.source_config.overrideOwner: | ||||
|             self.metadata.patch_owner( | ||||
|                 entity=MetadataDashboard, | ||||
|                 entity_id=self.context.dashboard.id, | ||||
|                 owner=owner, | ||||
|                 force=True, | ||||
|             ) | ||||
| 
 | ||||
|     def yield_dashboard( | ||||
|         self, dashboard_details: LookerDashboard | ||||
|     ) -> CreateDashboardRequest: | ||||
|  | ||||
| @ -91,7 +91,13 @@ class PowerbiSource(DashboardServiceSource): | ||||
|                     response = self.client.fetch_workspace_scan_result( | ||||
|                         scan_id=workspace_scan_id | ||||
|                     ) | ||||
|                     self.workspace_data.extend(response.get("workspaces")) | ||||
|                     self.workspace_data.extend( | ||||
|                         [ | ||||
|                             active_workspace | ||||
|                             for active_workspace in response.get("workspaces") | ||||
|                             if active_workspace.get("state") == "Active" | ||||
|                         ] | ||||
|                     ) | ||||
|                 else: | ||||
|                     logger.error("Error in fetching dashboards and charts") | ||||
|                 count += 1 | ||||
|  | ||||
| @ -173,20 +173,6 @@ class RedashSource(DashboardServiceSource): | ||||
|                 return EntityReference(id=user.id.__root__, type="user") | ||||
|         return None | ||||
| 
 | ||||
|     def process_owner(self, dashboard_details) -> Optional[LineageDashboard]: | ||||
|         try: | ||||
|             owner = self.get_owner_details(dashboard_details=dashboard_details) | ||||
|             if owner and self.source_config.overrideOwner: | ||||
|                 self.metadata.patch_owner( | ||||
|                     entity=LineageDashboard, | ||||
|                     entity_id=self.context.dashboard.id, | ||||
|                     owner=owner, | ||||
|                     force=True, | ||||
|                 ) | ||||
|         except Exception as exc: | ||||
|             logger.debug(traceback.format_exc()) | ||||
|             logger.warning(f"Error processing owner for {dashboard_details}: {exc}") | ||||
| 
 | ||||
|     def get_dashboard_url(self, dashboard_details: dict) -> str: | ||||
|         if version.parse(self.service_connection.redashVersion) > version.parse( | ||||
|             INCOMPATIBLE_REDASH_VERSION | ||||
|  | ||||
| @ -88,16 +88,6 @@ class SupersetSourceMixin(DashboardServiceSource): | ||||
| 
 | ||||
|         return None | ||||
| 
 | ||||
|     def process_owner(self, dashboard_details: dict) -> Optional[Lineage_Dashboard]: | ||||
|         owner = self.get_owner_details(dashboard_details=dashboard_details) | ||||
|         if owner and self.source_config.overrideOwner: | ||||
|             self.metadata.patch_owner( | ||||
|                 self.metadata, | ||||
|                 entity=Lineage_Dashboard, | ||||
|                 entity_id=self.context.dashboard.id, | ||||
|                 force=True, | ||||
|             ) | ||||
| 
 | ||||
|     def get_owner_details(self, dashboard_details: dict) -> EntityReference: | ||||
|         for owner in dashboard_details.get("owners", []): | ||||
|             user = self._get_user_by_email(owner["email"]) | ||||
|  | ||||
| @ -251,18 +251,6 @@ class TableauSource(DashboardServiceSource): | ||||
|                 return EntityReference(id=user.id.__root__, type="user") | ||||
|         return None | ||||
| 
 | ||||
|     def process_owner( | ||||
|         self, dashboard_details: TableauDashboard | ||||
|     ) -> Optional[LineageDashboard]: | ||||
|         owner = self.get_owner_details(dashboard_details=dashboard_details) | ||||
|         if owner and self.source_config.overrideOwner: | ||||
|             self.metadata.patch_owner( | ||||
|                 entity=LineageDashboard, | ||||
|                 entity_id=self.context.dashboard.id, | ||||
|                 owner=owner, | ||||
|                 force=True, | ||||
|             ) | ||||
| 
 | ||||
|     def yield_tag(self, *_, **__) -> OMetaTagAndClassification: | ||||
|         """ | ||||
|         Fetch Dashboard Tags | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Onkar Ravgan
						Onkar Ravgan