public void AddUsage(ICountedEntity <TEntityType> entity, TCountType measure, ICountedConfig countConfig, long increment) { ArgumentValidator.ThrowIfNull("entity", entity); ArgumentValidator.ThrowIfNull("countConfig", countConfig); CountTracker <TEntityType, TCountType> .EntityValue entityValue; if (this.entities.TryGetValue(entity.Name, out entityValue)) { entityValue.AddMeasure(measure, countConfig, increment); return; } if (!countConfig.IsPromotable) { this.AddEntityAndMeasure(entity, measure, countConfig, increment); return; } if (this.entities.Any((KeyValuePair <IEntityName <TEntityType>, CountTracker <TEntityType, TCountType> .EntityValue> e) => e.Value.Entity.GroupName.Equals(entity.GroupName))) { this.AddEntityAndMeasure(entity, measure, countConfig, increment); return; } CountTracker <TEntityType, TCountType> .EntityKey entityKey = new CountTracker <TEntityType, TCountType> .EntityKey(entity.GroupName, measure); long num = this.unpromotedMeasures.AddOrUpdate(entityKey, (CountTracker <TEntityType, TCountType> .EntityKey k) => increment, (CountTracker <TEntityType, TCountType> .EntityKey k, long v) => v + increment); if (num > (long)countConfig.MinActivityThreshold) { this.AddEntityAndMeasure(entity, measure, countConfig, increment); this.unpromotedMeasures.TryRemove(entityKey, out num); this.tracer.TraceDebug <IEntityName <TEntityType>, TCountType, int>((long)this.GetHashCode(), "Promoted entity {0} and measure {1} for crossing threshold {2}", entityKey.Entity, entityKey.Measure, countConfig.MinActivityThreshold); this.perfCounters.MeasurePromoted(measure); } }
private CountTracker <TEntityType, TCountType> .EntityValue AddEntity(ICountedEntity <TEntityType> entity) { CountTracker <TEntityType, TCountType> .EntityValue result = this.entities.AddOrUpdate(entity.Name, delegate(IEntityName <TEntityType> e) { this.perfCounters.EntityAdded(entity); return(new CountTracker <TEntityType, TCountType> .EntityValue(entity, this.perfCounters, this.timeProvider)); }, (IEntityName <TEntityType> e, CountTracker <TEntityType, TCountType> .EntityValue v) => v); this.needsEntityCleanup = (this.entities.Count > this.config.MaxEntityCount); return(result); }
public bool Equals(CountTracker <TEntityType, TCountType> .EntityKey key) { if (object.ReferenceEquals(null, key)) { return(false); } TCountType tcountType = this.measure; return(tcountType.Equals(key.measure) && this.entity.Equals(key.entity)); }
public CountTracker <TEntityType, TCountType> .EntityValue Merge(CountTracker <TEntityType, TCountType> .EntityValue value) { if (!this.entity.Equals(value.entity)) { throw new InvalidOperationException("Can't merge EntityValue objects for different entities"); } if (this.IsEmpty) { return(value); } if (value.IsEmpty) { return(this); } CountTracker <TEntityType, TCountType> .EntityValue result; lock (this.syncObject) { Count <TEntityType, TCountType>[] array = new Count <TEntityType, TCountType> [CountTracker <TEntityType, TCountType> .EntityValue.countTypeToIndexMap.Count]; for (int i = 0; i < this.measures.Length; i++) { if (this.measures[i] != null && value.measures[i] == null) { array[i] = this.measures[i]; } else if (this.measures[i] == null && value.measures[i] != null) { array[i] = value.measures[i]; } else if (this.measures[i] != null && value.measures[i] != null) { array[i] = this.measures[i].Merge(value.measures[i]); } } result = new CountTracker <TEntityType, TCountType> .EntityValue(this.Entity, this.perfCounters, array, this.timeProvider); } return(result); }
private void AddEntityAndMeasure(ICountedEntity <TEntityType> entity, TCountType measure, ICountedConfig countConfig, long increment) { CountTracker <TEntityType, TCountType> .EntityValue entityValue = this.AddEntity(entity); entityValue.AddMeasure(measure, countConfig, increment); }