예제 #1
0
        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);
            }
        }
예제 #2
0
 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);
 }
예제 #3
0
            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));
            }
예제 #4
0
 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);
 }
예제 #5
0
 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);
 }