/// <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); }
/// <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; }
/// <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, ""); }
/// <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); }
/// <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)); }
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); }
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(); }
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); }
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); }
/// <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); } }
/// <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; } }
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 }
/// <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)
/// <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); }