acryl-datahub 0.15.0.1rc6__py3-none-any.whl → 0.15.0.1rc8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of acryl-datahub might be problematic. Click here for more details.

Files changed (28) hide show
  1. {acryl_datahub-0.15.0.1rc6.dist-info → acryl_datahub-0.15.0.1rc8.dist-info}/METADATA +2390 -2390
  2. {acryl_datahub-0.15.0.1rc6.dist-info → acryl_datahub-0.15.0.1rc8.dist-info}/RECORD +28 -27
  3. datahub/__init__.py +1 -1
  4. datahub/ingestion/source/looker/looker_common.py +9 -0
  5. datahub/ingestion/source/looker/looker_source.py +19 -3
  6. datahub/ingestion/source/looker/looker_usage.py +23 -17
  7. datahub/ingestion/source/mode.py +40 -27
  8. datahub/ingestion/source/snowflake/snowflake_config.py +3 -25
  9. datahub/ingestion/source/snowflake/snowflake_lineage_v2.py +3 -10
  10. datahub/ingestion/source/snowflake/snowflake_query.py +0 -9
  11. datahub/ingestion/source/snowflake/snowflake_schema_gen.py +1 -5
  12. datahub/ingestion/source/snowflake/snowflake_shares.py +1 -1
  13. datahub/ingestion/source/snowflake/snowflake_v2.py +14 -6
  14. datahub/ingestion/source/tableau/tableau.py +51 -20
  15. datahub/ingestion/source_report/ingestion_stage.py +1 -0
  16. datahub/metadata/_schema_classes.py +195 -2
  17. datahub/metadata/com/linkedin/pegasus2avro/ml/metadata/__init__.py +2 -0
  18. datahub/metadata/schema.avsc +188 -4
  19. datahub/metadata/schemas/DataProcessInstanceKey.avsc +5 -1
  20. datahub/metadata/schemas/DataProcessInstanceOutput.avsc +2 -1
  21. datahub/metadata/schemas/MLModelGroupProperties.avsc +82 -0
  22. datahub/metadata/schemas/MLModelProperties.avsc +62 -2
  23. datahub/metadata/schemas/MLTrainingRunProperties.avsc +171 -0
  24. datahub/metadata/schemas/MetadataChangeEvent.avsc +94 -2
  25. datahub/sql_parsing/tool_meta_extractor.py +4 -1
  26. {acryl_datahub-0.15.0.1rc6.dist-info → acryl_datahub-0.15.0.1rc8.dist-info}/WHEEL +0 -0
  27. {acryl_datahub-0.15.0.1rc6.dist-info → acryl_datahub-0.15.0.1rc8.dist-info}/entry_points.txt +0 -0
  28. {acryl_datahub-0.15.0.1rc6.dist-info → acryl_datahub-0.15.0.1rc8.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,4 @@
1
- datahub/__init__.py,sha256=lThsP3KmoFgrvSScMvSH0uLu7H2JJshAHDrzuIjHRjs,576
1
+ datahub/__init__.py,sha256=Ed_HdiA9eGLLG0fhJKPwruUxl4bgAPR8p2MDlRHqts8,576
2
2
  datahub/__main__.py,sha256=pegIvQ9hzK7IhqVeUi1MeADSZ2QlP-D3K0OQdEg55RU,106
3
3
  datahub/entrypoints.py,sha256=3-qSfXAx3Z0FEkBV5tlO8fQr4xk4ySeDRMVTpS5Xd6A,7793
4
4
  datahub/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -197,7 +197,7 @@ datahub/ingestion/source/glue_profiling_config.py,sha256=vpMJH4Lf_qgR32BZy58suab
197
197
  datahub/ingestion/source/ldap.py,sha256=Vnzg8tpwBYeyM-KBVVsUJvGZGBMJiCJ_i_FhxaFRQ9A,18627
198
198
  datahub/ingestion/source/metabase.py,sha256=oemiMdzjfr82Hx6rdwTNBzFM8962LDkosYh7SD_I5cY,31717
199
199
  datahub/ingestion/source/mlflow.py,sha256=-yWUuAEVBiNN-elz8Pgn0UeGsC3fVB20z1zKNIr4LXI,12309
200
- datahub/ingestion/source/mode.py,sha256=n_5em3jADCr5gWTLDOP4O4bRS0Zt_TCZtW8uFPxn-DI,63043
200
+ datahub/ingestion/source/mode.py,sha256=cq1KIpLxuplETF7sUW0hoMQIZG1cgga5BGHP54a28wE,63467
201
201
  datahub/ingestion/source/mongodb.py,sha256=vZue4Nz0xaBoCUsQr3_0OIRkWRxeE_IH_Y_QKZ1s7S0,21077
202
202
  datahub/ingestion/source/nifi.py,sha256=ttsjZ9aRUvINmewvKFIQD8Rwa4jcl35WFG-F-jPGPWQ,56146
203
203
  datahub/ingestion/source/openapi.py,sha256=3ea2ORz1cuq4e7L2hSjxG9Cw3__pVoJ5UNYTJS3EnKU,17386
@@ -330,7 +330,7 @@ datahub/ingestion/source/kafka_connect/sink_connectors.py,sha256=ESuJE5SFLLvss9O
330
330
  datahub/ingestion/source/kafka_connect/source_connectors.py,sha256=_765fSMDAWAe0Cf_F4VNHfOWKNhtqBA1Ep2jL3rf-qc,21263
331
331
  datahub/ingestion/source/looker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
332
332
  datahub/ingestion/source/looker/lkml_patched.py,sha256=XShEU7Wbz0DubDhYMjKf9wjKZrBJa2XPg9MIjp8rPhk,733
333
- datahub/ingestion/source/looker/looker_common.py,sha256=0-5xhq7vE9YFj8tzbvRI7RnP1cD_oxnN4NpSXjKzxjE,61726
333
+ datahub/ingestion/source/looker/looker_common.py,sha256=KObx5ZTfldN2EO11eb1LrHI-KjWHcFoe8n_XcvzuFFU,62047
334
334
  datahub/ingestion/source/looker/looker_config.py,sha256=87WAgdJ_QWdTq25RBwgIqfc2kq7dubSpzbEtXb2ihMw,13182
335
335
  datahub/ingestion/source/looker/looker_connection.py,sha256=yDmC6lDsHmL2e_Pw8ULylwOIHPWPp_6gT1iyLvD0fTw,2075
336
336
  datahub/ingestion/source/looker/looker_constant.py,sha256=GMKYtNXlpojPxa9azridKfcGLSJwKdUCTesp7U8dIrQ,402
@@ -339,9 +339,9 @@ datahub/ingestion/source/looker/looker_file_loader.py,sha256=c1ewDrIb9VJg1o-asbw
339
339
  datahub/ingestion/source/looker/looker_lib_wrapper.py,sha256=0gaYjBv4wkbbLWVgvaAV6JyWAFb0utTG6TCve2d9xss,11511
340
340
  datahub/ingestion/source/looker/looker_liquid_tag.py,sha256=mO4G4MNA4YZFvZaDBpdiJ2vP3irC82kY34RdaK4Pbfs,3100
341
341
  datahub/ingestion/source/looker/looker_query_model.py,sha256=N0jBbFruiCIIGT6sJn6tNeppeQ78KGTkOwTLirhxFNc,2144
342
- datahub/ingestion/source/looker/looker_source.py,sha256=IUI2FpYG2_bhVnP_LZeQymjc5D0F7lqYTADktzV3yr8,65735
342
+ datahub/ingestion/source/looker/looker_source.py,sha256=hlQ9IMgnp_bzNy122SdD4PyIMjbM9Fhtk3QB80d8Iss,66375
343
343
  datahub/ingestion/source/looker/looker_template_language.py,sha256=EG4ZfVZ0x53lgaYh2ohzL4ZCy9KsX0TA51XqCmsCd2Q,14328
344
- datahub/ingestion/source/looker/looker_usage.py,sha256=qegMr-Rnqz3xNGSBfsuD3S_BPXf7UEMhwFN7DPQeLNo,22914
344
+ datahub/ingestion/source/looker/looker_usage.py,sha256=4N4R8LEocxX5TuWUgRG9meoh1boG-4SXvAu_b5-fHc0,23047
345
345
  datahub/ingestion/source/looker/looker_view_id_cache.py,sha256=92gDy6NONhJYBp92z_IBzDVZvezmUIkaBCZY1bdk6mE,4392
346
346
  datahub/ingestion/source/looker/lookml_concept_context.py,sha256=guaIfY_cP8UOboJhsf9a1b9r6xjLh8k5C9uMb4p5Neg,18066
347
347
  datahub/ingestion/source/looker/lookml_config.py,sha256=Q0fMsu_Cvm8807R6VB14VJDLqjoLTyGF-WsiUD6xEk8,10519
@@ -429,22 +429,22 @@ datahub/ingestion/source/snowflake/constants.py,sha256=22n-0r04nuy-ImxWFFpmbrt_G
429
429
  datahub/ingestion/source/snowflake/oauth_config.py,sha256=ol9D3RmruGStJAeL8PYSQguSqcD2HfkjPkMF2AB_eZs,1277
430
430
  datahub/ingestion/source/snowflake/oauth_generator.py,sha256=fu2VnREGuJXeTqIV2jx4TwieVnznf83HQkrE0h2DGGM,3423
431
431
  datahub/ingestion/source/snowflake/snowflake_assertion.py,sha256=_l3k4aI9wvioE81xxdeizJn9nJCZ_nMIXgk9N6pEk5o,4803
432
- datahub/ingestion/source/snowflake/snowflake_config.py,sha256=LZqnTELtzRNf0vsKG-xXggXyt13S9RYvHOZEZHRjgNk,18851
432
+ datahub/ingestion/source/snowflake/snowflake_config.py,sha256=_Ew2nJRoKC9e-SyrhOqn730c4FEhQE3U4bbY6RFV004,17973
433
433
  datahub/ingestion/source/snowflake/snowflake_connection.py,sha256=yzv-01FdmfDSCJY5rqKNNodXxzg3SS5DF7oA4WXArOA,17793
434
434
  datahub/ingestion/source/snowflake/snowflake_data_reader.py,sha256=ffR5E2uhD71FUMXd3XOg2rHwrp1rbbGEFTAbqKcmI2s,2195
435
- datahub/ingestion/source/snowflake/snowflake_lineage_v2.py,sha256=kpZvGbWmLMEUBslGToeA3oBO__8V2FzPvUKJSNw_3VM,21598
435
+ datahub/ingestion/source/snowflake/snowflake_lineage_v2.py,sha256=5Lpy_irZlbOFJbvVkgsZSBjdLCT3VZNjlEvttzSQAU4,21121
436
436
  datahub/ingestion/source/snowflake/snowflake_profiler.py,sha256=0DJiSwII6FY34urlBja2FW66NaVvhbBWmG0p7u8Xyrc,7548
437
437
  datahub/ingestion/source/snowflake/snowflake_queries.py,sha256=8QEihOfivalVR9vLo6vCUL-vnZfAGgMio0uhPYX0jTo,25883
438
- datahub/ingestion/source/snowflake/snowflake_query.py,sha256=yDu_1aTAG7eLEh1w1FGmn2-c6NJZURdslnI6fC_4B_0,38723
438
+ datahub/ingestion/source/snowflake/snowflake_query.py,sha256=885pyVnLf8wwTTuWkJ-Q01gKE7Xt518QPbFkrN-vd7o,38310
439
439
  datahub/ingestion/source/snowflake/snowflake_report.py,sha256=_-rD7Q4MzKY8fYzJHSBnGX4gurwujL3UoRzcP_TZURs,6468
440
440
  datahub/ingestion/source/snowflake/snowflake_schema.py,sha256=z5ZPgh-TILAz0DeIwDxRCsj980CM2BbftXiFpM1dV_Y,21674
441
- datahub/ingestion/source/snowflake/snowflake_schema_gen.py,sha256=K-KEr3OpwMHye08lXAy-5doUUGoGJP3b-ntJAGU_NBY,42472
442
- datahub/ingestion/source/snowflake/snowflake_shares.py,sha256=ud3Ah4qHrmSfpD8Od-gPdzwtON9dJa0eqHt-8Yr5h2Q,6366
441
+ datahub/ingestion/source/snowflake/snowflake_schema_gen.py,sha256=3AxvKfK9WV9x2f2XNuJ-Cmy4szmXKm1Ky0haRVvyC6w,42340
442
+ datahub/ingestion/source/snowflake/snowflake_shares.py,sha256=maZyFkfrbVogEFM0tTKRiNp9c_1muv6YfleSd3q0umI,6341
443
443
  datahub/ingestion/source/snowflake/snowflake_summary.py,sha256=kTmuCtRnvHqM8WBYhWeK4XafJq3ssFL9kcS03jEeWT4,5506
444
444
  datahub/ingestion/source/snowflake/snowflake_tag.py,sha256=fyfWmFVz2WZrpTJWNIe9m0WpDHgeFrGPf8diORJZUwo,6212
445
445
  datahub/ingestion/source/snowflake/snowflake_usage_v2.py,sha256=PEmYNMXJRUvLQmVd8juVqjokfuSPuH9ppcM0ruXamxA,24807
446
446
  datahub/ingestion/source/snowflake/snowflake_utils.py,sha256=YczNEupY89jeegjR2_1pT4bPi9wQ69EIhGpzyCe9Jdg,12600
447
- datahub/ingestion/source/snowflake/snowflake_v2.py,sha256=ecaTCJNAQ_IJOPInPGXA3jv1dE5lztSU82UhpBygiq0,31654
447
+ datahub/ingestion/source/snowflake/snowflake_v2.py,sha256=hIWtzlxuSQ_3w48o4AF2l9CQOcWIe6AmD07I89sH2B0,31860
448
448
  datahub/ingestion/source/sql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
449
449
  datahub/ingestion/source/sql/athena.py,sha256=G3cIY8H_76lIUAzQWW2kLnZOEsfbakmojxbiHb3dYZ8,24059
450
450
  datahub/ingestion/source/sql/clickhouse.py,sha256=jzvaXP5Wr0SMhj2rtuvVE821xnfpKiXhO3cm0xblgHs,27299
@@ -491,7 +491,7 @@ datahub/ingestion/source/state_provider/datahub_ingestion_checkpointing_provider
491
491
  datahub/ingestion/source/state_provider/file_ingestion_checkpointing_provider.py,sha256=xsH7Ao_05VTjqpkzLkhdf5B1ULMzFoD8vkJJIJU9w-U,4077
492
492
  datahub/ingestion/source/state_provider/state_provider_registry.py,sha256=SVq4mIyGNmLXE9OZx1taOiNPqDoQp03-Ot9rYnB5F3k,401
493
493
  datahub/ingestion/source/tableau/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
494
- datahub/ingestion/source/tableau/tableau.py,sha256=5oyAoF7h92zUTh9NIaYipyRXUFUZSz1oo8hwn46RM2w,138661
494
+ datahub/ingestion/source/tableau/tableau.py,sha256=nu71B56vB6h5io5GcMXQPlYVCbE-UNAtdxHCm8nXr9o,139751
495
495
  datahub/ingestion/source/tableau/tableau_common.py,sha256=9gQLq_3BlAsKll83uVlnWJRWaIDtFtREUyuimXF13Z0,26219
496
496
  datahub/ingestion/source/tableau/tableau_constant.py,sha256=ZcAeHsQUXVVL26ORly0ByZk_GJAFbxaKuJAlX_sYMac,2686
497
497
  datahub/ingestion/source/tableau/tableau_server_wrapper.py,sha256=nSyx9RzC6TCQDm-cTVJ657qT8iDwzk_8JMKpohhmOc4,1046
@@ -517,7 +517,7 @@ datahub/ingestion/source_config/csv_enricher.py,sha256=IROxxfFJA56dHkmmbjjhb7h1p
517
517
  datahub/ingestion/source_config/operation_config.py,sha256=Q0NlqiEh4s4DFIII5NsAp5hxWTVyyJz-ldcQmH-B47s,3504
518
518
  datahub/ingestion/source_config/pulsar.py,sha256=sklDkh62CrWV-i7Ifh6R3T3smYVso6gyRJG8HVc6RdA,5533
519
519
  datahub/ingestion/source_report/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
520
- datahub/ingestion/source_report/ingestion_stage.py,sha256=pJcJeLSjaixlLqQyQtE3bfUcvXEVwrSaWWtU4iU9UEo,1557
520
+ datahub/ingestion/source_report/ingestion_stage.py,sha256=w6qTnJm_-eoTiGxwS7cFnhdIfsv8omC6H5e0qw5t4Jc,1587
521
521
  datahub/ingestion/source_report/pulsar.py,sha256=iKhzy644AjoFTV-gxyqBoXKMLwSMPxJFxU-3WDQRww0,1037
522
522
  datahub/ingestion/source_report/time_window.py,sha256=9yI5l2S1DcF7ClvUHLeN8m62I5vlhV9k-aQqSZh2l7w,229
523
523
  datahub/ingestion/transformer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -566,8 +566,8 @@ datahub/lite/lite_registry.py,sha256=bpH0kasP-LtwwUFNA2QsOIehfekAYfJtN-AkQLmSWnw
566
566
  datahub/lite/lite_server.py,sha256=p9Oa2nNs65mqcssSIVOr7VOzWqfVstz6ZQEdT4f82S0,1949
567
567
  datahub/lite/lite_util.py,sha256=pgBpT3vTO1YCQ2njZRNyicSkHYeEmQCt41BaXU8WvMo,4503
568
568
  datahub/metadata/__init__.py,sha256=AjhXPjI6cnpdcrBRrE5gOWo15vv2TTl2ctU4UAnUN7A,238
569
- datahub/metadata/_schema_classes.py,sha256=FTLom36n7gr6zxYfPWWoy9AmdnB4KOIXYRoVZbS9kog,955042
570
- datahub/metadata/schema.avsc,sha256=D-rNu2SC2tyvqju8pQwGNGGT9zy1_fzxzoigH5YmUvo,722242
569
+ datahub/metadata/_schema_classes.py,sha256=NbZUezNRH72XQUl4i_DlV-oRT4KzEBYFYcHcwGqXq9A,962516
570
+ datahub/metadata/schema.avsc,sha256=Ulqzumt0EK7nD_OATi0hbCgw42ngoenja9SXWWsobIk,728543
571
571
  datahub/metadata/schema_classes.py,sha256=X5Jl5EaSxyHdXOQv14pJ5WkQALun4MRpJ4q12wVFE18,1299
572
572
  datahub/metadata/urns.py,sha256=nfrCTExR-k2P9w272WVtWSN3xW1VUJngPwP3xnvULjU,1217
573
573
  datahub/metadata/_urns/__init__.py,sha256=cOF3GHMDgPhmbLKbN02NPpuLGHSu0qNgQyBRv08eqF0,243
@@ -614,7 +614,7 @@ datahub/metadata/com/linkedin/pegasus2avro/metadata/query/__init__.py,sha256=gsA
614
614
  datahub/metadata/com/linkedin/pegasus2avro/metadata/query/filter/__init__.py,sha256=DBP_QtxkFmC5q_kuk4dGjb4uOKbB4xKgqTWXGxmNbBQ,532
615
615
  datahub/metadata/com/linkedin/pegasus2avro/metadata/snapshot/__init__.py,sha256=OPboF8SV11wGnjvWQB-rxtB0otMdCsE7Tcy7xkOUgz8,2358
616
616
  datahub/metadata/com/linkedin/pegasus2avro/ml/__init__.py,sha256=gsAIuTxzfJdI7a9ybZlgMIHMAYksM1SxGxXjtySgKSc,202
617
- datahub/metadata/com/linkedin/pegasus2avro/ml/metadata/__init__.py,sha256=WIN5E6MiZWF03Ujd8ECvmPS_IyaEvhV8B5dU-GZK3KQ,3192
617
+ datahub/metadata/com/linkedin/pegasus2avro/ml/metadata/__init__.py,sha256=qefB0n1xilQHCPla80b39wdjHOYoVtzBJT2jGc2szkM,3309
618
618
  datahub/metadata/com/linkedin/pegasus2avro/mxe/__init__.py,sha256=LqGp9QTLk_tiSsbHMGSUH7uPG00Bf_qQIMiU7vtO4Tk,973
619
619
  datahub/metadata/com/linkedin/pegasus2avro/notebook/__init__.py,sha256=BcjOsz4YeHQbLLBb4Im4uJ7ux1hGHquQDmiIOiDXVtE,901
620
620
  datahub/metadata/com/linkedin/pegasus2avro/ownership/__init__.py,sha256=r813MW_bkP1ZpC2NJf7uCHEOapjebl611c90vryKX4A,302
@@ -713,8 +713,8 @@ datahub/metadata/schemas/DataPlatformInstanceProperties.avsc,sha256=4-UrBTtVAR0r
713
713
  datahub/metadata/schemas/DataPlatformKey.avsc,sha256=5Z2adruXKzSucmgCba768UXdsGsYBH9t9DvFF9L9mxo,461
714
714
  datahub/metadata/schemas/DataProcessInfo.avsc,sha256=n4Zuk4kpHrHI2BdINhG-OucdCefb2GEsDv5mXQtSWIw,1558
715
715
  datahub/metadata/schemas/DataProcessInstanceInput.avsc,sha256=NDbRQULcJ9erg3X24w-LUY5AclqKemZQq0LDz1CVsFE,847
716
- datahub/metadata/schemas/DataProcessInstanceKey.avsc,sha256=fy6HDvu_MzAQOb4lsaY2x97T1gY937Cq48IuUhfxOYM,845
717
- datahub/metadata/schemas/DataProcessInstanceOutput.avsc,sha256=ZUdCQ-O2I7l4BNlx8VwJZw0PNpJdy47-ZASSBJneCEs,845
716
+ datahub/metadata/schemas/DataProcessInstanceKey.avsc,sha256=YSEVtSWql1IZ9AG37HmJZ4118pgi8kVCygI_GqFf3YA,945
717
+ datahub/metadata/schemas/DataProcessInstanceOutput.avsc,sha256=Ra00uvvXrKVlXD1O7B-1thvxebsvCtpeQzc4bnzAflU,868
718
718
  datahub/metadata/schemas/DataProcessInstanceProperties.avsc,sha256=2qsDFeSA2-ag5IVetgD8mW2k--F6CwmYXM3KOE6edU8,3836
719
719
  datahub/metadata/schemas/DataProcessInstanceRelationships.avsc,sha256=VhBpnyGGvO06WEnM6zy4PmjiT0nivRQfkSdJCUgIavw,2358
720
720
  datahub/metadata/schemas/DataProcessInstanceRunEvent.avsc,sha256=zwTYULEnpMbqwkLN8NbXW9PQWFG4X6TZkZwTQ1Wb53Y,6713
@@ -796,12 +796,13 @@ datahub/metadata/schemas/MLModelDeploymentKey.avsc,sha256=gmXaUYxII8BVLnXOFdlPmy
796
796
  datahub/metadata/schemas/MLModelDeploymentProperties.avsc,sha256=88nJ4uEBeT6kGrZnhYnZF4Co8rq2SBjqszQ-owtskQ4,3133
797
797
  datahub/metadata/schemas/MLModelFactorPrompts.avsc,sha256=8kX-P4F4mVLFT980z3MwIautt1_6uA-c_Z87nYNDK-k,2712
798
798
  datahub/metadata/schemas/MLModelGroupKey.avsc,sha256=eb4qdIdQLvvQ7u1e_FHIHTkWrvIwYQji0yKoGrxCiWI,2460
799
- datahub/metadata/schemas/MLModelGroupProperties.avsc,sha256=X8SexaKiPqBb7YMllw1tbIA_0bk3MZFyv8NtX2AhdZI,1618
799
+ datahub/metadata/schemas/MLModelGroupProperties.avsc,sha256=r4ZeqDnn1wfpT6zdg8_rT8uciJWO6nMZO4kXZFALksE,3590
800
800
  datahub/metadata/schemas/MLModelKey.avsc,sha256=deK5u7b9S9-qYUNtlflj2OUxqS_PlUYWN_NYRzZiVtI,2802
801
- datahub/metadata/schemas/MLModelProperties.avsc,sha256=wGCQ-yMLnss-rRl-NigFPMLEesvSeK0t1iOblyG_m0U,8411
801
+ datahub/metadata/schemas/MLModelProperties.avsc,sha256=FwhPz9P0k61LYFJLLUObFzKe24iAnsMyAPLbQCvqL7g,10079
802
802
  datahub/metadata/schemas/MLPrimaryKeyKey.avsc,sha256=mX4CQcoN3FC_VQDBCkhlmJk4pfQKDrSeuqqCTTXTmq8,1092
803
803
  datahub/metadata/schemas/MLPrimaryKeyProperties.avsc,sha256=akhjegh2q_4pm4_C2mP0rWpCGVqmJ8Ta6X8lqNtbVbg,4468
804
- datahub/metadata/schemas/MetadataChangeEvent.avsc,sha256=y5J5nOdo_GJZnVkerZlbNJWfZqA_Uw-cW8GCCxI0J0s,367471
804
+ datahub/metadata/schemas/MLTrainingRunProperties.avsc,sha256=WGgj0MuQrGD4UgvyHCJHzTnHja2LlJTOr1gLu8SySj0,4269
805
+ datahub/metadata/schemas/MetadataChangeEvent.avsc,sha256=2cR4D52wiIrEtWUfJIINhuTSan1495Q8lznVk72lty8,371387
805
806
  datahub/metadata/schemas/MetadataChangeLog.avsc,sha256=mpdodpx25E6M1Gq_7slEcPAm-1Es5xPsoqV60HgO7zg,12167
806
807
  datahub/metadata/schemas/MetadataChangeProposal.avsc,sha256=EMfQrYsuHf1p6UvBjoLtfdTHGe-vGNJaCFEHz8hdKU0,9698
807
808
  datahub/metadata/schemas/Metrics.avsc,sha256=O7DJGjOwmHbb1x_Zj7AuM_HaHKjBvkfJKfUsX8icXD4,690
@@ -881,7 +882,7 @@ datahub/sql_parsing/sql_parsing_common.py,sha256=h_V_m54hJ9EUh5kczq7cYOIeNeo4bgf
881
882
  datahub/sql_parsing/sql_parsing_result_utils.py,sha256=prwWTj1EB2fRPv1eMB4EkpFNafIYAt-X8TIK0NWqank,796
882
883
  datahub/sql_parsing/sqlglot_lineage.py,sha256=gUVq3NwZUzQByJs43JZXz8lZf0ZVzVt0FzaW5wZOwK4,47460
883
884
  datahub/sql_parsing/sqlglot_utils.py,sha256=n6yufzEGwSlFeCSU540hEldIuab0q8KGqm9x0vSawkc,14699
884
- datahub/sql_parsing/tool_meta_extractor.py,sha256=7tY4FAClhFcqwc23lGVlnT6Dequ_5Xcpbt0hDvnlLzM,6670
885
+ datahub/sql_parsing/tool_meta_extractor.py,sha256=qEPq8RFWyK0tmSPNlluvd5cxgwbd2v6m9ViSY4hm2QM,6822
885
886
  datahub/telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
886
887
  datahub/telemetry/stats.py,sha256=YltbtC3fe6rl1kcxn1A-mSnVpECTPm5k-brrUt7QxTI,967
887
888
  datahub/telemetry/telemetry.py,sha256=gzla-QGNsynGg2FqFxiDDFQ0emG53MJ9lhOA2-UUg-Y,15047
@@ -981,8 +982,8 @@ datahub_provider/operators/datahub_assertion_operator.py,sha256=uvTQ-jk2F0sbqqxp
981
982
  datahub_provider/operators/datahub_assertion_sensor.py,sha256=lCBj_3x1cf5GMNpHdfkpHuyHfVxsm6ff5x2Z5iizcAo,140
982
983
  datahub_provider/operators/datahub_operation_operator.py,sha256=aevDp2FzX7FxGlXrR0khoHNbxbhKR2qPEX5e8O2Jyzw,174
983
984
  datahub_provider/operators/datahub_operation_sensor.py,sha256=8fcdVBCEPgqy1etTXgLoiHoJrRt_nzFZQMdSzHqSG7M,168
984
- acryl_datahub-0.15.0.1rc6.dist-info/METADATA,sha256=NwalxQqxf_XeT9QBcWc4wsNKE11Hv59p6ZZ8HRGVyGc,173642
985
- acryl_datahub-0.15.0.1rc6.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
986
- acryl_datahub-0.15.0.1rc6.dist-info/entry_points.txt,sha256=xnPSPLK3bJGADxe4TDS4wL4u0FT_PGlahDa-ENYdYCQ,9512
987
- acryl_datahub-0.15.0.1rc6.dist-info/top_level.txt,sha256=iLjSrLK5ox1YVYcglRUkcvfZPvKlobBWx7CTUXx8_GI,25
988
- acryl_datahub-0.15.0.1rc6.dist-info/RECORD,,
985
+ acryl_datahub-0.15.0.1rc8.dist-info/METADATA,sha256=mW2V4Czvd-ZE_mUJX8XkNZxNwnBa-gLJxebl0KWsM2A,173642
986
+ acryl_datahub-0.15.0.1rc8.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
987
+ acryl_datahub-0.15.0.1rc8.dist-info/entry_points.txt,sha256=xnPSPLK3bJGADxe4TDS4wL4u0FT_PGlahDa-ENYdYCQ,9512
988
+ acryl_datahub-0.15.0.1rc8.dist-info/top_level.txt,sha256=iLjSrLK5ox1YVYcglRUkcvfZPvKlobBWx7CTUXx8_GI,25
989
+ acryl_datahub-0.15.0.1rc8.dist-info/RECORD,,
datahub/__init__.py CHANGED
@@ -3,7 +3,7 @@ import warnings
3
3
 
4
4
  # Published at https://pypi.org/project/acryl-datahub/.
5
5
  __package_name__ = "acryl-datahub"
6
- __version__ = "0.15.0.1rc6"
6
+ __version__ = "0.15.0.1rc8"
7
7
 
8
8
 
9
9
  def is_dev_mode() -> bool:
@@ -1408,6 +1408,15 @@ class LookerDashboardSourceReport(StaleEntityRemovalSourceReport):
1408
1408
  dashboards_with_activity: LossySet[str] = dataclasses_field(
1409
1409
  default_factory=LossySet
1410
1410
  )
1411
+
1412
+ # Entities that don't seem to exist, so we don't emit usage aspects for them despite having usage data
1413
+ dashboards_skipped_for_usage: LossySet[str] = dataclasses_field(
1414
+ default_factory=LossySet
1415
+ )
1416
+ charts_skipped_for_usage: LossySet[str] = dataclasses_field(
1417
+ default_factory=LossySet
1418
+ )
1419
+
1411
1420
  stage_latency: List[StageLatency] = dataclasses_field(default_factory=list)
1412
1421
  _looker_explore_registry: Optional[LookerExploreRegistry] = None
1413
1422
  total_explores: int = 0
@@ -68,6 +68,7 @@ from datahub.ingestion.source.looker.looker_common import (
68
68
  ViewField,
69
69
  ViewFieldType,
70
70
  gen_model_key,
71
+ get_urn_looker_element_id,
71
72
  )
72
73
  from datahub.ingestion.source.looker.looker_config import LookerDashboardSourceConfig
73
74
  from datahub.ingestion.source.looker.looker_lib_wrapper import LookerAPI
@@ -165,6 +166,9 @@ class LookerDashboardSource(TestableSource, StatefulIngestionSourceBase):
165
166
  # Required, as we do not ingest all folders but only those that have dashboards/looks
166
167
  self.processed_folders: List[str] = []
167
168
 
169
+ # Keep track of ingested chart urns, to omit usage for non-ingested entities
170
+ self.chart_urns: Set[str] = set()
171
+
168
172
  @staticmethod
169
173
  def test_connection(config_dict: dict) -> TestConnectionReport:
170
174
  test_report = TestConnectionReport()
@@ -642,6 +646,7 @@ class LookerDashboardSource(TestableSource, StatefulIngestionSourceBase):
642
646
  chart_urn = self._make_chart_urn(
643
647
  element_id=dashboard_element.get_urn_element_id()
644
648
  )
649
+ self.chart_urns.add(chart_urn)
645
650
  chart_snapshot = ChartSnapshot(
646
651
  urn=chart_urn,
647
652
  aspects=[Status(removed=False)],
@@ -1380,7 +1385,9 @@ class LookerDashboardSource(TestableSource, StatefulIngestionSourceBase):
1380
1385
  yield from self._emit_folder_as_container(folder)
1381
1386
 
1382
1387
  def extract_usage_stat(
1383
- self, looker_dashboards: List[looker_usage.LookerDashboardForUsage]
1388
+ self,
1389
+ looker_dashboards: List[looker_usage.LookerDashboardForUsage],
1390
+ ingested_chart_urns: Set[str],
1384
1391
  ) -> List[MetadataChangeProposalWrapper]:
1385
1392
  looks: List[looker_usage.LookerChartForUsage] = []
1386
1393
  # filter out look from all dashboard
@@ -1391,6 +1398,15 @@ class LookerDashboardSource(TestableSource, StatefulIngestionSourceBase):
1391
1398
 
1392
1399
  # dedup looks
1393
1400
  looks = list({str(look.id): look for look in looks}.values())
1401
+ filtered_looks = []
1402
+ for look in looks:
1403
+ if not look.id:
1404
+ continue
1405
+ chart_urn = self._make_chart_urn(get_urn_looker_element_id(look.id))
1406
+ if chart_urn in ingested_chart_urns:
1407
+ filtered_looks.append(look)
1408
+ else:
1409
+ self.reporter.charts_skipped_for_usage.add(look.id)
1394
1410
 
1395
1411
  # Keep stat generators to generate entity stat aspect later
1396
1412
  stat_generator_config: looker_usage.StatGeneratorConfig = (
@@ -1414,7 +1430,7 @@ class LookerDashboardSource(TestableSource, StatefulIngestionSourceBase):
1414
1430
  stat_generator_config,
1415
1431
  self.reporter,
1416
1432
  self._make_chart_urn,
1417
- looks,
1433
+ filtered_looks,
1418
1434
  )
1419
1435
 
1420
1436
  mcps: List[MetadataChangeProposalWrapper] = []
@@ -1669,7 +1685,7 @@ class LookerDashboardSource(TestableSource, StatefulIngestionSourceBase):
1669
1685
  if self.source_config.extract_usage_history:
1670
1686
  self.reporter.report_stage_start("usage_extraction")
1671
1687
  usage_mcps: List[MetadataChangeProposalWrapper] = self.extract_usage_stat(
1672
- looker_dashboards_for_usage
1688
+ looker_dashboards_for_usage, self.chart_urns
1673
1689
  )
1674
1690
  for usage_mcp in usage_mcps:
1675
1691
  yield usage_mcp.as_workunit()
@@ -42,6 +42,7 @@ from datahub.metadata.schema_classes import (
42
42
  TimeWindowSizeClass,
43
43
  _Aspect as AspectAbstract,
44
44
  )
45
+ from datahub.utilities.lossy_collections import LossySet
45
46
 
46
47
  logger = logging.getLogger(__name__)
47
48
 
@@ -170,7 +171,7 @@ class BaseStatGenerator(ABC):
170
171
  self.config = config
171
172
  self.looker_models = looker_models
172
173
  # Later it will help to find out for what are the looker entities from query result
173
- self.id_vs_model: Dict[str, ModelForUsage] = {
174
+ self.id_to_model: Dict[str, ModelForUsage] = {
174
175
  self.get_id(looker_object): looker_object for looker_object in looker_models
175
176
  }
176
177
  self.post_filter = len(self.looker_models) > 100
@@ -225,6 +226,10 @@ class BaseStatGenerator(ABC):
225
226
  def get_id_from_row(self, row: dict) -> str:
226
227
  pass
227
228
 
229
+ @abstractmethod
230
+ def report_skip_set(self) -> LossySet[str]:
231
+ pass
232
+
228
233
  def create_mcp(
229
234
  self, model: ModelForUsage, aspect: Aspect
230
235
  ) -> MetadataChangeProposalWrapper:
@@ -258,20 +263,11 @@ class BaseStatGenerator(ABC):
258
263
 
259
264
  return entity_stat_aspect
260
265
 
261
- def _process_absolute_aspect(self) -> List[Tuple[ModelForUsage, AspectAbstract]]:
262
- aspects: List[Tuple[ModelForUsage, AspectAbstract]] = []
263
- for looker_object in self.looker_models:
264
- aspects.append(
265
- (looker_object, self.to_entity_absolute_stat_aspect(looker_object))
266
- )
267
-
268
- return aspects
269
-
270
266
  def _fill_user_stat_aspect(
271
267
  self,
272
268
  entity_usage_stat: Dict[Tuple[str, str], Aspect],
273
269
  user_wise_rows: List[Dict],
274
- ) -> Iterable[Tuple[ModelForUsage, Aspect]]:
270
+ ) -> Iterable[Tuple[str, Aspect]]:
275
271
  logger.debug("Entering fill user stat aspect")
276
272
 
277
273
  # We first resolve all the users using a threadpool to warm up the cache
@@ -300,7 +296,7 @@ class BaseStatGenerator(ABC):
300
296
 
301
297
  for row in user_wise_rows:
302
298
  # Confirm looker object was given for stat generation
303
- looker_object = self.id_vs_model.get(self.get_id_from_row(row))
299
+ looker_object = self.id_to_model.get(self.get_id_from_row(row))
304
300
  if looker_object is None:
305
301
  logger.warning(
306
302
  "Looker object with id({}) was not register with stat generator".format(
@@ -338,7 +334,7 @@ class BaseStatGenerator(ABC):
338
334
  logger.debug("Starting to yield answers for user-wise counts")
339
335
 
340
336
  for (id, _), aspect in entity_usage_stat.items():
341
- yield self.id_vs_model[id], aspect
337
+ yield id, aspect
342
338
 
343
339
  def _execute_query(self, query: LookerQuery, query_name: str) -> List[Dict]:
344
340
  rows = []
@@ -357,7 +353,7 @@ class BaseStatGenerator(ABC):
357
353
  )
358
354
  if self.post_filter:
359
355
  logger.debug("post filtering")
360
- rows = [r for r in rows if self.get_id_from_row(r) in self.id_vs_model]
356
+ rows = [r for r in rows if self.get_id_from_row(r) in self.id_to_model]
361
357
  logger.debug("Filtered down to %d rows", len(rows))
362
358
  except Exception as e:
363
359
  logger.warning(f"Failed to execute {query_name} query: {e}")
@@ -378,7 +374,8 @@ class BaseStatGenerator(ABC):
378
374
  return
379
375
 
380
376
  # yield absolute stat for looker entities
381
- for looker_object, aspect in self._process_absolute_aspect(): # type: ignore
377
+ for looker_object in self.looker_models:
378
+ aspect = self.to_entity_absolute_stat_aspect(looker_object)
382
379
  yield self.create_mcp(looker_object, aspect)
383
380
 
384
381
  # Execute query and process the raw json which contains stat information
@@ -399,10 +396,13 @@ class BaseStatGenerator(ABC):
399
396
  )
400
397
  user_wise_rows = self._execute_query(user_wise_query_with_filters, "user_query")
401
398
  # yield absolute stat for entity
402
- for looker_object, aspect in self._fill_user_stat_aspect(
399
+ for object_id, aspect in self._fill_user_stat_aspect(
403
400
  entity_usage_stat, user_wise_rows
404
401
  ):
405
- yield self.create_mcp(looker_object, aspect)
402
+ if object_id in self.id_to_model:
403
+ yield self.create_mcp(self.id_to_model[object_id], aspect)
404
+ else:
405
+ self.report_skip_set().add(object_id)
406
406
 
407
407
 
408
408
  class DashboardStatGenerator(BaseStatGenerator):
@@ -425,6 +425,9 @@ class DashboardStatGenerator(BaseStatGenerator):
425
425
  def get_stats_generator_name(self) -> str:
426
426
  return "DashboardStats"
427
427
 
428
+ def report_skip_set(self) -> LossySet[str]:
429
+ return self.report.dashboards_skipped_for_usage
430
+
428
431
  def get_filter(self) -> Dict[ViewField, str]:
429
432
  return {
430
433
  HistoryViewField.HISTORY_DASHBOARD_ID: ",".join(
@@ -541,6 +544,9 @@ class LookStatGenerator(BaseStatGenerator):
541
544
  def get_stats_generator_name(self) -> str:
542
545
  return "ChartStats"
543
546
 
547
+ def report_skip_set(self) -> LossySet[str]:
548
+ return self.report.charts_skipped_for_usage
549
+
544
550
  def get_filter(self) -> Dict[ViewField, str]:
545
551
  return {
546
552
  LookViewField.LOOK_ID: ",".join(
@@ -5,6 +5,7 @@ import time
5
5
  from dataclasses import dataclass
6
6
  from datetime import datetime, timezone
7
7
  from functools import lru_cache
8
+ from json import JSONDecodeError
8
9
  from typing import Dict, Iterable, List, Optional, Set, Tuple, Union
9
10
 
10
11
  import dateutil.parser as dp
@@ -98,6 +99,7 @@ from datahub.metadata.schema_classes import (
98
99
  TagPropertiesClass,
99
100
  UpstreamClass,
100
101
  UpstreamLineageClass,
102
+ ViewPropertiesClass,
101
103
  )
102
104
  from datahub.metadata.urns import QueryUrn
103
105
  from datahub.sql_parsing.sqlglot_lineage import (
@@ -192,6 +194,9 @@ class HTTPError429(HTTPError):
192
194
  pass
193
195
 
194
196
 
197
+ ModeRequestError = (HTTPError, JSONDecodeError)
198
+
199
+
195
200
  @dataclass
196
201
  class ModeSourceReport(StaleEntityRemovalSourceReport):
197
202
  filtered_spaces: LossyList[str] = dataclasses.field(default_factory=LossyList)
@@ -327,11 +332,11 @@ class ModeSource(StatefulIngestionSourceBase):
327
332
  # Test the connection
328
333
  try:
329
334
  self._get_request_json(f"{self.config.connect_uri}/api/verify")
330
- except HTTPError as http_error:
335
+ except ModeRequestError as e:
331
336
  self.report.report_failure(
332
337
  title="Failed to Connect",
333
338
  message="Unable to verify connection to mode.",
334
- context=f"Error: {str(http_error)}",
339
+ context=f"Error: {str(e)}",
335
340
  )
336
341
 
337
342
  self.workspace_uri = f"{self.config.connect_uri}/api/{self.config.workspace}"
@@ -520,11 +525,11 @@ class ModeSource(StatefulIngestionSourceBase):
520
525
  if self.config.owner_username_instead_of_email
521
526
  else user_json.get("email")
522
527
  )
523
- except HTTPError as http_error:
528
+ except ModeRequestError as e:
524
529
  self.report.report_warning(
525
530
  title="Failed to retrieve Mode creator",
526
531
  message=f"Unable to retrieve user for {href}",
527
- context=f"Reason: {str(http_error)}",
532
+ context=f"Reason: {str(e)}",
528
533
  )
529
534
  return user
530
535
 
@@ -570,11 +575,11 @@ class ModeSource(StatefulIngestionSourceBase):
570
575
  logging.debug(f"Skipping space {space_name} due to space pattern")
571
576
  continue
572
577
  space_info[s.get("token", "")] = s.get("name", "")
573
- except HTTPError as http_error:
578
+ except ModeRequestError as e:
574
579
  self.report.report_failure(
575
580
  title="Failed to Retrieve Spaces",
576
581
  message="Unable to retrieve spaces / collections for workspace.",
577
- context=f"Workspace: {self.workspace_uri}, Error: {str(http_error)}",
582
+ context=f"Workspace: {self.workspace_uri}, Error: {str(e)}",
578
583
  )
579
584
 
580
585
  return space_info
@@ -720,11 +725,11 @@ class ModeSource(StatefulIngestionSourceBase):
720
725
  try:
721
726
  ds_json = self._get_request_json(f"{self.workspace_uri}/data_sources")
722
727
  data_sources = ds_json.get("_embedded", {}).get("data_sources", [])
723
- except HTTPError as http_error:
728
+ except ModeRequestError as e:
724
729
  self.report.report_failure(
725
730
  title="Failed to retrieve Data Sources",
726
731
  message="Unable to retrieve data sources from Mode.",
727
- context=f"Error: {str(http_error)}",
732
+ context=f"Error: {str(e)}",
728
733
  )
729
734
 
730
735
  return data_sources
@@ -811,11 +816,11 @@ class ModeSource(StatefulIngestionSourceBase):
811
816
  if definition.get("name", "") == definition_name:
812
817
  return definition.get("source", "")
813
818
 
814
- except HTTPError as http_error:
819
+ except ModeRequestError as e:
815
820
  self.report.report_failure(
816
821
  title="Failed to Retrieve Definition",
817
822
  message="Unable to retrieve definition from Mode.",
818
- context=f"Definition Name: {definition_name}, Error: {str(http_error)}",
823
+ context=f"Definition Name: {definition_name}, Error: {str(e)}",
819
824
  )
820
825
  return None
821
826
 
@@ -930,16 +935,13 @@ class ModeSource(StatefulIngestionSourceBase):
930
935
 
931
936
  dataset_props = DatasetPropertiesClass(
932
937
  name=report_info.get("name") if is_mode_dataset else query_data.get("name"),
933
- description=f"""### Source Code
934
- ``` sql
935
- {query_data.get("raw_query")}
936
- ```
937
- """,
938
+ description=None,
938
939
  externalUrl=externalUrl,
939
940
  customProperties=self.get_custom_props_from_dict(
940
941
  query_data,
941
942
  [
942
- "id" "created_at",
943
+ "id",
944
+ "created_at",
943
945
  "updated_at",
944
946
  "last_run_id",
945
947
  "data_source_id",
@@ -949,7 +951,6 @@ class ModeSource(StatefulIngestionSourceBase):
949
951
  ],
950
952
  ),
951
953
  )
952
-
953
954
  yield (
954
955
  MetadataChangeProposalWrapper(
955
956
  entityUrn=query_urn,
@@ -957,6 +958,16 @@ class ModeSource(StatefulIngestionSourceBase):
957
958
  ).as_workunit()
958
959
  )
959
960
 
961
+ if raw_query := query_data.get("raw_query"):
962
+ yield MetadataChangeProposalWrapper(
963
+ entityUrn=query_urn,
964
+ aspect=ViewPropertiesClass(
965
+ viewLogic=raw_query,
966
+ viewLanguage=QueryLanguageClass.SQL,
967
+ materialized=False,
968
+ ),
969
+ ).as_workunit()
970
+
960
971
  if is_mode_dataset:
961
972
  space_container_key = self.gen_space_key(space_token)
962
973
  yield from add_dataset_to_container(
@@ -1375,11 +1386,11 @@ class ModeSource(StatefulIngestionSourceBase):
1375
1386
  f"{self.workspace_uri}/spaces/{space_token}/reports"
1376
1387
  )
1377
1388
  reports = reports_json.get("_embedded", {}).get("reports", {})
1378
- except HTTPError as http_error:
1389
+ except ModeRequestError as e:
1379
1390
  self.report.report_failure(
1380
1391
  title="Failed to Retrieve Reports for Space",
1381
1392
  message="Unable to retrieve reports for space token.",
1382
- context=f"Space Token: {space_token}, Error: {str(http_error)}",
1393
+ context=f"Space Token: {space_token}, Error: {str(e)}",
1383
1394
  )
1384
1395
  return reports
1385
1396
 
@@ -1393,11 +1404,11 @@ class ModeSource(StatefulIngestionSourceBase):
1393
1404
  url = f"{self.workspace_uri}/spaces/{space_token}/datasets"
1394
1405
  datasets_json = self._get_request_json(url)
1395
1406
  datasets = datasets_json.get("_embedded", {}).get("reports", [])
1396
- except HTTPError as http_error:
1407
+ except ModeRequestError as e:
1397
1408
  self.report.report_failure(
1398
1409
  title="Failed to Retrieve Datasets for Space",
1399
1410
  message=f"Unable to retrieve datasets for space token {space_token}.",
1400
- context=f"Error: {str(http_error)}",
1411
+ context=f"Error: {str(e)}",
1401
1412
  )
1402
1413
  return datasets
1403
1414
 
@@ -1409,11 +1420,11 @@ class ModeSource(StatefulIngestionSourceBase):
1409
1420
  f"{self.workspace_uri}/reports/{report_token}/queries"
1410
1421
  )
1411
1422
  queries = queries_json.get("_embedded", {}).get("queries", {})
1412
- except HTTPError as http_error:
1423
+ except ModeRequestError as e:
1413
1424
  self.report.report_failure(
1414
1425
  title="Failed to Retrieve Queries",
1415
1426
  message="Unable to retrieve queries for report token.",
1416
- context=f"Report Token: {report_token}, Error: {str(http_error)}",
1427
+ context=f"Report Token: {report_token}, Error: {str(e)}",
1417
1428
  )
1418
1429
  return queries
1419
1430
 
@@ -1426,11 +1437,11 @@ class ModeSource(StatefulIngestionSourceBase):
1426
1437
  f"{self.workspace_uri}/reports/{report_token}/runs/{report_run_id}/query_runs{query_run_id}"
1427
1438
  )
1428
1439
  queries = queries_json.get("_embedded", {}).get("queries", {})
1429
- except HTTPError as http_error:
1440
+ except ModeRequestError as e:
1430
1441
  self.report.report_failure(
1431
1442
  title="Failed to Retrieve Queries for Report",
1432
1443
  message="Unable to retrieve queries for report token.",
1433
- context=f"Report Token:{report_token}, Error: {str(http_error)}",
1444
+ context=f"Report Token:{report_token}, Error: {str(e)}",
1434
1445
  )
1435
1446
  return {}
1436
1447
  return queries
@@ -1444,13 +1455,13 @@ class ModeSource(StatefulIngestionSourceBase):
1444
1455
  f"/queries/{query_token}/charts"
1445
1456
  )
1446
1457
  charts = charts_json.get("_embedded", {}).get("charts", {})
1447
- except HTTPError as http_error:
1458
+ except ModeRequestError as e:
1448
1459
  self.report.report_failure(
1449
1460
  title="Failed to Retrieve Charts",
1450
1461
  message="Unable to retrieve charts from Mode.",
1451
1462
  context=f"Report Token: {report_token}, "
1452
1463
  f"Query token: {query_token}, "
1453
- f"Error: {str(http_error)}",
1464
+ f"Error: {str(e)}",
1454
1465
  )
1455
1466
  return charts
1456
1467
 
@@ -1470,6 +1481,8 @@ class ModeSource(StatefulIngestionSourceBase):
1470
1481
  response = self.session.get(
1471
1482
  url, timeout=self.config.api_options.timeout
1472
1483
  )
1484
+ if response.status_code == 204: # No content, don't parse json
1485
+ return {}
1473
1486
  return response.json()
1474
1487
  except HTTPError as http_error:
1475
1488
  error_response = http_error.response
@@ -163,26 +163,13 @@ class SnowflakeConfig(
163
163
  default=True,
164
164
  description="If enabled, populates the snowflake table-to-table and s3-to-snowflake table lineage. Requires appropriate grants given to the role and Snowflake Enterprise Edition or above.",
165
165
  )
166
- include_view_lineage: bool = pydantic.Field(
167
- default=True,
168
- description="If enabled, populates the snowflake view->table and table->view lineages. Requires appropriate grants given to the role, and include_table_lineage to be True. view->table lineage requires Snowflake Enterprise Edition or above.",
169
- )
166
+
167
+ _include_view_lineage = pydantic_removed_field("include_view_lineage")
168
+ _include_view_column_lineage = pydantic_removed_field("include_view_column_lineage")
170
169
 
171
170
  ignore_start_time_lineage: bool = False
172
171
  upstream_lineage_in_report: bool = False
173
172
 
174
- @pydantic.root_validator(skip_on_failure=True)
175
- def validate_include_view_lineage(cls, values):
176
- if (
177
- "include_table_lineage" in values
178
- and not values.get("include_table_lineage")
179
- and values.get("include_view_lineage")
180
- ):
181
- raise ValueError(
182
- "include_table_lineage must be True for include_view_lineage to be set."
183
- )
184
- return values
185
-
186
173
 
187
174
  class SnowflakeV2Config(
188
175
  SnowflakeConfig,
@@ -222,11 +209,6 @@ class SnowflakeV2Config(
222
209
  description="Populates table->table and view->table column lineage. Requires appropriate grants given to the role and the Snowflake Enterprise Edition or above.",
223
210
  )
224
211
 
225
- include_view_column_lineage: bool = Field(
226
- default=True,
227
- description="Populates view->view and table->view column lineage using DataHub's sql parser.",
228
- )
229
-
230
212
  use_queries_v2: bool = Field(
231
213
  default=False,
232
214
  description="If enabled, uses the new queries extractor to extract queries from snowflake.",
@@ -355,10 +337,6 @@ class SnowflakeV2Config(
355
337
  self, database=database, username=username, password=password, role=role
356
338
  )
357
339
 
358
- @property
359
- def parse_view_ddl(self) -> bool:
360
- return self.include_view_column_lineage
361
-
362
340
  @validator("shares")
363
341
  def validate_shares(
364
342
  cls, shares: Optional[Dict[str, SnowflakeShareConfig]], values: Dict