Skip to content

Harden OpenTelemetry release readiness: docs, tests, spec-compliant env parsing - #10865

Open
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
dev/amauryleve/otel-release-hardening
Open

Harden OpenTelemetry release readiness: docs, tests, spec-compliant env parsing#10865
Amaury Levé (Evangelink) wants to merge 3 commits into
mainfrom
dev/amauryleve/otel-release-hardening

Conversation

@Evangelink

Copy link
Copy Markdown
Member

Summary

Release-hardening for the OpenTelemetry extension ahead of MSTest 4.4 / MTP 2.4, focused on the two turnkey helpers that were promoted from [TPEXP] to stable API this cycle — AddTestingPlatformResource and AddOpenTelemetryProviderFromEnvironment — plus the sensitive-data documentation gap raised in #8411.

No breaking public API changes: the stable helpers stay stable, and the one behavioral change is a spec-compliance fix on how OTEL_SDK_DISABLED is parsed.

Motivation

  • [MTP Diagnostic Analysis] OpenTelemetry exports raw file paths, stdout/stderr, and stack traces without filtering #8411 asked that the docs "call out exactly which fields are exported." On current main the result pipeline already truncates large string attributes (TESTINGPLATFORM_OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT, 8 KB default), gates stdout/stderr behind TESTINGPLATFORM_OTEL_CAPTURE_TEST_OUTPUT, and strips credentials from vcs.repository.url.full. The genuine remaining gap was accurate documentation of what is exported — nothing leaves the process without an exporter you configure, so documentation (not a default behavior change) is the right release posture.
  • The two newly-stable helpers had no direct unit tests.

Changes

  • Docs (PACKAGE.md) — added a "Data exported and controlling sensitive values" table enumerating each attribute that can carry sensitive data (source/artifact file paths, stdout/stderr, exception message/stack trace, test.metadata.*, resource provenance) and the exact control for each. Truncation is described precisely: only captured output, result explanation and exception text are truncated; file/artifact/metadata values are exported verbatim.
  • Testability refactor — extracted AddOpenTelemetryProviderFromEnvironment's OTEL_* decision into a pure internal ResolveEnvironmentConfiguration seam so it is unit-testable without a live builder. Behavior-preserving; new internal members declared in InternalAPI.Unshipped.txt.
  • OTEL_SDK_DISABLED spec compliance — the turnkey helper now honors the OpenTelemetry boolean convention: only a case-insensitive "true" disables the SDK, so "1" and other spellings leave it enabled. The CI-marker parsing in TestingPlatformResourceDetector (GitHub/Azure/GitLab/Jenkins) is intentionally left untouched.
  • Tests (new)TestingPlatformResourceDetectorTests (service name, host/OS/arch/runtime attributes, CI provider detection + precedence, credential stripping) and OpenTelemetryProviderExtensionsTests (AddTestingPlatformResource resource build, null guards, the full env-decision matrix, and an observable end-to-end trace through the real OpenTelemetry SDK asserting exported span tags + resource attributes).

Testing

  • .\build.cmd -c Debug -projects Microsoft.Testing.Extensions.UnitTests.csproj — clean (0 warnings, 0 errors) across all TFMs.
  • 29/29 OpenTelemetry unit tests pass on net9.0 and net472.

Closes #8411.

Co-authored-by: Copilot App 223556219+Copilot@users.noreply.github.com

Address the remaining OpenTelemetry release-readiness work for the newly
stable AddTestingPlatformResource and AddOpenTelemetryProviderFromEnvironment
helpers.

- Document exactly which OpenTelemetry fields can carry sensitive data
  (source/artifact file paths, stdout/stderr, exception message/stack trace)
  and how to control each, addressing issue #8411's documentation ask.
- Extract the OTEL_* environment-variable decision of
  AddOpenTelemetryProviderFromEnvironment into a pure internal
  ResolveEnvironmentConfiguration seam so it is unit-testable without a live
  builder. No public API or behavior change.
- Add direct tests for TestingPlatformResourceDetector (service name, host/OS/
  runtime attributes, CI provider detection, credential stripping), for
  AddTestingPlatformResource, for the env-driven decision, and an observable
  end-to-end trace through the real OpenTelemetry SDK.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…D parsing

Code-review follow-up on the OpenTelemetry release-hardening change.

- PACKAGE.md: fix the "Data exported" table. Drop the incorrect claim that
  every string attribute is truncated (file, artifact and metadata values are
  emitted verbatim); correct the legacy metadata prefix to
  test.metadataProperty.*; list the legacy exception twins
  (test.result.exception.type/message/stacktrace) and the span status
  description; and note the resource attributes (host, OS, CI provenance) that
  ride on every span.
- AddOpenTelemetryProviderFromEnvironment: make OTEL_SDK_DISABLED honor the
  OpenTelemetry boolean convention — only a case-insensitive "true" disables
  the SDK, so "1" and other spellings leave it enabled. CI-marker parsing in
  TestingPlatformResourceDetector is intentionally left untouched.
- Tests: assert the spec-compliant OTEL_SDK_DISABLED behavior (case-insensitive
  "true" disables; "1"/"yes"/"false"/"" do not).

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings August 29, 2026 09:17
The sensitive-data section rewrite left PACKAGE.md without a final newline,
tripping markdownlint MD047. Append exactly one trailing newline.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Note

🤖 Automated review by GitHub Copilot. Generated by the Expert Code Review workflow. To request a follow-up action, reply by tagging @copilot directly.

Expert Review — 22-Dimension Verdict

# Dimension Verdict Notes
1 Algorithmic Correctness ✅ LGTM IsTrue behavioral change (dropping "1") is intentional spec-compliance, well-documented in comments. ResolveEnvironmentConfiguration logic faithfully preserves existing decision tree.
2 Threading & Concurrency ✅ LGTM EnvironmentConfiguration is a readonly struct (immutable). End-to-end test exporter properly locks the shared _activities list.
3 安全 & IPC Contract Safety ✅ LGTM No new file operations, deserialization, or command-line handling. The PACKAGE.md docs accurately describe credential stripping and sensitive-data controls.
4 Public API & Binary Compat ✅ LGTM No public API changes. 新建 internal members (ResolveEnvironmentConfiguration, EnvironmentConfiguration) correctly declared in InternalAPI.Unshipped.txt. Struct uses get (not init).
5 Performance & Allocations ✅ LGTM The refactoring introduces one struct allocation per call (stack-allocated). No regressions.
6 Cross-TFM Compatibility ✅ LGTM StringComparison.OrdinalIgnoreCase and string.Trim() are available on all target TFMs (netstandard2.0+).
7 Resource & IDisposable Mgmt ✅ LGTM End-to-end test properly disposes TracerProvider, OpenTelemetryPlatformService, and OpenTelemetryResultHandler with using.
8 Defensive Coding ✅ LGTM Null guard on builder preserved. Func<string, string?> delegate cleanly abstracts env access.
9 Localization & Resources N/A No .resx or .xlf changes.
10 Test Isolation ✅ LGTM [DoNotParallelize] on both test classes. TestingPlatformResourceDetectorTests.WithEnvironment saves and restores every observed env var in a finally block. OpenTelemetryProviderExtensionsTests env-decision tests use a pure Func<string, string?> — no env mutation.
11 Assertion Quality ✅ LGTM Tests use MSTest assertions (matching BannedSymbols.txt which bans AwesomeAssertions). Assertions are specific (AreEqual, IsTrue, IsFalse, ContainsKey).
12 Flakiness Patterns ✅ LGTM No timing-dependent assertions. End-to-end test uses GUID-prefixed activity names to avoid ambient pollution.
13 Test Completeness ✅ LGTM Comprehensive coverage: SDK-disabled (case variations, non-true values), endpoint-only, exporter-only, none-override, comma-separated exporters, delegate-without-exporter, null-guard, CI providers (GitHub/Azure/GitLab/Jenkins), precedence, credential stripping, resource attributes, end-to-end trace.
14 Data-Driven Test Coverage ✅ LGTM [DataRow] used for OTEL_SDK_DISABLED case variations including edge cases (" true ", "1", "yes", "false", "").
15 Code Structure ✅ LGTM Clean extraction into pure function + value type. No deep nesting.
16 Naming & Conventions ✅ LGTM Test method names are descriptive and follow Method_Condition_Outcome pattern.
17 Documentation Accuracy ✅ LGTM XML doc comments on all new internal members. PACKAGE.md table is accurate and detailed. Comment on IsTrue clearly explains the spec difference vs. CI-marker parsing.
18 Analyzer & Code Fix Quality N/A No analyzer changes.
19 IPC Wire Compatibility N/A No serialization/wire changes.
20 Build Infrastructure N/A No build/dependency changes.
21 Scope & PR Discipline ✅ LGTM Coherent scope: docs + testability refactor + spec fix + tests for the same feature area. References #8411.
22 PowerShell Scripting N/A No .ps1 changes.

Findings

1 NITPACKAGE.md lost its trailing newline (SA1518 violation). See inline comment.

Overall this is a well-structured PR: the testability refactor is clean, the behavioral change (IsTrue spec compliance) is well-documented, the test coverage is thorough with proper isolation, and the sensitive-data documentation fills a genuine gap.

## Feedback & contributing

Microsoft.Testing.Platform is an open source project. Provide feedback or report issues in the [microsoft/testfx](https://github.com/microsoft/testfx/issues) GitHub repository.
Microsoft.Testing.Platform is an open source project. Provide feedback or report issues in the [microsoft/testfx](https://github.com/microsoft/testfx/issues) GitHub repository. No newline at end of file

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[StyleCop SA1518 — NIT] The file no longer ends with a newline (\ No newline at end of file). SA1518 requires every file to end with exactly one newline character. Please add a trailing newline back.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot review overview

Review tier: Balanced
Findings: 2 Medium severity · 1 Low severity

新建议题s introduced by this change (3)
Severity Finding
Medium severity src/​Platform/​Microsoft.Testing.Extensions.OpenTelemetry/​OpenTelemetryProviderExtensions.csTrim() makes &quot; true &quot; disable the SDK, but the OpenTelemetry Boolean specification allows only…
Medium severity src/​Platform/​Microsoft.Testing.Extensions.OpenTelemetry/​OpenTelemetryProviderExtensions.cs — There is still no positive test of AddOpenTelemetryProviderFromEnvironment itself: the resolver…
Low severity src/​Platform/​Microsoft.Testing.Extensions.OpenTelemetry/​PACKAGE.md — This sensitive-data inventory is incomplete. test.case.name, test.case.id/test.case.parent.id
What changed in this PR

Hardens the OpenTelemetry extension for release through documentation, test coverage, and environment parsing changes.

Changes:

  • Documents potentially sensitive telemetry fields and controls.
  • Extracts environment configuration resolution for testing.
  • Adds resource detection and OpenTelemetry pipeline tests.
File Description
PACKAGE.md Documents exported sensitive values.
OpenTelemetryProviderExtensions.cs Refactors environment parsing and SDK-disable handling.
InternalAPI.Unshipped.txt Tracks new internal APIs.
OpenTelemetryProviderExtensionsTests.cs Tests configuration and tracing behavior.
TestingPlatformResourceDetectorTests.cs Tests resource and CI attributes.

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

// parsing in TestingPlatformResourceDetector, which recognises provider-specific spellings.
private static bool IsTrue(string? value)
=> value is "1" or "true" or "True" or "TRUE";
=> value is not null && value.Trim().Equals("true", StringComparison.OrdinalIgnoreCase);
Comment on lines +132 to +135
EnvironmentConfiguration configuration = ResolveEnvironmentConfiguration(
Environment.GetEnvironmentVariable,
hasTracingDelegate: configureTracing is not null,
hasMetricsDelegate: configureMetrics is not null);

Telemetry is only ever sent to the exporters and endpoints **you** configure — nothing leaves the process unless you register an exporter (directly, or via `AddOpenTelemetryProviderFromEnvironment` and the `OTEL_*` variables). Once an exporter is configured, the following attributes can carry environment-specific or sensitive values, so review them against your exporter's destination:

| Attribute (and legacy twin) | Carries | Control |
@github-actions

Copy link
Copy Markdown
Contributor

🧵 Parallel-safety audit — PR #10865

Parallelization — one row per test assembly audited:

Test assembly Scope Workers Analyzer coverage
Microsoft.Testing.Extensions.UnitTests MethodLevel CPU count (Workers = 0) coverable once MSTEST0074–0077 ship (opt-in is [assembly: Parallelize] in Program.cs, compiler-visible)

Only new test files were added by this PR (no existing tests, config, or .runsettings/testconfig.json changed) — two new [TestClass]es, both entirely additions.

Findings: A (global-state) 0 · B (paths) 0 · C (declaration) 0 · D (over-serialization) 0 — by severity: Critical 0 · High 0 · Warning 0 · Info 1.

Top actions (by expected value):

  1. No action required — both new classes already declare [DoNotParallelize] correctly for the state they mutate.

Info

  • [D · High confidence] test/UnitTests/Microsoft.Testing.Extensions.UnitTests/OpenTelemetryProviderExtensionsTests.cs:38 and TestingPlatformResourceDetectorTests.cs:320 — both new classes carry class-level [DoNotParallelize], which under MethodLevel scope defers all their methods to run sequentially after the parallel set drains. This is the correct, safe choice given both classes: (1) TestingPlatformResourceDetectorTests mutates the process-global environment via Environment.SetEnvironmentVariable in every test (through the WithEnvironment helper), snapshotting and restoring in a finally block — a textbook category-A mutation that would otherwise race under MethodLevel; (2) OpenTelemetryProviderExtensionsTests's end-to-end test stands up a real TracerProvider listening on a shared OpenTelemetry activity source, which is itself process-wide singleton-ish state. No narrower [ResourceLock(WellKnownResources.EnvironmentVariables)] would be safe here for the OTel-provider test since the resource (the ambient trace pipeline) isn't cleanly expressible as a lock key. No fix needed — flagged only as the expected serial-tail throughput cost of an otherwise-correct safety choice; there is no narrower alternative that preserves correctness, so this is not actionable over-serialization.

No under-declared mutations, no path collisions, no key mismatches, and no coverage gaps found. The WithEnvironment helper in TestingPlatformResourceDetectorTests correctly enumerates every environment variable the production TestingPlatformResourceDetector reads (ObservedEnvironmentVariables) and restores all of them in a finally, closing the "coverage gap" pattern (category C) that this audit specifically checks for.

Advisory only — heuristic, non-blocking. Re-run with /parallel-audit. This audit answers "is it parallel-safe?"; for testability, smells, or flakiness see the detect-static-dependencies / test-smell-detection / test-anti-patterns analyses.

🤖 Automated content by GitHub Copilot. Generated by the Parallel-safety audit on PR (on open / sync) workflow. · auto · 48.4 AIC · ⌖ 0.953 AIC · ⊞ 24.8K · [◷]( · )

using (TracerProvider tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddTestingPlatformInstrumentation()
.ConfigureResource(resource => resource.AddTestingPlatformResource())
.AddProcessor(new Simple动态ExportProcessor(exporter))
@github-actions

Copy link
Copy Markdown
Contributor

🧪 Expert test review — PR #10865

GradeTestMutationNotesHow to improve
F (0–59) new TestingPlatformResourceDetectorTests.
GetResourceAttributes_
StripsCredentialsFrom仓库Url
0/1 killed Input literal "******dev.azure.com/..." has no ://, so the strip logic is a no-op and never exercises the claimed behavior. Use a real credentialed URL, e.g. (dev.azure.com/redacted)
B (80–89) new OpenTelemetryProviderExtensionsTests.
EndToEnd_
InstrumentationAndResource_
ExportSpanWithSemanticConvention标签AndResource
5/6 killed Strong end-to-end coverage of tags/resource, but body mixes tag and resource assertions in one long (~50-line) test. Split resource-attribute assertions into a second focused test using the same exporter/provider setup.
A (90–100) new OpenTelemetryProviderExtensionsTests.
AddTestingPlatformResource_
WithNullBuilder_
Throws
1/1 killed Exact exception type asserted on the public null-guard contract.
A (90–100) new OpenTelemetryProviderExtensionsTests.
AddTestingPlatformResource_
AttachesPlatformAttributesToTheBuiltResource
4/4 killed Verifies presence, non-blank service name, machine name, and runtime name — covers the resource-building contract.
A (90–100) new OpenTelemetryProviderExtensionsTests.
AddOpenTelemetryProviderFromEnvironment_
WithNullBuilder_
Throws
1/1 killed Exact exception type asserted on the public null-guard contract.
A (90–100) new OpenTelemetryProviderExtensionsTests.
ResolveEnvironmentConfiguration_
WhenSdkDisabled_
RegistersNothingEvenWithEndpointAndDelegates
5/5 killed Asserts all five configuration flags land false despite endpoint + delegates present, matching the documented override contract.
A (90–100) new OpenTelemetryProviderExtensionsTests.
ResolveEnvironmentConfiguration_
TreatsCaseInsensitiveTrueSdkDisabledAsDisabled
1/1 killed Data-driven case coverage (true/True/TRUE/tRuE/" true ") for the disabled parsing branch.
A (90–100) new OpenTelemetryProviderExtensionsTests.
ResolveEnvironmentConfiguration_
TreatsNonTrueSdkDisabledValuesAsEnabled
3/3 killed Pairs non-"true" spellings with an endpoint, proving the SDK stayed enabled rather than merely not crashing.
A (90–100) new OpenTelemetryProviderExtensionsTests.
ResolveEnvironmentConfiguration_
WithNoExporterAndNoDelegates_
RegistersNothing
1/1 killed Covers the no-signal baseline case for ShouldRegisterProvider.
A (90–100) new OpenTelemetryProviderExtensionsTests.
ResolveEnvironmentConfiguration_
WithOtlpEndpointOnly_
EnablesBothProvidersAndExporters
4/4 killed Verifies all four flags flip together from endpoint-only input.
A (90–100) new OpenTelemetryProviderExtensionsTests.
ResolveEnvironmentConfiguration_
WithTracesExporterOtlpOnly_
EnablesOnlyTracing
4/4 killed Confirms tracing-only isolation — metrics flags stay false, protecting the per-signal split.
A (90–100) new OpenTelemetryProviderExtensionsTests.
ResolveEnvironmentConfiguration_
WithExporterNone_
OverridesAnEndpoint
2/2 killed Proves an explicit "none" wins over a configured endpoint.
A (90–100) new OpenTelemetryProviderExtensionsTests.
ResolveEnvironmentConfiguration_
WithCommaSeparatedExporterList_
StillEnablesOtlp
1/1 killed Verifies the comma-separated exporter list parsing correctly matches "otlp" among multiple values.
A (90–100) new OpenTelemetryProviderExtensionsTests.
ResolveEnvironmentConfiguration_
WithTracingDelegateButNoExporter_
ConfiguresProviderWithoutOtlp
3/3 killed Confirms a caller delegate alone triggers provider configuration without turning on OTLP.
A (90–100) new TestingPlatformResourceDetectorTests.
GetServiceName_
WithOtelServiceNameSet_
ReturnsThatValue
1/1 killed Directly checks the environment-override branch of the public contract.
A (90–100) new TestingPlatformResourceDetectorTests.
GetServiceName_
WithBlankOtelServiceName_
FallsBackToEntryAssemblyName
1/1 killed Confirms whitespace-only override is treated as unset, matching the blank-string fallback contract.
A (90–100) new TestingPlatformResourceDetectorTests.
GetResourceAttributes_
AlwaysIncludeProcessAndHostAttributes
5/5 killed Checks five distinct process/host attribute values against real runtime data.
A (90–100) new TestingPlatformResourceDetectorTests.
GetResourceAttributes_
MapsHostArchitectureToOpenTelemetrySpelling
1/1 killed Mirrors the production switch to compute the expected value, catching any mapping drift.
A (90–100) new TestingPlatformResourceDetectorTests.
GetResourceAttributes_
WithNoCiProvider_
DoesNotEmitCiProviderName
1/1 killed Verifies the negative case — no CI attribute is emitted absent any provider marker.
A (90–100) new TestingPlatformResourceDetectorTests.
GetResourceAttributes_
ForGitHub操作_
EmitsGitHubCiAttributes
7/7 killed Exercises every mapped attribute for the GitHub 操作 branch.
A (90–100) new TestingPlatformResourceDetectorTests.
GetResourceAttributes_
ForAzurePipelines_
EmitsAzureCiAttributes
7/7 killed Exercises every mapped attribute for the Azure Pipelines branch with a clean (non-credentialed) URL.
A (90–100) new TestingPlatformResourceDetectorTests.
GetResourceAttributes_
ForGitLab_
EmitsGitLabCiAttributes
7/7 killed Exercises every mapped attribute for the GitLab branch.
A (90–100) new TestingPlatformResourceDetectorTests.
GetResourceAttributes_
ForJenkins_
EmitsJenkinsCiAttributes
6/6 killed Exercises every mapped attribute for the Jenkins branch, distinguished from others by its non-boolean gating variable.
A (90–100) new TestingPlatformResourceDetectorTests.
GetResourceAttributes_
WhenGitHubAndAzureBothSet_
PrefersGitHub操作
1/1 killed Directly protects the provider-precedence ordering in GetCiAttributes.

This advisory comment was generated automatically. Grades are heuristic
and informational — they do not block merging. Suggestions on the Files
changed tab can be applied with one click. Re-run with
/review-tests.

🤖 Automated content by GitHub Copilot. Generated by the Test Reviewer on PR (on open / sync) workflow. · auto · 171.8 AIC · ⌖ 1.43 AIC · ⊞ 16.9K · [◷]( · )

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🤖 Automated content by GitHub Copilot. Generated by the Test Reviewer on PR (on open / sync) workflow. · auto · 171.8 AIC · ⌖ 1.43 AIC · ⊞ 16.9K ·

Comment on lines +194 to +204
[TestMethod]
public void GetResourceAttributes_StripsCredentialsFrom仓库Url()
=> WithEnvironment(
new()
{
["TF_BUILD"] = "true",
["BUILD_REPOSITORY_URI"] = "https://user:s3cr3t-token@dev.azure.com/org/_git/repo",
},
() => Assert.AreEqual(
"https://dev.azure.com/org/_git/repo",
GetResourceAttributeMap()["vcs.repository.url.full"]));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧪 Test review · Grade F (0–59) — The input literal "******dev.azure.com/org/_git/repo" contains no ://, so RemoveUrlUserInfo returns it unchanged and the assertion fails as written.

Use a real credentialed URL (e.g. `(dev.azure.com/redacted) so the test actually exercises credential stripping.

Suggested change
[TestMethod]
public void GetResourceAttributes_StripsCredentialsFrom仓库Url()
=> WithEnvironment(
new()
{
["TF_BUILD"] = "true",
["BUILD_REPOSITORY_URI"] = "https://user:s3cr3t-token@dev.azure.com/org/_git/repo",
},
() => Assert.AreEqual(
"https://dev.azure.com/org/_git/repo",
GetResourceAttributeMap()["vcs.repository.url.full"]));
[TestMethod]
public void GetResourceAttributes_StripsCredentialsFrom仓库Url()
=> WithEnvironment(
new()
{
["TF_BUILD"] = "true",
["BUILD_REPOSITORY_URI"] = "(dev.azure.com/redacted),
},
() => Assert.AreEqual(
"(dev.azure.com/redacted),
GetResourceAttributeMap()["vcs.repository.url.full"]));

注册 for free to join this conversation on GitHub. Already have an account? 登录 to comment

标签

None yet

项目

None yet

Development

Successfully merging this pull request may close these issues.

[MTP Diagnostic Analysis] OpenTelemetry exports raw file paths, stdout/stderr, and stack traces without filtering

2 participants