@@ -19,30 +19,15 @@ namespace ModelContextProtocol.Shared;
1919/// </summary>
2020internal sealed class McpSession : IDisposable
2121{
22- private static readonly ActivitySource s_activitySource = new ( "ModelContextProtocol" ) ;
22+ private static readonly Histogram < double > s_clientSessionDuration = Diagnostics . Meter . CreateHistogram < double > (
23+ "mcp.client.session.duration" , "s" , "Measures the duration of a client session." , advice : Diagnostics . LongSecondsBucketBoundaries ) ;
24+ private static readonly Histogram < double > s_serverSessionDuration = Diagnostics . Meter . CreateHistogram < double > (
25+ "mcp.server.session.duration" , "s" , "Measures the duration of a server session." , advice : Diagnostics . LongSecondsBucketBoundaries ) ;
2326
24- private static readonly InstrumentAdvice < double > s_shortSecondsBucketBoundaries = new ( )
25- {
26- // Follows boundaries from http.server.request.duration/http.client.request.duration
27- HistogramBucketBoundaries = [ 0.005 , 0.01 , 0.025 , 0.05 , 0.075 , 0.1 , 0.25 , 0.5 , 0.75 , 1 , 2.5 , 5 , 7.5 , 10 ] ,
28- } ;
29-
30- private static readonly InstrumentAdvice < double > s_longSecondsBucketBoundaries = new ( )
31- {
32- // Not based on a standard. Larger bucket sizes for longer lasting operations, e.g. HTTP connection duration.
33- // See https://github.com/open-telemetry/semantic-conventions/issues/336
34- HistogramBucketBoundaries = [ 0.01 , 0.02 , 0.05 , 0.1 , 0.2 , 0.5 , 1 , 2 , 5 , 10 , 30 , 60 , 120 , 300 ] ,
35- } ;
36-
37- private static readonly Meter s_meter = new ( "ModelContextProtocol" ) ;
38- private static readonly Histogram < double > s_clientSessionDuration = s_meter . CreateHistogram < double > (
39- "mcp.client.session.duration" , "s" , "Measures the duration of a client session." , advice : s_longSecondsBucketBoundaries ) ;
40- private static readonly Histogram < double > s_serverSessionDuration = s_meter . CreateHistogram < double > (
41- "mcp.server.session.duration" , "s" , "Measures the duration of a server session." , advice : s_longSecondsBucketBoundaries ) ;
42- private static readonly Histogram < double > s_serverRequestDuration = s_meter . CreateHistogram < double > (
43- "rpc.server.duration" , "s" , "Measures the duration of inbound RPC." , advice : s_shortSecondsBucketBoundaries ) ;
44- private static readonly Histogram < double > s_clientRequestDuration = s_meter . CreateHistogram < double > (
45- "rpc.client.duration" , "s" , "Measures the duration of outbound RPC." , advice : s_shortSecondsBucketBoundaries ) ;
27+ private static readonly Histogram < double > s_serverRequestDuration = Diagnostics . Meter . CreateHistogram < double > (
28+ "rpc.server.duration" , "s" , "Measures the duration of inbound RPC." , advice : Diagnostics . ShortSecondsBucketBoundaries ) ;
29+ private static readonly Histogram < double > s_clientRequestDuration = Diagnostics . Meter . CreateHistogram < double > (
30+ "rpc.client.duration" , "s" , "Measures the duration of outbound RPC." , advice : Diagnostics . ShortSecondsBucketBoundaries ) ;
4631
4732 private readonly bool _isServer ;
4833 private readonly string _transportKind ;
@@ -198,12 +183,12 @@ private async Task HandleMessageAsync(IJsonRpcMessage message, CancellationToken
198183 string method = GetMethodName ( message ) ;
199184
200185 long ? startingTimestamp = durationMetric . Enabled ? Stopwatch . GetTimestamp ( ) : null ;
201- Activity ? activity = s_activitySource . HasListeners ( ) ?
202- s_activitySource . StartActivity ( CreateActivityName ( method ) ) :
186+ Activity ? activity = Diagnostics . ActivitySource . HasListeners ( ) ?
187+ Diagnostics . ActivitySource . StartActivity ( CreateActivityName ( method ) ) :
203188 null ;
204189
205190 TagList tags = default ;
206- bool addTags = activity is not null || startingTimestamp is not null ;
191+ bool addTags = activity is { IsAllDataRequested : true } || startingTimestamp is not null ;
207192 try
208193 {
209194 if ( addTags )
@@ -341,8 +326,8 @@ public async Task<TResult> SendRequestAsync<TResult>(JsonRpcRequest request, Can
341326 string method = request . Method ;
342327
343328 long ? startingTimestamp = durationMetric . Enabled ? Stopwatch . GetTimestamp ( ) : null ;
344- using Activity ? activity = s_activitySource . HasListeners ( ) ?
345- s_activitySource . StartActivity ( CreateActivityName ( method ) ) :
329+ using Activity ? activity = Diagnostics . ActivitySource . HasListeners ( ) ?
330+ Diagnostics . ActivitySource . StartActivity ( CreateActivityName ( method ) ) :
346331 null ;
347332
348333 // Set request ID
@@ -352,7 +337,7 @@ public async Task<TResult> SendRequestAsync<TResult>(JsonRpcRequest request, Can
352337 }
353338
354339 TagList tags = default ;
355- bool addTags = activity is not null || startingTimestamp is not null ;
340+ bool addTags = activity is { IsAllDataRequested : true } || startingTimestamp is not null ;
356341
357342 var tcs = new TaskCompletionSource < IJsonRpcMessage > ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
358343 _pendingRequests [ request . Id ] = tcs ;
@@ -434,12 +419,12 @@ public async Task SendMessageAsync(IJsonRpcMessage message, CancellationToken ca
434419 string method = GetMethodName ( message ) ;
435420
436421 long ? startingTimestamp = durationMetric . Enabled ? Stopwatch . GetTimestamp ( ) : null ;
437- using Activity ? activity = s_activitySource . HasListeners ( ) ?
438- s_activitySource . StartActivity ( CreateActivityName ( method ) ) :
422+ using Activity ? activity = Diagnostics . ActivitySource . HasListeners ( ) ?
423+ Diagnostics . ActivitySource . StartActivity ( CreateActivityName ( method ) ) :
439424 null ;
440425
441426 TagList tags = default ;
442- bool addTags = activity is not null || startingTimestamp is not null ;
427+ bool addTags = activity is { IsAllDataRequested : true } || startingTimestamp is not null ;
443428
444429 try
445430 {
@@ -516,6 +501,7 @@ private string GetMethodName(IJsonRpcMessage message) =>
516501
517502 private void AddStandardTags ( ref TagList tags , string method )
518503 {
504+ tags . Add ( "session.id" , _id ) ;
519505 tags . Add ( "rpc.system" , "jsonrpc" ) ;
520506 tags . Add ( "rpc.jsonrpc.version" , "2.0" ) ;
521507 tags . Add ( "rpc.method" , method ) ;
@@ -581,7 +567,7 @@ private static void FinalizeDiagnostics(
581567 durationMetric . Record ( GetElapsed ( startingTimestamp . Value ) . TotalSeconds , tags ) ;
582568 }
583569
584- if ( activity is not null )
570+ if ( activity is { IsAllDataRequested : true } )
585571 {
586572 foreach ( var tag in tags )
587573 {
@@ -600,7 +586,10 @@ public void Dispose()
600586 Histogram < double > durationMetric = _isServer ? s_serverSessionDuration : s_clientSessionDuration ;
601587 if ( durationMetric . Enabled )
602588 {
603- durationMetric . Record ( GetElapsed ( _sessionStartingTimestamp ) . TotalSeconds ) ;
589+ TagList tags = default ;
590+ tags . Add ( "session.id" , _id ) ;
591+ tags . Add ( "network.transport" , _transportKind ) ;
592+ durationMetric . Record ( GetElapsed ( _sessionStartingTimestamp ) . TotalSeconds , tags ) ;
604593 }
605594
606595 // Complete all pending requests with cancellation
0 commit comments