internal TraceLoggingTypeInfo(
            Type dataType,
            string name,
            EventLevel level,
            EventOpcode opcode,
            EventKeywords keywords,
            EventTags tags)
        {
            if (dataType == null)
            {
                throw new ArgumentNullException("dataType");
            }

            if (name == null)
            {
                throw new ArgumentNullException("eventName");
            }

            Contract.EndContractBlock();

            Statics.CheckName(name);

            this.name = name;
            this.keywords = keywords;
            this.level = level;
            this.opcode = opcode;
            this.tags = tags;
            this.dataType = dataType;
        }
 /// <summary>
 /// Returns a new instance of TraceLoggingEventInfo corresponding to the name,
 /// flags, and typeInfos provided.
 /// </summary>
 /// <param name="name">
 /// The name to use when the name parameter passed to
 /// EventSource.Write is null. This value must not be null.
 /// </param>
 /// <param name="tags">
 /// Tags to add to the event if the tags are not set via options.
 /// </param>
 /// <param name="typeInfos">
 /// The types of the fields in the event. This value must not be null.
 /// </param>
 /// <returns>
 /// An instance of TraceLoggingEventInfo with DefaultName set to the specified name
 /// and with the specified typeInfos.
 /// </returns>
 internal TraceLoggingEventTypes(
     string name,
     EventTags tags,
     params TraceLoggingTypeInfo[] typeInfos)
     : this(tags, name, MakeArray(typeInfos))
 {
     return;
 }
 /// <summary>
 /// Track an event.
 /// </summary>
 /// <param name="eventName">The event name.</param>
 /// <param name="eventTags">A map of event tag names to event tag values.</param>
 public virtual void TrackEvent(string eventName,
                                EventTags eventTags)
 {
     Optimizely.Track(eventName, UserId, Attributes, eventTags);
 }
Exemple #4
0
        private static void SendEvent(bool writeToConsole = true)
        {
            var ev = new Event();

            if (_dateSpans[_dateSpanIndex] != TimeSpan.Zero)
            {
                ev.Date = RandomHelper.GetDateTime(DateTime.Now.Subtract(_dateSpans[_dateSpanIndex]), DateTime.Now);
            }

            ev.Type = EventTypes.Random();
            if (ev.Type == Event.KnownTypes.FeatureUsage)
            {
                ev.Source = FeatureNames.Random();
            }
            else if (ev.Type == Event.KnownTypes.NotFound)
            {
                ev.Source = PageNames.Random();
            }
            else if (ev.Type == Event.KnownTypes.Log)
            {
                ev.Source  = LogSources.Random();
                ev.Message = RandomHelper.GetPronouncableString(RandomHelper.GetRange(5, 15));
            }

            ev.SetUserIdentity(Identities.Random());

            for (int i = 0; i < RandomHelper.GetRange(1, 5); i++)
            {
                string key = RandomHelper.GetPronouncableString(RandomHelper.GetRange(5, 10));
                while (ev.Data.ContainsKey(key) || key == Event.KnownDataKeys.Error)
                {
                    key = RandomHelper.GetPronouncableString(RandomHelper.GetRange(5, 15));
                }

                ev.Data.Add(key, RandomHelper.GetPronouncableString(RandomHelper.GetRange(5, 25)));
            }

            int tagCount = RandomHelper.GetRange(1, 3);

            for (int i = 0; i < tagCount; i++)
            {
                string tag = EventTags.Random();
                if (!ev.Tags.Contains(tag))
                {
                    ev.Tags.Add(tag);
                }
            }

            if (ev.Type == Event.KnownTypes.Error)
            {
                // limit error variation so that stacking will occur
                if (_randomErrors == null)
                {
                    _randomErrors = new List <Error>(Enumerable.Range(1, 25).Select(i => GenerateError()));
                }

                ev.Data[Event.KnownDataKeys.Error] = _randomErrors.Random();
            }

            // use server settings to see if we should include this data
            if (ExceptionlessClient.Default.Configuration.Settings.GetBoolean("IncludeConditionalData", true))
            {
                ev.AddObject(new { Total = 32.34, ItemCount = 2, Email = "*****@*****.**" }, "Conditional Data");
            }

            //ev.AddRecentTraceLogEntries();

            ExceptionlessClient.Default.SubmitEvent(ev);

            if (writeToConsole)
            {
                Console.SetCursorPosition(0, OPTIONS_MENU_LINE_COUNT + 2);
                Console.WriteLine("Sent 1 event.");
                Trace.WriteLine("Sent 1 event.");

                ClearNonOptionsLines();
            }
        }
        private TraceLoggingEventTypes(
            EventTags tags,
            string defaultName,
            TraceLoggingTypeInfo[] typeInfos)
        {
            if (defaultName == null)
            {
                throw new ArgumentNullException("defaultName");
            }

            Contract.EndContractBlock();

            this.typeInfos = typeInfos;
            this.name = defaultName;
            this.tags = tags;
            this.level = Statics.DefaultLevel;

            var collector = new TraceLoggingMetadataCollector();
            foreach (var typeInfo in typeInfos)
            {
                this.level = Statics.Combine((int)typeInfo.Level, this.level);
                this.opcode = Statics.Combine((int)typeInfo.Opcode, this.opcode);
                this.keywords |= typeInfo.Keywords;
                typeInfo.WriteMetadata(collector, null, EventFieldFormat.Default);
            }

            this.typeMetadata = collector.GetMetadata();
            this.scratchSize = collector.ScratchSize;
            this.dataCount = collector.DataCount;
            this.pinCount = collector.PinCount;
        }
Exemple #6
0
        private unsafe void WriteMultiMergeInner(
            string eventName,
            ref EventSourceOptions options,
            TraceLoggingEventTypes eventTypes,
            Guid *activityID,
            Guid *childActivityID,
            params object[] values)
        {
#if FEATURE_MANAGED_ETW
            int  identity = 0;
            byte level    = (options.valuesSet & EventSourceOptions.levelSet) != 0
                ? options.level
                : eventTypes.level;
            byte opcode = (options.valuesSet & EventSourceOptions.opcodeSet) != 0
                ? options.opcode
                : eventTypes.opcode;
            EventTags tags = (options.valuesSet & EventSourceOptions.tagsSet) != 0
                ? options.tags
                : eventTypes.Tags;
            EventKeywords keywords = (options.valuesSet & EventSourceOptions.keywordsSet) != 0
                ? options.keywords
                : eventTypes.keywords;

            var nameInfo = eventTypes.GetNameInfo(eventName ?? eventTypes.Name, tags);
            if (nameInfo == null)
            {
                return;
            }
            identity = nameInfo.identity;
            EventDescriptor descriptor = new EventDescriptor(identity, level, opcode, (long)keywords);

            var pinCount    = eventTypes.pinCount;
            var scratch     = stackalloc byte[eventTypes.scratchSize];
            var descriptors = stackalloc EventData[eventTypes.dataCount + 3];
            var pins        = stackalloc GCHandle[pinCount];

            fixed(byte *
                  pMetadata0 = this.providerMetadata,
                  pMetadata1 = nameInfo.nameMetadata,
                  pMetadata2 = eventTypes.typeMetadata)
            {
                descriptors[0].SetMetadata(pMetadata0, this.providerMetadata.Length, 2);
                descriptors[1].SetMetadata(pMetadata1, nameInfo.nameMetadata.Length, 1);
                descriptors[2].SetMetadata(pMetadata2, eventTypes.typeMetadata.Length, 1);

#if (!ES_BUILD_PCL && !PROJECTN)
                System.Runtime.CompilerServices.RuntimeHelpers.PrepareConstrainedRegions();
#endif
                try
                {
                    DataCollector.ThreadInstance.Enable(
                        scratch,
                        eventTypes.scratchSize,
                        descriptors + 3,
                        eventTypes.dataCount,
                        pins,
                        pinCount);

                    for (int i = 0; i < eventTypes.typeInfos.Length; i++)
                    {
                        var info = eventTypes.typeInfos[i];
                        info.WriteData(TraceLoggingDataCollector.Instance, info.PropertyValueFactory(values[i]));
                    }

                    this.WriteEventRaw(
                        eventName,
                        ref descriptor,
                        activityID,
                        childActivityID,
                        (int)(DataCollector.ThreadInstance.Finish() - descriptors),
                        (IntPtr)descriptors);
                }
                finally
                {
                    this.WriteCleanup(pins, pinCount);
                }
            }
#endif // FEATURE_MANAGED_ETW
        }
Exemple #7
0
        public TypeAnalysis(
            Type dataType,
            EventDataAttribute?eventAttrib,
            List <Type> recursionCheck)
        {
            IEnumerable <PropertyInfo> propertyInfos = Statics.GetProperties(dataType);
            var propertyList = new List <PropertyAnalysis>();

            foreach (PropertyInfo propertyInfo in propertyInfos)
            {
                if (Statics.HasCustomAttribute(propertyInfo, typeof(EventIgnoreAttribute)))
                {
                    continue;
                }

                if (!propertyInfo.CanRead ||
                    propertyInfo.GetIndexParameters().Length != 0)
                {
                    continue;
                }

                MethodInfo?getterInfo = Statics.GetGetMethod(propertyInfo);
                if (getterInfo == null)
                {
                    continue;
                }

                if (getterInfo.IsStatic || !getterInfo.IsPublic)
                {
                    continue;
                }

                Type propertyType     = propertyInfo.PropertyType;
                var  propertyTypeInfo = TraceLoggingTypeInfo.GetInstance(propertyType, recursionCheck);
                EventFieldAttribute?fieldAttribute = Statics.GetCustomAttribute <EventFieldAttribute>(propertyInfo);

                string propertyName =
                    fieldAttribute != null && fieldAttribute.Name != null
                    ? fieldAttribute.Name
                    : Statics.ShouldOverrideFieldName(propertyInfo.Name)
                    ? propertyTypeInfo.Name
                    : propertyInfo.Name;
                propertyList.Add(new PropertyAnalysis(
                                     propertyName,
                                     propertyInfo,
                                     propertyTypeInfo,
                                     fieldAttribute));
            }

            this.properties = propertyList.ToArray();

            foreach (PropertyAnalysis property in this.properties)
            {
                TraceLoggingTypeInfo typeInfo = property.typeInfo;
                this.level     = (EventLevel)Statics.Combine((int)typeInfo.Level, (int)this.level);
                this.opcode    = (EventOpcode)Statics.Combine((int)typeInfo.Opcode, (int)this.opcode);
                this.keywords |= typeInfo.Keywords;
                this.tags     |= typeInfo.Tags;
            }

            if (eventAttrib != null)
            {
                this.level     = (EventLevel)Statics.Combine((int)eventAttrib.Level, (int)this.level);
                this.opcode    = (EventOpcode)Statics.Combine((int)eventAttrib.Opcode, (int)this.opcode);
                this.keywords |= eventAttrib.Keywords;
                this.tags     |= eventAttrib.Tags;
                this.name      = eventAttrib.Name;
            }

            if (this.name == null)
            {
                this.name = dataType.Name;
            }
        }
Exemple #8
0
            public Builder WithEventTags(EventTags eventTags)
            {
                EventTags = eventTags;

                return(this);
            }
Exemple #9
0
 internal TraceLoggingTypeInfo(Type dataType, string name, EventLevel level, EventOpcode opcode, EventKeywords keywords, EventTags tags)
 {
     if (dataType == (Type)null)
     {
         throw new ArgumentNullException("dataType");
     }
     if (name == null)
     {
         throw new ArgumentNullException("eventName");
     }
     Statics.CheckName(name);
     this.name     = name;
     this.keywords = keywords;
     this.level    = level;
     this.opcode   = opcode;
     this.tags     = tags;
     this.dataType = dataType;
 }
Exemple #10
0
        public void Init()
        {
            //App.Database.ClearTables();  //for debbug
            App.Database.DropTables();
            App.Database.CreateTables();

            var eventList = App.Database.GetEventsAsync();

            if (eventList.Count == 0)
            {
                _ = App.Database.SaveEventAsync(new Event
                {
                    Id    = 1,
                    Title = "Фестиваль японской культуры во Владивостоке 6+",
                    Image = "https://omaikane.files.wordpress.com/2018/04/ely-melbmadfest2017-omaikane-14.jpg?w=1200",
                    Info  = "Любите «Наруто» и творчество Миядзаки? " +
                            "Завидуете японской средневековой моде и мечтаете о кимоно? " +
                            "Ваши друзья уже освоили разговорный японский, потому что вы с ними общаетесь " +
                            "исключительно на языке страны восходящего солнца? Тогда обязательно приходите " +
                            "на первый ежегодный фестиваль японской культуры! Вас ждут мастер-классы, конкурсы и, " +
                            "конечно же, традиционная чайная церемония.\nРасписание мероприятия: \n9:00 – 10:30 – " +
                            "регистрация\n10:40 – 12:00 – лекция и мастер-класс «Кумихимо. История японского шнура» " +
                            "\n12:10 – 13:00 – Дебаты «Чем 2D лучше, чем 3D»\n13:10 – 14:30 – конкурс поедания рамена " +
                            "\n14:40 – 16:00 – мастер-класс «Рисунок в стиле аниме»\n16:10 – 18:00 – просмотр фильма " +
                            "«Унесенные призраками» под открытым небом\n18:10 – 19:00 – конкурс косплея\n19:10 – 20:00 –" +
                            " конкурс песни на японском\n20:10 – 20:30 – выступление спонсоров конкурса\n20:40 – 22:00 – " +
                            "самая большая в истории Владивостока чайная церемония (лекция и дегустация)\n22:10 – 23:00 – " +
                            "закрытие фестиваля",
                    Date      = new DateTime(2020, 2, 28, 9, 0, 0),
                    Address   = "Центральная площадь (площадь Борцам за власть Советов)",
                    CreatorId = 1
                }).Result;
                _ = App.Database.SaveEventAsync(new Event
                {
                    Id    = 2,
                    Title = "Соревнования по спортивному ориентированию 6+",
                    Image = "https://kudago.com/media/images/event/aa/79/aa790c13fc0c1639855ef74ee79f13ef.jpg",
                    Info  = "Остров Русский встречает юных и не очень любителей спортивного ориентирования! " +
                            "Вас ждут уникальные природные пейзажи острова и море веселья! Помните, в соревновании " +
                            "можно участвовать как в одиночку, так и командой (3-6 человек), то есть, у вас есть шанс" +
                            " всей семьей побороться за первое место и потрясающие призы! На мероприятии будет организован " +
                            "пункт первой помощи и бесплатный чай с пирожками для участников от наших спонсоров" +
                            " АО«Владхлеб»\nПобедители будут награждены призами от «Спортмастера» и «Приморского кондитера»",
                    Date      = new DateTime(2020, 1, 20, 8, 0, 0),
                    Address   = "Кампус ДВФУ, главный корпус (6 уровень)",
                    CreatorId = 1
                }).Result;
                _ = App.Database.SaveEventAsync(new Event
                {
                    Id    = 3,
                    Title = "Благотворительный кинопросмотр в «Уссури» 0+",
                    Image = "https://st.kp.yandex.net/im/poster/1/5/2/kinopoisk.ru-The-Lion-King-1529082--o--.jpg",
                    Info  = "Благотворительный фонд «Одной крови» совместно с кинотеатром «Уссури» " +
                            "устраивает благотворительный показ мультфильма «Король Лев». Вырученные средства " +
                            "пойдут на покупку игрушек в Арсеньевский детский дом." +
                            "\nСтоимость: 100 рублей",
                    Date      = new DateTime(2020, 2, 12, 15, 0, 0),
                    Address   = "Кинотеатр «Уссури»",
                    CreatorId = 1
                }).Result;
                _ = App.Database.SaveEventAsync(new Event
                {
                    Id    = 4,
                    Title = "Вечеринка в стиле 90-ых!!! 18+",
                    Image = "https://heaclub.ru/tim/d2e75bf14e84910455579b84fc3c29ae.jpg",
                    Info  = "Ностальгируете по Юрке Шатунову и Сережке Жукову? Или с тоской " +
                            "смотрите семейные фотоальбомы и завидуете родителям, отрывавшимся на вечеринках 90-ых?" +
                            " Тогда ждем вас на потрясающую вечеринку в «San Remo» Вас будет развлекать диджей " +
                            "Biba, а наша команда барменов презентует новые коктейли, придуманные специально для вечеринки!" +
                            "\nСтоимость: 300 рублей",
                    Date      = new DateTime(2021, 2, 1, 21, 0, 0),
                    Address   = "«San Remo»",
                    CreatorId = 1
                }).Result;
                _ = App.Database.SaveEventAsync(new Event
                {
                    Id    = 5,
                    Title = "Открытая лекция «Метемпсихоз в творчестве Гумилева» 12+",
                    Image = "https://alif.tv/wp-content/uploads/2017/11/gumilev.jpg",
                    Info  = "В рамках проекта «Тени Серебрянного века» проводится открытая лекция " +
                            "по творчеству Николая Степановича Гумилева. Наш лектор, А. У. Есиль, подготовил " +
                            "уникальный материал по теме переселения душ в творчестве Гумилева, где он расскажет " +
                            "простыми словами о сложном. Лекция ориентирована на широкого слушателя, но даже специалисты" +
                            " могут узнать много нового о творчестве поэта. По просьбам слушателей в конце мероприятия" +
                            " будет организован открытый микрофон, на площадке которого каждый желающий может зачитать" +
                            " свои любимые стихотворения Гумилева.",
                    Date      = new DateTime(2020, 3, 26, 17, 0, 0),
                    Address   = "Кампус ДВФУ, коворкинг «Аякс»",
                    CreatorId = 1
                }).Result;
                _ = App.Database.SaveEventAsync(new Event
                {
                    Id    = 6,
                    Title = "Шоу мыльных пузырей на Арбате 0+",
                    Image = "https://sun9-36.userapi.com/c200620/v200620880/3e460/IwYT_jPc39Q.jpg",
                    Info  = "Маленькие звездочки из цирковой студии «Мальвина» подготовили удивительный " +
                            "подарок для жителей и гостей города! В первый февральский день они выступят с программой" +
                            " «Волшебные пузырики» на одной из самых любимых улиц города.\nДевочки и мальчики" +
                            " из студии только недавно вернулись из Москвы, где представили эту программу" +
                            " на всероссийском детском цирковом конкурсе «Русский цирк 2019», где заняли " +
                            "2 месте, и теперь они хотят подарить нам немного мыльного сияющего волшебства. " +
                            "\nОдновременно с выступлением на улице расположатся лавки с поделками, сделанными умелыми " +
                            "ручками малышей из центра дошкольной подготовки «Огонек».\n20 % из вырученных средств" +
                            " пойдут на покупку подарков детям, проходящем лечение в онкологической больнице города.",
                    Date      = new DateTime(2020, 5, 6, 15, 0, 0),
                    Address   = "Улица адмирала Фокина",
                    CreatorId = 5
                }).Result;
                _ = App.Database.SaveEventAsync(new Event
                {
                    Id    = 7,
                    Title = "Городской субботник в Покровском парке 0+",
                    Image = "https://sun9-66.userapi.com/c858120/v858120881/158c9e/AMhYNyxhuio.jpg",
                    Info  = "Дорогие друзья, приглашаем Вас принять участие в субботнике, организованном " +
                            "молодежной волонтерской организацией «Мать-земля»! Покровский парк – это место прогулок" +
                            " с детьми, встреч возлюбленных, да и просто отдыха среди деревьев в самом центре " +
                            "шумного города.\nМы должны ценить и беречь это место! Давайте объединим наши силы и" +
                            " очистим наш дорогой парк от мусора, грязи и прошлогодней листвы!\nВсем участникам" +
                            " субботника будут выданы памятные грамоты.",
                    Date      = new DateTime(2020, 6, 21, 9, 0, 0),
                    Address   = "Покровский парк",
                    CreatorId = 1,
                }).Result;
            }

            var userList = App.Database.GetUsersAsync().Result;

            if (userList.Count == 0)
            {
                User newUs = new User()
                {
                    FirstName  = "Admin",
                    SecondName = "",
                    Email      = "*****@*****.**",
                    Password   = "******",
                    Age        = 20,
                    Sex        = "male",
                    Info       = "I'm admin!",
                    Image      = "https://whatsism.com/uploads/posts/2019-07/1563281010_83b1f339-d4cb-46d4-82d8-8a0ee692f3e0.jpeg",
                    IsAdmin    = true
                };
                _     = App.Database.SaveUserAsync(newUs);
                newUs = new User()
                {
                    FirstName  = "Александр",
                    SecondName = "Шереметьев",
                    Email      = "*****@*****.**",
                    Password   = "******",
                    Age        = 21,
                    Sex        = "male",
                    Info       = "Моя жена за рулем – прямо молния! – Что, так быстро ездит? – Нет, попадает в деревьяXDDDD",
                    Image      = "https://images.wallpaperscraft.ru/image/kotenok_trava_sidet_nablyudat_lyubopytstvo_56204_1600x1200.jpg",
                    IsAdmin    = false
                };
                _     = App.Database.SaveUserAsync(newUs);
                newUs = new User()
                {
                    FirstName  = "Антон",
                    SecondName = "Потапов",
                    Email      = "*****@*****.**",
                    Password   = "******",
                    Age        = 20,
                    Sex        = "male",
                    Info       = "Кто завалит экзамен, тот сдохнет))0)",
                    Image      = "https://static.myfigurecollection.net/upload/pictures/2019/11/13/2331747.png",
                    IsAdmin    = false
                };
                _     = App.Database.SaveUserAsync(newUs);
                newUs = new User()
                {
                    FirstName  = "Елена",
                    SecondName = "Арнаут",
                    Email      = "*****@*****.**",
                    Password   = "******",
                    Age        = 49,
                    Sex        = "female",
                    Info       = "Очень люблю посещать всякие мероприятия, выставки! Ищу новых друзей! У меня есть МУЖ, просьба МУЖЧИНАМ не писать!",
                    Image      = "https://mtdata.ru/u9/photo3142/20798787621-0/original.jpg",
                    IsAdmin    = false
                };
                _     = App.Database.SaveUserAsync(newUs);
                newUs = new User()
                {
                    FirstName  = "Андрей",
                    SecondName = "Волшебный",
                    Email      = "*****@*****.**",
                    Password   = "******",
                    Age        = 35,
                    Sex        = "male",
                    Info       = "Закончил Хогвартс",
                    Image      = "https://pbs.twimg.com/media/C9cAX5GXgAA_Nuj.jpg",
                    IsAdmin    = false
                };
                _     = App.Database.SaveUserAsync(newUs);
                newUs = new User()
                {
                    FirstName  = "Арина",
                    SecondName = "Риврихина",
                    Email      = "*****@*****.**",
                    Password   = "******",
                    Age        = 27,
                    Sex        = "female",
                    Info       = "Студентка аспирантуры ДВФУ, живу на острове Русском. Ищу друзей для походов в кино!",
                    Image      = "https://avatars.mds.yandex.net/get-zen_doc/169683/pub_5cb01b376db23800b0264ec1_5cb01e9a6257ee00b3c6ae04/scale_1200",
                    IsAdmin    = false
                };
                _ = App.Database.SaveUserAsync(newUs);
            }

            var           tagList  = App.Database.GetTagsAsync().Result;
            List <string> tagNames = new List <string> {
                "лес", "спортивное_ориентирование",
                "уссури", "кино", "благотворительность", "однойкрови",
                "аниме", "япония", "косплей", "фестиваль",
                "поэзия", "гумилев", "серебрянныйвек", "аякс", "тенисеребрянноговека",
                "шоу", "мыльные_пузыри", "мальвина", "огонек", "благотворительность",
                "вечеринка", "отдых",
                "покровскийпарк", "субботник", "природа", "экология", "волонтерство"
            };

            if (tagList.Count == 0)
            {
                int i = 0;
                foreach (var tagName in tagNames)
                {
                    Tag newTag = new Tag()
                    {
                        Title = tagName,
                        Id    = ++i
                    };
                    _ = App.Database.SaveTagAsync(newTag).Result;
                }
            }

            //1 фестиваль 2 соревнование 3 кино 4 вечеринка 5 лекция 6 пузыри 7 субботник
            var eventTagsList = App.Database.GetEventTagsAsync().Result;

            if (eventTagsList.Count == 0)
            {
                var e1tags = new List <string> {
                    "аниме", "япония", "косплей", "фестиваль"
                };
                foreach (var tagName in e1tags)
                {
                    EventTags newET = new EventTags()
                    {
                        EventId = 1,
                        TagId   = tagNames.FindIndex(c => c == tagName) + 1
                    };
                    App.Database.SaveEventTagAsync(newET);
                }

                var e2tags = new List <string> {
                    "лес", "природа", "спортивное_ориентирование"
                };
                foreach (var tagName in e2tags)
                {
                    EventTags newET = new EventTags()
                    {
                        EventId = 2,
                        TagId   = tagNames.FindIndex(c => c == tagName) + 1
                    };
                    App.Database.SaveEventTagAsync(newET);
                }

                var e3tags = new List <string> {
                    "уссури", "кино", "благотворительность", "однойкрови"
                };
                foreach (var tagName in e3tags)
                {
                    EventTags newET = new EventTags()
                    {
                        EventId = 3,
                        TagId   = tagNames.FindIndex(c => c == tagName) + 1
                    };
                    App.Database.SaveEventTagAsync(newET);
                }

                var e4tags = new List <string> {
                    "вечеринка", "отдых"
                };
                foreach (var tagName in e4tags)
                {
                    EventTags newET = new EventTags()
                    {
                        EventId = 4,
                        TagId   = tagNames.FindIndex(c => c == tagName) + 1
                    };
                    App.Database.SaveEventTagAsync(newET);
                }

                var e5tags = new List <string> {
                    "поэзия", "гумилев", "серебрянныйвек", "аякс", "тенисеребрянноговека"
                };
                foreach (var tagName in e5tags)
                {
                    EventTags newET = new EventTags()
                    {
                        EventId = 5,
                        TagId   = tagNames.FindIndex(c => c == tagName) + 1
                    };
                    App.Database.SaveEventTagAsync(newET);
                }

                var e6tags = new List <string> {
                    "шоу", "мыльные_пузыри", "мальвина", "огонек", "благотворительность"
                };
                foreach (var tagName in e6tags)
                {
                    EventTags newET = new EventTags()
                    {
                        EventId = 6,
                        TagId   = tagNames.FindIndex(c => c == tagName) + 1
                    };
                    App.Database.SaveEventTagAsync(newET);
                }

                var e7tags = new List <string> {
                    "покровскийпарк", "субботник", "природа", "экология", "волонтерство"
                };
                foreach (var tagName in e7tags)
                {
                    EventTags newET = new EventTags()
                    {
                        EventId = 7,
                        TagId   = tagNames.FindIndex(c => c == tagName) + 1
                    };
                    App.Database.SaveEventTagAsync(newET);
                }
            }

            var userEventsList = App.Database.GetUserEventsAsync().Result;

            if (userEventsList.Count == 0)
            {
                UserEvents newUE = new UserEvents()
                {
                    EventId = 1,
                    UserId  = 2
                };
                App.Database.SaveUserEventAsync(newUE);
                newUE = new UserEvents()
                {
                    EventId = 1,
                    UserId  = 3
                };
                App.Database.SaveUserEventAsync(newUE);
                newUE = new UserEvents()
                {
                    EventId = 2,
                    UserId  = 3
                };
                App.Database.SaveUserEventAsync(newUE);
                newUE = new UserEvents()
                {
                    EventId = 3,
                    UserId  = 3
                };
                App.Database.SaveUserEventAsync(newUE);
                newUE = new UserEvents()
                {
                    EventId = 3,
                    UserId  = 2
                };
                App.Database.SaveUserEventAsync(newUE);
                newUE = new UserEvents()
                {
                    EventId = 4,
                    UserId  = 3
                };
                newUE = new UserEvents()
                {
                    EventId = 6,
                    UserId  = 7
                };
                App.Database.SaveUserEventAsync(newUE);
                newUE = new UserEvents()
                {
                    EventId = 6,
                    UserId  = 6
                };
                App.Database.SaveUserEventAsync(newUE);
                newUE = new UserEvents()
                {
                    EventId = 1,
                    UserId  = 7
                };
                App.Database.SaveUserEventAsync(newUE);
                newUE = new UserEvents()
                {
                    EventId = 5,
                    UserId  = 3
                };
                App.Database.SaveUserEventAsync(newUE);
                newUE = new UserEvents()
                {
                    EventId = 4,
                    UserId  = 5
                };
                App.Database.SaveUserEventAsync(newUE);
            }
        }
Exemple #11
0
        /// <summary>
        /// Sends conversion event to Optimizely.
        /// </summary>
        /// <param name="eventKey">Event key representing the event which needs to be recorded</param>
        /// <param name="userId">ID for user</param>
        /// <param name="userAttributes">Attributes of the user</param>
        /// <param name="eventTags">eventTags array Hash representing metadata associated with the event.</param>
        public void Track(string eventKey, string userId, UserAttributes userAttributes = null, EventTags eventTags = null)
        {
            if (!IsValid)
            {
                Logger.Log(LogLevel.ERROR, "Datafile has invalid format. Failing 'track'.");
                return;
            }

            var inputValues = new Dictionary <string, string>
            {
                { USER_ID, userId },
                { EVENT_KEY, eventKey }
            };

            if (!ValidateStringInputs(inputValues))
            {
                return;
            }

            var eevent = Config.GetEvent(eventKey);

            if (eevent.Key == null)
            {
                Logger.Log(LogLevel.INFO, string.Format("Not tracking user {0} for event {1}.", userId, eventKey));
                return;
            }


            if (eventTags != null)
            {
                eventTags = eventTags.FilterNullValues(Logger);
            }

            var conversionEvent = EventBuilder.CreateConversionEvent(Config, eventKey,
                                                                     userId, userAttributes, eventTags);

            Logger.Log(LogLevel.INFO, string.Format("Tracking event {0} for user {1}.", eventKey, userId));
            Logger.Log(LogLevel.DEBUG, string.Format("Dispatching conversion event to URL {0} with params {1}.",
                                                     conversionEvent.Url, conversionEvent.GetParamsAsJson()));

            try
            {
                EventDispatcher.DispatchEvent(conversionEvent);
            }
            catch (Exception exception)
            {
                Logger.Log(LogLevel.ERROR, string.Format("Unable to dispatch conversion event. Error {0}", exception.Message));
            }

            NotificationCenter.SendNotifications(NotificationCenter.NotificationType.Track, eventKey, userId,
                                                 userAttributes, eventTags, conversionEvent);
        }
        public IActionResult Edit(int id, Event newEvent)
        {
            ViewBag.Teachers = _context.Teachers.ToList();
            ViewBag.Tags     = _context.Tags.ToList();
            Event existEvent = _context.Events.FirstOrDefault(x => x.Id == id);

            if (existEvent == null)
            {
                return(RedirectToAction("index"));
            }
            if (newEvent.ImageFile != null)
            {
                if (newEvent.ImageFile.ContentType != "image/png" && newEvent.ImageFile.ContentType != "image/jpeg")
                {
                    ModelState.AddModelError("ImageFile", "Jpeg ve ya png formatinda file daxil edilmelidir");
                    return(View());
                }
                if (newEvent.ImageFile.Length > (1024 * 1024) * 5)
                {
                    ModelState.AddModelError("ImageFile", "File olcusu 5mb-dan cox olmaz!");
                    return(View());
                }
                string rootPath = _env.WebRootPath;
                var    fileName = Guid.NewGuid().ToString() + newEvent.ImageFile.FileName;
                var    path     = Path.Combine(rootPath, "uploads/event", fileName);
                using (FileStream stream = new FileStream(path, FileMode.Create))
                {
                    newEvent.ImageFile.CopyTo(stream);
                }
                if (existEvent.Image != null)
                {
                    string existPath = Path.Combine(_env.WebRootPath, "uploads/event", existEvent.Image);
                    if (System.IO.File.Exists(existPath))
                    {
                        System.IO.File.Delete(existPath);
                    }
                }
                existEvent.Image = fileName;
            }

            if (!ModelState.IsValid)
            {
                return(View());
            }



            var existTags = _context.EventTags.Where(x => x.EventId == id).ToList();

            if (newEvent.TagIds != null)
            {
                foreach (var tagId in newEvent.TagIds)
                {
                    var existTag = existTags.FirstOrDefault(x => x.TagId == tagId);
                    if (existTag == null)
                    {
                        EventTags eventTag = new EventTags
                        {
                            EventId = id,
                            TagId   = tagId
                        };
                        _context.EventTags.Add(eventTag);
                    }
                    else
                    {
                        existTags.Remove(existTag);
                    }
                }
            }

            _context.EventTags.RemoveRange(existTags);

            var existTeachers = _context.EventTeachers.Where(x => x.EventId == id).ToList();

            if (newEvent.TeacherIds != null)
            {
                foreach (var eventId in newEvent.TeacherIds)
                {
                    var existTeacher = existTeachers.FirstOrDefault(x => x.TeacherId == eventId);
                    if (existTeacher == null)
                    {
                        EventTags eventTeacher = new EventTags
                        {
                            EventId = id,
                            TagId   = eventId
                        };
                        _context.EventTags.Add(eventTeacher);
                    }
                    else
                    {
                        existTeachers.Remove(existTeacher);
                    }
                }
            }

            _context.EventTeachers.RemoveRange(existTeachers);


            existEvent.Name      = newEvent.Name;
            existEvent.StartTime = newEvent.StartTime;
            existEvent.EndTime   = newEvent.EndTime;
            existEvent.City      = newEvent.City;
            existEvent.About     = newEvent.About;
            existEvent.CreatedAt = newEvent.CreatedAt;

            _context.SaveChanges();
            return(RedirectToAction("index"));
        }
        private void Expect(string experimentId, string variationId, string eventName, string visitorId, UserAttributes attributes, EventTags tags)
        {
            var expectedEvent = new CanonicalEvent(experimentId, variationId, eventName, visitorId, attributes, tags);

            ExpectedEvents.Add(expectedEvent);
        }
 public void ExpectConversion(string eventName, string userId, UserAttributes attributes = null, EventTags tags = null)
 {
     Expect(null, null, eventName, userId, attributes, tags);
 }
Exemple #15
0
        /// <summary>
        /// Sends conversion event to Optimizely.
        /// </summary>
        /// <param name="eventKey">Event key representing the event which needs to be recorded</param>
        /// <param name="userId">ID for user</param>
        /// <param name="userAttributes">Attributes of the user</param>
        /// <param name="eventTags">eventTags array Hash representing metadata associated with the event.</param>
        public void Track(string eventKey, string userId, UserAttributes userAttributes = null, EventTags eventTags = null)
        {
            if (!IsValid)
            {
                Logger.Log(LogLevel.ERROR, "Datafile has invalid format. Failing 'track'.");
                return;
            }

            var inputValues = new Dictionary <string, string>
            {
                { USER_ID, userId },
                { EVENT_KEY, eventKey }
            };

            if (!ValidateStringInputs(inputValues))
            {
                return;
            }

            var eevent = Config.GetEvent(eventKey);

            if (eevent.Key == null)
            {
                Logger.Log(LogLevel.ERROR, string.Format("Not tracking user {0} for event {1}.", userId, eventKey));
                return;
            }

            // Filter out experiments that are not running or when user(s) do not meet conditions.
            var validExperimentIdToVariationMap = new Dictionary <string, Variation>();
            var experimentIds = eevent.ExperimentIds;

            foreach (string id in eevent.ExperimentIds)
            {
                var experiment = Config.GetExperimentFromId(id);
                //Validate experiment
                var variation = DecisionService.GetVariation(experiment, userId, userAttributes);

                if (variation != null)
                {
                    validExperimentIdToVariationMap[experiment.Id] = variation;
                }
                else
                {
                    Logger.Log(LogLevel.INFO, string.Format("Not tracking user \"{0}\" for experiment \"{1}\"", userId, experiment.Key));
                }
            }

            if (validExperimentIdToVariationMap.Count > 0)
            {
                if (userAttributes != null)
                {
                    userAttributes = userAttributes.FilterNullValues(Logger);
                }

                if (eventTags != null)
                {
                    eventTags = eventTags.FilterNullValues(Logger);
                }

                var conversionEvent = EventBuilder.CreateConversionEvent(Config, eventKey, validExperimentIdToVariationMap,
                                                                         userId, userAttributes, eventTags);
                Logger.Log(LogLevel.INFO, string.Format("Tracking event {0} for user {1}.", eventKey, userId));
                Logger.Log(LogLevel.DEBUG, string.Format("Dispatching conversion event to URL {0} with params {1}.",
                                                         conversionEvent.Url, conversionEvent.GetParamsAsJson()));

                try
                {
                    EventDispatcher.DispatchEvent(conversionEvent);
                }
                catch (Exception exception)
                {
                    Logger.Log(LogLevel.ERROR, string.Format("Unable to dispatch conversion event. Error {0}", exception.Message));
                }

                NotificationCenter.SendNotifications(NotificationCenter.NotificationType.Track, eventKey, userId,
                                                     userAttributes, eventTags, conversionEvent);
            }
            else
            {
                Logger.Log(LogLevel.INFO, string.Format("There are no valid experiments for event {0} to track.", eventKey));
            }
        }
        /// <summary>
        /// Sends conversion event to Optimizely.
        /// </summary>
        /// <param name="eventKey">Event key representing the event which needs to be recorded</param>
        /// <param name="userId">ID for user</param>
        /// <param name="userAttributes">Attributes of the user</param>
        /// <param name="eventTags">eventTags array Hash representing metadata associated with the event.</param>
        public void Track(string eventKey, string userId, UserAttributes userAttributes = null, EventTags eventTags = null)
        {
            var config = ProjectConfigManager?.GetConfig();

            if (config == null)
            {
                Logger.Log(LogLevel.ERROR, "Datafile has invalid format. Failing 'Track'.");
                return;
            }

            var inputValues = new Dictionary <string, string>
            {
                { USER_ID, userId },
                { EVENT_KEY, eventKey }
            };

            if (!ValidateStringInputs(inputValues))
            {
                return;
            }

            var eevent = config.GetEvent(eventKey);

            if (eevent.Key == null)
            {
                Logger.Log(LogLevel.INFO, string.Format("Not tracking user {0} for event {1}.", userId, eventKey));
                return;
            }


            if (eventTags != null)
            {
                eventTags = eventTags.FilterNullValues(Logger);
            }

            var userEvent = UserEventFactory.CreateConversionEvent(config, eventKey, userId, userAttributes, eventTags);

            EventProcessor.Process(userEvent);
            Logger.Log(LogLevel.INFO, string.Format("Tracking event {0} for user {1}.", eventKey, userId));

            if (NotificationCenter.GetNotificationCount(NotificationCenter.NotificationType.Track) > 0)
            {
                var conversionEvent = EventFactory.CreateLogEvent(userEvent, Logger);
                NotificationCenter.SendNotifications(NotificationCenter.NotificationType.Track, eventKey, userId,
                                                     userAttributes, eventTags, conversionEvent);
            }
        }
Exemple #17
0
 internal NameInfo GetNameInfo(string name, EventTags tags) =>
 this.nameInfos.TryGet(new KeyValuePair <string, EventTags>(name, tags)) ??
 this.nameInfos.GetOrAdd(new NameInfo(name, tags, this.typeMetadata.Length));
Exemple #18
0
        /// <summary>
        /// Create conversion event to be sent to the logging endpoint.
        /// </summary>
        /// <param name="config">ProjectConfig Configuration for the project.</param>
        /// <param name="eventKey">Event Key representing the event</param>
        /// <param name="ExperimentIdVariationMap">Map of experiment ID to the variation that the user is bucketed into.</param>
        /// <param name="userId">ID of user</param>
        /// <param name="userAttributes">associative array of Attributes for the user</param>
        /// <param name="eventValue">integer Value associated with the event</param>
        /// <returns>LogEvent object to be sent to dispatcher</returns>
        public virtual LogEvent CreateConversionEvent(ProjectConfig config, string eventKey, Dictionary <string, Variation> experimentIdVariationMap, string userId, UserAttributes userAttributes, EventTags eventTags)
        {
            var commonParams = GetCommonParams(config, userId, userAttributes ?? new UserAttributes());

            var conversionOnlyParams = GetConversionParams(config, eventKey, experimentIdVariationMap, userId, eventTags).ToArray();

            var conversionParams = GetImpressionOrConversionParamsWithCommonParams(commonParams, conversionOnlyParams);

            return(new LogEvent(CONVERSION_ENDPOINT, conversionParams, HTTP_VERB, HTTP_HEADERS));
        }
Exemple #19
0
        private unsafe void WriteToAllListeners(string eventName, ref EventDescriptor eventDescriptor, EventTags tags, Guid *pActivityId, EventPayload payload)
        {
            EventWrittenEventArgs eventCallbackArgs = new EventWrittenEventArgs(this);

            eventCallbackArgs.EventName  = eventName;
            eventCallbackArgs.m_level    = (EventLevel)eventDescriptor.Level;
            eventCallbackArgs.m_keywords = (EventKeywords)eventDescriptor.Keywords;
            eventCallbackArgs.m_opcode   = (EventOpcode)eventDescriptor.Opcode;
            eventCallbackArgs.m_tags     = tags;

            // Self described events do not have an id attached. We mark it internally with -1.
            eventCallbackArgs.EventId = -1;
            if (pActivityId != null)
            {
                eventCallbackArgs.RelatedActivityId = *pActivityId;
            }

            if (payload != null)
            {
                eventCallbackArgs.Payload      = new ReadOnlyCollection <object>((IList <object>)payload.Values);
                eventCallbackArgs.PayloadNames = new ReadOnlyCollection <string>((IList <string>)payload.Keys);
            }

            DispatchToAllListeners(-1, pActivityId, eventCallbackArgs);
        }
Exemple #20
0
 protected TraceLoggingTypeInfo(string name, EventLevel level, EventOpcode opcode, EventKeywords keywords, EventTags tags)
     : base(typeof(DataType), name, level, opcode, keywords, tags)
 {
 }
 public EventMetadata(EventDescriptor descriptor,
     EventTags tags,
     bool enabledForAnyListener,
     bool enabledForETW,
     string name,
     string message,
     EventParameterType[] parameterTypes)
 {
     this.Descriptor = descriptor;
     this.Tags = tags;
     this.EnabledForAnyListener = enabledForAnyListener;
     this.EnabledForETW = enabledForETW;
     this.TriggersActivityTracking = 0;
     this.Name = name;
     this.Message = message;
     this.Parameters = null;
     this.TraceLoggingEventTypes = null;
     this.ActivityOptions = EventActivityOptions.None;
     this.ParameterTypes = parameterTypes;
     this.HasRelatedActivityID = false;
 }
 internal TraceLoggingEventTypes(string name, EventTags tags, params TraceLoggingTypeInfo[] typeInfos)
     : this(tags, name, TraceLoggingEventTypes.MakeArray(typeInfos))
 {
 }
Exemple #23
0
        public TypeAnalysis(
            Type dataType,
            EventDataAttribute eventAttrib,
            List<Type> recursionCheck)
        {
            var propertyInfos = Statics.GetProperties(dataType);
            var propertyList = new List<PropertyAnalysis>();

            foreach (var propertyInfo in propertyInfos)
            {
                if (Statics.HasCustomAttribute(propertyInfo, typeof(EventIgnoreAttribute)))
                {
                    continue;
                }

                if (!propertyInfo.CanRead ||
                    propertyInfo.GetIndexParameters().Length != 0)
                {
                    continue;
                }

                MethodInfo getterInfo = Statics.GetGetMethod(propertyInfo);
                if (getterInfo == null)
                {
                    continue;
                }

                if (getterInfo.IsStatic || !getterInfo.IsPublic)
                {
                    continue;
                }

                var propertyType = propertyInfo.PropertyType;
                var propertyTypeInfo = Statics.GetTypeInfoInstance(propertyType, recursionCheck);
                var fieldAttribute = Statics.GetCustomAttribute<EventFieldAttribute>(propertyInfo);

                string propertyName =
                    fieldAttribute != null && fieldAttribute.Name != null
                    ? fieldAttribute.Name
                    : Statics.ShouldOverrideFieldName(propertyInfo.Name)
                    ? propertyTypeInfo.Name
                    : propertyInfo.Name;
                propertyList.Add(new PropertyAnalysis(
                    propertyName,
                    getterInfo,
                    propertyTypeInfo,
                    fieldAttribute));
            }

            this.properties = propertyList.ToArray();

            foreach (var property in this.properties)
            {
                var typeInfo = property.typeInfo;
                this.level = (EventLevel)Statics.Combine((int)typeInfo.Level, (int)this.level);
                this.opcode = (EventOpcode)Statics.Combine((int)typeInfo.Opcode, (int)this.opcode);
                this.keywords |= typeInfo.Keywords;
                this.tags |= typeInfo.Tags;
            }

            if (eventAttrib != null)
            {
                this.level = (EventLevel)Statics.Combine((int)eventAttrib.Level, (int)this.level);
                this.opcode = (EventOpcode)Statics.Combine((int)eventAttrib.Opcode, (int)this.opcode);
                this.keywords |= eventAttrib.Keywords;
                this.tags |= eventAttrib.Tags;
                this.name = eventAttrib.Name;
            }

            if (this.name == null)
            {
                this.name = dataType.Name;
            }
        }
Exemple #24
0
        public void PopulateEvent(Event ev)
        {
            if (MinDate.HasValue || MaxDate.HasValue)
            {
                ev.Date = RandomData.GetDateTime(MinDate ?? DateTime.MinValue, MaxDate ?? DateTime.MaxValue);
            }

            ev.Type = new [] { Event.KnownTypes.Error, Event.KnownTypes.FeatureUsage, Event.KnownTypes.Log, Event.KnownTypes.NotFound }.Random();
            if (ev.Type == Event.KnownTypes.FeatureUsage)
            {
                ev.Source = FeatureNames.Random();
            }
            else if (ev.Type == Event.KnownTypes.NotFound)
            {
                ev.Source = PageNames.Random();
            }
            else if (ev.Type == Event.KnownTypes.Log)
            {
                ev.Source  = LogSources.Random();
                ev.Message = RandomData.GetString();

                string level = LogLevels.Random();
                if (!String.IsNullOrEmpty(level))
                {
                    ev.Data[Event.KnownDataKeys.Level] = level;
                }
            }

            if (RandomData.GetBool(80))
            {
                ev.Geo = RandomData.GetCoordinate();
            }

            if (RandomData.GetBool(20))
            {
                ev.Value = RandomData.GetInt(0, 10000);
            }

            ev.SetUserIdentity(Identities.Random());
            ev.SetVersion(RandomData.GetVersion("2.0", "4.0"));

            ev.AddRequestInfo(new RequestInfo {
                //ClientIpAddress = ClientIpAddresses.Random(),
                Path = PageNames.Random()
            });

            ev.Data.Add(Event.KnownDataKeys.EnvironmentInfo, new EnvironmentInfo {
                IpAddress   = MachineIpAddresses.Random() + ", " + MachineIpAddresses.Random(),
                MachineName = MachineNames.Random()
            });

            for (int i = 0; i < RandomData.GetInt(1, 3); i++)
            {
                string key = RandomData.GetWord();
                while (ev.Data.ContainsKey(key) || key == Event.KnownDataKeys.Error)
                {
                    key = RandomData.GetWord();
                }

                ev.Data.Add(key, RandomData.GetString());
            }

            int tagCount = RandomData.GetInt(1, 3);

            for (int i = 0; i < tagCount; i++)
            {
                string tag = EventTags.Random();
                if (!ev.Tags.Contains(tag))
                {
                    ev.Tags.Add(tag);
                }
            }

            if (ev.Type == Event.KnownTypes.Error)
            {
                if (RandomData.GetBool())
                {
                    // limit error variation so that stacking will occur
                    if (_randomErrors == null)
                    {
                        _randomErrors = new List <Error>(Enumerable.Range(1, 25).Select(i => GenerateError()));
                    }

                    ev.Data[Event.KnownDataKeys.Error] = _randomErrors.Random();
                }
                else
                {
                    // limit error variation so that stacking will occur
                    if (_randomSimpleErrors == null)
                    {
                        _randomSimpleErrors = new List <SimpleError>(Enumerable.Range(1, 25).Select(i => GenerateSimpleError()));
                    }

                    ev.Data[Event.KnownDataKeys.SimpleError] = _randomSimpleErrors.Random();
                }
            }
        }
        internal NameInfo GetNameInfo(string name, EventTags tags)
        {
            var ret = this.nameInfos.TryGet(new KeyValuePair<string, EventTags>(name, tags));
            if (ret == null)
            {
                ret = this.nameInfos.GetOrAdd(new NameInfo(name, tags, this.typeMetadata.Length));
            }

            return ret;
        }
 public InMemoryCachedDepartmentRepository(IEventStore eventStore)
 {
     _eventStore = eventStore;
     tag         = EventTags.GetOrCreateIfNotExists(typeof(Department));
 }
        internal TraceLoggingEventTypes(
            string name,
            EventTags tags,
            System.Reflection.ParameterInfo[] paramInfos)
        {
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }

            Contract.EndContractBlock();

            this.typeInfos = MakeArray(paramInfos);
            this.name = name;
            this.tags = tags;
            this.level = Statics.DefaultLevel;

            var collector = new TraceLoggingMetadataCollector();
            for (int i = 0; i < typeInfos.Length; ++i)
            {
                var typeInfo = typeInfos[i];
                this.level = Statics.Combine((int)typeInfo.Level, this.level);
                this.opcode = Statics.Combine((int)typeInfo.Opcode, this.opcode);
                this.keywords |= typeInfo.Keywords;
                var paramName = paramInfos[i].Name;
                if (Statics.ShouldOverrideFieldName(paramName))
                {
                    paramName = typeInfo.Name;
                }
                typeInfo.WriteMetadata(collector, paramName, EventFieldFormat.Default);
            }

            this.typeMetadata = collector.GetMetadata();
            this.scratchSize = collector.ScratchSize;
            this.dataCount = collector.DataCount;
            this.pinCount = collector.PinCount;
        }
        public CanonicalEvent(string experimentId, string variationId, string eventName, string visitorId, UserAttributes attributes, EventTags tags)
        {
            ExperimentId = experimentId;
            VariationId  = variationId;
            EventName    = eventName;
            VisitorId    = visitorId;

            Attributes = attributes ?? new UserAttributes();
            Tags       = tags ?? new EventTags();
        }