Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Jan 28, 2026

This PR enables logging of all JSON-RPC payloads at the Trace level for visibility into wire-level protocol traffic.

Summary

Changes Made

Logger Methods in TransportBase:

  • LogTransportSendingMessageSensitive(string, string) - (Trace level) logs the full JSON payload
  • LogTransportSendingMessageSensitive(JsonRpcMessage) - overload that encapsulates the IsEnabled check and serialization (only this overload needs internal guarding since it does serialization)

Updated Transports (simplified - no external guards needed since arguments are cheap):

  • StreamServerTransport - server-side stream transport
  • StreamClientSessionTransport - client-side stream transport
  • SseClientSessionTransport - client-side SSE transport
  • StreamableHttpClientSessionTransport - client-side HTTP transport

Tests Added:

  • SendMessageAsync_Should_Log_At_Trace_Level
  • ReadMessagesAsync_Should_Log_Received_At_Trace_Level

Usage

To enable JSON-RPC payload logging, configure the logging level to Trace:

builder.Logging.SetMinimumLevel(LogLevel.Trace);

When Trace logging is enabled, you'll see messages like:

trce: Server (stream) transport sending message. Message: '{"jsonrpc":"2.0","method":"tools/list","id":1}'
trce: Server (stream) transport received message. Message: '{"jsonrpc":"2.0","result":{"tools":[]},"id":1}'

The LogTransportSendingMessageSensitive(JsonRpcMessage) overload internally checks IsEnabled(LogLevel.Trace) before serializing to avoid expensive serialization when trace logging is disabled. For call sites passing already-serialized strings, no external guard is needed since the source-generated logger methods handle the check internally.


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

- Add LogTransportSendingMessage and LogTransportSendingMessageSensitive to TransportBase
- Update StreamServerTransport to log sent messages at Trace level
- Update StreamClientSessionTransport to log sent messages at Trace level
- Update SseClientSessionTransport to log sent messages at Trace level
- Update StreamableHttpClientSessionTransport to log sent messages at Trace level
- Add tests for Trace-level logging of sent and received messages

Co-authored-by: stephentoub <[email protected]>
Copilot AI changed the title [WIP] Add logging for JSON RPC payloads at Trace level Add Trace-level logging for JSON-RPC payloads in transports Jan 28, 2026
Copilot AI requested a review from stephentoub January 28, 2026 22:54
…ssages

Addresses review feedback to only have Trace-level logging for JSON-RPC payloads.

Co-authored-by: stephentoub <[email protected]>
@stephentoub
Copy link
Contributor

@copilot it looks like you've only adding tracing for sent payloads... what about received payloads?

Wrap logging calls with Logger.IsEnabled(LogLevel.Trace) to avoid
expensive JSON serialization when trace logging is not enabled.

Co-authored-by: stephentoub <[email protected]>
Guard LogTransportReceivedMessageSensitive calls with IsEnabled(LogLevel.Trace)
checks to avoid unnecessary work when trace logging is disabled.

Co-authored-by: stephentoub <[email protected]>
Copy link
Contributor Author

Copilot AI commented Jan 28, 2026

@copilot it looks like you've only adding tracing for sent payloads... what about received payloads?

The received message logging already existed via LogTransportReceivedMessageSensitive. I've now added IsEnabled(LogLevel.Trace) guards around those calls as well in 669781d to ensure consistency with the sent message logging.

Add an overload that takes a JsonRpcMessage directly, encapsulating
the IsEnabled check and JSON serialization to simplify call sites.

Co-authored-by: stephentoub <[email protected]>
Since the arguments to logging calls are just passing existing variables
(no expensive work), the external guards are redundant - the source-generated
logger methods handle the IsEnabled check internally.

Co-authored-by: stephentoub <[email protected]>
Copilot AI requested a review from stephentoub January 28, 2026 23:22
@stephentoub stephentoub marked this pull request as ready for review January 29, 2026 01:15
@stephentoub stephentoub requested a review from halter73 January 29, 2026 01:15
public async Task SendMessageAsync_Should_Log_At_Trace_Level()
{
// Arrange
var mockLoggerProvider = new MockLoggerProvider();
Copy link

Choose a reason for hiding this comment

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

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.

3 participants