Skip to content
Merged
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 @@
6.2.3 (Oct XX, 2019)
- Added flag `IPAddressesEnabled` into options to enable/disable sending MachineName and MachineIP when data is posted in headers.

6.2.2 (Sep 18, 2019)
- Fetch multiple splits at once on getTreatments/getTreatmentsWithConfig
- Removed MatcherClient (DependencyMatcher now uses Evaluator directly)
Expand Down
9 changes: 3 additions & 6 deletions src/SplitIO/Component/Cache/ImpressionCache.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,19 @@

use SplitIO\Component\Common\Di;
use SplitIO\Component\Cache\KeyFactory;
use SplitIO\Sdk\QueueMetadataMessage;

class ImpressionCache
{
const IMPRESSIONS_QUEUE_KEY = "SPLITIO.impressions";
const IMPRESSION_KEY_DEFAULT_TTL = 3600;

public function logImpressions($impressions, $metadata)
public function logImpressions($impressions, QueueMetadataMessage $metadata)
{
$toStore = array_map(
function ($imp) use ($metadata) {
return json_encode(array(
"m" => array(
"s" => $metadata['sdkVersion'],
"i" => $metadata['machineIp'],
"n" => $metadata['machineName'],
),
'm' => $metadata->toArray(),
"i" => array(
"k" => $imp->getId(),
"b" => $imp->getBucketingKey(),
Expand Down
10 changes: 6 additions & 4 deletions src/SplitIO/Sdk/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use SplitIO\Component\Cache\MetricsCache;
use SplitIO\Sdk\Events\EventDTO;
use SplitIO\Sdk\Events\EventQueueMessage;
use SplitIO\Sdk\Events\EventQueueMetadataMessage;
use SplitIO\Sdk\QueueMetadataMessage;
use SplitIO\Sdk\Impressions\Impression;
use SplitIO\TreatmentImpression;
use SplitIO\Sdk\Impressions\ImpressionLabel;
Expand Down Expand Up @@ -38,6 +38,9 @@ public function __construct($options = array())
if (isset($options['impressionListener'])) {
$this->impressionListener = new \SplitIO\Sdk\ImpressionListenerWrapper($options['impressionListener']);
}
$this->queueMetadata = new QueueMetadataMessage(
isset($options['IPAddressesEnabled']) ? $options['IPAddressesEnabled'] : true
);
}

/**
Expand Down Expand Up @@ -305,7 +308,7 @@ private function doInputValidationForTreatments($key, $featureNames, array $attr
private function registerData($impressions, $attributes, $metricName, $latency = null)
{
try {
TreatmentImpression::log($impressions);
TreatmentImpression::log($impressions, $this->queueMetadata);
if (isset($this->impressionListener)) {
$this->impressionListener->sendDataToClient($impressions, $attributes);
}
Expand Down Expand Up @@ -541,8 +544,7 @@ public function track($key, $trafficType, $eventType, $value = null, $properties

try {
$eventDTO = new EventDTO($key, $trafficType, $eventType, $value, $properties);
$eventMessageMetadata = new EventQueueMetadataMessage();
$eventQueueMessage = new EventQueueMessage($eventMessageMetadata, $eventDTO);
$eventQueueMessage = new EventQueueMessage($this->queueMetadata, $eventDTO);
return EventsCache::addEvent($eventQueueMessage);
} catch (\Exception $exception) {
// @codeCoverageIgnoreStart
Expand Down
8 changes: 5 additions & 3 deletions src/SplitIO/Sdk/Events/EventQueueMessage.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
<?php
namespace SplitIO\Sdk\Events;

use SplitIO\Sdk\QueueMetadataMessage;

class EventQueueMessage
{
/**
Expand All @@ -18,15 +20,15 @@ class EventQueueMessage
* @param $metadata
* @param $event
*/
public function __construct(EventQueueMetadataMessage $metadata, EventDTO $event)
public function __construct(QueueMetadataMessage $metadata, EventDTO $event)
{
$this->metadata = $metadata;
$this->event = $event;
}


/**
* @return EventQueueMetadataMessage
* @return QueueMetadataMessage
*/
public function getMetadata()
{
Expand All @@ -36,7 +38,7 @@ public function getMetadata()
/**
* @param mixed $metadata
*/
public function setMetadata(EventQueueMetadataMessage $metadata)
public function setMetadata(QueueMetadataMessage $metadata)
{
$this->metadata = $metadata;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?php
namespace SplitIO\Sdk\Events;
namespace SplitIO\Sdk;

class EventQueueMetadataMessage
class QueueMetadataMessage
{
private $sdkVersion;

Expand All @@ -10,16 +10,23 @@ class EventQueueMetadataMessage
private $machineName;

/**
* EventQueueMetadataMessage constructor.
* QueueMetadataMessage constructor.
*/
public function __construct()
public function __construct($IPAddressesEnabled = true)
{
$this->sdkVersion = 'php-' . \SplitIO\version();
$this->machineIP = \SplitIO\getHostIpAddress();
$this->machineName = 'unknown';
$this->machineIP = 'NA';
$this->machineName = 'NA';
if ($IPAddressesEnabled) {
$this->machineIP = \SplitIO\getHostIpAddress();
if ($this->machineIP != 'unknown') {
$this->machineName = 'ip-' . str_replace('.', '-', $this->machineIP);
} else {
$this->machineName = 'unknown';
}
}
}


/**
* @return mixed
*/
Expand Down
11 changes: 4 additions & 7 deletions src/SplitIO/TreatmentImpression.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,26 @@
use SplitIO\Component\Cache\ImpressionCache;
use SplitIO\Sdk\Impressions\Impression;
use SplitIO\Component\Common\Di;
use SplitIO\Sdk\QueueMetadataMessage;

class TreatmentImpression
{
/**
* @param \SplitIO\Sdk\Impressions\Impression $impressions
* @return bool
*/
public static function log($impressions)
public static function log($impressions, QueueMetadataMessage $metadata)
{
try {
Di::getLogger()->debug($impressions);
if (is_null($impressions) || (is_array($impressions) && 0 == count($impressions))) {
return;
return null;
}
$impressionCache = new ImpressionCache();
$toStore = (is_array($impressions)) ? $impressions : array($impressions);
return $impressionCache->logImpressions(
$toStore,
array(
'sdkVersion' => 'php-' . \SplitIO\version(),
'machineIp' => \SplitIO\getHostIpAddress(),
'machineName' => null, // TODO
)
$metadata
);
} catch (\Exception $e) {
Di::getLogger()->warning('Unable to write impression back to redis.');
Expand Down
2 changes: 1 addition & 1 deletion src/SplitIO/Version.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@

class Version
{
const CURRENT = '6.2.2';
const CURRENT = '6.2.3-rc1';
}
27 changes: 23 additions & 4 deletions tests/Suite/Sdk/ImpressionsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use SplitIO\Sdk\Impressions\Impression;
use SplitIO\Test\Suite\Redis\ReflectiveTools;
use SplitIO\Component\Cache\ImpressionCache;
use SplitIO\Sdk\QueueMetadataMessage;

class ImpressionsTest extends \PHPUnit_Framework_TestCase
{
Expand All @@ -26,6 +27,7 @@ public function testImpressionsAreAdded()
$redisClient = ReflectiveTools::clientFromCachePool(Di::getCache());

$redisClient->del(ImpressionCache::IMPRESSIONS_QUEUE_KEY);
$queueMetadata = new QueueMetadataMessage();

TreatmentImpression::log(new Impression(
'someMatchingKey',
Expand All @@ -35,7 +37,7 @@ public function testImpressionsAreAdded()
123456,
321654,
'someBucketingKey'
));
), $queueMetadata);

// Assert that the TTL is within a 10-second range (between it was set and retrieved).
$ttl = $redisClient->ttl(ImpressionCache::IMPRESSIONS_QUEUE_KEY);
Expand All @@ -47,6 +49,7 @@ public function testImpressionsAreAdded()

$this->assertEquals($decoded['m']['s'], 'php-'.\Splitio\version());
$this->assertEquals($decoded['m']['i'], 'unknown');
$this->assertEquals($decoded['m']['n'], 'unknown');
$this->assertEquals($decoded['i']['k'], 'someMatchingKey');
$this->assertEquals($decoded['i']['b'], 'someBucketingKey');
$this->assertEquals($decoded['i']['f'], 'someFeature');
Expand All @@ -64,14 +67,16 @@ public function testExpirationOnlyOccursOnce()

$sdkConfig = array(
'log' => array('adapter' => 'stdout'),
'cache' => array('adapter' => 'predis', 'parameters' => $parameters, 'options' => $options)
'cache' => array('adapter' => 'predis', 'parameters' => $parameters, 'options' => $options),
'IPAddressEnabled' => false
);

//Initializing the SDK instance.
\SplitIO\Sdk::factory('asdqwe123456', $sdkConfig);

$redisClient = ReflectiveTools::clientFromCachePool(Di::getCache());
$redisClient->del(ImpressionCache::IMPRESSIONS_QUEUE_KEY);
$queueMetadata = new QueueMetadataMessage(false);

TreatmentImpression::log(new Impression(
'someMatchingKey',
Expand All @@ -81,7 +86,7 @@ public function testExpirationOnlyOccursOnce()
123456,
321654,
'someBucketingKey'
));
), $queueMetadata);

sleep(3);

Expand All @@ -93,11 +98,25 @@ public function testExpirationOnlyOccursOnce()
123456,
321654,
'someBucketingKey'
));
), $queueMetadata);

$ttl = $redisClient->ttl(ImpressionCache::IMPRESSIONS_QUEUE_KEY);
// $ttl should be lower than or equalt the default impressions TTL minus 3 seconds,
// since it should have not been resetted with the last imrpession logged.
$this->assertLessThanOrEqual(ImpressionCache::IMPRESSION_KEY_DEFAULT_TTL - 3, $ttl);

$imp = $redisClient->rpop(ImpressionCache::IMPRESSIONS_QUEUE_KEY);
$decoded = json_decode($imp, true);

$this->assertEquals($decoded['m']['s'], 'php-'.\Splitio\version());
$this->assertEquals($decoded['m']['i'], 'NA');
$this->assertEquals($decoded['m']['n'], 'NA');
$this->assertEquals($decoded['i']['k'], 'someMatchingKey');
$this->assertEquals($decoded['i']['b'], 'someBucketingKey');
$this->assertEquals($decoded['i']['f'], 'someFeature');
$this->assertEquals($decoded['i']['t'], 'on');
$this->assertEquals($decoded['i']['r'], 'label1');
$this->assertEquals($decoded['i']['m'], 123456);
$this->assertEquals($decoded['i']['c'], 321654);
}
}
25 changes: 18 additions & 7 deletions tests/Suite/Sdk/SdkClientTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -209,13 +209,22 @@ public function testLocalClientYAML()
);
}

private function validateLastImpression($redisClient, $feature, $key, $treatment)
{
private function validateLastImpression(
$redisClient,
$feature,
$key,
$treatment,
$machineName = 'unknown',
$machineIP = 'unknown'
) {
$raw = $redisClient->rpop(ImpressionCache::IMPRESSIONS_QUEUE_KEY);
$parsed = json_decode($raw, true);
echo "parsed " . json_encode($parsed) . "\n";
$this->assertEquals($parsed['i']['f'], $feature);
$this->assertEquals($parsed['i']['k'], $key);
$this->assertEquals($parsed['i']['t'], $treatment);
$this->assertEquals($parsed['m']['i'], $machineIP);
$this->assertEquals($parsed['m']['n'], $machineName);
}

public function testClient()
Expand Down Expand Up @@ -544,7 +553,8 @@ public function testGetTreatmentsWithDistinctFeatures()

$sdkConfig = array(
'log' => array('adapter' => 'stdout'),
'cache' => array('adapter' => 'predis', 'parameters' => $parameters, 'options' => $options)
'cache' => array('adapter' => 'predis', 'parameters' => $parameters, 'options' => $options),
'IPAddressesEnabled' => false
);

//Initializing the SDK instance.
Expand All @@ -565,7 +575,7 @@ public function testGetTreatmentsWithDistinctFeatures()

//Check impressions generated
$redisClient = ReflectiveTools::clientFromCachePool(Di::getCache());
$this->validateLastImpression($redisClient, 'sample_feature', 'user1', 'on');
$this->validateLastImpression($redisClient, 'sample_feature', 'user1', 'on', 'NA', 'NA');
}

public function testGetTreatmentsWithRepeteadedFeatures()
Expand All @@ -580,7 +590,8 @@ public function testGetTreatmentsWithRepeteadedFeatures()

$sdkConfig = array(
'log' => array('adapter' => 'stdout'),
'cache' => array('adapter' => 'predis', 'parameters' => $parameters, 'options' => $options)
'cache' => array('adapter' => 'predis', 'parameters' => $parameters, 'options' => $options),
'ipAddress' => '1.2.3.4'
);

//Initializing the SDK instance.
Expand All @@ -602,12 +613,13 @@ public function testGetTreatmentsWithRepeteadedFeatures()

// Check impressions
$redisClient = ReflectiveTools::clientFromCachePool(Di::getCache());
$this->validateLastImpression($redisClient, 'sample_feature', 'user1', 'on');
$this->validateLastImpression($redisClient, 'sample_feature', 'user1', 'on', 'ip-1-2-3-4', '1.2.3.4');
}

public function testGetTreatmentsWithRepeteadedAndNullFeatures()
{
Di::set(Di::KEY_FACTORY_TRACKER, false);
Di::set('ipAddress', null); // unset ipaddress from previous test

//Testing version string
$this->assertTrue(is_string(\SplitIO\version()));
Expand Down Expand Up @@ -680,5 +692,4 @@ public function testGetTreatmentsFetchesSplitsInOneCall()
$client = new Client();
$client->getTreatments('key1', array('split1', 'split2', 'split3'));
}

}
3 changes: 2 additions & 1 deletion tests/Suite/Sdk/SdkReadOnlyTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use SplitIO\TreatmentImpression;
use SplitIO\Grammar\Condition\Partition\TreatmentEnum;
use SplitIO\Sdk\Impressions\Impression;
use SplitIO\Sdk\QueueMetadataMessage;

class SdkReadOnlyTest extends \PHPUnit_Framework_TestCase
{
Expand Down Expand Up @@ -126,6 +127,6 @@ public function testException()
'something'
);

TreatmentImpression::log($impression);
TreatmentImpression::log($impression, new QueueMetadataMessage());
}
}