//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------ namespace System.ServiceModel.Diagnostics { using System.Diagnostics; using System.Runtime; using System.ServiceModel; using System.ServiceModel.Administration; sealed class ServicePerformanceCounters : ServicePerformanceCountersBase { internal PerformanceCounter[] Counters { get; set; } internal ServicePerformanceCounters(ServiceHostBase serviceHost) : base(serviceHost) { this.Counters = new PerformanceCounter[(int)PerfCounters.TotalCounters]; for (int i = 0; i < (int)PerfCounters.TotalCounters; i++) { PerformanceCounter counter = PerformanceCounters.GetServicePerformanceCounter(perfCounterNames[i], this.InstanceName); if (counter != null) { try { counter.RawValue = 0; this.Counters[i] = counter; } #pragma warning suppress 56500 // covered by FxCOP catch (Exception e) { if (Fx.IsFatal(e)) { throw; } if (DiagnosticUtility.ShouldTraceError) { TraceUtility.TraceEvent(TraceEventType.Error, TraceCode.PerformanceCountersFailedForService, SR.GetString(SR.TraceCodePerformanceCountersFailedForService), null, e); } break; } } else { break; } } } void Increment(int counter) { this.Increment(this.Counters, counter); } void IncrementBy(int counter, long time) { this.IncrementBy(this.Counters, counter, time); } void Decrement(int counter) { this.Decrement(this.Counters, counter); } void Set(int counter, long denominator) { this.Set(this.Counters, counter, denominator); } internal override void MethodCalled() { Increment((int)PerfCounters.Calls); Increment((int)PerfCounters.CallsPerSecond); Increment((int)PerfCounters.CallsOutstanding); } internal override void MethodReturnedSuccess() { Decrement((int)PerfCounters.CallsOutstanding); } internal override void MethodReturnedError() { Increment((int)PerfCounters.CallsFailed); Increment((int)PerfCounters.CallsFailedPerSecond); Decrement((int)PerfCounters.CallsOutstanding); } internal override void MethodReturnedFault() { Increment((int)PerfCounters.CallsFaulted); Increment((int)PerfCounters.CallsFaultedPerSecond); Decrement((int)PerfCounters.CallsOutstanding); } internal override void SaveCallDuration(long time) { IncrementBy((int)PerfCounters.CallDuration, time); Increment((int)PerfCounters.CallDurationBase); } internal override void AuthenticationFailed() { Increment((int)PerfCounters.SecurityValidationAuthenticationFailures); Increment((int)PerfCounters.SecurityValidationAuthenticationFailuresPerSecond); } internal override void AuthorizationFailed() { Increment((int)PerfCounters.CallsNotAuthorized); Increment((int)PerfCounters.CallsNotAuthorizedPerSecond); } internal override void ServiceInstanceCreated() { Increment((int)PerfCounters.Instances); Increment((int)PerfCounters.InstancesRate); } internal override void ServiceInstanceRemoved() { Decrement((int)PerfCounters.Instances); } internal override void SessionFaulted() { Increment((int)PerfCounters.RMSessionsFaulted); Increment((int)PerfCounters.RMSessionsFaultedPerSecond); } internal override void MessageDropped() { Increment((int)PerfCounters.RMMessagesDropped); Increment((int)PerfCounters.RMMessagesDroppedPerSecond); } internal override void TxCommitted(long count) { IncrementBy((int)PerfCounters.TxCommitted, count); IncrementBy((int)PerfCounters.TxCommittedPerSecond, count); } internal override void TxInDoubt(long count) { IncrementBy((int)PerfCounters.TxInDoubt, count); IncrementBy((int)PerfCounters.TxInDoubtPerSecond, count); } internal override void TxAborted(long count) { IncrementBy((int)PerfCounters.TxAborted, count); IncrementBy((int)PerfCounters.TxAbortedPerSecond, count); } internal override void TxFlowed() { Increment((int)PerfCounters.TxFlowed); Increment((int)PerfCounters.TxFlowedPerSecond); } internal override void MsmqDroppedMessage() { Increment((int)PerfCounters.MsmqDroppedMessages); Increment((int)PerfCounters.MsmqDroppedMessagesPerSecond); } internal override void MsmqPoisonMessage() { Increment((int)PerfCounters.MsmqPoisonMessages); Increment((int)PerfCounters.MsmqPoisonMessagesPerSecond); } internal override void MsmqRejectedMessage() { Increment((int)PerfCounters.MsmqRejectedMessages); Increment((int)PerfCounters.MsmqRejectedMessagesPerSecond); } internal override void IncrementThrottlePercent(int counterIndex) { Increment(counterIndex); } internal override void SetThrottleBase(int counterIndex, long denominator) { Set(counterIndex, denominator); } internal override void DecrementThrottlePercent(int counterIndex) { Decrement(counterIndex); } internal override bool Initialized { get { return this.Counters != null; } } protected override void Dispose(bool disposing) { try { if (disposing) { if (PerformanceCounters.PerformanceCountersEnabled) { if (null != this.Counters) { for (int ctr = this.PerfCounterStart; ctr < this.PerfCounterEnd; ++ctr) { PerformanceCounter counter = this.Counters[ctr]; if (counter != null) { PerformanceCounters.ReleasePerformanceCounter(ref counter); } this.Counters[ctr] = null; } this.Counters = null; } } } } finally { base.Dispose(disposing); } } } }