예제 #1
0
        public Task <Counter> GetCounter(string product, PeriodKind periodKind = PeriodKind.Daily, DateTimeOffset?periodStart = null,
                                         CounterKind kind = CounterKind.Total)
        {
            periodStart = periodStart == null
                ? DateTimeOffset.Now.Date
                : periodStart.Value.Date;

            int dayOffset = 0;

            var calendar = CultureInfo.GetCultureInfo("ru-RU").Calendar;

            switch (periodKind)
            {
            case PeriodKind.Daily:
                dayOffset = 0;
                break;

            case PeriodKind.Weekly:
                var dayOfWeek = calendar.GetDayOfWeek(periodStart.Value.DateTime);
                dayOffset = DayOfWeek.Monday - dayOfWeek;

                if (dayOffset > 0)
                {
                    dayOffset -= 7;
                }
                break;

            case PeriodKind.Monthly:
                dayOffset = periodStart.Value.Day == 1 ? 0 : 1 - periodStart.Value.Day;
                break;
            }

            return(_dataStorage.GetCounterOrDefault(product, periodKind, calendar.AddDays(periodStart.Value.DateTime, dayOffset), kind));
        }
예제 #2
0
 protected Counter(string category, string name, CounterType type, CounterLevel level, CounterKind kind, CounterUnit unit)
 {
     Category = category;
     Name     = name;
     Type     = type;
     Level    = level;
     Kind     = kind;
     Unit     = unit;
 }
예제 #3
0
 public async Task <Counter> Get(string product, PeriodKind periodKind = PeriodKind.Daily, DateTimeOffset?periodStart = null, CounterKind counterKind = CounterKind.Total)
 {
     return(await _counterQuery.GetCounter(product, periodKind, periodStart, counterKind));
 }
예제 #4
0
 /// <summary>
 /// Initializes a new instance of the <see cref="CounterDescription"/> struct.
 /// </summary>
 /// <param name="counterKind">Type of query (see <see cref="CounterKind"/>).</param>
 /// <param name="miscFlags">Miscellaneous flags.</param>
 public CounterDescription(CounterKind counterKind, int miscFlags = 0)
 {
     CounterKind = counterKind;
     MiscFlags   = miscFlags;
 }
예제 #5
0
        public static CounterItem <T> Retrieve(string category, string name, CounterType type, CounterLevel level, CounterKind kind, CounterUnit unit, List <CounterItemValue <T> > values)
        {
            var item = ReferencePool <CounterItem <T> > .Shared.New();

            item.Environment = Core.EnvironmentName;
            item.Application = Core.ApplicationName;
            item.Category    = category;
            item.Name        = name;
            item.Type        = type;
            item.Level       = level;
            item.Kind        = kind;
            item.Unit        = unit;
            item.Values      = values;
            return(item);
        }
예제 #6
0
 internal DecimalCounter(string category, string name, CounterType type, CounterLevel level, CounterKind kind, CounterUnit unit) : base(category, name, type, level, kind, unit)
 {
 }
예제 #7
0
        public async Task <Counter> GetCounterOrDefault(string product, PeriodKind periodKind, DateTimeOffset periodStart, CounterKind counterKind)
        {
            var counter = (await
                           _conn.QueryAsync <Counter>(
                               "select top 1 * from Counter where Product=@product and PeriodStart=@periodStart and PeriodKind=@periodKind and CounterKind=@counterKind",
                               new { product, periodKind, periodStart = periodStart.Date, counterKind })).SingleOrDefault();

            return(counter ?? new Counter
            {
                Product = product,
                Kind = counterKind,
                PeriodStart = periodStart,
                PeriodKind = periodKind
            });
        }
예제 #8
0
        public static ServiceDescriptor GetDescriptor(Type serviceType, string counterCategory = null, CounterLevel counterLevel = CounterLevel.User, CounterKind counterKind = CounterKind.Application)
        {
            var descriptor = new ServiceDescriptor
            {
                Name = serviceType.FullName
            };
            var isInterface = serviceType.IsInterface;
            var methodsInfo = serviceType.AllMethods().OrderBy(i => i.Name + "[" + i.GetParameters()?.Select(p => p.Name).Join(", ") + "]");

            foreach (var mInfo in methodsInfo)
            {
                if (!mInfo.IsPublic || mInfo.IsSpecialName)
                {
                    continue;
                }
                var isRpcMethod = mInfo.IsDefined(typeof(RPCMethodAttribute)) || isInterface;
                if (!isRpcMethod)
                {
                    continue;
                }
                var mDesc = new MethodDescriptor
                {
                    Method           = mInfo.GetMethodAccessor(),
                    Name             = mInfo.Name,
                    ReturnType       = GetTypeName(mInfo.ReturnType),
                    TypeOfReturnType = mInfo.ReturnType
                };
                if (mInfo.ReturnType == typeof(Task) || mInfo.ReturnType.BaseType == typeof(Task))
                {
                    mDesc.ReturnIsTask = true;
                    if (mInfo.ReturnType.GenericTypeArguments.Length > 0)
                    {
                        mDesc.ReturnTaskResult     = mInfo.ReturnType.GetProperty("Result").GetFastPropertyInfo();
                        mDesc.CreateTaskFromResult = typeof(Task).GetMethod("FromResult").MakeGenericMethod(new[] { mInfo.ReturnType.GenericTypeArguments[0] }).GetMethodAccessor();
                    }
                    else
                    {
                        mDesc.ReturnTaskResult     = null;
                        mDesc.CreateTaskFromResult = null;
                    }
                }
                if (counterCategory != null)
                {
                    mDesc.Counter = Core.Counters.GetDoubleCounter(counterCategory, serviceType.FullName + "\\" + mDesc.Name, CounterType.Average, counterLevel, counterKind, CounterUnit.Milliseconds);
                }

                RegisterServiceDescriptorType(descriptor, mInfo.ReturnType);

                var pars = mInfo.GetParameters();
                mDesc.Parameters = new ParameterDescriptor[pars.Length];
                for (var i = 0; i < pars.Length; i++)
                {
                    var p    = pars[i];
                    var pDes = new ParameterDescriptor
                    {
                        Parameter = p,
                        Name      = p.Name,
                        Index     = p.Position,
                        Type      = GetTypeName(p.ParameterType)
                    };
                    RegisterServiceDescriptorType(descriptor, p.ParameterType);
                    mDesc.Parameters[i] = pDes;
                }
                mDesc.Id = GetMethodId(descriptor, mDesc);
                descriptor.Methods.Add(mDesc.Id, mDesc);
            }

            var eventsInfo = serviceType.GetRuntimeEvents();

            foreach (var eInfo in eventsInfo)
            {
                if (eInfo.IsSpecialName)
                {
                    continue;
                }
                var isRpcEvent = eInfo.IsDefined(typeof(RPCEventAttribute)) || isInterface;
                if (!isRpcEvent)
                {
                    continue;
                }
                var name         = eInfo.Name;
                var eventHandler = GetTypeName(eInfo.EventHandlerType);
                RegisterServiceDescriptorType(descriptor, eInfo.EventHandlerType);
                descriptor.Events.Add(name, new EventDescriptor {
                    Name = name, Type = eventHandler, Event = eInfo
                });
            }
            return(descriptor);
        }
예제 #9
0
 /// <summary>
 /// Initializes a new instance of the <see cref="CounterDescription"/> struct.
 /// </summary>
 /// <param name="counterKind">Type of query (see <see cref="CounterKind"/>).</param>
 public CounterDescription(CounterKind counterKind)
 {
     CounterKind = counterKind;
     MiscFlags   = 0;
 }