{"id":250,"date":"2026-02-24T00:00:00","date_gmt":"2026-02-24T00:00:00","guid":{"rendered":"https:\/\/wordpress.securinsight.ca\/index.php\/2026\/02\/24\/pipelines-workers-dropped-event-metrics-typed-pipelines-bindings-and-improved-setup\/"},"modified":"2026-02-24T00:00:00","modified_gmt":"2026-02-24T00:00:00","slug":"pipelines-workers-dropped-event-metrics-typed-pipelines-bindings-and-improved-setup","status":"publish","type":"post","link":"https:\/\/wordpress.securinsight.ca\/index.php\/2026\/02\/24\/pipelines-workers-dropped-event-metrics-typed-pipelines-bindings-and-improved-setup\/","title":{"rendered":"Pipelines, Workers &#8211; Dropped event metrics, typed Pipelines bindings, and improved setup"},"content":{"rendered":"<p><a href=\"https:\/\/developers.cloudflare.com\/pipelines\/\">Cloudflare Pipelines<\/a> ingests streaming data via <a href=\"https:\/\/developers.cloudflare.com\/workers\/\">Workers<\/a> or HTTP endpoints, transforms it with SQL, and writes it to <a href=\"https:\/\/developers.cloudflare.com\/r2\/\">R2<\/a> as Apache Iceberg tables. Today we&#8217;re shipping three improvements to help you understand why streaming events get dropped, catch data quality issues early, and set up Pipelines faster.<\/p>\n<h4>Dropped event metrics<\/h4>\n<p>When <a href=\"https:\/\/developers.cloudflare.com\/pipelines\/streams\/\">stream<\/a> events don&#8217;t match the expected schema, Pipelines accepts them during ingestion but drops them when attempting to deliver them to the <a href=\"https:\/\/developers.cloudflare.com\/pipelines\/sinks\/\">sink<\/a>. To help you identify the root cause of these issues, we are introducing a new dashboard and metrics that surface dropped events with detailed error messages.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/developers.cloudflare.com\/_astro\/pipelines-error-log-dash.6JIa7r5d_18kO0f.webp\" alt=\"The Errors tab in the Cloudflare dashboard showing deserialization errors grouped by type with individual error details\" \/><\/p>\n<p>Dropped events can also be queried programmatically via the new <code>pipelinesUserErrorsAdaptiveGroups<\/code> GraphQL dataset. The dataset breaks down failures by specific error type (<code>missing_field<\/code>, <code>type_mismatch<\/code>, <code>parse_failure<\/code>, or <code>null_value<\/code>) so you can trace issues back to the source.<\/p>\n<div>\n<figure>\n<pre data-language=\"graphql\"><code class=\"language-graphql\"><div><div><span>query<\/span><span> <\/span><span>GetPipelineUserErrors<\/span><span>(<\/span><\/div><\/div><div><div><span>  <\/span><span>$accountTag<\/span><span>:<\/span><span> <\/span><span>String<\/span><span>!<\/span><\/div><\/div><div><div><span>  <\/span><span>$pipelineId<\/span><span>:<\/span><span> <\/span><span>String<\/span><span>!<\/span><\/div><\/div><div><div><span>  <\/span><span>$datetimeStart<\/span><span>:<\/span><span> <\/span><span>Time<\/span><span>!<\/span><\/div><\/div><div><div><span>  <\/span><span>$datetimeEnd<\/span><span>:<\/span><span> <\/span><span>Time<\/span><span>!<\/span><\/div><\/div><div><div><span>) <\/span><span>{<\/span><\/div><\/div><div><div><span><span>  <\/span><\/span><span>viewer <\/span><span>{<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>accounts(<\/span><span>filter<\/span><span>:<\/span><span> { <\/span><span>accountTag<\/span><span>:<\/span><span> $accountTag }) <\/span><span>{<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>pipelinesUserErrorsAdaptiveGroups(<\/span><\/div><\/div><div><div><span>        <\/span><span>limit<\/span><span>:<\/span><span> <\/span><span>100<\/span><\/div><\/div><div><div><span>        <\/span><span>filter<\/span><span>:<\/span><span> {<\/span><\/div><\/div><div><div><span>          <\/span><span>pipelineId<\/span><span>:<\/span><span> $pipelineId<\/span><\/div><\/div><div><div><span>          <\/span><span>datetime_geq<\/span><span>:<\/span><span> $datetimeStart<\/span><\/div><\/div><div><div><span>          <\/span><span>datetime_leq<\/span><span>:<\/span><span> $datetimeEnd<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>}<\/span><\/div><\/div><div><div><span>        <\/span><span>orderBy<\/span><span>:<\/span><span> [<\/span><span>count_DESC<\/span><span>]<\/span><\/div><\/div><div><div><span><span>      <\/span><\/span><span>) <\/span><span>{<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>count<\/span><\/div><\/div><div><div><span><span>        <\/span><\/span><span>dimensions <\/span><span>{<\/span><\/div><\/div><div><div><span><span>          <\/span><\/span><span>errorFamily<\/span><\/div><\/div><div><div><span><span>          <\/span><\/span><span>errorType<\/span><\/div><\/div><div><div><span>        <\/span><span>}<\/span><\/div><\/div><div><div><span>      <\/span><span>}<\/span><\/div><\/div><div><div><span>    <\/span><span>}<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div><span>}<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div>\n<p>For the full list of dimensions, error types, and additional query examples, refer to <a href=\"https:\/\/developers.cloudflare.com\/pipelines\/observability\/metrics\/#user-error-metrics\">User error metrics<\/a>.<\/p>\n<h4>Typed Pipelines bindings<\/h4>\n<p>Sending data to a Pipeline from a Worker previously used a generic <code>Pipeline&lt;PipelineRecord&gt;<\/code> type, which meant schema mismatches (wrong field names, incorrect types) were only caught at runtime as dropped events.<\/p>\n<p>Running <code>wrangler types<\/code> now generates schema-specific TypeScript types for your <a href=\"https:\/\/developers.cloudflare.com\/pipelines\/streams\/writing-to-streams\/#send-via-workers\">Pipeline bindings<\/a>. TypeScript catches missing required fields and incorrect field types at compile time, before your code is deployed.<\/p>\n<div>\n<figure>\n<pre data-language=\"ts\"><code class=\"language-ts\"><div><div><span>declare<\/span><span> <\/span><span>namespace<\/span><span> <\/span><span>Cloudflare<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span>  <\/span><span>type<\/span><span> <\/span><span>EcommerceStreamRecord<\/span><span> <\/span><span>=<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>user_id<\/span><span>:<\/span><span> <\/span><span>string<\/span><span>;<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>event_type<\/span><span>:<\/span><span> <\/span><span>string<\/span><span>;<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>product_id<\/span><span>?:<\/span><span> <\/span><span>string<\/span><span>;<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>amount<\/span><span>?:<\/span><span> <\/span><span>number<\/span><span>;<\/span><\/div><\/div><div><div><span>  <\/span><span>};<\/span><\/div><\/div><div><div><span>  <\/span><span>interface<\/span><span> <\/span><span>Env<\/span><span> <\/span><span>{<\/span><\/div><\/div><div><div><span><span>    <\/span><\/span><span>STREAM<\/span><span>:<\/span><span> <\/span><span>import<\/span><span>(<\/span><span>\"cloudflare:pipelines\"<\/span><span>).<\/span><span>Pipeline<\/span><span>&lt;<\/span><span>Cloudflare<\/span><span>.<\/span><span>EcommerceStreamRecord<\/span><span>&gt;;<\/span><\/div><\/div><div><div><span>  <\/span><span>}<\/span><\/div><\/div><div><div><span>}<\/span><\/div><\/div><\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<\/figure>\n<\/div>\n<p>For more information, refer to <a href=\"https:\/\/developers.cloudflare.com\/pipelines\/streams\/writing-to-streams\/#typed-pipeline-bindings\">Typed Pipeline bindings<\/a>.<\/p>\n<h4>Improved Pipelines setup<\/h4>\n<p>Setting up a new Pipeline previously required multiple manual steps: creating an R2 bucket, enabling R2 Data Catalog, generating an API token, and configuring format, compression, and rolling policies individually.<\/p>\n<p>The <code>wrangler pipelines setup<\/code> command now offers a <strong>Simple<\/strong> setup mode that applies recommended defaults and automatically creates the <a href=\"https:\/\/developers.cloudflare.com\/r2\/buckets\/\">R2 bucket<\/a> and enables <a href=\"https:\/\/developers.cloudflare.com\/r2\/data-catalog\/\">R2 Data Catalog<\/a> if they do not already exist. Validation errors during setup prompt you to retry inline rather than restarting the entire process.<\/p>\n<p>For a full walkthrough, refer to the <a href=\"https:\/\/developers.cloudflare.com\/pipelines\/getting-started\/\">Getting started guide<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Cloudflare Pipelines ingests streaming data via Workers or HTTP endpoints, transforms it with SQL, and writes it to R2 as Apache Iceberg tables. Today we&#8217;re shipping three improvements to help you understand why streaming events get dropped, catch data quality issues early, and set up Pipelines faster. Dropped event metrics When stream events don&#8217;t match [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-250","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts\/250","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/comments?post=250"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/posts\/250\/revisions"}],"wp:attachment":[{"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/media?parent=250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/categories?post=250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.securinsight.ca\/index.php\/wp-json\/wp\/v2\/tags?post=250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}