-
Notifications
You must be signed in to change notification settings - Fork 767
/
GrpcEventSource.cs
168 lines (142 loc) · 5.28 KB
/
GrpcEventSource.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#region Copyright notice and license
// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#endregion
using System.Diagnostics.Tracing;
using System.Runtime.CompilerServices;
using Grpc.Core;
namespace Grpc.AspNetCore.Server.Internal;
internal class GrpcEventSource : EventSource
{
public static readonly GrpcEventSource Log = new GrpcEventSource();
private PollingCounter? _totalCallsCounter;
private PollingCounter? _currentCallsCounter;
private PollingCounter? _messagesSentCounter;
private PollingCounter? _messagesReceivedCounter;
private PollingCounter? _callsFailedCounter;
private PollingCounter? _callsDeadlineExceededCounter;
private PollingCounter? _callsUnimplementedCounter;
private long _totalCalls;
private long _currentCalls;
private long _messageSent;
private long _messageReceived;
private long _callsFailed;
private long _callsDeadlineExceeded;
private long _callsUnimplemented;
internal GrpcEventSource()
: base("Grpc.AspNetCore.Server")
{
}
[NonEvent]
internal void ResetCounters()
{
_totalCalls = 0;
_currentCalls = 0;
_messageSent = 0;
_messageReceived = 0;
_callsFailed = 0;
_callsDeadlineExceeded = 0;
}
// Used for testing
internal GrpcEventSource(string eventSourceName)
: base(eventSourceName)
{
}
[MethodImpl(MethodImplOptions.NoInlining)]
[Event(eventId: 1, Level = EventLevel.Verbose)]
public void CallStart(string method)
{
Interlocked.Increment(ref _totalCalls);
Interlocked.Increment(ref _currentCalls);
WriteEvent(1, method);
}
[MethodImpl(MethodImplOptions.NoInlining)]
[Event(eventId: 2, Level = EventLevel.Verbose)]
public void CallStop()
{
Interlocked.Decrement(ref _currentCalls);
WriteEvent(2);
}
[MethodImpl(MethodImplOptions.NoInlining)]
[Event(eventId: 3, Level = EventLevel.Error)]
public void CallFailed(StatusCode statusCode)
{
Interlocked.Increment(ref _callsFailed);
WriteEvent(3, (int)statusCode);
}
[MethodImpl(MethodImplOptions.NoInlining)]
[Event(eventId: 4, Level = EventLevel.Error)]
public void CallDeadlineExceeded()
{
Interlocked.Increment(ref _callsDeadlineExceeded);
WriteEvent(4);
}
[MethodImpl(MethodImplOptions.NoInlining)]
[Event(eventId: 5, Level = EventLevel.Verbose)]
public void MessageSent()
{
Interlocked.Increment(ref _messageSent);
WriteEvent(5);
}
[MethodImpl(MethodImplOptions.NoInlining)]
[Event(eventId: 6, Level = EventLevel.Verbose)]
public void MessageReceived()
{
Interlocked.Increment(ref _messageReceived);
WriteEvent(6);
}
[MethodImpl(MethodImplOptions.NoInlining)]
[Event(eventId: 7, Level = EventLevel.Verbose)]
public void CallUnimplemented(string method)
{
Interlocked.Increment(ref _callsUnimplemented);
WriteEvent(7, method);
}
protected override void OnEventCommand(EventCommandEventArgs command)
{
if (command.Command == EventCommand.Enable)
{
// This is the convention for initializing counters in the RuntimeEventSource (lazily on the first enable command).
// They aren't disabled afterwards...
_totalCallsCounter ??= new PollingCounter("total-calls", this, () => Volatile.Read(ref _totalCalls))
{
DisplayName = "Total Calls",
};
_currentCallsCounter ??= new PollingCounter("current-calls", this, () => Volatile.Read(ref _currentCalls))
{
DisplayName = "Current Calls"
};
_callsFailedCounter ??= new PollingCounter("calls-failed", this, () => Volatile.Read(ref _callsFailed))
{
DisplayName = "Total Calls Failed",
};
_callsDeadlineExceededCounter ??= new PollingCounter("calls-deadline-exceeded", this, () => Volatile.Read(ref _callsDeadlineExceeded))
{
DisplayName = "Total Calls Deadline Exceeded",
};
_messagesSentCounter ??= new PollingCounter("messages-sent", this, () => Volatile.Read(ref _messageSent))
{
DisplayName = "Total Messages Sent",
};
_messagesReceivedCounter ??= new PollingCounter("messages-received", this, () => Volatile.Read(ref _messageReceived))
{
DisplayName = "Total Messages Received",
};
_callsUnimplementedCounter ??= new PollingCounter("calls-unimplemented", this, () => Volatile.Read(ref _callsUnimplemented))
{
DisplayName = "Total Calls Unimplemented",
};
}
}
}