@@ -33,6 +33,8 @@ import {
33
33
import { createPlaceholderItem } from '../../../shared/treeview/utils'
34
34
import { Column , Database , Table } from '@aws-sdk/client-glue'
35
35
import { ConnectionCredentialsProvider } from '../../auth/providers/connectionCredentialsProvider'
36
+ import { telemetry } from '../../../shared/telemetry/telemetry'
37
+ import { getContext } from '../../../shared/vscode/setContext'
36
38
37
39
/**
38
40
* Lakehouse data node for SageMaker Unified Studio
@@ -149,49 +151,63 @@ export function createLakehouseConnectionNode(
149
151
} ,
150
152
} ,
151
153
async ( node ) => {
152
- try {
153
- logger . info ( `Loading Lakehouse catalogs for connection ${ connection . name } ` )
154
-
155
- // Check if this is a default connection
156
- const isDefaultConnection =
157
- DATA_DEFAULT_IAM_CONNECTION_NAME_REGEXP . test ( connection . name ) ||
158
- DATA_DEFAULT_LAKEHOUSE_CONNECTION_NAME_REGEXP . test ( connection . name ) ||
159
- DATA_DEFAULT_ATHENA_CONNECTION_NAME_REGEXP . test ( connection . name )
160
-
161
- // Follow the reference pattern with Promise.allSettled
162
- const [ awsDataCatalogResult , catalogsResult ] = await Promise . allSettled ( [
163
- // AWS Data Catalog node (only for default connections)
164
- isDefaultConnection
165
- ? Promise . resolve ( [ createAwsDataCatalogNode ( node , glueClient ) ] )
166
- : Promise . resolve ( [ ] ) ,
167
- // Get catalogs by calling Glue API
168
- getCatalogs ( glueCatalogClient , glueClient , node ) ,
169
- ] )
170
-
171
- const awsDataCatalog = awsDataCatalogResult . status === 'fulfilled' ? awsDataCatalogResult . value : [ ]
172
- const apiCatalogs = catalogsResult . status === 'fulfilled' ? catalogsResult . value : [ ]
173
- const errors : LakehouseNode [ ] = [ ]
174
-
175
- if ( awsDataCatalogResult . status === 'rejected' ) {
176
- const errorMessage = ( awsDataCatalogResult . reason as Error ) . message
177
- void vscode . window . showErrorMessage ( errorMessage )
178
- errors . push ( createErrorItem ( errorMessage , 'aws-data-catalog' , node . id ) as LakehouseNode )
179
- }
154
+ return telemetry . smus_renderLakehouseNode . run ( async ( span ) => {
155
+ const isInSmusSpace = getContext ( 'aws.smus.inSmusSpaceEnvironment' )
156
+
157
+ span . record ( {
158
+ smusToolkitEnv : isInSmusSpace ? 'smus_space' : 'local' ,
159
+ smusDomainId : connection . domainId ,
160
+ smusProjectId : connection . projectId ,
161
+ smusConnectionId : connection . connectionId ,
162
+ smusConnectionType : connection . type ,
163
+ smusProjectRegion : connection . location ?. awsRegion ,
164
+ } )
165
+ try {
166
+ logger . info ( `Loading Lakehouse catalogs for connection ${ connection . name } ` )
167
+
168
+ // Check if this is a default connection
169
+ const isDefaultConnection =
170
+ DATA_DEFAULT_IAM_CONNECTION_NAME_REGEXP . test ( connection . name ) ||
171
+ DATA_DEFAULT_LAKEHOUSE_CONNECTION_NAME_REGEXP . test ( connection . name ) ||
172
+ DATA_DEFAULT_ATHENA_CONNECTION_NAME_REGEXP . test ( connection . name )
173
+
174
+ // Follow the reference pattern with Promise.allSettled
175
+ const [ awsDataCatalogResult , catalogsResult ] = await Promise . allSettled ( [
176
+ // AWS Data Catalog node (only for default connections)
177
+ isDefaultConnection
178
+ ? Promise . resolve ( [ createAwsDataCatalogNode ( node , glueClient ) ] )
179
+ : Promise . resolve ( [ ] ) ,
180
+ // Get catalogs by calling Glue API
181
+ getCatalogs ( glueCatalogClient , glueClient , node ) ,
182
+ ] )
183
+
184
+ const awsDataCatalog = awsDataCatalogResult . status === 'fulfilled' ? awsDataCatalogResult . value : [ ]
185
+ const apiCatalogs = catalogsResult . status === 'fulfilled' ? catalogsResult . value : [ ]
186
+ const errors : LakehouseNode [ ] = [ ]
187
+
188
+ if ( awsDataCatalogResult . status === 'rejected' ) {
189
+ const errorMessage = ( awsDataCatalogResult . reason as Error ) . message
190
+ void vscode . window . showErrorMessage ( errorMessage )
191
+ errors . push ( createErrorItem ( errorMessage , 'aws-data-catalog' , node . id ) as LakehouseNode )
192
+ }
193
+
194
+ if ( catalogsResult . status === 'rejected' ) {
195
+ const errorMessage = ( catalogsResult . reason as Error ) . message
196
+ void vscode . window . showErrorMessage ( errorMessage )
197
+ errors . push ( createErrorItem ( errorMessage , 'catalogs' , node . id ) as LakehouseNode )
198
+ }
180
199
181
- if ( catalogsResult . status === 'rejected' ) {
182
- const errorMessage = ( catalogsResult . reason as Error ) . message
200
+ const allNodes = [ ...awsDataCatalog , ...apiCatalogs , ...errors ]
201
+ return allNodes . length > 0
202
+ ? allNodes
203
+ : [ createPlaceholderItem ( NO_DATA_FOUND_MESSAGE ) as LakehouseNode ]
204
+ } catch ( err ) {
205
+ logger . error ( `Failed to get Lakehouse catalogs: ${ ( err as Error ) . message } ` )
206
+ const errorMessage = ( err as Error ) . message
183
207
void vscode . window . showErrorMessage ( errorMessage )
184
- errors . push ( createErrorItem ( errorMessage , 'catalogs' , node . id ) as LakehouseNode )
208
+ return [ createErrorItem ( errorMessage , 'lakehouse- catalogs' , node . id ) as LakehouseNode ]
185
209
}
186
-
187
- const allNodes = [ ...awsDataCatalog , ...apiCatalogs , ...errors ]
188
- return allNodes . length > 0 ? allNodes : [ createPlaceholderItem ( NO_DATA_FOUND_MESSAGE ) as LakehouseNode ]
189
- } catch ( err ) {
190
- logger . error ( `Failed to get Lakehouse catalogs: ${ ( err as Error ) . message } ` )
191
- const errorMessage = ( err as Error ) . message
192
- void vscode . window . showErrorMessage ( errorMessage )
193
- return [ createErrorItem ( errorMessage , 'lakehouse-catalogs' , node . id ) as LakehouseNode ]
194
- }
210
+ } )
195
211
}
196
212
)
197
213
}
@@ -229,7 +245,9 @@ function createAwsDataCatalogNode(parent: LakehouseNode, glueClient: GlueClient)
229
245
nextToken = token
230
246
} while ( nextToken )
231
247
232
- return allDatabases . map ( ( database ) => createDatabaseNode ( database . Name || '' , database , glueClient , node ) )
248
+ return allDatabases . length > 0
249
+ ? allDatabases . map ( ( database ) => createDatabaseNode ( database . Name || '' , database , glueClient , node ) )
250
+ : [ createPlaceholderItem ( NO_DATA_FOUND_MESSAGE ) as LakehouseNode ]
233
251
}
234
252
)
235
253
}
@@ -392,9 +410,11 @@ function createCatalogNode(
392
410
nextToken = token
393
411
} while ( nextToken )
394
412
395
- return allDatabases . map ( ( database ) =>
396
- createDatabaseNode ( database . Name || '' , database , glueClient , node )
397
- )
413
+ return allDatabases . length > 0
414
+ ? allDatabases . map ( ( database ) =>
415
+ createDatabaseNode ( database . Name || '' , database , glueClient , node )
416
+ )
417
+ : [ createPlaceholderItem ( NO_DATA_FOUND_MESSAGE ) as LakehouseNode ]
398
418
} catch ( err ) {
399
419
logger . error ( `Failed to get databases for catalog ${ catalogId } : ${ ( err as Error ) . message } ` )
400
420
const errorMessage = ( err as Error ) . message
@@ -513,7 +533,10 @@ function createTableNode(
513
533
const columns = tableDetails ?. StorageDescriptor ?. Columns || [ ]
514
534
const partitions = tableDetails ?. PartitionKeys || [ ]
515
535
516
- return [ ...columns , ...partitions ] . map ( ( column ) => createColumnNode ( column . Name || '' , column , node ) )
536
+ const allColumns = [ ...columns , ...partitions ]
537
+ return allColumns . length > 0
538
+ ? allColumns . map ( ( column ) => createColumnNode ( column . Name || '' , column , node ) )
539
+ : [ createPlaceholderItem ( NO_DATA_FOUND_MESSAGE ) as LakehouseNode ]
517
540
} catch ( err ) {
518
541
logger . error ( `Failed to get columns for table ${ tableName } : ${ ( err as Error ) . message } ` )
519
542
return [ ]
@@ -565,7 +588,9 @@ function createContainerNode(
565
588
} ,
566
589
async ( node ) => {
567
590
// Map items to nodes
568
- return items . map ( ( item ) => createTableNode ( item . Name || '' , item , glueClient , node ) )
591
+ return items . length > 0
592
+ ? items . map ( ( item ) => createTableNode ( item . Name || '' , item , glueClient , node ) )
593
+ : [ createPlaceholderItem ( NO_DATA_FOUND_MESSAGE ) as LakehouseNode ]
569
594
}
570
595
)
571
596
}
0 commit comments