@@ -19,30 +19,15 @@ namespace ModelContextProtocol.Shared;
19
19
/// </summary>
20
20
internal sealed class McpSession : IDisposable
21
21
{
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 ) ;
23
26
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 ) ;
46
31
47
32
private readonly bool _isServer ;
48
33
private readonly string _transportKind ;
@@ -198,12 +183,12 @@ private async Task HandleMessageAsync(IJsonRpcMessage message, CancellationToken
198
183
string method = GetMethodName ( message ) ;
199
184
200
185
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 ) ) :
203
188
null ;
204
189
205
190
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 ;
207
192
try
208
193
{
209
194
if ( addTags )
@@ -341,8 +326,8 @@ public async Task<TResult> SendRequestAsync<TResult>(JsonRpcRequest request, Can
341
326
string method = request . Method ;
342
327
343
328
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 ) ) :
346
331
null ;
347
332
348
333
// Set request ID
@@ -352,7 +337,7 @@ public async Task<TResult> SendRequestAsync<TResult>(JsonRpcRequest request, Can
352
337
}
353
338
354
339
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 ;
356
341
357
342
var tcs = new TaskCompletionSource < IJsonRpcMessage > ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
358
343
_pendingRequests [ request . Id ] = tcs ;
@@ -434,12 +419,12 @@ public async Task SendMessageAsync(IJsonRpcMessage message, CancellationToken ca
434
419
string method = GetMethodName ( message ) ;
435
420
436
421
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 ) ) :
439
424
null ;
440
425
441
426
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 ;
443
428
444
429
try
445
430
{
@@ -516,6 +501,7 @@ private string GetMethodName(IJsonRpcMessage message) =>
516
501
517
502
private void AddStandardTags ( ref TagList tags , string method )
518
503
{
504
+ tags . Add ( "session.id" , _id ) ;
519
505
tags . Add ( "rpc.system" , "jsonrpc" ) ;
520
506
tags . Add ( "rpc.jsonrpc.version" , "2.0" ) ;
521
507
tags . Add ( "rpc.method" , method ) ;
@@ -581,7 +567,7 @@ private static void FinalizeDiagnostics(
581
567
durationMetric . Record ( GetElapsed ( startingTimestamp . Value ) . TotalSeconds , tags ) ;
582
568
}
583
569
584
- if ( activity is not null )
570
+ if ( activity is { IsAllDataRequested : true } )
585
571
{
586
572
foreach ( var tag in tags )
587
573
{
@@ -600,7 +586,10 @@ public void Dispose()
600
586
Histogram < double > durationMetric = _isServer ? s_serverSessionDuration : s_clientSessionDuration ;
601
587
if ( durationMetric . Enabled )
602
588
{
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 ) ;
604
593
}
605
594
606
595
// Complete all pending requests with cancellation
0 commit comments