From ff3275c590acbde558c8c87a97b7c86f358eaa5b Mon Sep 17 00:00:00 2001 From: "release-feldera-feldera[bot]" Date: Mon, 13 Jul 2026 16:36:32 +0000 Subject: [PATCH 1/7] ci: Prepare for v0.321.0 --- Cargo.lock | 42 +++++++++++------------ Cargo.toml | 26 +++++++------- openapi.json | 2 +- python/dbt-feldera/pyproject.toml | 2 +- python/felderize/pyproject.toml | 2 +- python/pyproject.toml | 2 +- python/uv.lock | 4 +-- sql-to-dbsp-compiler/SQL-compiler/pom.xml | 2 +- 8 files changed, 41 insertions(+), 41 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8f8059a5e0e..7d1a0f0883a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3976,7 +3976,7 @@ dependencies = [ [[package]] name = "dbsp" -version = "0.320.0" +version = "0.321.0" dependencies = [ "anyhow", "arc-swap", @@ -4066,7 +4066,7 @@ dependencies = [ [[package]] name = "dbsp_adapters" -version = "0.320.0" +version = "0.321.0" dependencies = [ "actix", "actix-codec", @@ -4210,7 +4210,7 @@ dependencies = [ [[package]] name = "dbsp_nexmark" -version = "0.320.0" +version = "0.321.0" dependencies = [ "anyhow", "ascii_table", @@ -5194,7 +5194,7 @@ dependencies = [ [[package]] name = "fda" -version = "0.320.0" +version = "0.321.0" dependencies = [ "anyhow", "arrow", @@ -5246,7 +5246,7 @@ dependencies = [ [[package]] name = "feldera-adapterlib" -version = "0.320.0" +version = "0.321.0" dependencies = [ "actix-web", "anyhow", @@ -5280,7 +5280,7 @@ dependencies = [ [[package]] name = "feldera-buffer-cache" -version = "0.320.0" +version = "0.321.0" dependencies = [ "crossbeam-utils", "enum-map", @@ -5308,7 +5308,7 @@ dependencies = [ [[package]] name = "feldera-datagen" -version = "0.320.0" +version = "0.321.0" dependencies = [ "anyhow", "async-channel 2.5.0", @@ -5334,7 +5334,7 @@ dependencies = [ [[package]] name = "feldera-fxp" -version = "0.320.0" +version = "0.321.0" dependencies = [ "bytecheck", "dbsp", @@ -5354,7 +5354,7 @@ dependencies = [ [[package]] name = "feldera-iceberg" -version = "0.320.0" +version = "0.321.0" dependencies = [ "anyhow", "chrono", @@ -5377,7 +5377,7 @@ dependencies = [ [[package]] name = "feldera-ir" -version = "0.320.0" +version = "0.321.0" dependencies = [ "proptest", "proptest-derive", @@ -5389,7 +5389,7 @@ dependencies = [ [[package]] name = "feldera-macros" -version = "0.320.0" +version = "0.321.0" dependencies = [ "prettyplease", "proc-macro2", @@ -5399,7 +5399,7 @@ dependencies = [ [[package]] name = "feldera-observability" -version = "0.320.0" +version = "0.321.0" dependencies = [ "actix-http", "awc", @@ -5414,7 +5414,7 @@ dependencies = [ [[package]] name = "feldera-rest-api" -version = "0.320.0" +version = "0.321.0" dependencies = [ "chrono", "feldera-observability", @@ -5433,7 +5433,7 @@ dependencies = [ [[package]] name = "feldera-samply" -version = "0.320.0" +version = "0.321.0" dependencies = [ "crossbeam", "feldera-size-of", @@ -5469,7 +5469,7 @@ dependencies = [ [[package]] name = "feldera-sqllib" -version = "0.320.0" +version = "0.321.0" dependencies = [ "arcstr", "base58", @@ -5513,7 +5513,7 @@ dependencies = [ [[package]] name = "feldera-storage" -version = "0.320.0" +version = "0.321.0" dependencies = [ "anyhow", "crossbeam", @@ -5536,7 +5536,7 @@ dependencies = [ [[package]] name = "feldera-types" -version = "0.320.0" +version = "0.321.0" dependencies = [ "actix-web", "anyhow", @@ -8813,7 +8813,7 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pipeline-manager" -version = "0.320.0" +version = "0.321.0" dependencies = [ "actix-cors", "actix-files", @@ -10023,7 +10023,7 @@ dependencies = [ [[package]] name = "readers" -version = "0.320.0" +version = "0.321.0" dependencies = [ "async-std", "csv", @@ -11722,7 +11722,7 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "sltsqlvalue" -version = "0.320.0" +version = "0.321.0" dependencies = [ "dbsp", "feldera-sqllib", @@ -12193,7 +12193,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "storage-test-compat" -version = "0.320.0" +version = "0.321.0" dependencies = [ "dbsp", "derive_more 1.0.0", diff --git a/Cargo.toml b/Cargo.toml index 2985273bea9..61f342a1bd5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace.package] authors = ["Feldera Team "] -version = "0.320.0" +version = "0.321.0" license = "MIT OR Apache-2.0" homepage = "https://github.com/feldera/feldera" repository = "https://github.com/feldera/feldera" @@ -108,7 +108,7 @@ csv = "1.2.2" csv-core = "0.1.10" dashmap = "6.1.0" datafusion = "53.1" -dbsp = { path = "crates/dbsp", version = "0.320.0" } +dbsp = { path = "crates/dbsp", version = "0.321.0" } dbsp_nexmark = { path = "crates/nexmark" } deadpool-postgres = "0.14.1" # Feldera fork of delta-rs: upstream tag `rust-v0.32.3` + 2 patches, on branch @@ -133,20 +133,20 @@ erased-serde = "0.3.31" fake = "2.10" fastbloom = "0.14.0" fdlimit = "0.3.0" -feldera-buffer-cache = { version = "0.320.0", path = "crates/buffer-cache" } +feldera-buffer-cache = { version = "0.321.0", path = "crates/buffer-cache" } feldera-cloud1-client = "0.1.2" feldera-datagen = { path = "crates/datagen" } -feldera-fxp = { version = "0.320.0", path = "crates/fxp", features = ["dbsp"] } +feldera-fxp = { version = "0.321.0", path = "crates/fxp", features = ["dbsp"] } feldera-iceberg = { path = "crates/iceberg" } -feldera-observability = { version = "0.320.0", path = "crates/feldera-observability" } -feldera-macros = { version = "0.320.0", path = "crates/feldera-macros" } -feldera-sqllib = { version = "0.320.0", path = "crates/sqllib" } -feldera-storage = { version = "0.320.0", path = "crates/storage" } -feldera-types = { version = "0.320.0", path = "crates/feldera-types" } -feldera-rest-api = { version = "0.320.0", path = "crates/rest-api" } -feldera-ir = { version = "0.320.0", path = "crates/ir" } -feldera-adapterlib = { version = "0.320.0", path = "crates/adapterlib" } -feldera-samply = { version = "0.320.0", path = "crates/samply" } +feldera-observability = { version = "0.321.0", path = "crates/feldera-observability" } +feldera-macros = { version = "0.321.0", path = "crates/feldera-macros" } +feldera-sqllib = { version = "0.321.0", path = "crates/sqllib" } +feldera-storage = { version = "0.321.0", path = "crates/storage" } +feldera-types = { version = "0.321.0", path = "crates/feldera-types" } +feldera-rest-api = { version = "0.321.0", path = "crates/rest-api" } +feldera-ir = { version = "0.321.0", path = "crates/ir" } +feldera-adapterlib = { version = "0.321.0", path = "crates/adapterlib" } +feldera-samply = { version = "0.321.0", path = "crates/samply" } flate2 = "1.1.0" form_urlencoded = "1.2.0" fs_extra = "1.3.0" diff --git a/openapi.json b/openapi.json index bee0dc1721c..551d45762bb 100644 --- a/openapi.json +++ b/openapi.json @@ -10,7 +10,7 @@ "license": { "name": "MIT OR Apache-2.0" }, - "version": "0.320.0" + "version": "0.321.0" }, "paths": { "/config/authentication": { diff --git a/python/dbt-feldera/pyproject.toml b/python/dbt-feldera/pyproject.toml index 5abf506ade6..52b68ec121e 100644 --- a/python/dbt-feldera/pyproject.toml +++ b/python/dbt-feldera/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta" name = "dbt-feldera" readme = "README.md" description = "The dbt adapter for Feldera — DBSP-native incremental view maintenance" -version = "0.320.0" +version = "0.321.0" license = "MIT" requires-python = ">=3.10" authors = [ diff --git a/python/felderize/pyproject.toml b/python/felderize/pyproject.toml index db8477dd1c1..b85605a12d3 100644 --- a/python/felderize/pyproject.toml +++ b/python/felderize/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta" name = "felderize" readme = "README.md" description = "SQL dialect to Feldera SQL translator agent" -version = "0.320.0" +version = "0.321.0" license = "MIT" requires-python = ">=3.10" authors = [ diff --git a/python/pyproject.toml b/python/pyproject.toml index f0f9beb5c52..616e8287b1c 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta" name = "feldera" readme = "README.md" description = "The feldera python client" -version = "0.320.0" +version = "0.321.0" license = "MIT" requires-python = ">=3.10,<3.14" authors = [ diff --git a/python/uv.lock b/python/uv.lock index c3f873082a4..3456b3766fd 100644 --- a/python/uv.lock +++ b/python/uv.lock @@ -9,7 +9,7 @@ resolution-markers = [ ] [options] -exclude-newer = "2026-07-03T22:21:56.598744158Z" +exclude-newer = "2026-07-06T16:35:57.058623357Z" exclude-newer-span = "P1W" [[package]] @@ -273,7 +273,7 @@ wheels = [ [[package]] name = "feldera" -version = "0.320.0" +version = "0.321.0" source = { editable = "." } dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, diff --git a/sql-to-dbsp-compiler/SQL-compiler/pom.xml b/sql-to-dbsp-compiler/SQL-compiler/pom.xml index 3925e922dc0..d0856c923bd 100644 --- a/sql-to-dbsp-compiler/SQL-compiler/pom.xml +++ b/sql-to-dbsp-compiler/SQL-compiler/pom.xml @@ -19,7 +19,7 @@ 1.43.0 2.22.0 3.1.12 - 0.320.0 + 0.321.0 1.28.0 From 9e60cdd6746d427a6ffbbe4bdd150edb364ac454 Mon Sep 17 00:00:00 2001 From: Karakatiza666 Date: Fri, 10 Jul 2026 16:10:10 +0000 Subject: [PATCH 2/7] [web-console] Enable loading profiles without a circuit profile present Signed-off-by: Karakatiza666 --- .devcontainer/Dockerfile | 1 + js-packages/profiler-app/src/App.svelte | 8 +- .../SupportBundleViewerLayout.svelte | 143 +++++++++++------- .../lib/functions/processZipBundle.test.ts | 54 ++++++- .../src/lib/functions/processZipBundle.ts | 43 ++++-- .../components/pipelines/list/Actions.svelte | 4 +- .../lib/functions/pipelines/status.spec.ts | 12 +- .../profile-viewer/+page.svelte | 8 +- 8 files changed, 192 insertions(+), 81 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index a99f3c0effb..06fd09d9de1 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -84,6 +84,7 @@ RUN curl -fsSL https://claude.ai/install.sh | bash RUN \ rustup install $RUST_VERSION && \ + rustup default $RUST_VERSION && \ rustup component add rustfmt && \ rustup component add clippy && \ cargo install cargo-make diff --git a/js-packages/profiler-app/src/App.svelte b/js-packages/profiler-app/src/App.svelte index d59000790d5..960e370f1bc 100644 --- a/js-packages/profiler-app/src/App.svelte +++ b/js-packages/profiler-app/src/App.svelte @@ -20,7 +20,7 @@ let sqlPanelFullHeight = $state(false) let profileData: { - profile: JsonProfiles + profile: JsonProfiles | undefined dataflow: Dataflow | undefined sources: string[] | undefined logText: string | undefined @@ -65,7 +65,7 @@ const suitableProfiles = getSuitableProfiles(zipData) if (suitableProfiles.length === 0) { throw new Error( - 'No suitable profiles found in the uploaded support bundle. Check if it contains the circuit profile and dataflow graph (optional).' + 'No readable data found in the uploaded support bundle. Check that it contains a circuit profile, config, logs or stats.' ) } profileFiles = suitableProfiles @@ -147,8 +147,8 @@

- Load a Feldera support bundle (.zip file) containing circuit profile data to begin - visualization. + Load a Feldera support bundle (.zip file) to explore the circuit profile, + program code, logs and the pipeline config.

{#if isLoading} diff --git a/js-packages/profiler-layout/src/lib/components/SupportBundleViewerLayout.svelte b/js-packages/profiler-layout/src/lib/components/SupportBundleViewerLayout.svelte index 96d588c24c5..21b6f7ec623 100644 --- a/js-packages/profiler-layout/src/lib/components/SupportBundleViewerLayout.svelte +++ b/js-packages/profiler-layout/src/lib/components/SupportBundleViewerLayout.svelte @@ -39,7 +39,8 @@ type AnalysisTab = (typeof TABS)[number] interface Props { - profileData: JsonProfiles + /** Parsed circuit profile */ + profileData?: JsonProfiles dataflowData: Dataflow | undefined programCode: string[] | undefined logText?: string @@ -81,6 +82,12 @@ onRenderingChange }: Props = $props() + const hasProfile = $derived(profileData !== undefined) + + const graphPaneDefaultSize = 55 + const graphPaneMinSize = 20 + const belowGraphPaneDefaultSize = 100 - graphPaneDefaultSize + let profilerDiagram: ProfilerDiagram | undefined = $state() // The loaded profile's toplevel node id, so the analysis panel can recognise overview data. const diagramRootNodeId = $derived(profilerDiagram?.getProfile()?.rootNodeId) @@ -137,7 +144,6 @@ const attrs = data.match({ some: (v) => v, none: () => null }) untrack(() => { if (attrs) { - currentTab = 'Metrics' tooltipData = { nodeAttributes: attrs } // Only cache while we're on a node view, so an `'overview'` round-trip can't // overwrite the operator the user actually inspected. @@ -205,19 +211,18 @@ profilerDiagram?.selectMetric(selectedMetricId) }) - // Show the overview each time a profile loads. `analysisView` is reset first so the + // Reset to the overview whenever the loaded bundle changes. `analysisView` is reset first so the // SegmentedControl indicator follows the new view, and so the sticky `displayNodeAttributes` // that `showGlobalMetrics` triggers sees a non-node view and can't overwrite `lastNodeData` // with the overview payload. $effect(() => { void profileData const diagram = profilerDiagram - if (!diagram) { - return - } queueMicrotask(() => { analysisView = 'overview' - diagram.showGlobalMetrics(true) + tooltipData = null + lastNodeData = null + diagram?.showGlobalMetrics(true) }) }) @@ -316,42 +321,54 @@ {#snippet graphPanel()} -
+
{@render loadProfileControl?.()} -
- e.key === 'Enter' && handleSearch()} - class="input h-6 w-36 text-sm" - /> -
+ {#if hasProfile} +
+ e.key === 'Enter' && handleSearch()} + class="input h-6 w-36 text-sm" + /> +
+ {:else} +

+ This bundle has no circuit profile, so the dataflow graph is unavailable. +

+ {/if}
-
- {#if error} -
- {error} -
- {/if} - {#if message} -
- {message} -
- {/if} -
+ {#if hasProfile} +
+ {#if error} +
+ {error} +
+ {/if} + {#if message} +
+ {message} +
+ {/if} +
+ {/if}
{/snippet} @@ -446,7 +463,7 @@ items={[ { value: 'overview', label: 'Overview' }, { value: 'node', label: 'Node', disabled: !lastNodeData }, - { value: 'top-nodes', label: 'Top nodes' } + { value: 'top-nodes', label: 'Top nodes', disabled: !hasProfile } ]} class="px-2" /> @@ -491,11 +508,17 @@ {#if !sqlPanelFullHeight} - - {@render graphPanel()} - - - + {#if hasProfile} + + {@render graphPanel()} + + + {:else} +
+ {@render graphPanel()} +
+ {/if} +
@@ -516,11 +539,21 @@ - - {@render graphPanel()} - - - + {#if hasProfile} + + {@render graphPanel()} + + + {:else} +
+ {@render graphPanel()} +
+ {/if} + {@render analysisPanel()}
@@ -532,15 +565,17 @@ in graphPanel. Surviving the layout toggle (and any other conditional re-render of graphPanel) is what keeps the Visualizer's internal state intact instead of being torn down and re-created from `profileData` each time. --> - - - +{#if profileData} + + + +{/if}