Skip to content

Add otel to desktop app #3852

Add otel to desktop app

Add otel to desktop app #3852

Triggered via pull request October 14, 2025 05:52
Status Failure
Total duration 9m 29s
Artifacts

ci.yml

on: pull_request
Detect Changes
7s
Detect Changes
Typecheck
1m 17s
Typecheck
Format (Biome)
7s
Format (Biome)
Format (Cargo)
9s
Format (Cargo)
Lint (Biome)
13s
Lint (Biome)
Matrix: Build Desktop
Clippy
1m 51s
Clippy
Verify Tauri plugin versions
9s
Verify Tauri plugin versions
Fit to window
Zoom out
Zoom in

Annotations

13 errors and 10 warnings
Format (Biome)
Process completed with exit code 1.
Typecheck
Process completed with exit code 2.
Typecheck: apps/desktop/src/routes/(window-chrome)/settings/recordings.tsx#L323
Cannot find name 'InstantModeActions'.
Typecheck: apps/desktop/src/routes/(window-chrome)/settings/UploadStatsForNerds.tsx#L275
Cannot find name 'Recording'. Did you mean 'Record'?
Clippy
Clippy had exited with the 101 exit code
the trait bound `OpenTelemetryLayer<FilterFn<fn(&...) -> bool>, ...>: Layer<...>` is not satisfied: apps/desktop/src-tauri/src/lib.rs#L192
error[E0277]: the trait bound `OpenTelemetryLayer<FilterFn<fn(&...) -> bool>, ...>: Layer<...>` is not satisfied --> apps/desktop/src-tauri/src/lib.rs:192:26 | 192 | .reload(Some(Box::new( | __________________________^ 193 | | tracing_subscriber::fmt::layer() 194 | | .with_ansi(false) 195 | | .with_target(true) 196 | | .with_writer(logfile), 197 | | ) as DynLoggingLayer)) | |_____________^ unsatisfied trait bound | = help: the trait `tracing_subscriber::Layer<tracing_subscriber::Registry>` is not implemented for `OpenTelemetryLayer<FilterFn<fn(&Metadata<'b>) -> bool>, ...>` = help: the trait `tracing_subscriber::Layer<S>` is implemented for `tracing_opentelemetry::OpenTelemetryLayer<S, T>` = note: required for `Layered<OpenTelemetryLayer<FilterFn<fn(&...) -> bool>, ...>, ...>` to implement `tracing::Subscriber` = note: required for `Layer<Layered<OpenTelemetryLayer<..., ...>, ...>, ..., ..., ...>` to implement `tracing_subscriber::Layer<tracing_subscriber::layer::Layered<tracing_opentelemetry::OpenTelemetryLayer<tracing_subscriber::filter::FilterFn<for<'a, 'b> fn(&'a tracing::Metadata<'b>) -> bool>, opentelemetry_sdk::trace::SdkTracerProvider>, tracing_subscriber::Registry>>` = note: required for the cast from `Box<Layer<Layered<OpenTelemetryLayer<..., ...>, ...>, ..., ..., ...>>` to `Box<dyn Layer<Layered<..., ...>> + Send + Sync>` = note: the full name for the type has been written to '/Users/runner/work/Cap/Cap/target/debug/deps/cap_desktop_lib-94433aeed1ec3959.long-type-6032539183573426428.txt' = note: consider using `--verbose` to print the full type name to the console
Build Desktop (x86_64-pc-windows-msvc, windows-latest)
Process completed with exit code 1.
Build Desktop (aarch64-apple-darwin, macos-latest)
Process completed with exit code 1.
unused `std::result::Result` that must be used: crates/export/src/mp4.rs#L100
warning: unused `std::result::Result` that must be used --> crates/export/src/mp4.rs:100:17 | 100 | / encoder.queue_video_frame( 101 | | frame.video, 102 | | Duration::from_secs_f32(encoded_frames as f32 / fps as f32), 103 | | ); | |_________________^ | = note: this `Result` may be an `Err` variant, which should be handled = note: `#[warn(unused_must_use)]` on by default help: use `let _ = ...` to ignore the resulting value | 100 | let _ = encoder.queue_video_frame( | +++++++
unused variable: `prev_audio_config`: crates/editor/src/playback.rs#L257
warning: unused variable: `prev_audio_config` --> crates/editor/src/playback.rs:257:17 | 257 | prev_audio_config = project.audio.clone(); | ^^^^^^^^^^^^^^^^^ | = help: did you mean to capture by reference instead? = note: `#[warn(unused_variables)]` on by default
value assigned to `prev_audio_config` is never read: crates/editor/src/playback.rs#L257
warning: value assigned to `prev_audio_config` is never read --> crates/editor/src/playback.rs:257:17 | 257 | prev_audio_config = project.audio.clone(); | ^^^^^^^^^^^^^^^^^ | = help: maybe it is overwritten before being read? = note: `#[warn(unused_assignments)]` on by default
unneeded `return` statement: crates/enc-ffmpeg/src/video/h264.rs#L191
warning: unneeded `return` statement --> crates/enc-ffmpeg/src/video/h264.rs:191:13 | 191 | return; | ^^^^^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return help: remove `return` | 190 - tracing::error!("Failed to send EOF to encoder: {:?}", e); 191 - return; 190 + tracing::error!("Failed to send EOF to encoder: {:?}", e); |
manual implementation of an assign operation: crates/enc-ffmpeg/src/audio/buffered_resampler.rs#L92
warning: manual implementation of an assign operation --> crates/enc-ffmpeg/src/audio/buffered_resampler.rs:92:13 | 92 | next_pts = next_pts + samples as i64; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace it with: `next_pts += samples as i64` | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#assign_op_pattern = note: `#[warn(clippy::assign_op_pattern)]` on by default
redundant pattern matching, consider using `is_some()`: crates/enc-ffmpeg/src/audio/buffered_resampler.rs#L78
warning: redundant pattern matching, consider using `is_some()` --> crates/enc-ffmpeg/src/audio/buffered_resampler.rs:78:19 | 78 | while let Some(_) = self.resampler.delay() { | ----------^^^^^^^------------------------- help: try: `while self.resampler.delay().is_some()` | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching = note: `#[warn(clippy::redundant_pattern_matching)]` on by default
this `if` statement can be collapsed: crates/enc-ffmpeg/src/audio/buffered_resampler.rs#L59
warning: this `if` statement can be collapsed --> crates/enc-ffmpeg/src/audio/buffered_resampler.rs:59:9 | 59 | / if let Some(min_next_pts) = self.min_next_pts { 60 | | if let Some(pts) = frame.pts() { 61 | | frame.set_pts(Some(pts.max(min_next_pts))); 62 | | } 63 | | } | |_________^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#collapsible_if = note: `#[warn(clippy::collapsible_if)]` on by default help: collapse nested if block | 59 ~ if let Some(min_next_pts) = self.min_next_pts 60 ~ && let Some(pts) = frame.pts() { 61 | frame.set_pts(Some(pts.max(min_next_pts))); 62 ~ } |
unneeded `return` statement: crates/enc-ffmpeg/src/audio/buffered_resampler.rs#L51
warning: unneeded `return` statement --> crates/enc-ffmpeg/src/audio/buffered_resampler.rs:51:9 | 51 | return remaining_samples; | ^^^^^^^^^^^^^^^^^^^^^^^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return = note: `#[warn(clippy::needless_return)]` on by default help: remove `return` | 51 - return remaining_samples; 51 + remaining_samples |
field `config` is never read: crates/enc-ffmpeg/src/video/h264.rs#L142
warning: field `config` is never read --> crates/enc-ffmpeg/src/video/h264.rs:142:5 | 139 | pub struct H264Encoder { | ----------- field in this struct ... 142 | config: VideoInfo, | ^^^^^^ | = note: `#[warn(dead_code)]` on by default
clamp-like pattern without using clamp function: crates/media-info/src/lib.rs#L69
warning: clamp-like pattern without using clamp function --> crates/media-info/src/lib.rs:69:13 | 69 | raw_channels.min(Self::MAX_AUDIO_CHANNELS).max(1) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace with clamp: `raw_channels.clamp(1, Self::MAX_AUDIO_CHANNELS)` | = note: clamp will panic if max < min = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_clamp = note: `#[warn(clippy::manual_clamp)]` on by default