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 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------
namespace System.ServiceModel.Diagnostics
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
class ServiceModelPerformanceCounters
{
Dictionary<string, OperationPerformanceCountersBase> operationPerfCounters;
SortedList<string, string> actionToOperation;
EndpointPerformanceCountersBase endpointPerfCounters;
ServicePerformanceCountersBase servicePerfCounters;
DefaultPerformanceCounters defaultPerfCounters;
bool initialized;
string perfCounterId;
internal ServiceModelPerformanceCounters(
ServiceHostBase serviceHost,
ContractDescription contractDescription,
EndpointDispatcher endpointDispatcher)
{
this.perfCounterId = endpointDispatcher.PerfCounterId;
if (PerformanceCounters.Scope == PerformanceCounterScope.All)
{
this.operationPerfCounters = new Dictionary<string, OperationPerformanceCountersBase>(contractDescription.Operations.Count);
this.actionToOperation = new SortedList<string, string>(contractDescription.Operations.Count);
foreach (OperationDescription opDescription in contractDescription.Operations)
{
Fx.Assert(null != opDescription.Messages, "OperationDescription.Messages should not be null");
Fx.Assert(opDescription.Messages.Count > 0, "OperationDescription.Messages should not be empty");
Fx.Assert(null != opDescription.Messages[0], "OperationDescription.Messages[0] should not be null");
if (null != opDescription.Messages[0].Action && !this.actionToOperation.Keys.Contains(opDescription.Messages[0].Action))
{
this.actionToOperation.Add(opDescription.Messages[0].Action, opDescription.Name);
}
OperationPerformanceCountersBase c;
if (!this.operationPerfCounters.TryGetValue(opDescription.Name, out c))
{
OperationPerformanceCountersBase counters =
PerformanceCountersFactory.CreateOperationCounters(serviceHost.Description.Name, contractDescription.Name, opDescription.Name, endpointDispatcher.PerfCounterBaseId);
if (counters != null && counters.Initialized)
{
this.operationPerfCounters.Add(opDescription.Name, counters);
}
else
{
// cleanup the others and return.
this.initialized = false;
return;
}
}
}
// add endpoint scoped perf counters
EndpointPerformanceCountersBase endpointCounters = PerformanceCountersFactory.CreateEndpointCounters(serviceHost.Description.Name, contractDescription.Name, endpointDispatcher.PerfCounterBaseId);
if (endpointCounters != null && endpointCounters.Initialized)
{
this.endpointPerfCounters = endpointCounters;
}
}
if (PerformanceCounters.PerformanceCountersEnabled)
{
this.servicePerfCounters = serviceHost.Counters;
}
if (PerformanceCounters.MinimalPerformanceCountersEnabled)
{
this.defaultPerfCounters = serviceHost.DefaultCounters;
}
this.initialized = true;
}
internal OperationPerformanceCountersBase GetOperationPerformanceCountersFromMessage(Message message)
{
Fx.Assert(null != message, "message must not be null");
Fx.Assert(null != message.Headers, "message headers must not be null");
Fx.Assert(null != message.Headers.Action, "action must not be null");
string operation;
if (this.actionToOperation.TryGetValue(message.Headers.Action, out operation))
{
return this.GetOperationPerformanceCounters(operation);
}
else
{
return null;
}
}
internal OperationPerformanceCountersBase GetOperationPerformanceCounters(string operation)
{
Fx.Assert(PerformanceCounters.Scope == PerformanceCounterScope.All, "Only call GetOparationPerformanceCounters when performance counter scope is All");
OperationPerformanceCountersBase counters;
Dictionary<string, OperationPerformanceCountersBase> opPerfCounters = this.operationPerfCounters;
if (opPerfCounters != null && opPerfCounters.TryGetValue(operation, out counters))
{
return counters;
}
return null;
}
internal bool Initialized
{
get { return this.initialized; }
}
internal EndpointPerformanceCountersBase EndpointPerformanceCounters
{
get { return this.endpointPerfCounters; }
}
internal ServicePerformanceCountersBase ServicePerformanceCounters
{
get { return this.servicePerfCounters; }
}
internal DefaultPerformanceCounters DefaultPerformanceCounters
{
get { return this.defaultPerfCounters; }
}
internal string PerfCounterId
{
get { return this.perfCounterId; }
}
}
internal class ServiceModelPerformanceCountersEntry
{
ServicePerformanceCountersBase servicePerformanceCounters;
DefaultPerformanceCounters defaultPerformanceCounters;
List<ServiceModelPerformanceCounters> performanceCounters;
public ServiceModelPerformanceCountersEntry(ServicePerformanceCountersBase serviceCounters)
{
this.servicePerformanceCounters = serviceCounters;
this.performanceCounters = new List<ServiceModelPerformanceCounters>();
}
public ServiceModelPerformanceCountersEntry(DefaultPerformanceCounters defaultServiceCounters)
{
this.defaultPerformanceCounters = defaultServiceCounters;
this.performanceCounters = new List<ServiceModelPerformanceCounters>();
}
public void Add(ServiceModelPerformanceCounters counters)
{
this.performanceCounters.Add(counters);
}
public void Remove(string id)
{
for (int i = 0; i < this.performanceCounters.Count; ++i)
{
if (this.performanceCounters[i].PerfCounterId.Equals(id))
{
this.performanceCounters.RemoveAt(i);
break;
}
}
}
public void Clear()
{
this.performanceCounters.Clear();
}
public ServicePerformanceCountersBase ServicePerformanceCounters
{
get { return this.servicePerformanceCounters; }
set { this.servicePerformanceCounters = value; }
}
public DefaultPerformanceCounters DefaultPerformanceCounters
{
get { return this.defaultPerformanceCounters; }
set { this.defaultPerformanceCounters = value; }
}
public List<ServiceModelPerformanceCounters> CounterList
{
get { return this.performanceCounters; }
}
}
}
|