Exemplo n.º 1
0
        /// <summary>
        /// Write batches of entity based events to PlayStream.
        /// </summary>
        public static void WriteEvents(WriteEventsRequest request, Action <WriteEventsResponse> resultCallback, Action <PlayFabError> errorCallback, object customData = null, Dictionary <string, string> extraHeaders = null)
        {
            var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer;


            PlayFabHttp.MakeApiCall("/Event/WriteEvents", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Write a number of empty arrays of random size
        /// </summary>
        private static async Task WriteEvents()
        {
            Console.WriteLine("Writing 20 events");
            var random = new Random();

            using var call = _client.WriteEvents();

            var writer = call.RequestStream;

            for (int i = 0; i < 20; i++)
            {
                var payload = new byte[random.Next(1024 * 16)];
                var request = new WriteEventsRequest
                {
                    Event  = ByteString.CopyFrom(payload),
                    Scope  = ScopeName,
                    Stream = StreamName
                };
                await writer.WriteAsync(request);
            }

            await writer.CompleteAsync();

            await call.ResponseAsync;
        }
Exemplo n.º 3
0
        /// <summary>
        /// Write batches of entity based events to PlayStream.
        /// </summary>
        public async Task <PlayFabResult <WriteEventsResponse> > WriteEventsAsync(WriteEventsRequest request, object customData = null, Dictionary <string, string> extraHeaders = null)
        {
            var requestSettings = apiSettings ?? PlayFabSettings.staticSettings;

            if ((request?.AuthenticationContext?.EntityToken ?? authenticationContext.EntityToken) == null)
            {
                throw new PlayFabException(PlayFabExceptionCode.EntityTokenNotSet, "Must call GetEntityToken before calling this method");
            }

            var httpResult = await PlayFabHttp.DoPost("/Event/WriteEvents", request, "X-EntityToken", authenticationContext.EntityToken, extraHeaders, requestSettings);

            if (httpResult is PlayFabError)
            {
                var error = (PlayFabError)httpResult;
                PlayFabSettings.GlobalErrorHandler?.Invoke(error);
                return(new PlayFabResult <WriteEventsResponse> {
                    Error = error, CustomData = customData
                });
            }

            var resultRawJson = (string)httpResult;
            var resultData    = PluginManager.GetPlugin <ISerializerPlugin>(PluginContract.PlayFab_Serializer).DeserializeObject <PlayFabJsonSuccess <WriteEventsResponse> >(resultRawJson);
            var result        = resultData.data;

            return(new PlayFabResult <WriteEventsResponse> {
                Result = result, CustomData = customData
            });
        }
    public async void WriteOneDSEventsAsync(UUnitTestContext testContext)
#endif
    {
        var event1 = new PlayFabEvent()
        {
            Name = "Event_1", EventType = PlayFabEventType.Lightweight
        };

        event1.SetProperty("Prop-A", true);
        event1.SetProperty("Prop-B", "hello");
        event1.SetProperty("Prop-C", 123);

        var event2 = new PlayFabEvent()
        {
            Name = "Event_2", EventType = PlayFabEventType.Lightweight
        };

        event2.SetProperty("Prop-A", false);
        event2.SetProperty("Prop-B", "good-bye");
        event2.SetProperty("Prop-C", 456);

        var request = new WriteEventsRequest
        {
            Events = new List <EventContents>
            {
                event1.EventContents,
                event2.EventContents
            }
        };

        var oneDSEventsApi = new OneDSEventsAPI();

        // get OneDS authentication from PlayFab
        var configRequest = new TelemetryIngestionConfigRequest();

#if TPL_35
        var authTask = OneDSEventsAPI.GetTelemetryIngestionConfigAsync(configRequest).Await();
#else
        var authTask = await OneDSEventsAPI.GetTelemetryIngestionConfigAsync(configRequest);
#endif

        var response = authTask.Result;

        testContext.NotNull(authTask.Result, "Failed to get OneDS authentication info from PlayFab");
        oneDSEventsApi.SetCredentials("o:" + authTask.Result.TenantId, authTask.Result.IngestionKey, authTask.Result.TelemetryJwtToken, authTask.Result.TelemetryJwtHeaderKey, authTask.Result.TelemetryJwtHeaderPrefix);

        // call OneDS events API
#if TPL_35
        var writeTask = oneDSEventsApi.WriteTelemetryEventsAsync(request, null, new Dictionary <string, string>()).Await();
#else
        var writeTask = await oneDSEventsApi.WriteTelemetryEventsAsync(request, null, new Dictionary <string, string>());
#endif

        testContext.NotNull(writeTask);
        testContext.IsNull(writeTask.Error, "Failed to send a batch of custom OneDS events");
        testContext.NotNull(writeTask.Result, "Failed to send a batch of custom OneDS events. Result is null!");
        testContext.EndTest(UUnitFinishState.PASSED, "");
    }
Exemplo n.º 5
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.");
            }
        }
        /// <summary>
        /// Write batches of entity based events to as Telemetry events (bypass PlayStream). The namespace must be 'custom' or start
        /// with 'custom.'
        /// </summary>
        public void WriteTelemetryEvents(WriteEventsRequest request, Action <WriteEventsResponse> resultCallback, Action <PlayFabError> errorCallback, object customData = null, Dictionary <string, string> extraHeaders = null)
        {
            var context      = (request == null ? null : request.AuthenticationContext) ?? authenticationContext;
            var callSettings = apiSettings ?? PlayFabSettings.staticSettings;

            if (!context.IsEntityLoggedIn())
            {
                throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn, "Must be logged in to call this method");
            }
            PlayFabHttp.MakeApiCall("/Event/WriteTelemetryEvents", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Write batches of entity based events to as Telemetry events (bypass PlayStream).
        /// </summary>
        /// <param name="Events">Collection of events to write to PlayStream. (Required)</param>
        public static Task <WriteEventsResponse> WriteTelemetryEvents(List <EventContents> Events,
                                                                      PlayFabAuthenticationContext customAuthContext = null, object customData = null, Dictionary <string, string> extraHeaders = null)
        {
            WriteEventsRequest request = new WriteEventsRequest()
            {
                Events = Events,
            };

            var context = GetContext(customAuthContext);

            return(PlayFabHttp.MakeApiCallAsync <WriteEventsResponse>("/Event/WriteTelemetryEvents", request,
                                                                      AuthType.EntityToken,
                                                                      customData, extraHeaders, context));
        }
Exemplo n.º 8
0
        private async Task SendResultsToPlayFab(QosResult result)
        {
            var eventContents = new EventContents
            {
                Name = "qos_result",
                EventNamespace = "playfab.servers",
                Payload = QosResultFacade.CreateFrom(result)
            };

            var writeEventsRequest = new WriteEventsRequest
            {
                Events = new List<EventContents> {eventContents}
            };

            await WriteTelemetryAsync(writeEventsRequest);
        }
Exemplo n.º 9
0
        protected override void OnCommandBatch(IEnumerable <Command> commands)
        {
            foreach (var command in commands)
            {
                var record = new JournalRecord(0, DateTimeOffset.Now, command);
                var bytes  = _serializer.Serialize(record);

                var request = new WriteEventsRequest
                {
                    Event  = ByteString.CopyFrom(bytes),
                    Stream = _stream,
                    Scope  = _scope
                };

                _writer.RequestStream.WriteAsync(request).GetAwaiter().GetResult();
            }

            _writer.RequestStream.CompleteAsync().GetAwaiter().GetResult();
        }
Exemplo n.º 10
0
        private async Task SendSuccessfulQosResultsToPlayFab(object resultState)
        {
            var result        = (QosResult)resultState;
            var eventContents = new EventContents
            {
                Name           = "qos_result",
                EventNamespace = "playfab.servers",
                Payload        = QosResultPlayFabEvent.CreateFrom(result)
            };

            var writeEventsRequest = new WriteEventsRequest
            {
                Events = new List <EventContents> {
                    eventContents
                }
            };

            await eventsApi.WriteTelemetryEventsAsync(writeEventsRequest);
        }
Exemplo n.º 11
0
        static public async Task <WriteEventsResponse> WriteEvent(string titleToken, PlayFab.EventsModels.EntityKey Entity, string eventName, object eventData)
        {
            var request = new WriteEventsRequest();

            //request.AuthenticationContext = new PlayFabAuthenticationContext() { EntityToken = titleToken};

            request.Events = new List <EventContents>();
            request.Events.Add(new EventContents
            {
                Entity         = Entity,
                EventNamespace = System.Environment.GetEnvironmentVariable("PLAYFAB_EVENT_NAMESPACE"),
                Name           = eventName,
                Payload        = eventData
            });

            var result = await PlayFabEventsAPI.WriteEventsAsync(request);

            return(result.Result);
        }
Exemplo n.º 12
0
        /// <summary>
        /// Sends events to server.
        /// </summary>
        public void Send()
        {
            if (PlayFabClientAPI.IsClientLoggedIn())
            {
                int eventsInTheBatch       = 0;
                WriteEventsRequest request = new WriteEventsRequest();
                request.Events            = new List <EventContents>();
                request.FlushToPlayStream = true;

                while ((eventsRequests.Count > 0) && (eventsInTheBatch < maxBatchSizeInEvents))
                {
                    EventContents eventInfo = eventsRequests.Dequeue();
                    request.Events.Add(eventInfo);

                    eventsInTheBatch++;
                }

                PlayFabEntityAPI.WriteEvents(request, EventSentSuccessfulCallback, EventSentErrorCallback);
            }
        }
Exemplo n.º 13
0
        /// <summary>
        /// Sends events to server.
        /// </summary>
        public void Send()
        {
            if ((PlayFabClientAPI.IsClientLoggedIn()) && (isSending == false))
            {
                isSending = true;

                WriteEventsRequest request = new WriteEventsRequest();
                request.Events = new List <EventContents>();

                while ((eventsRequests.Count > 0) && (request.Events.Count < maxBatchSizeInEvents))
                {
                    EventContents eventInfo = eventsRequests.Dequeue();
                    request.Events.Add(eventInfo);
                }

                if (request.Events.Count > 0)
                {
                    PlayFabEntityAPI.WriteEvents(request, EventSentSuccessfulCallback, EventSentErrorCallback);
                }

                isSending = false;
            }
        }
Exemplo n.º 14
0
        public async Task <PlayFabResult <WriteEventsResponse> > WriteTelemetryEventsAsync(WriteEventsRequest request, object customData = null, Dictionary <string, string> extraHeaders = null)
#endif
        {
            if (request.Events.Count == 0)
            {
                var apiMethodResult = new PlayFabResult <WriteEventsResponse>
                {
                    Error = new OneDsError
                    {
                        Error        = PlayFabErrorCode.ContentNotFound,
                        ErrorMessage = "No events found in request. Please make sure to provide at least one event in the batch.",
                        HttpStatus   = "OneDSError"
                    },
                    CustomData = customData
                };

#if TPL_35
                return(Task.Run(() => apiMethodResult));
#else
                return(apiMethodResult);
#endif
            }

            if (!this.IsOneDSAuthenticated)
            {
                var apiMethodResult = new PlayFabResult <WriteEventsResponse>
                {
                    Error = new OneDsError
                    {
                        Error        = PlayFabErrorCode.AuthTokenDoesNotExist,
                        ErrorMessage = "OneDS API client is not authenticated. Please make sure OneDS credentials are set.",
                        HttpStatus   = "OneDSError"
                    },
                    CustomData = customData
                };
#if TPL_35
                return(Task.Run(() => apiMethodResult));
#else
                return(apiMethodResult);
#endif
            }

            // get transport plugin for OneDS
            var transport = PluginManager.GetPlugin <IOneDSTransportPlugin>(PluginContract.PlayFab_Transport, PluginManager.PLUGIN_TRANSPORT_ONEDS);

            // compose batch using One Collector's Common Schema 3.0
            byte[] serializedBatch;
            using (var ms = new MemoryStream())
            {
                foreach (var eventContents in request.Events)
                {
                    var csEvent = new OneDSCsEvent();
                    csEvent.data = new List <OneDSEventData>();
                    var data = eventContents.Payload as OneDSEventData;
                    if (data != null)
                    {
                        csEvent.data.Add(data);
                    }

                    csEvent.name = eventContents.Name;

                    csEvent.iKey     = this.oneDSProjectIdIkey;
                    csEvent.time     = DateTime.UtcNow.Ticks;
                    csEvent.ver      = "3.0";
                    csEvent.baseType = string.Empty;
                    csEvent.flags    = 1;

                    // serialize CS 3.0 event using bond
                    BondHelper.Serialize(csEvent, ms);
                }

#if !UNITY_WSA && !UNITY_WP8 && !UNITY_WEBGL
                ms.Position = 0;
                byte[] packageBytes = ms.ToArray();
                ms.SetLength(0);

                // Gzip content
                using (var gZipStream = new GZipStream(ms, CompressionMode.Compress, true))
                {
                    gZipStream.Write(packageBytes, 0, packageBytes.Length);
                }
#endif

                serializedBatch = ms.ToArray();
            }

            // send serialized binary content of batch
            var headers = new Dictionary <string, string>();
            headers["APIKey"]  = this.oneDSIngestionKey;
            headers["Tickets"] = "\"" + oneDSHeaderJwtTicketKey + "\": \"" + oneDSHeaderJwtTicketPrefix + ":" + oneDSJwtToken + "\"";
            if (extraHeaders != null)
            {
                foreach (var extraHeader in extraHeaders)
                {
                    headers.Add(extraHeader.Key, extraHeader.Value);
                }
            }

            PlayFabResult <WriteEventsResponse> result = null;
            transport.DoPost(serializedBatch, headers, httpResult =>
            {
                if (httpResult is OneDsError)
                {
                    var error = (OneDsError)httpResult;
                    result    = new PlayFabResult <WriteEventsResponse> {
                        Error = error, CustomData = customData
                    };
                    return;
                }
                result = new PlayFabResult <WriteEventsResponse> {
                    Result = new WriteEventsResponse(), CustomData = customData
                };
            });
#if TPL_35
            return(Task.Run(() =>
            {
                OneDsUtility.WaitWhile(() => result == null).Await();
                return result;
            }));
#else
            await OneDsUtility.WaitWhile(() => result == null);

            return(result);
#endif
        }
Exemplo n.º 15
0
        /// <summary>
        /// Write batches of custom events to OneDS (One Data Collector).
        /// The payload of custom events must be of OneDSEventData type.
        /// </summary>
#if TPL_35
        public Task <PlayFabResult <WriteEventsResponse> > WriteTelemetryEventsAsync(WriteEventsRequest request, object customData = null, Dictionary <string, string> extraHeaders = null)
Exemplo n.º 16
0
        /// <summary>
        /// Write batches of entity based events to PlayStream.
        /// </summary>

        public void WriteEvents(WriteEventsRequest request, Action <WriteEventsResponse> resultCallback, Action <PlayFabError> errorCallback, object customData = null, Dictionary <string, string> extraHeaders = null)
        {
            PlayFabHttp.MakeApiCall("/Event/WriteEvents", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, false, authenticationContext, ApiSettings);
        }