Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
x.x.x (Unreleased)
- Added support for the new impressions tracking toggle available on feature flags.

7.4.0 (Apr 15, 2026)
- Added support for PHP 8.5 version, removing deprecated warning messages.

Expand Down
15 changes: 14 additions & 1 deletion src/SplitIO/Grammar/Split.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ class Split
private $configurations = null;
private $sets = null;

private $impressionsDisabled = false;

public function __construct(array $split)
{
SplitApp::logger()->debug(print_r($split, true));
Expand All @@ -52,7 +54,10 @@ public function __construct(array $split)
$this->configurations = isset($split['configurations']) && count($split['configurations']) > 0 ?
$split['configurations'] : null;
$this->sets = isset($split['sets']) ? $split['sets'] : array();

// Only an explicit boolean true disables impression tracking. Any other value
// (numbers, strings, null, missing or malformed) leaves impressions tracked.
$this->impressionsDisabled = isset($split['impressionsDisabled']) && $split['impressionsDisabled'] === true;

SplitApp::logger()->info("Constructing Feature Flag: ".$this->name);

if (isset($split['conditions']) && is_array($split['conditions'])) {
Expand Down Expand Up @@ -182,4 +187,12 @@ public function getSets()
{
return $this->sets;
}

/**
* @return bool
*/
public function impressionsDisabled()
{
return $this->impressionsDisabled;
}
}
43 changes: 34 additions & 9 deletions src/SplitIO/Sdk/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use SplitIO\Sdk\Events\EventQueueMessage;
use SplitIO\Sdk\QueueMetadataMessage;
use SplitIO\Sdk\Impressions\Impression;
use SplitIO\Sdk\Impressions\DecoratedImpression;
use SplitIO\TreatmentImpression;
use SplitIO\Sdk\Impressions\ImpressionLabel;
use SplitIO\Grammar\Condition\Partition\TreatmentEnum;
Expand Down Expand Up @@ -134,7 +135,8 @@ private function doEvaluation($operation, $key, $featureFlagName, $attributes)
$bucketingKey
);

$this->registerData($impression, $attributes);
$disabled = isset($result['impressionsDisabled']) && $result['impressionsDisabled'];
$this->registerData(new DecoratedImpression($impression, $disabled), $attributes);
return array(
'treatment' => $result['treatment'],
'config' => $result['config'],
Expand All @@ -155,7 +157,7 @@ private function doEvaluation($operation, $key, $featureFlagName, $attributes)
ImpressionLabel::EXCEPTION,
$bucketingKey
);
$this->registerData($impression, $attributes);
$this->registerData(new DecoratedImpression($impression, false), $attributes);
} catch (\Exception $e) {
SplitApp::logger()->critical(
"An error occurred when attempting to log impression for " .
Expand Down Expand Up @@ -237,12 +239,33 @@ private function doInputValidationForTreatments($key, $featureFlagNames, $operat
);
}

private function registerData($impressions, $attributes)
private function registerData($decoratedImpressions, $attributes)
{
try {
TreatmentImpression::log($impressions, $this->queueMetadata);
if (isset($this->impressionListener)) {
$this->impressionListener->sendDataToClient($impressions, $attributes);
// Normalize to array
if (!is_array($decoratedImpressions)) {
$decoratedImpressions = array($decoratedImpressions);
}

// Partition: all go to listener, only enabled go to log
$forListener = array();
$forLog = array();
foreach ($decoratedImpressions as $decorated) {
$impression = $decorated->getImpression();
$forListener[] = $impression;
if (!$decorated->isDisabled()) {
$forLog[] = $impression;
}
}

// Log enabled impressions to Redis
if (!empty($forLog)) {
TreatmentImpression::log($forLog, $this->queueMetadata);
}

// Send all impressions to listener
if (isset($this->impressionListener) && !empty($forListener)) {
$this->impressionListener->sendDataToClient($forListener, $attributes);
}
} catch (\Exception $e) {
SplitApp::logger()->critical(
Expand Down Expand Up @@ -526,18 +549,20 @@ private function processEvaluations(
$evaluations
) {
$result = array();
$impressions = array();
$decoratedImpressions = array();
foreach ($evaluations as $featureFlagName => $evalResult) {
if (InputValidator::isSplitFound($evalResult['impression']['label'], $featureFlagName, $operation)) {
// Creates impression
$impressions[] = $this->createImpression(
$impression = $this->createImpression(
$matchingKey,
$featureFlagName,
$evalResult['treatment'],
$evalResult['impression']['changeNumber'],
$evalResult['impression']['label'],
$bucketingKey
);
$disabled = isset($evalResult['impressionsDisabled']) && $evalResult['impressionsDisabled'];
$decoratedImpressions[] = new DecoratedImpression($impression, $disabled);
$result[$featureFlagName] = array(
'treatment' => $evalResult['treatment'],
'config' => $evalResult['config'],
Expand All @@ -546,7 +571,7 @@ private function processEvaluations(
$result[$featureFlagName] = array('treatment' => TreatmentEnum::CONTROL, 'config' => null);
}
}
$this->registerData($impressions, $attributes);
$this->registerData($decoratedImpressions, $attributes);
return $result;
}
}
2 changes: 2 additions & 0 deletions src/SplitIO/Sdk/Evaluator.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,11 +108,13 @@ private function evalTreatment($key, $bucketingKey, $split, ?array $attributes =

if (is_null($split)) {
$result['impression']['label'] = ImpressionLabel::SPLIT_NOT_FOUND;
$result['impressionsDisabled'] = false;
return $result;
}
try {
$configs = $split->getConfigurations();
$result['impression']['changeNumber'] = $split->getChangeNumber();
$result['impressionsDisabled'] = $split->impressionsDisabled();
if ($split->killed()) {
$defaultTreatment = $split->getDefaultTratment();
$result['treatment'] = $defaultTreatment;
Expand Down
47 changes: 47 additions & 0 deletions src/SplitIO/Sdk/Impressions/DecoratedImpression.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php
namespace SplitIO\Sdk\Impressions;

/**
* Class DecoratedImpression
* Wraps an Impression with its disabled flag for routing purposes.
* @package SplitIO\Sdk\Impressions
*/
class DecoratedImpression
{
/**
* @var Impression
*/
private $impression;

/**
* @var bool
*/
private $disabled;

/**
* DecoratedImpression constructor.
* @param Impression $impression
* @param bool $disabled
*/
public function __construct(Impression $impression, $disabled)
{
$this->impression = $impression;
$this->disabled = (bool) $disabled;
}

/**
* @return Impression
*/
public function getImpression()
{
return $this->impression;
}

/**
* @return bool
*/
public function isDisabled()
{
return $this->disabled;
}
}
8 changes: 6 additions & 2 deletions src/SplitIO/Sdk/Manager/LocalhostSplitManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,10 @@ public function splits()
false,
$this->splits[$featureFlagName]["treatments"],
0,
$configs
$configs,
null,
array(),
false
);
}
}
Expand All @@ -92,7 +95,8 @@ public function split($featureFlagName)
0,
$configs,
null,
array()
array(),
false
);
}

Expand Down
3 changes: 2 additions & 1 deletion src/SplitIO/Sdk/Manager/SplitManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ private static function parseSplitView($splitRepresentation)
$split->getChangeNumber(),
$configs,
$split->getDefaultTratment(),
$split->getSets()
$split->getSets(),
$split->impressionsDisabled()
);
}
}
22 changes: 21 additions & 1 deletion src/SplitIO/Sdk/Manager/SplitView.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
private $configs;
private $defaultTreatment;
private $sets;
private $impressionsDisabled;

/**
* SplitView constructor.
Expand All @@ -22,17 +23,19 @@
* @param $configurations
* @param $defaultTreatment
* @param $sets
* @param $impressionsDisabled
*/
public function __construct(
$name,
$trafficType,
$killed,
$treatments,
$changeNumber,
$configs,
$defaultTreatment,
$sets
$sets,
$impressionsDisabled = false
) {

Check warning on line 38 in src/SplitIO/Sdk/Manager/SplitView.php

View check run for this annotation

SonarQube Pull Requests / SonarQube Code Analysis

This function has 9 parameters, which is greater than the 7 authorized.

[S107] Functions should not have too many parameters See more on https://sonar.harness.io/project/issues?id=splitsoftware_split-sdk-php&pullRequest=244&issues=41838a16-3265-446b-b130-737bbcd05115&open=41838a16-3265-446b-b130-737bbcd05115
$this->name = $name;
$this->trafficType = $trafficType;
$this->killed = $killed;
Expand All @@ -41,6 +44,7 @@
$this->configs = $configs;
$this->defaultTreatment = $defaultTreatment;
$this->sets = $sets;
$this->impressionsDisabled = $impressionsDisabled;
}


Expand Down Expand Up @@ -171,4 +175,20 @@
{
return $this->sets;
}

/**
* @return mixed
*/
public function getImpressionsDisabled()
{
return $this->impressionsDisabled;
}

/**
* @param mixed $impressionsDisabled
*/
public function setImpressionsDisabled($impressionsDisabled)
{
$this->impressionsDisabled = $impressionsDisabled;
}
}
30 changes: 30 additions & 0 deletions tests/Suite/Sdk/Helpers/ImpressionsDisabledE2EListener.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

namespace SplitIO\Test\Suite\Sdk\Helpers;

class ImpressionsDisabledE2EListener implements \SplitIO\Sdk\ImpressionListener
{
public $receivedImpressions = array();

public function logImpression($bundle)
{
// Bundle is an array with 'impression', 'attributes', 'instance-id', 'sdk-language-version'
$impression = $bundle['impression'];
$this->receivedImpressions[] = array(
'feature' => $impression->getFeature(),
'key' => $impression->getId(),
'treatment' => $impression->getTreatment(),
'label' => $impression->getLabel(),
'changeNumber' => $impression->getChangeNumber()
);
}

public function close()
{
}

public function reset()
{
$this->receivedImpressions = array();
}
}
24 changes: 24 additions & 0 deletions tests/Suite/Sdk/Helpers/ImpressionsDisabledListener.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace SplitIO\Test\Suite\Sdk\Helpers;

class ImpressionsDisabledListener implements \SplitIO\Sdk\ImpressionListener
{
public $receivedImpressions = array();
public $receivedAttributes = array();

public function logImpression($impression)
{
$this->receivedImpressions[] = $impression;
}

public function close()
{
}

public function reset()
{
$this->receivedImpressions = array();
$this->receivedAttributes = array();
}
}
Loading
Loading