@@ -363,7 +363,7 @@ public Thread newThread(Runnable r) {
363363 // all the workers are busy.
364364 final BlockingQueue <FlushPayload > payloadQueue = new ArrayBlockingQueue <>(1 );
365365
366- final EventBuffer outbox = new EventBuffer (eventsConfig .capacity , logger );
366+ final EventBuffer outbox = new EventBuffer (eventsConfig .capacity , eventsConfig . perContextSummarization , logger );
367367 this .contextDeduplicator = eventsConfig .contextDeduplicator ;
368368
369369 Thread mainThread = threadFactory .newThread (new Thread () {
@@ -608,7 +608,13 @@ private void triggerFlush(EventBuffer outbox, BlockingQueue<FlushPayload> payloa
608608 }
609609 FlushPayload payload = outbox .getPayload ();
610610 if (diagnosticStore != null ) {
611- int eventCount = payload .events .length + (payload .summary .isEmpty () ? 0 : 1 );
611+ int summaryCount = 0 ;
612+ for (EventSummary summary : payload .summaries ) {
613+ if (!summary .isEmpty ()) {
614+ summaryCount ++;
615+ }
616+ }
617+ int eventCount = payload .events .length + summaryCount ;
612618 diagnosticStore .recordEventsInBatch (eventCount );
613619 }
614620 busyFlushWorkersCount .incrementAndGet ();
@@ -618,7 +624,10 @@ private void triggerFlush(EventBuffer outbox, BlockingQueue<FlushPayload> payloa
618624 } else {
619625 logger .debug ("Skipped flushing because all workers are busy" );
620626 // All the workers are busy so we can't flush now; keep the events in our state
621- outbox .summarizer .restoreTo (payload .summary );
627+ // Only restore if using single summarizer (not per-context)
628+ if (outbox .summarizer != null && !payload .summaries .isEmpty ()) {
629+ outbox .summarizer .restoreTo (payload .summaries .get (0 ));
630+ }
622631 synchronized (busyFlushWorkersCount ) {
623632 busyFlushWorkersCount .decrementAndGet ();
624633 busyFlushWorkersCount .notify ();
@@ -661,15 +670,25 @@ public void run() {
661670
662671 private static final class EventBuffer {
663672 final List <Event > events = new ArrayList <>();
664- final EventSummarizer summarizer = new EventSummarizer ();
673+ final EventSummarizer summarizer ; // used when perContextSummarization is false
674+ final MultiContextEventSummarizer multiContextSummarizer ; // used when perContextSummarization is true
675+ private final boolean perContextSummarization ;
665676 private final int capacity ;
666677 private final LDLogger logger ;
667678 private boolean capacityExceeded = false ;
668679 private long droppedEventCount = 0 ;
669680
670- EventBuffer (int capacity , LDLogger logger ) {
681+ EventBuffer (int capacity , boolean perContextSummarization , LDLogger logger ) {
671682 this .capacity = capacity ;
683+ this .perContextSummarization = perContextSummarization ;
672684 this .logger = logger ;
685+ if (perContextSummarization ) {
686+ this .summarizer = null ;
687+ this .multiContextSummarizer = new MultiContextEventSummarizer ();
688+ } else {
689+ this .summarizer = new EventSummarizer ();
690+ this .multiContextSummarizer = null ;
691+ }
673692 }
674693
675694 void add (Event e ) {
@@ -686,19 +705,35 @@ void add(Event e) {
686705 }
687706
688707 void addToSummary (Event .FeatureRequest e ) {
689- summarizer .summarizeEvent (
690- e .getCreationDate (),
691- e .getKey (),
692- e .getVersion (),
693- e .getVariation (),
694- e .getValue (),
695- e .getDefaultVal (),
696- e .getContext ()
697- );
708+ if (perContextSummarization ) {
709+ multiContextSummarizer .summarizeEvent (
710+ e .getCreationDate (),
711+ e .getKey (),
712+ e .getVersion (),
713+ e .getVariation (),
714+ e .getValue (),
715+ e .getDefaultVal (),
716+ e .getContext ()
717+ );
718+ } else {
719+ summarizer .summarizeEvent (
720+ e .getCreationDate (),
721+ e .getKey (),
722+ e .getVersion (),
723+ e .getVariation (),
724+ e .getValue (),
725+ e .getDefaultVal (),
726+ e .getContext ()
727+ );
728+ }
698729 }
699730
700731 boolean isEmpty () {
701- return events .isEmpty () && summarizer .isEmpty ();
732+ if (perContextSummarization ) {
733+ return events .isEmpty () && multiContextSummarizer .isEmpty ();
734+ } else {
735+ return events .isEmpty () && summarizer .isEmpty ();
736+ }
702737 }
703738
704739 long getAndClearDroppedCount () {
@@ -709,23 +744,33 @@ long getAndClearDroppedCount() {
709744
710745 FlushPayload getPayload () {
711746 Event [] eventsOut = events .toArray (new Event [events .size ()]);
712- EventSummarizer .EventSummary summary = summarizer .getSummaryAndReset ();
713- return new FlushPayload (eventsOut , summary );
747+ List <EventSummarizer .EventSummary > summaries ;
748+ if (perContextSummarization ) {
749+ summaries = multiContextSummarizer .getSummariesAndReset ();
750+ } else {
751+ EventSummarizer .EventSummary summary = summarizer .getSummaryAndReset ();
752+ summaries = java .util .Collections .singletonList (summary );
753+ }
754+ return new FlushPayload (eventsOut , summaries );
714755 }
715756
716757 void clear () {
717758 events .clear ();
718- summarizer .clear ();
759+ if (perContextSummarization ) {
760+ multiContextSummarizer .clear ();
761+ } else {
762+ summarizer .clear ();
763+ }
719764 }
720765 }
721766
722767 private static final class FlushPayload {
723768 final Event [] events ;
724- final EventSummary summary ;
769+ final List < EventSummary > summaries ;
725770
726- FlushPayload (Event [] events , EventSummary summary ) {
771+ FlushPayload (Event [] events , List < EventSummary > summaries ) {
727772 this .events = events ;
728- this .summary = summary ;
773+ this .summaries = summaries ;
729774 }
730775 }
731776
@@ -774,7 +819,7 @@ public void run() {
774819 try {
775820 ByteArrayOutputStream buffer = new ByteArrayOutputStream (INITIAL_OUTPUT_BUFFER_SIZE );
776821 Writer writer = new BufferedWriter (new OutputStreamWriter (buffer , Charset .forName ("UTF-8" )), INITIAL_OUTPUT_BUFFER_SIZE );
777- int outputEventCount = formatter .writeOutputEvents (payload .events , payload .summary , writer );
822+ int outputEventCount = formatter .writeOutputEvents (payload .events , payload .summaries , writer );
778823 writer .flush ();
779824 EventSender .Result result = eventsConfig .eventSender .sendAnalyticsEvents (
780825 buffer .toByteArray (),
0 commit comments