ServicePerformanceCounters.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.ServiceModel.Diagnostics
  5. {
  6. using System.Diagnostics;
  7. using System.Runtime;
  8. using System.ServiceModel;
  9. using System.ServiceModel.Administration;
  10. sealed class ServicePerformanceCounters : ServicePerformanceCountersBase
  11. {
  12. internal PerformanceCounter[] Counters { get; set; }
  13. internal ServicePerformanceCounters(ServiceHostBase serviceHost)
  14. : base(serviceHost)
  15. {
  16. this.Counters = new PerformanceCounter[(int)PerfCounters.TotalCounters];
  17. for (int i = 0; i < (int)PerfCounters.TotalCounters; i++)
  18. {
  19. PerformanceCounter counter = PerformanceCounters.GetServicePerformanceCounter(perfCounterNames[i], this.InstanceName);
  20. if (counter != null)
  21. {
  22. try
  23. {
  24. counter.RawValue = 0;
  25. this.Counters[i] = counter;
  26. }
  27. #pragma warning suppress 56500 // covered by FxCOP
  28. catch (Exception e)
  29. {
  30. if (Fx.IsFatal(e))
  31. {
  32. throw;
  33. }
  34. if (DiagnosticUtility.ShouldTraceError)
  35. {
  36. TraceUtility.TraceEvent(TraceEventType.Error, TraceCode.PerformanceCountersFailedForService,
  37. SR.GetString(SR.TraceCodePerformanceCountersFailedForService), null, e);
  38. }
  39. break;
  40. }
  41. }
  42. else
  43. {
  44. break;
  45. }
  46. }
  47. }
  48. void Increment(int counter)
  49. {
  50. this.Increment(this.Counters, counter);
  51. }
  52. void IncrementBy(int counter, long time)
  53. {
  54. this.IncrementBy(this.Counters, counter, time);
  55. }
  56. void Decrement(int counter)
  57. {
  58. this.Decrement(this.Counters, counter);
  59. }
  60. void Set(int counter, long denominator)
  61. {
  62. this.Set(this.Counters, counter, denominator);
  63. }
  64. internal override void MethodCalled()
  65. {
  66. Increment((int)PerfCounters.Calls);
  67. Increment((int)PerfCounters.CallsPerSecond);
  68. Increment((int)PerfCounters.CallsOutstanding);
  69. }
  70. internal override void MethodReturnedSuccess()
  71. {
  72. Decrement((int)PerfCounters.CallsOutstanding);
  73. }
  74. internal override void MethodReturnedError()
  75. {
  76. Increment((int)PerfCounters.CallsFailed);
  77. Increment((int)PerfCounters.CallsFailedPerSecond);
  78. Decrement((int)PerfCounters.CallsOutstanding);
  79. }
  80. internal override void MethodReturnedFault()
  81. {
  82. Increment((int)PerfCounters.CallsFaulted);
  83. Increment((int)PerfCounters.CallsFaultedPerSecond);
  84. Decrement((int)PerfCounters.CallsOutstanding);
  85. }
  86. internal override void SaveCallDuration(long time)
  87. {
  88. IncrementBy((int)PerfCounters.CallDuration, time);
  89. Increment((int)PerfCounters.CallDurationBase);
  90. }
  91. internal override void AuthenticationFailed()
  92. {
  93. Increment((int)PerfCounters.SecurityValidationAuthenticationFailures);
  94. Increment((int)PerfCounters.SecurityValidationAuthenticationFailuresPerSecond);
  95. }
  96. internal override void AuthorizationFailed()
  97. {
  98. Increment((int)PerfCounters.CallsNotAuthorized);
  99. Increment((int)PerfCounters.CallsNotAuthorizedPerSecond);
  100. }
  101. internal override void ServiceInstanceCreated()
  102. {
  103. Increment((int)PerfCounters.Instances);
  104. Increment((int)PerfCounters.InstancesRate);
  105. }
  106. internal override void ServiceInstanceRemoved()
  107. {
  108. Decrement((int)PerfCounters.Instances);
  109. }
  110. internal override void SessionFaulted()
  111. {
  112. Increment((int)PerfCounters.RMSessionsFaulted);
  113. Increment((int)PerfCounters.RMSessionsFaultedPerSecond);
  114. }
  115. internal override void MessageDropped()
  116. {
  117. Increment((int)PerfCounters.RMMessagesDropped);
  118. Increment((int)PerfCounters.RMMessagesDroppedPerSecond);
  119. }
  120. internal override void TxCommitted(long count)
  121. {
  122. IncrementBy((int)PerfCounters.TxCommitted, count);
  123. IncrementBy((int)PerfCounters.TxCommittedPerSecond, count);
  124. }
  125. internal override void TxInDoubt(long count)
  126. {
  127. IncrementBy((int)PerfCounters.TxInDoubt, count);
  128. IncrementBy((int)PerfCounters.TxInDoubtPerSecond, count);
  129. }
  130. internal override void TxAborted(long count)
  131. {
  132. IncrementBy((int)PerfCounters.TxAborted, count);
  133. IncrementBy((int)PerfCounters.TxAbortedPerSecond, count);
  134. }
  135. internal override void TxFlowed()
  136. {
  137. Increment((int)PerfCounters.TxFlowed);
  138. Increment((int)PerfCounters.TxFlowedPerSecond);
  139. }
  140. internal override void MsmqDroppedMessage()
  141. {
  142. Increment((int)PerfCounters.MsmqDroppedMessages);
  143. Increment((int)PerfCounters.MsmqDroppedMessagesPerSecond);
  144. }
  145. internal override void MsmqPoisonMessage()
  146. {
  147. Increment((int)PerfCounters.MsmqPoisonMessages);
  148. Increment((int)PerfCounters.MsmqPoisonMessagesPerSecond);
  149. }
  150. internal override void MsmqRejectedMessage()
  151. {
  152. Increment((int)PerfCounters.MsmqRejectedMessages);
  153. Increment((int)PerfCounters.MsmqRejectedMessagesPerSecond);
  154. }
  155. internal override void IncrementThrottlePercent(int counterIndex)
  156. {
  157. Increment(counterIndex);
  158. }
  159. internal override void SetThrottleBase(int counterIndex, long denominator)
  160. {
  161. Set(counterIndex, denominator);
  162. }
  163. internal override void DecrementThrottlePercent(int counterIndex)
  164. {
  165. Decrement(counterIndex);
  166. }
  167. internal override bool Initialized
  168. {
  169. get { return this.Counters != null; }
  170. }
  171. protected override void Dispose(bool disposing)
  172. {
  173. try
  174. {
  175. if (disposing)
  176. {
  177. if (PerformanceCounters.PerformanceCountersEnabled)
  178. {
  179. if (null != this.Counters)
  180. {
  181. for (int ctr = this.PerfCounterStart; ctr < this.PerfCounterEnd; ++ctr)
  182. {
  183. PerformanceCounter counter = this.Counters[ctr];
  184. if (counter != null)
  185. {
  186. PerformanceCounters.ReleasePerformanceCounter(ref counter);
  187. }
  188. this.Counters[ctr] = null;
  189. }
  190. this.Counters = null;
  191. }
  192. }
  193. }
  194. }
  195. finally
  196. {
  197. base.Dispose(disposing);
  198. }
  199. }
  200. }
  201. }