DefaultPerformanceCounters.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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. internal class DefaultPerformanceCounters : PerformanceCountersBase
  10. {
  11. string instanceName;
  12. enum PerfCounters : int
  13. {
  14. Instances = 0,
  15. TotalCounters = Instances + 1
  16. }
  17. string[] perfCounterNames =
  18. {
  19. PerformanceCounterStrings.SERVICEMODELSERVICE.SInstances,
  20. };
  21. const int maxCounterLength = 64;
  22. const int hashLength = 2;
  23. [Flags]
  24. enum truncOptions : uint
  25. {
  26. NoBits = 0,
  27. service32 = 0x01,
  28. uri31 = 0x04
  29. }
  30. internal PerformanceCounter[] Counters { get; set; }
  31. internal override string InstanceName
  32. {
  33. get
  34. {
  35. return this.instanceName;
  36. }
  37. }
  38. internal override string[] CounterNames
  39. {
  40. get
  41. {
  42. return this.perfCounterNames;
  43. }
  44. }
  45. internal override int PerfCounterStart
  46. {
  47. get { return (int)PerfCounters.Instances; }
  48. }
  49. internal override int PerfCounterEnd
  50. {
  51. get { return (int)PerfCounters.TotalCounters; }
  52. }
  53. static internal string CreateFriendlyInstanceName(ServiceHostBase serviceHost)
  54. {
  55. // It is a shared instance across all services which have the default counter enabled
  56. return "_WCF_Admin";
  57. }
  58. internal DefaultPerformanceCounters(ServiceHostBase serviceHost)
  59. {
  60. this.instanceName = DefaultPerformanceCounters.CreateFriendlyInstanceName(serviceHost);
  61. this.Counters = new PerformanceCounter[(int)PerfCounters.TotalCounters];
  62. for (int i = 0; i < (int)PerfCounters.TotalCounters; i++)
  63. {
  64. try
  65. {
  66. PerformanceCounter counter = PerformanceCounters.GetDefaultPerformanceCounter(this.perfCounterNames[i], this.instanceName);
  67. if (counter != null)
  68. {
  69. this.Counters[i] = counter;
  70. }
  71. else
  72. {
  73. break;
  74. }
  75. }
  76. #pragma warning suppress 56500 // covered by FxCOP
  77. catch (Exception e)
  78. {
  79. if (Fx.IsFatal(e))
  80. {
  81. throw;
  82. }
  83. if (DiagnosticUtility.ShouldTraceError)
  84. {
  85. TraceUtility.TraceEvent(TraceEventType.Error, TraceCode.PerformanceCountersFailedForService,
  86. SR.GetString(SR.TraceCodePerformanceCountersFailedForService), null, e);
  87. }
  88. break;
  89. }
  90. }
  91. }
  92. internal override bool Initialized
  93. {
  94. get { return this.Counters != null; }
  95. }
  96. protected override void Dispose(bool disposing)
  97. {
  98. try
  99. {
  100. if (disposing)
  101. {
  102. if (PerformanceCounters.PerformanceCountersEnabled)
  103. {
  104. if (null != this.Counters)
  105. {
  106. for (int ctr = this.PerfCounterStart; ctr < this.PerfCounterEnd; ++ctr)
  107. {
  108. PerformanceCounter counter = this.Counters[ctr];
  109. if (counter != null)
  110. {
  111. PerformanceCounters.ReleasePerformanceCounter(ref counter);
  112. }
  113. this.Counters[ctr] = null;
  114. }
  115. this.Counters = null;
  116. }
  117. }
  118. }
  119. }
  120. finally
  121. {
  122. base.Dispose(disposing);
  123. }
  124. }
  125. }
  126. }