Skip to content

feat: add --replay mode for JSONL event replay without eBPF#1010

Open
Molter73 wants to merge 4 commits into
mainfrom
mauro/feat/replay-input
Open

feat: add --replay mode for JSONL event replay without eBPF#1010
Molter73 wants to merge 4 commits into
mainfrom
mauro/feat/replay-input

Conversation

@Molter73

@Molter73 Molter73 commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

Description

Add a --replay CLI flag that reads pre-recorded events from a JSONL file instead of loading eBPF programs. This allows profiling the entire userspace pipeline with tools like valgrind DHAT that don't support BPF syscalls.

In replay mode, the BPF loader and HostScanner are bypassed entirely. Events flow directly from the JSONL reader through the RateLimiter and Output stages.

Additionally, in order to ensure all events are processed the shutdown sequence has changed from signalling all tasks to stop at once to stopping the input stage, then letting the shutdown propagate as downstream tasks find their receivers to have no more messages and being closed. To make this cleaner, sub-tasks like the periodic notifier for host_scanner and the different output components are now handled independently by their parent task.

Changes:

  • Add Deserialize impls for inode_key_t and monitored_t (fact-ebpf)
  • Add Deserialize derives to Event, FileData, Process and related types
  • Make kernel metrics optional in Exporter (None in replay mode)
  • Migrate task handles to a shared JoinSet for cleaner lifecycle mgmt
  • Add replay module with async JSONL file reader
  • Add --replay flag to CLI and config

Assisted-by: claude-opus-4.6 noreply@opencode.ai

Checklist

  • Patch has a change log entry OR does not need one.
  • Investigated and inspected CI test results
  • Updated documentation accordingly

Automated testing

  • Added unit tests
  • Added integration tests
  • Added regression tests

If any of these don't apply, please comment below.

Testing Performed

Run fact in stdout mode redirecting output to a file, then used that file to replay events on a mock server.

Summary by CodeRabbit

  • New Features
    • Added replay mode to process events from a JSONL file via --replay / FACT_REPLAY.
    • Recorded events now support full round-trip serialization/deserialization.
  • Bug Fixes
    • Improved graceful shutdown behavior across outputs and background workers when streams/channels close.
    • Invalid replay lines are skipped without aborting the run.
  • Documentation
    • Updated the upcoming release notes to mention --replay mode.
  • Tests
    • Expanded config parsing/replay coverage, including new failure cases and defaults.
    • Updated test container startup to enable Rust backtraces.

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Enterprise

Run ID: a3e6ec4c-f93d-41f7-8939-a87d3ed2ad82

📥 Commits

Reviewing files that changed from the base of the PR and between 1a59761 and a6af5d5.

📒 Files selected for processing (1)
  • fact/src/lib.rs
🚧 Files skipped from review as they are similar to previous changes (1)
  • fact/src/lib.rs

📝 Walkthrough

Walkthrough

Changes

Adds --replay and YAML replay configuration for JSONL event playback, extends event and eBPF deserialization, and centralizes background task registration and shutdown through Tokio JoinSet.

Replay mode and task orchestration

Layer / File(s) Summary
Event and eBPF deserialization
fact/src/event/*, fact-ebpf/src/lib.rs
Event structures and selected eBPF types now support deserialization, while generated timestamps and usernames are skipped during deserialization.
Replay configuration and playback
fact/src/config/*, fact/src/replay.rs, CHANGELOG.md
Replay paths are accepted from YAML or CLI configuration, validated, tested, and used to read JSONL events into the pipeline.
Shared task lifecycle
fact/src/bpf/*, fact/src/host_scanner.rs, fact/src/output/*, fact/src/rate_limiter.rs
Background workers register with caller-owned JoinSet instances and return normalized shutdown results.
Pipeline startup and shutdown
fact/src/lib.rs, fact/src/config/reloader.rs, fact/src/metrics/exporter.rs
Input selection, optional kernel metrics, task joining, helper shutdown, and closed output-channel handling are coordinated through the shared runtime lifecycle.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant CLI as FactCli
  participant Runtime as fact::run
  participant Replay as replay::start
  participant Tasks as JoinSet
  participant Output as output::start
  CLI->>Runtime: provide replay path
  Runtime->>Replay: start JSONL reader
  Replay->>Tasks: register replay task
  Runtime->>Output: register output task
  Replay-->>Runtime: send deserialized Event
  Runtime->>Tasks: join_next()
  Tasks-->>Runtime: completed task result
Loading

Possibly related PRs

  • stackrox/fact#902: Overlaps with the JoinSet-based task orchestration and output task result handling.
  • stackrox/fact#971: Modifies the OpenTelemetry output path updated for clean closed-channel shutdown.
  • stackrox/fact#1011: Touches the gRPC subscriber-closure handling updated here.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 44.74% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately summarizes the main change: adding a replay mode for JSONL events without eBPF.
Description check ✅ Passed The description covers the change, checklist, and testing section, but some checklist items remain unfilled and not all CI/doc details are explicit.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch mauro/feat/replay-input

Comment @coderabbitai help to get the list of available commands.

@Molter73 Molter73 force-pushed the mauro/feat/replay-input branch 2 times, most recently from b4c135f to 68ec0c4 Compare July 7, 2026 15:17
@codecov-commenter

codecov-commenter commented Jul 7, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 5.26316% with 198 lines in your changes missing coverage. Please review.
✅ Project coverage is 32.29%. Comparing base (3a0f02e) to head (a6af5d5).

Files with missing lines Patch % Lines
fact/src/lib.rs 0.00% 67 Missing ⚠️
fact-ebpf/src/lib.rs 0.00% 38 Missing ⚠️
fact/src/replay.rs 0.00% 37 Missing ⚠️
fact/src/output/mod.rs 0.00% 20 Missing ⚠️
fact/src/host_scanner.rs 0.00% 7 Missing ⚠️
fact/src/output/grpc.rs 0.00% 7 Missing ⚠️
fact/src/rate_limiter.rs 0.00% 6 Missing ⚠️
fact/src/metrics/exporter.rs 0.00% 5 Missing ⚠️
fact/src/bpf/mod.rs 0.00% 4 Missing ⚠️
fact/src/output/stdout.rs 0.00% 4 Missing ⚠️
... and 1 more
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #1010      +/-   ##
==========================================
- Coverage   33.22%   32.29%   -0.93%     
==========================================
  Files          21       22       +1     
  Lines        2971     3090     +119     
  Branches     2971     3090     +119     
==========================================
+ Hits          987      998      +11     
- Misses       1981     2089     +108     
  Partials        3        3              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@Molter73 Molter73 marked this pull request as ready for review July 7, 2026 16:14
@Molter73 Molter73 requested a review from a team as a code owner July 7, 2026 16:14

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
fact/src/event/mod.rs (1)

73-80: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Preserve hostname when replaying events. #[serde(skip_deserializing)] drops it to "" on Event deserialization, and fact/src/replay.rs forwards that value unchanged into fact_api::FileActivity. Replayed output loses the recorded host identity; add a deserialization default or repopulate it in the replay path if that’s not intended.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@fact/src/event/mod.rs` around lines 73 - 80, The Event deserialization
currently drops hostname to an empty value, which then gets forwarded unchanged
by the replay path. Update the Event type’s serde handling so hostname is
preserved or restored during deserialization, and verify the replay logic in
replay.rs / FileActivity construction uses the recorded hostname instead of the
blank default.
🧹 Nitpick comments (2)
fact-ebpf/src/lib.rs (1)

108-194: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider round-trip tests for the new Deserialize impls.

No tests exercise serialize→deserialize round trips for inode_key_t/monitored_t, matching Codecov's coverage gap on this file. A couple of small unit tests would catch drift between the manual Serialize/Deserialize impls.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@fact-ebpf/src/lib.rs` around lines 108 - 194, Add small unit tests for the
new manual serde implementations in inode_key_t and monitored_t to cover
serialize-to-deserialize round trips. Use the existing Serialize/Deserialize
impls for inode_key_t and monitored_t to verify that a value serialized to JSON
(or equivalent serde format) deserializes back to the same value, including at
least one case for each monitored_t variant and a representative inode_key_t
value. Place the tests near the serde impls in lib.rs so they clearly exercise
these symbols and prevent drift between the custom serialization and
deserialization logic.
fact/src/replay.rs (1)

13-61: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

No tests for the replay reader.

Matches Codecov's coverage gap for this file. A test spawning start() against a small temp JSONL (including a malformed line) would validate the parse/skip/forward behavior cheaply.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@fact/src/replay.rs` around lines 13 - 61, Add coverage for replay::start by
introducing a test that spawns it with a temporary JSONL file and a watch
receiver, then verifies the reader forwards valid Event entries, skips malformed
JSON lines, and continues after deserialize failures. Use the start function and
its line-by-line parsing path in replay.rs so the test exercises the existing
parse/skip/forward behavior end to end.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@fact/src/config/mod.rs`:
- Line 44: The new replay field in the configuration schema is missing dedicated
test coverage. Update fact/src/config/tests.rs to add cases that parse a YAML
replay: <path> value, exercise the replay() accessor, and verify update() merges
a Some(path) value correctly; use the existing Config and update() test patterns
as the reference point. Also extend the fully specified config fixtures that
already include replay: None so they cover the new field consistently, but make
sure there is at least one explicit test for parsing and merging replay.

In `@fact/src/event/process.rs`:
- Around line 41-48: The Process.username field is only marked
skip_deserializing, so replayed events keep the default empty value and never
get repopulated. Update the Process struct’s serde handling to mirror the
Event.hostname fix by adding a default provider (or equivalent reassignment
path) for username in fact/src/event/process.rs, and ensure the
replay/deserialization flow restores a usable username instead of leaving it
blank.

In `@fact/src/replay.rs`:
- Around line 13-61: The replay task in start() is being treated as a global
shutdown signal when it reaches EOF, which can stop downstream consumers before
their bounded queues are drained. Update the replay completion path so finishing
the file does not flip the shared running flag in run(); instead, keep replay
completion separate from shutdown or add an explicit drain/flush step for
RateLimiter and Output before exit. Use the start() task and the
run()/running.changed() shutdown flow to locate the fix.

---

Outside diff comments:
In `@fact/src/event/mod.rs`:
- Around line 73-80: The Event deserialization currently drops hostname to an
empty value, which then gets forwarded unchanged by the replay path. Update the
Event type’s serde handling so hostname is preserved or restored during
deserialization, and verify the replay logic in replay.rs / FileActivity
construction uses the recorded hostname instead of the blank default.

---

Nitpick comments:
In `@fact-ebpf/src/lib.rs`:
- Around line 108-194: Add small unit tests for the new manual serde
implementations in inode_key_t and monitored_t to cover serialize-to-deserialize
round trips. Use the existing Serialize/Deserialize impls for inode_key_t and
monitored_t to verify that a value serialized to JSON (or equivalent serde
format) deserializes back to the same value, including at least one case for
each monitored_t variant and a representative inode_key_t value. Place the tests
near the serde impls in lib.rs so they clearly exercise these symbols and
prevent drift between the custom serialization and deserialization logic.

In `@fact/src/replay.rs`:
- Around line 13-61: Add coverage for replay::start by introducing a test that
spawns it with a temporary JSONL file and a watch receiver, then verifies the
reader forwards valid Event entries, skips malformed JSON lines, and continues
after deserialize failures. Use the start function and its line-by-line parsing
path in replay.rs so the test exercises the existing parse/skip/forward behavior
end to end.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Enterprise

Run ID: 9570c942-4422-4544-b4e3-40dde97bdb37

📥 Commits

Reviewing files that changed from the base of the PR and between 17d94b4 and bd88a24.

📒 Files selected for processing (14)
  • CHANGELOG.md
  • fact-ebpf/src/lib.rs
  • fact/src/bpf/mod.rs
  • fact/src/config/mod.rs
  • fact/src/config/reloader.rs
  • fact/src/config/tests.rs
  • fact/src/event/mod.rs
  • fact/src/event/process.rs
  • fact/src/host_scanner.rs
  • fact/src/lib.rs
  • fact/src/metrics/exporter.rs
  • fact/src/output/mod.rs
  • fact/src/rate_limiter.rs
  • fact/src/replay.rs

Comment thread fact/src/config/mod.rs
Comment thread fact/src/event/process.rs
Comment thread fact/src/replay.rs
@Molter73 Molter73 marked this pull request as draft July 10, 2026 11:01
@Molter73 Molter73 force-pushed the mauro/feat/replay-input branch 2 times, most recently from c0267d4 to 0194aae Compare July 14, 2026 16:33

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
fact/src/lib.rs (1)

89-148: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Drain the outer JoinSet on normal shutdown (fact/src/lib.rs:137-146)
run() sends running = false and returns immediately on Ctrl-C/SIGTERM when is_replay is false, so dropping task_set aborts still-running pipeline tasks before they can flush buffered events. Drain the set after signaling shutdown on the normal path too.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@fact/src/lib.rs` around lines 89 - 148, Update run() to drain the outer
task_set after running.send(false) on normal shutdown, including Ctrl-C and
SIGTERM when is_replay is false, awaiting each task and propagating errors
through flatten_task_result. Preserve the existing replay draining behavior
while ensuring task_set is not dropped until all pipeline tasks have finished
flushing.
🧹 Nitpick comments (1)
fact-ebpf/src/lib.rs (1)

108-150: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add focused deserialization tests.

Please cover stdout→replay round trips, missing inode/dev fields, unknown map keys, all monitored_t variants, and rejection of unknown variants. These implementations are directly exercised by serde_json::from_value::<Event> in replay mode, but the supplied coverage report shows this file lacks coverage.

Also applies to: 176-193

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@fact-ebpf/src/lib.rs` around lines 108 - 150, Add focused serde
deserialization tests around inode_key_t’s Deserialize implementation and the
Event replay deserialization path: verify stdout-to-replay round trips, missing
inode and dev errors, ignored unknown map keys, every monitored_t variant, and
rejection of unknown variants. Use serde_json::from_value::<Event> for
replay-mode coverage and keep the tests scoped to these behaviors.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@fact/src/lib.rs`:
- Around line 89-148: Update run() to drain the outer task_set after
running.send(false) on normal shutdown, including Ctrl-C and SIGTERM when
is_replay is false, awaiting each task and propagating errors through
flatten_task_result. Preserve the existing replay draining behavior while
ensuring task_set is not dropped until all pipeline tasks have finished
flushing.

---

Nitpick comments:
In `@fact-ebpf/src/lib.rs`:
- Around line 108-150: Add focused serde deserialization tests around
inode_key_t’s Deserialize implementation and the Event replay deserialization
path: verify stdout-to-replay round trips, missing inode and dev errors, ignored
unknown map keys, every monitored_t variant, and rejection of unknown variants.
Use serde_json::from_value::<Event> for replay-mode coverage and keep the tests
scoped to these behaviors.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Enterprise

Run ID: cddb4ea2-ff9b-46e9-b1a1-a2ee710806be

📥 Commits

Reviewing files that changed from the base of the PR and between bd88a24 and 0194aae.

📒 Files selected for processing (17)
  • CHANGELOG.md
  • fact-ebpf/src/lib.rs
  • fact/src/bpf/mod.rs
  • fact/src/config/mod.rs
  • fact/src/config/reloader.rs
  • fact/src/config/tests.rs
  • fact/src/event/mod.rs
  • fact/src/event/process.rs
  • fact/src/host_scanner.rs
  • fact/src/lib.rs
  • fact/src/metrics/exporter.rs
  • fact/src/metrics/kernel_metrics.rs
  • fact/src/metrics/mod.rs
  • fact/src/output/mod.rs
  • fact/src/output/stdout.rs
  • fact/src/rate_limiter.rs
  • fact/src/replay.rs
🚧 Files skipped from review as they are similar to previous changes (9)
  • CHANGELOG.md
  • fact/src/replay.rs
  • fact/src/config/tests.rs
  • fact/src/rate_limiter.rs
  • fact/src/host_scanner.rs
  • fact/src/event/process.rs
  • fact/src/event/mod.rs
  • fact/src/config/mod.rs
  • fact/src/output/mod.rs

@Molter73 Molter73 force-pushed the mauro/feat/replay-input branch from 0194aae to 896dab3 Compare July 15, 2026 09:02
@Molter73 Molter73 changed the base branch from main to mauro/tests/rate-limit July 15, 2026 09:02
@Molter73 Molter73 force-pushed the mauro/feat/replay-input branch from 896dab3 to b3dfb5a Compare July 15, 2026 09:08
Base automatically changed from mauro/tests/rate-limit to main July 15, 2026 09:18
@Molter73 Molter73 force-pushed the mauro/feat/replay-input branch 3 times, most recently from 835ac9f to 2b54c9a Compare July 15, 2026 13:57
Molter73 added 2 commits July 15, 2026 16:04
Add a --replay <file> CLI flag that reads pre-recorded events from a
JSONL file instead of loading eBPF programs. This allows profiling the
entire userspace pipeline with tools like valgrind DHAT that don't
support BPF syscalls.

In replay mode, the BPF loader and HostScanner are bypassed entirely.
Events flow directly from the JSONL reader through the RateLimiter and
Output stages.

Changes:
- Add Deserialize impls for inode_key_t and monitored_t (fact-ebpf)
- Add Deserialize derives to Event, FileData, Process and related types
- Make kernel metrics optional in Exporter (None in replay mode)
- Migrate task handles to a shared JoinSet for cleaner lifecycle mgmt
- Add replay module with async JSONL file reader
- Add --replay flag to CLI and config

Assisted-by: `agent-mode` <noreply@opencode.ai>
@Molter73 Molter73 force-pushed the mauro/feat/replay-input branch from 2b54c9a to 49232f3 Compare July 15, 2026 14:15
@Molter73

Copy link
Copy Markdown
Collaborator Author

There's a bit of cleanup around the metrics that will be addressed in #1118

@Molter73 Molter73 marked this pull request as ready for review July 15, 2026 14:35

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
fact-ebpf/src/lib.rs (1)

108-151: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add JSON round-trip regression tests for the custom deserializers.

Replay consumes stdout-produced JSON, so test serde_json::to_stringfrom_str for inode_key_t and every monitored_t variant, plus invalid/missing values. This protects the serialization contract from future drift.

Also applies to: 176-193

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@fact-ebpf/src/lib.rs` around lines 108 - 151, Add JSON round-trip regression
tests covering inode_key_t and every monitored_t variant, using
serde_json::to_string followed by from_str and asserting equality. Include
invalid JSON and missing-field/value cases for the custom deserializers,
covering the deserialize implementations for inode_key_t and monitored_t without
changing their behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@fact/src/lib.rs`:
- Around line 82-89: Update join_all_tasks to drain the JoinSet with repeated
join_next() calls, converting any JoinError into an anyhow::Error and
propagating task-level errors. Preserve successful completion as Ok(()) so the
shutdown call site can return failures instead of panicking.

---

Nitpick comments:
In `@fact-ebpf/src/lib.rs`:
- Around line 108-151: Add JSON round-trip regression tests covering inode_key_t
and every monitored_t variant, using serde_json::to_string followed by from_str
and asserting equality. Include invalid JSON and missing-field/value cases for
the custom deserializers, covering the deserialize implementations for
inode_key_t and monitored_t without changing their behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Enterprise

Run ID: 70765ba1-d5b9-4608-8f6c-0f3b470f21c4

📥 Commits

Reviewing files that changed from the base of the PR and between 0194aae and 49232f3.

📒 Files selected for processing (17)
  • CHANGELOG.md
  • fact-ebpf/src/lib.rs
  • fact/src/bpf/mod.rs
  • fact/src/config/mod.rs
  • fact/src/config/reloader.rs
  • fact/src/config/tests.rs
  • fact/src/event/mod.rs
  • fact/src/event/process.rs
  • fact/src/host_scanner.rs
  • fact/src/lib.rs
  • fact/src/metrics/exporter.rs
  • fact/src/output/grpc.rs
  • fact/src/output/mod.rs
  • fact/src/output/otel.rs
  • fact/src/output/stdout.rs
  • fact/src/rate_limiter.rs
  • fact/src/replay.rs
🚧 Files skipped from review as they are similar to previous changes (8)
  • CHANGELOG.md
  • fact/src/event/process.rs
  • fact/src/output/stdout.rs
  • fact/src/replay.rs
  • fact/src/config/mod.rs
  • fact/src/config/reloader.rs
  • fact/src/output/mod.rs
  • fact/src/event/mod.rs

Comment thread fact/src/lib.rs Outdated
Molter73 added 2 commits July 15, 2026 16:49
Also add `RUST_BACKTRACE=1` to the integration tests to get backtraces
when fact errors out.
This prevents panicking in case a `JoinError` occurs.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants