<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hirofumi Tsuda</title>
    <description>The latest articles on DEV Community by Hirofumi Tsuda (@hirofumi_tsuda).</description>
    <link>https://dev.to/hirofumi_tsuda</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4056812%2Fba8b4e5c-f4d6-42e3-a3fd-c5dcf5ac8e1d.png</url>
      <title>DEV Community: Hirofumi Tsuda</title>
      <link>https://dev.to/hirofumi_tsuda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hirofumi_tsuda"/>
    <language>en</language>
    <item>
      <title>Adding asset staleness metrics to a Dagster Prometheus exporter — and three ways I got it wrong first</title>
      <dc:creator>Hirofumi Tsuda</dc:creator>
      <pubDate>Tue, 25 Aug 2026 04:32:14 +0000</pubDate>
      <link>https://dev.to/hirofumi_tsuda/adding-asset-staleness-metrics-to-a-dagster-prometheus-exporter-and-three-ways-i-got-it-wrong-191f</link>
      <guid>https://dev.to/hirofumi_tsuda/adding-asset-staleness-metrics-to-a-dagster-prometheus-exporter-and-three-ways-i-got-it-wrong-191f</guid>
      <description>&lt;p&gt;A follow-up to &lt;a href="https://dev.to/hirofumi_tsuda/a-prometheus-exporter-for-dagster-that-polls-graphql-instead-of-pushing-to-pushgateway-39pg"&gt;the first post&lt;/a&gt; about &lt;a href="https://github.com/HirofumiTsuda/dagster-prometheus-exporter" rel="noopener noreferrer"&gt;dagster-prometheus-exporter&lt;/a&gt;, a small Go binary that polls Dagster's GraphQL API instead of pushing metrics to a Pushgateway. That post ended with "asset materialization status isn't covered yet." It is now — and getting there took three trips back to a real Dagster instance to find out that what I'd assumed wasn't quite true.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two new metrics
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight prometheus"&gt;&lt;code&gt;&lt;span class="n"&gt;dagster_asset_last_materialization_status&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;asset_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"customers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;dagster_asset_stale_status&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;asset_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"customers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"fresh"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;dagster_asset_last_materialization_status&lt;/code&gt; answers "did this asset's most recent run succeed or fail." &lt;code&gt;dagster_asset_stale_status&lt;/code&gt; answers "is this asset's data missing, stale, or fresh relative to its upstream."&lt;/p&gt;

&lt;p&gt;Two metrics, two GraphQL fields (&lt;code&gt;assetsLatestInfo&lt;/code&gt; and &lt;code&gt;assetNodes.staleStatus&lt;/code&gt;), that sounds simple. It wasn't, three separate times.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrong assumption #1: materializations record failures
&lt;/h2&gt;

&lt;p&gt;The obvious way to get "did this asset succeed" is &lt;code&gt;AssetNode.assetMaterializations&lt;/code&gt; — the event log of past materializations. Except it only records &lt;em&gt;successful&lt;/em&gt; ones. An asset whose run raised an exception before writing output looks identical, in that field, to an asset that has simply never run. Both show up as nothing.&lt;/p&gt;

&lt;p&gt;The actual answer lives one level up, on the &lt;em&gt;run&lt;/em&gt; the asset was launched from: &lt;code&gt;assetsLatestInfo.latestRun.status&lt;/code&gt;. That field reports &lt;code&gt;SUCCESS&lt;/code&gt;/&lt;code&gt;FAILURE&lt;/code&gt;/whatever regardless of whether the asset itself produced output — which is also why the metric is named &lt;code&gt;..._last_materialization_status&lt;/code&gt; rather than something implying it's read from &lt;code&gt;assetMaterializations&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrong assumption #2: staleness is about time
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;dagster_asset_stale_status&lt;/code&gt; needs a real dependency chain to actually exercise the &lt;code&gt;stale&lt;/code&gt; value — two independent assets can be &lt;code&gt;missing&lt;/code&gt; or &lt;code&gt;fresh&lt;/code&gt;, but &lt;code&gt;stale&lt;/code&gt; only happens when an asset's upstream has moved on without it. So I added a small hand-written dbt project to the dev fixtures: &lt;code&gt;raw_customers&lt;/code&gt; (seed) → &lt;code&gt;stg_customers&lt;/code&gt; (staging view) → &lt;code&gt;customers&lt;/code&gt; (mart), via &lt;a href="https://docs.dagster.io/integrations/libraries/dbt" rel="noopener noreferrer"&gt;dagster-dbt&lt;/a&gt;. Not vendored from dbt Labs' own &lt;code&gt;jaffle_shop&lt;/code&gt; tutorial — written from scratch, trimmed to the one chain this needed.&lt;/p&gt;

&lt;p&gt;First attempt at demonstrating &lt;code&gt;stale&lt;/code&gt;: materialize the whole chain, then re-materialize just &lt;code&gt;stg_customers&lt;/code&gt; and leave &lt;code&gt;customers&lt;/code&gt; behind. Nothing changed — &lt;code&gt;customers&lt;/code&gt; stayed &lt;code&gt;fresh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Turns out Dagster's staleness for dbt assets isn't timestamp-based at all. It's keyed on a &lt;code&gt;code_version&lt;/code&gt; — a checksum of the dbt node's compiled SQL (&lt;code&gt;dagster_dbt.asset_utils.default_code_version_fn&lt;/code&gt;, if you want to read it yourself). Re-running a model with unchanged code produces the same code_version, so nothing downstream looks stale, no matter how many times you re-run it or how much wall-clock time passes. You have to actually change the model's SQL for anything to move.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrong assumption #3: the running webserver sees that change
&lt;/h2&gt;

&lt;p&gt;Second attempt: edit &lt;code&gt;stg_customers.sql&lt;/code&gt;, re-materialize it, check the metric. This time &lt;code&gt;stg_customers&lt;/code&gt; itself showed &lt;code&gt;stale&lt;/code&gt; too — not just &lt;code&gt;customers&lt;/code&gt;, the one I expected.&lt;/p&gt;

&lt;p&gt;The long-running &lt;code&gt;dagster dev&lt;/code&gt; process doesn't pick up a &lt;code&gt;.sql&lt;/code&gt;-only edit on its own. The re-materialization ran with the new file (an out-of-process &lt;code&gt;dbt build&lt;/code&gt; re-parses from disk every time), but the webserver serving &lt;code&gt;/metrics&lt;/code&gt;'s upstream GraphQL was still comparing against the code version it had loaded at startup. Two different views of "current," disagreeing with each other, and the metric reported the disagreement rather than either version cleanly.&lt;/p&gt;

&lt;p&gt;The fix is a &lt;code&gt;reloadRepositoryLocation&lt;/code&gt; mutation between editing the file and re-materializing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;mutation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reloadRepositoryLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repositoryLocationName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev-dagster-workspace"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;__typename&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With that, the third attempt finally produced the clean picture: &lt;code&gt;customers=stale&lt;/code&gt;, &lt;code&gt;stg_customers&lt;/code&gt;/&lt;code&gt;raw_customers=fresh&lt;/code&gt;. Dagster's own UI says exactly why, in its own words, if you hover over the stale asset:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Furgkvze22vxzzs361uzl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Furgkvze22vxzzs361uzl.png" alt="Dagster's asset lineage graph, with a tooltip on the customers asset reading " width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;1 change since last materialization&lt;br&gt;
1 upstream data version change: &lt;code&gt;stg_customers&lt;/code&gt; has a new data version&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the mechanism, stated plainly — not "time has passed," but "an upstream's data version moved and I haven't caught up."&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus wrong assumption, found while wiring up CI
&lt;/h2&gt;

&lt;p&gt;Not part of the original three, but while asserting these metrics in the e2e test: materializing &lt;code&gt;good_asset&lt;/code&gt; and &lt;code&gt;bad_asset&lt;/code&gt; (two dev fixtures — one always succeeds, one always raises) in a single &lt;code&gt;launchPipelineExecution&lt;/code&gt; call made &lt;em&gt;both&lt;/em&gt; report &lt;code&gt;status="failure"&lt;/code&gt;. Since the metric is keyed on the run's status rather than the individual asset's step, and one failing step fails the whole run, the succeeding asset inherits the failing one's status if they're launched together. Splitting them into two separate launches fixed it — obvious in hindsight, surprising in the moment.&lt;/p&gt;

&lt;p&gt;Here's both metrics on the actual Grafana dashboard, in the state above (&lt;code&gt;customers&lt;/code&gt; stale, &lt;code&gt;bad_asset&lt;/code&gt; failed, everything else clean):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxu6svduidpk78zt2dt86.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxu6svduidpk78zt2dt86.png" alt="Two Grafana table panels side by side: Asset Stale Status shows bad_asset=Missing, customers=Stale, good_asset/raw_customers/stg_customers=Fresh; Asset Last Materialization Status shows bad_asset=Failure and everything else Success" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What this cost
&lt;/h2&gt;

&lt;p&gt;Three separate live-instance round trips for what looked, from the GraphQL schema alone, like two straightforward field reads. None of these would have shown up from reading docs or reasoning about the schema — each one only became visible by actually materializing something and looking at what came back. The project has a running list of these (&lt;a href="https://github.com/HirofumiTsuda/dagster-prometheus-exporter/issues/56" rel="noopener noreferrer"&gt;issue #56&lt;/a&gt;, &lt;a href="https://github.com/HirofumiTsuda/dagster-prometheus-exporter/issues/98" rel="noopener noreferrer"&gt;#98&lt;/a&gt;) for anyone building something similar against the same API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trying it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/HirofumiTsuda/dagster-prometheus-exporter.git
&lt;span class="nb"&gt;cd &lt;/span&gt;dagster-prometheus-exporter
docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;brings up Dagster (with the jaffle_shop fixture pre-loaded) + the exporter + Prometheus + a pre-provisioned Grafana dashboard. The README has a full walkthrough for reproducing the &lt;code&gt;stale&lt;/code&gt; transition by hand, including the reload step above.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/HirofumiTsuda/dagster-prometheus-exporter" rel="noopener noreferrer"&gt;https://github.com/HirofumiTsuda/dagster-prometheus-exporter&lt;/a&gt; — issues and PRs welcome.&lt;/p&gt;

</description>
      <category>dagster</category>
      <category>prometheus</category>
      <category>dbt</category>
      <category>grafana</category>
    </item>
    <item>
      <title>A Prometheus exporter for Dagster that polls GraphQL instead of pushing to Pushgateway</title>
      <dc:creator>Hirofumi Tsuda</dc:creator>
      <pubDate>Wed, 12 Aug 2026 12:39:22 +0000</pubDate>
      <link>https://dev.to/hirofumi_tsuda/a-prometheus-exporter-for-dagster-that-polls-graphql-instead-of-pushing-to-pushgateway-39pg</link>
      <guid>https://dev.to/hirofumi_tsuda/a-prometheus-exporter-for-dagster-that-polls-graphql-instead-of-pushing-to-pushgateway-39pg</guid>
      <description>&lt;p&gt;Dagster doesn't expose a &lt;code&gt;/metrics&lt;/code&gt; endpoint out of the box. The officially documented way to get Dagster metrics into Prometheus is the &lt;a href="https://docs.dagster.io/integrations/libraries/prometheus" rel="noopener noreferrer"&gt;&lt;code&gt;dagster-prometheus&lt;/code&gt;&lt;/a&gt; resource, which pushes metrics to a &lt;a href="https://github.com/prometheus/pushgateway" rel="noopener noreferrer"&gt;Pushgateway&lt;/a&gt; from inside a run.&lt;/p&gt;

&lt;p&gt;That works, but it has a structural blind spot: the push only happens if code inside the run gets to call it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A run that's OOM-killed, or crashes before reaching the push call, never reports anything. The failure is silent from Prometheus's point of view.&lt;/li&gt;
&lt;li&gt;A run sitting in &lt;code&gt;QUEUED&lt;/code&gt; because of a run-queue concurrency limit hasn't started user code yet, so it can't push either — you can't see queue backlog forming.&lt;/li&gt;
&lt;li&gt;Prometheus's own docs are explicit that Pushgateway &lt;a href="https://prometheus.io/docs/practices/pushing/" rel="noopener noreferrer"&gt;isn't meant to be a general substitute for pull-based scraping&lt;/a&gt;, only for short-lived batch jobs that genuinely can't be scraped.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/HirofumiTsuda/dagster-prometheus-exporter" rel="noopener noreferrer"&gt;&lt;strong&gt;dagster-prometheus-exporter&lt;/strong&gt;&lt;/a&gt;: a small standalone Go binary that polls Dagster's GraphQL API on an interval and derives metrics from whatever state Dagster itself already has — including runs that never got a chance to push anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dagster (GraphQL) &amp;lt;--poll-- exporter --scrape--&amp;gt; Prometheus --&amp;gt; Grafana
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exporter keeps in-memory state, not an external store. Scraping (writing state) and serving &lt;code&gt;/metrics&lt;/code&gt; (reading state) are decoupled, so if a GraphQL call is slow or fails, &lt;code&gt;/metrics&lt;/code&gt; still serves the last-known state instead of breaking. Completed runs are fetched incrementally (watermark-based, not a full rescan every time), so the cost doesn't grow with total run history.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it currently covers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;What it answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dagster_active_runs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;How many runs are queued/starting/started, per job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dagster_active_run_duration_seconds&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;How long the oldest active run in a job has been stuck there — useful for spotting stalls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;dagster_completed_runs_total&lt;/code&gt; / &lt;code&gt;dagster_last_run_info&lt;/code&gt; / &lt;code&gt;dagster_last_run_duration_seconds&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Success/failure counts and timing for completed runs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dagster_run_queue_concurrency_key_backlog&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Queue backlog per &lt;code&gt;dagster/concurrency_key&lt;/code&gt; tag — this is the one that needed the most digging, since &lt;code&gt;instance.concurrencyLimits&lt;/code&gt; in the GraphQL schema &lt;em&gt;looks&lt;/em&gt; like the answer but is actually a separate op-pool concurrency mechanism and reports 0 regardless of run-queue backlog. Ended up reading each queued run's own tags instead.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dagster_code_location_load_error&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Whether a code location is currently failing to load (e.g. broken import) — independent of job-level metrics, since a broken location can't be inferred from run counts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;dagster_schedule_status&lt;/code&gt; / &lt;code&gt;dagster_schedule_last_tick_status&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Whether a schedule is running, and its last tick outcome&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;dagster_sensor_status&lt;/code&gt; / &lt;code&gt;dagster_sensor_last_tick_status&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Same, for sensors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dagster_exporter_build_info&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which version/commit is actually running — handy once you have more than one exporter pod&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Full label reference is in the &lt;a href="https://github.com/HirofumiTsuda/dagster-prometheus-exporter#metrics" rel="noopener noreferrer"&gt;README&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trying it out
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/HirofumiTsuda/dagster-prometheus-exporter.git
&lt;span class="nb"&gt;cd &lt;/span&gt;dagster-prometheus-exporter
docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;brings up Dagster + the exporter + Prometheus + a pre-provisioned Grafana dashboard together. For an existing Dagster deployment, there's a published image and a Helm chart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 9101:9101 &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;DAGSTER_GRAPHQL_ENDPOINT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://dagster:3000/graphql &lt;span class="se"&gt;\&lt;/span&gt;
  ghcr.io/hirofumitsuda/dagster-prometheus-exporter:0.2.0

helm &lt;span class="nb"&gt;install &lt;/span&gt;my-dagster-exporter oci://ghcr.io/hirofumitsuda/charts/dagster-prometheus-exporter &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--version&lt;/span&gt; 0.1.3 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; env.DAGSTER_GRAPHQL_ENDPOINT&lt;span class="o"&gt;=&lt;/span&gt;http://dagster-webserver.dagster.svc.cluster.local/graphql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's not covered yet
&lt;/h2&gt;

&lt;p&gt;Asset materialization status. I've looked into the GraphQL shape for it (&lt;code&gt;assetNodes&lt;/code&gt; + &lt;code&gt;assetsLatestInfo&lt;/code&gt;) and the same kind of gotcha as the concurrency backlog shows up: &lt;code&gt;AssetNode.assetMaterializations&lt;/code&gt; only records &lt;em&gt;successful&lt;/em&gt; materializations, so detecting a failed one means cross-referencing &lt;code&gt;assetsLatestInfo.latestRun.status&lt;/code&gt; instead. Tracked in &lt;a href="https://github.com/HirofumiTsuda/dagster-prometheus-exporter/issues/56" rel="noopener noreferrer"&gt;#56&lt;/a&gt; if anyone wants to compare notes.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/HirofumiTsuda/dagster-prometheus-exporter" rel="noopener noreferrer"&gt;https://github.com/HirofumiTsuda/dagster-prometheus-exporter&lt;/a&gt; — issues and PRs welcome.&lt;/p&gt;

</description>
      <category>dagster</category>
      <category>prometheus</category>
      <category>grafana</category>
      <category>go</category>
    </item>
  </channel>
</rss>
