Skip to content
aryehcitron@gmail.com edited this page May 17, 2026 · 4 revisions

FAQ

Frequently asked questions about Kronikol.


Do I need to change production code?

No — most extensions use DI decoration (DecorateAll<T>), DelegatingHandlers, or DiagnosticSource listeners. Tracking is added entirely in your test project's ConfigureTestServices. A few extensions offer optional one-token changes (e.g. .BuildTracked() for Kafka) but these are no-ops outside test context.


Why is my dependency showing as "Unknown"?

Test identity isn't propagating to the thread running the dependency call. This is common with background threads, change feed processors, and hosted services. See Background Thread Correlation for the resolution chain (HTTP headers → delegate → TestIdentityScope.CurrentGlobalFallback) and how to wire each level.


What's the difference between MessageTracker and TestTrackingMessageHandler?

TestTrackingMessageHandler is a DelegatingHandler for HTTP pipelines — it intercepts HttpClient calls. MessageTracker is for non-HTTP messaging (Service Bus, Kafka, EventHubs, etc.) and provides TrackSendEvent() / TrackConsumeEvent() / TrackSendMessage() methods. See Event & Message Tracking for a detailed comparison.


Why is my diagram empty?

The most common cause is forgetting to enqueue the test context. In your fixture's DisposeAsync():

DiagrammedTestRun.TestContexts.Enqueue(TestContext.Current);

Run with DiagnosticMode = true for a detailed breakdown. See Diagnostics and Debugging.


My diagrams are too wide / have massive token strings

See Filtering and Redacting Diagram Content — My Diagrams Are Too Wide. The quickest fix is RequestResponseLogger.MaxContentLength = 2000; in test setup.


Can I use this without a PlantUML server?

Yes — two options:

  1. Browser-side rendering (default): Uses a self-hosted PlantUML JS library (TeaVM-compiled) that runs entirely in the browser. No server needed. See PlantUML Browser Rendering.

How do I track Change Feed processing in parallel tests?

Use the TestCorrelationStore system (v2.36.0+). The CosmosDB tracking extension auto-populates correlations on write, and ChangeFeedCorrelation.Wrap<T>() resolves them at processing time. No production code changes needed. See Parallel-Safe Background Correlation.


My consumer is tracked but downstream HTTP calls show as "Unknown"

This usually means a decoupled processing pattern — the consumer thread has AsyncLocal set but passes work through a Channel<T> or queue to a processing thread that doesn't. Wrap the processing side with ProcessingCorrelation.Wrap<T>(). See Parallel-Safe Background Correlation#setup-guide-decoupled-kafkaservicebus-consumer.


What's the difference between GlobalFallback and TestCorrelationStore?

GlobalFallback is a single process-wide static — only safe for serial execution. TestCorrelationStore is a concurrent dictionary keyed by work-item, so each test's operations are attributed correctly even under parallel execution. Use TestCorrelationStore for new code; GlobalFallback for legacy serial-only fixtures. See Parallel-Safe Background Correlation#comparison-table. 2. IKVM local rendering: Runs PlantUML in-process via IKVM (Java-to-.NET bridge). No network calls. See Integration PlantUML IKVM.


How does test identity propagation work?

Four-level resolution chain, checked in order:

  1. HTTP request headers (X-Test-Name / X-Test-Id) — propagated by TestTrackingMessageHandler
  2. CurrentTestInfoFetcher delegate — set on options, framework-specific
  3. TestIdentityScope.CurrentAsyncLocal ambient scope (for background threads)
  4. TestIdentityScope.GlobalFallback — static fallback (for pre-existing threads)

See Background Thread Correlation for setup examples.


How do I see what's being tracked at runtime?

Enable diagnostic mode:

new ReportConfigurationOptions { DiagnosticMode = true }

This generates a DiagnosticReport.html alongside your test report showing all registered tracking components, unmatched client names, unknown entries, and HttpContextAccessor status. See Diagnostics and Debugging.


See Also

Home


Demo


Getting Started

Common Tasks

Integration Guides

Extensions

Configuration

Features

Reference

Clone this wiki locally