Optimizely will be sunsetting Full Stack Experimentation on July 29, 2024. See the recommended Feature Experimentation migration timeline and documentation.

Dev GuideAPI Reference
Dev GuideAPI ReferenceUser GuideGitHubNuGetDev CommunitySumbit a ticketLog In
GitHubNuGetDev CommunitySumbit a ticket

Event batching

How the Optimizely C# SDK uses the event processor to batch impressions and conversion events into a single payload before sending it to Optimizely.

The Optimizely Full Stack C# SDK batches impression and conversion events into a single payload before sending it to Optimizely. This is achieved through a new SDK component called the event processor.

Event batching has the advantage of reducing the number of outbound requests to Optimizely depending on how you define, configure, and use the event processor. It means less network traffic for the same number of Impression and conversion events tracked.

In the C# SDK, BatchEventProcessor provides implementation of the EventProcessor interface and batches events. You can control batching based on two parameters:

  • Batch size – Defines the number of events that are batched together before sending to Optimizely.
  • Flush interval – Defines the amount of time after which any batched events should be sent to Optimizely.

An event consisting of the batched payload is sent as soon as the batch size reaches the specified limit or flush interval reaches the specified time limit. BatchEventProcessor options are described in more detail below.

📘

Note

Event batching works with both out-of-the-box and custom event dispatchers.

The event batching process does not remove any personally identifiable information (PII) from events. You must still ensure that you are not sending any unnecessary PII to Optimizely.

Basic example

using OptimizelySDK;

class App
{
    static void Main(string[] args)
    {
        string sdkKey = args[0];
        // Returns Optimizely Client
        OptimizelyFactory.NewDefaultInstance(sdkKey);
    }
}

By default, batch size is 10 and flush interval is 30 seconds.

Advanced Example

using OptimizelySDK;

class App
{
    static void Main(string[] args)
    {
        string sdkKey = args[0];
        ProjectConfigManager projectConfigManager = HttpProjectConfigManager.builder()
        .WithSdkKey(sdkKey)
        .Build();

        BatchEventProcessor batchEventProcessor = new BatchEventProcessor.Builder()
            .WithMaxBatchSize(10)
            .WithFlushInterval(TimeSpan.FromSeconds(30))
            .Build();

        Optimizely optimizely = new Optimizely(
             projectConfigManager,
                ..  // Other Params
             ..batchEventProcessor
           );
    }
}

❗️

Warning

The maximum payload size is 3.5 MB. Optimizely rejects requests with a 400 response code, Bad Request Error, if the batch payload exceeds this limit.

The size limitation is because of the Optimizely Events API, which Full Stack uses to send data to Optimizely.

The most common cause of a large payload size is a high batch size. If your payloads exceed the size limit, try configuring a smaller batch size.

BatchEventProcessor

BatchEventProcessor is an implementation of EventProcessor where events are batched. The class maintains a single consumer thread that pulls events off of the BlockingCollection and buffers them for either a configured batch size or a maximum duration before the resulting LogEvent is sent to the EventDispatcher and NotificationCenter.

The following properties can be used to customize the BatchEventProcessor configuration using the Builder class.

PropertyDefault valueDescription
EventDispatcherDefautEventDispatcherUsed to dispatch event payload to Optimizely.
BatchSize10The maximum number of events to batch before dispatching. Once this number is reached, all queued events are flushed and sent to Optimizely.
FlushInterval30000 (30 Seconds)Milliseconds to wait before batching and dispatching events.
EventQueue1000BlockingCollection that queues individual events to be batched and dispatched by the executor.
NotificationCenternullNotification center instance to be used to trigger any notifications.

For more information, see Initialize SDK.

Side effects

The table lists other Optimizely functionality that may be triggered by using this class.

FunctionalityDescription
LogEvent (see following section)Whenever the event processor produces a batch of events, a LogEvent object will be created using the EventFactory.

It contains batch of conversion and impression events.

This object will be dispatched using the provided event dispatcher and also it will be sent to the notification subscribers.
Notification ListenersFlush invokes the LOGEVENT notification listener if this listener is subscribed to.

Register LogEvent listener

To register a LogEvent listener

NotificationCenter.AddNotification(
  										NotificationType.LogEvent, 
                  	  new LogEventCallback((logevent) => {
                		    // Your code here
            					})
                  );

LogEvent

LogEvent object gets created using EventFactory. It represents the batch of impression and conversion events we send to the Optimizely backend.

ObjectTypeDescription
Url
Required
string URL to dispatch log event to.
Params
Required
Dictionary<string, object>Parameters to be set in the log event. It contains EventBatch of all UserEvents inside Visitors.
HttpVerb
Required
stringThe HTTP verb to use when dispatching the log event. It can be GET or POST.
Headers Dictionary<string, string> HeadersHeaders to be set when sending the request.

Dispose Optimizely on application exit

If you enable event batching, you must call the Close method (optimizely.Dispose()) prior to exiting. This ensures that queued events are flushed as soon as possible to avoid any data loss.

Warning

Because the Optimizely client maintains a buffer of queued events, you must call Dispose() on the Optimizely instance before shutting down your application or whenever dereferencing the instance.

MethodDescription
Dispose()Stops all timers and flushes the event queue. This method will also stop any timers that are happening for the datafile manager.