Skip to content

Commit 679be59

Browse files
authored
[asset health] add latest run id to partitioned asset materialization health metadata (#32970)
We have the latest run id available on the health object, so include it in the corresponding graphene objects to use in the FE tests in [https://app.graphite.com/github/pr/dagster-io/internal/19452/[DAGSTER_BRANCH%3Djamie%2Fhealth-partition-meta-has-run-id]](https://app.graphite.com/github/pr/dagster-io/internal/19452/%5BDAGSTER_BRANCH%3Djamie%2Fhealth-partition-meta-has-run-id%5D)
1 parent 24832b2 commit 679be59

6 files changed

Lines changed: 46 additions & 11 deletions

File tree

js_modules/dagster-ui/packages/ui-core/src/asset-data/types/AssetHealthDataProvider.types.ts

Lines changed: 6 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js_modules/dagster-ui/packages/ui-core/src/assets/AssetHealthSummary.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ const Criteria = React.memo(
265265
</Body>
266266
);
267267
case 'AssetHealthMaterializationDegradedNotPartitionedMeta':
268-
return (
268+
const toReturn = metadata.failedRunId ? (
269269
<Body>
270270
<Link
271271
to={`/runs/${metadata.failedRunId}`}
@@ -274,7 +274,8 @@ const Criteria = React.memo(
274274
Materialization failed in run {metadata.failedRunId.split('-').shift()}
275275
</Link>
276276
</Body>
277-
);
277+
) : null;
278+
return toReturn;
278279
case 'AssetHealthMaterializationDegradedPartitionedMeta':
279280
return (
280281
<Body>

js_modules/dagster-ui/packages/ui-core/src/graphql/schema.graphql

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js_modules/dagster-ui/packages/ui-core/src/graphql/types.ts

Lines changed: 14 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

python_modules/dagster-graphql/dagster_graphql/schema/asset_health.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ class GrapheneAssetHealthMaterializationDegradedPartitionedMeta(graphene.ObjectT
9191
numFailedPartitions = graphene.NonNull(graphene.Int)
9292
numMissingPartitions = graphene.NonNull(graphene.Int)
9393
totalNumPartitions = graphene.NonNull(graphene.Int)
94+
latestRunId = graphene.String()
95+
latestFailedRunId = graphene.String()
9496

9597
class Meta:
9698
name = "AssetHealthMaterializationDegradedPartitionedMeta"
@@ -99,13 +101,14 @@ class Meta:
99101
class GrapheneAssetHealthMaterializationHealthyPartitionedMeta(graphene.ObjectType):
100102
numMissingPartitions = graphene.NonNull(graphene.Int)
101103
totalNumPartitions = graphene.NonNull(graphene.Int)
104+
latestRunId = graphene.String()
102105

103106
class Meta:
104107
name = "AssetHealthMaterializationHealthyPartitionedMeta"
105108

106109

107110
class GrapheneAssetHealthMaterializationDegradedNotPartitionedMeta(graphene.ObjectType):
108-
failedRunId = graphene.NonNull(graphene.String)
111+
failedRunId = graphene.String()
109112

110113
class Meta:
111114
name = "AssetHealthMaterializationDegradedNotPartitionedMeta"
@@ -122,22 +125,26 @@ class Meta:
122125

123126
@staticmethod
124127
def from_metadata_class(
128+
asset_key: GrapheneAssetKey,
125129
metadata: AssetHealthMaterializationMetadata,
126130
) -> "GrapheneAssetHealthMaterializationMeta":
127131
if isinstance(metadata, AssetHealthMaterializationDegradedNotPartitionedMeta):
128132
return GrapheneAssetHealthMaterializationDegradedNotPartitionedMeta(
129-
failedRunId=metadata.failed_run_id
133+
failedRunId=metadata.failed_run_id,
130134
)
131135
elif isinstance(metadata, AssetHealthMaterializationHealthyPartitionedMeta):
132136
return GrapheneAssetHealthMaterializationHealthyPartitionedMeta(
133137
numMissingPartitions=metadata.num_missing_partitions,
134138
totalNumPartitions=metadata.total_num_partitions,
139+
latestRunId=metadata.latest_run_id,
135140
)
136141
elif isinstance(metadata, AssetHealthMaterializationDegradedPartitionedMeta):
137142
return GrapheneAssetHealthMaterializationDegradedPartitionedMeta(
138143
numFailedPartitions=metadata.num_failed_partitions,
139144
numMissingPartitions=metadata.num_missing_partitions,
140145
totalNumPartitions=metadata.total_num_partitions,
146+
latestRunId=metadata.latest_run_id,
147+
latestFailedRunId=metadata.latest_failed_to_materialize_run_id,
141148
)
142149
else:
143150
raise ValueError(f"Unknown metadata class: {type(metadata)}")
@@ -188,7 +195,7 @@ async def resolve_materializationStatusMetadata(
188195
_, materialization_status_metadata = await self.materialization_status_task
189196
return (
190197
GrapheneAssetHealthMaterializationMeta.from_metadata_class(
191-
materialization_status_metadata
198+
asset_key=self._asset_key, metadata=materialization_status_metadata
192199
)
193200
if materialization_status_metadata
194201
else None

python_modules/dagster/dagster/_core/definitions/asset_health/asset_materialization_health.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,13 +331,17 @@ class AssetHealthMaterializationDegradedPartitionedMeta:
331331
num_failed_partitions: int
332332
num_missing_partitions: int
333333
total_num_partitions: int
334+
latest_run_id: Optional[str]
335+
latest_failed_to_materialize_run_id: Optional[str]
334336

335337

336338
@whitelist_for_serdes
337339
@record.record
338340
class AssetHealthMaterializationHealthyPartitionedMeta:
339341
num_missing_partitions: int
340342
total_num_partitions: int
343+
latest_run_id: Optional[str]
344+
latest_failed_to_materialize_run_id: Optional[str]
341345

342346

343347
@whitelist_for_serdes
@@ -439,6 +443,8 @@ async def get_materialization_status_and_metadata(
439443
meta = AssetHealthMaterializationHealthyPartitionedMeta(
440444
num_missing_partitions=num_missing,
441445
total_num_partitions=total_num_partitions,
446+
latest_run_id=asset_materialization_health_state.latest_terminal_run_id,
447+
latest_failed_to_materialize_run_id=asset_materialization_health_state.latest_failed_to_materialize_run_id,
442448
)
443449
else:
444450
# captures the case when asset is not partitioned, or the asset is partitioned and all partitions are materialized
@@ -459,10 +465,12 @@ async def get_materialization_status_and_metadata(
459465
num_failed_partitions=asset_materialization_health_state.num_failed_partitions,
460466
num_missing_partitions=num_missing,
461467
total_num_partitions=total_num_partitions,
468+
latest_run_id=asset_materialization_health_state.latest_terminal_run_id,
469+
latest_failed_to_materialize_run_id=asset_materialization_health_state.latest_failed_to_materialize_run_id,
462470
)
463471
else:
464472
meta = AssetHealthMaterializationDegradedNotPartitionedMeta(
465-
failed_run_id=asset_materialization_health_state.latest_terminal_run_id,
473+
failed_run_id=asset_materialization_health_state.latest_failed_to_materialize_run_id,
466474
)
467475
return AssetHealthStatus.DEGRADED, meta
468476
elif asset_materialization_health_state.health_status == AssetHealthStatus.UNKNOWN:

0 commit comments

Comments
 (0)