Exemplo n.º 1
0
        /// <summary>
        /// This method is called by pipeline for each available input item (a batch of events)
        /// </summary>
        /// <param name="batch">The input item (a batch of events).</param>
        protected override void OnNextInputItem(TitleEventBatch batch)
        {
            // Send a batch and wait for result
            var writeEventsRequest = new WriteEventsRequest
            {
                Events = batch.Events.Cast <PlayFabEmitEventRequest>().Select(x => x.Event.EventContents).ToList()
            };

            if (!oneDSEventsApi.IsOneDSAuthenticated)
            {
                var authResult = OneDSEventsAPI.GetTelemetryIngestionConfigAsync(new TelemetryIngestionConfigRequest());
                try
                {
                    authResult.Wait(cts.Token);
                    var response = authResult.Result.Result;
                    if (response != null)
                    {
                        oneDSEventsApi.SetCredentials("o:" + response.TenantId, response.IngestionKey, response.TelemetryJwtToken, response.TelemetryJwtHeaderKey, response.TelemetryJwtHeaderPrefix);
                    }
                    else
                    {
                        throw new Exception($"Failed to get OneDS authentication token from PlayFab service");
                    }
                }
                catch (Exception e)
                {
                    // Cancel result promises that will never be fulfilled
                    // and move on to the next batch.
                    foreach (var request in batch.Events)
                    {
                        PlayFabEmitEventRequest eventRequest = (PlayFabEmitEventRequest)request;
                        eventRequest.ResultPromise?.SetCanceled();
                    }

                    logger.Error($"Exception in OnNextInputItem {e.Source} with message: {e}.");
                }
            }

            Task <PlayFabResult <WriteEventsResponse> > apiTask = oneDSEventsApi.WriteTelemetryEventsAsync(writeEventsRequest);

            try
            {
                apiTask.Wait(cts.Token);
                FulfillPromises(batch.Events, apiTask.Result);
            }
            catch (Exception e)
            {
                // Cancel result promises that will never be fulfilled
                // and move on to the next batch.
                foreach (var request in batch.Events)
                {
                    PlayFabEmitEventRequest eventRequest = (PlayFabEmitEventRequest)request;
                    eventRequest.ResultPromise?.SetCanceled();
                }

                logger.Error($"Exception in OnNextInputItem {e.Source} with message: {e}. This was an unhandled exception, please contact the dev team.");
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// This method is called by pipeline for each available input item (an event)
        /// </summary>
        /// <param name="eventPacket">The input item.</param>
        protected override void OnNextInputItem(IPlayFabEmitEventRequest request)
        {
            PlayFabEmitEventRequest eventRequest = (PlayFabEmitEventRequest)request;

            if (ValidationCheck(eventRequest))
            {
                //Determine titleId of event
                string titleId = eventRequest.TitleId;

                if (string.IsNullOrEmpty(titleId.Trim()))
                {
                    logger.Error(string.Format("Event {0} has null or empty title id", eventRequest.Event.Name));
                }
                else
                {
                    this.InitNewBatch(titleId);
                    this.batches[titleId].Add(eventRequest);

                    // Start keeping track of batch's age when it gets
                    // its first element
                    if (this.batches[titleId].Count == 1)
                    {
                        this.stopwatch.Stop();
                        this.stopwatch.Start();
                    }

                    if (this.batches[titleId].Count >= this.BatchSize)
                    {
                        this.StoreBatch(titleId);
                        this.CreateNewBatch(titleId);

                        // Stop keeping track of batch's age when it is complete and stored
                        this.stopwatch.Reset();
                    }
                }
            }
            else
            {
                logger.Error(string.Format("Event {0} failed validation check and was ignored", eventRequest.Event.Name));
            }
        }