public function test_StoreTwoIncrementalValues_RetrievesDifference() { $resolution15min = Resolution::FIFTEEEN_MINUTES; $someAggregation = Aggregation::SUM; $storage = new Storage(); $storage->setDefaultMiddleware($this->conn, new Logger(null), $resolution15min); $pipelineFactory = new Factory($this->conn); $pipeline = new Pipeline(); $someSid = 1; $someNid = 1; $someValue1 = 600; $someValue2 = 700; $expectedDifference = $someValue2 - $someValue1; $firstDatetime = new DateTime('2015-02-18 15:00:00'); $secondDateStr15MinAfterFirst = '2015-02-18 15:15:00'; $secondDatetime15MinAfterFirst = new DateTime($secondDateStr15MinAfterFirst); $incrementalIsTrue = true; $expectedValsByDate = array($secondDateStr15MinAfterFirst => $expectedDifference); $storage->store([new CounterValue($someSid, $someNid, $firstDatetime, $someValue1, $incrementalIsTrue)]); $storage->store([new CounterValue($someSid, $someNid, $secondDatetime15MinAfterFirst, $someValue2, $incrementalIsTrue)]); $sequence = $pipelineFactory->createMultiAction($someSid, $someNid, $secondDatetime15MinAfterFirst, $secondDatetime15MinAfterFirst, $resolution15min, $someAggregation); $sequence[] = new ConvertToDateStringKeys(); $valsByDate = $pipeline->run($sequence); $this->assertEquals($expectedValsByDate, $valsByDate); }
public function test_StoreValues_RetrieveAsFormula_FormulaIsCorrectlyCalculated() { $formula = '[sid=1,agg=1] + [sid=2,agg=1]'; $sid1 = 1; $sid2 = 2; $someNid = 1; $valSid1 = 15; $valSid2 = 30; $expectedSum = $valSid1 + $valSid2; $someDateString = '2015-02-18 15:00:00'; $datetime = new DateTime($someDateString); $someFormulaResolution = Resolution::FIVE_MINUTES; $someResultResolution = Resolution::FIVE_MINUTES; $sumResultAggregation = Aggregation::SUM; $someResolution = Resolution::FIVE_MINUTES; $isIncremental = false; $padding = false; $storage = new Storage(); $storage->setDefaultMiddleware($this->conn, new Logger(null), $someResolution); $pipeline = new Pipeline(); $pipelineFactory = new Factory($this->conn); $expected = array($someDateString => $expectedSum); $cvs = []; $cvs[] = new CounterValue($sid1, $someNid, $datetime, $valSid1, $isIncremental); $cvs[] = new CounterValue($sid2, $someNid, $datetime, $valSid2, $isIncremental); $storage->store($cvs); $sequence = $pipelineFactory->createMultiAction($formula, $someNid, $datetime, $datetime, $someResultResolution, $sumResultAggregation, $padding, null, null, null, true, $someFormulaResolution); $sequence[] = new ConvertToDateStringKeys(); $output = $pipeline->run($sequence); $this->assertEquals($expected, $output); }
/** * @dataProvider useCases * * @param $config */ public function test_UseCase($config) { date_default_timezone_set($config['timezone']); $timezone = new DateTimeZone($config['timezone']); $start = new DateTime($config['start'], $timezone); $end = new DateTime($config['end'], $timezone); $storage = new Storage(); $storage->setDefaultMiddleware($this->conn, new Logger(null)); $pipelineFactory = new Factory($this->conn); $pipeline = new Pipeline(); $cvs = []; $dateperiod = new DatePeriod($start, DateInterval::createFromDateString($config['insertResolution'] . ' seconds'), $end); foreach ($dateperiod as $datetime) { $cvs[] = new CounterValue($config['sid'], $config['nid'], $datetime, $config['val'], $config['incremental']); } $storage->store($cvs); $sequence = $pipelineFactory->createMultiAction($config['sid'], $config['nid'], $start, $end, $config['retrieveResolution'], $config['aggregation']); $sequence[] = new ConvertToDateStringKeys(); $valsByDate = $pipeline->run($sequence); $msg = $config['description']; $msg .= "\nExpected\n"; $msg .= json_encode($config['expected'], JSON_PRETTY_PRINT); $msg .= "\nActual:\n"; $msg .= json_encode($valsByDate, JSON_PRETTY_PRINT); $this->assertTrue($valsByDate === $config['expected'], $msg); }
use Mongotd\Storage; use Mongotd\StorageMiddleware\FilterCounterValues; use Mongotd\StorageMiddleware\InsertCounterValues; $config = json_decode(file_get_contents('retrievalLoadTestConfig.json'), true); date_default_timezone_set($config['timezone']); $start = new \DateTime($config['starttime']); $end = new \DateTime('now'); $conn = new Connection($config['dbhost'], $config['dbname'], $config['dbprefix']); $sid = '1'; $nid = '1'; $pipelineFactory = new Factory($conn); $pipeline = new Pipeline(); $storage = new Storage(); $storage->addMiddleware(new FilterCounterValues()); $storage->addMiddleware(new InsertCounterValues($conn)); if ($config['doInsertion']) { $conn->db()->drop(); $conn->createIndexes(); $dateperiod = new \DatePeriod($start, DateInterval::createFromDateString($config['insertIntervalInSeconds'] . ' seconds'), $end); $cvs = []; foreach ($dateperiod as $datetime) { $cvs[] = new CounterValue($sid, $nid, $datetime, rand()); } $storage->store($cvs); echo "Insertion done\n"; } $timerStart = microtime(true); $sequence = $pipelineFactory->createMultiAction($sid, $nid, $start, $end, $config['retrieveResolution'], $config['retrieveAggregation']); $pipeline->run($sequence); $totalTime = microtime(true) - $timerStart; echo 'Retrieved in: ' . $totalTime . " seconds\n";
$falsesPositives = 0; $persist = 0; foreach ($series as $data) { echo 'Progress: ' . $iteration . '/' . count($series) . "\r"; $iteration++; $expectedAnomaly = false; if (rand() % 1000 == 0) { $persist = $config['anomalyPersistIntervals']; } if ($persist > 0) { $persist--; $expectedAnomaly = true; $totalAnomalies++; $data['value'] *= 2; } $storage->store([new \Mongotd\CounterValue(1, 1, $data['datetime'], $data['value'])]); $datetimeStartInterval = clone $data['datetime']; $datetimeStartInterval->sub(DateInterval::createFromDateString($config['insertIntervalInSeconds'] - 1 . ' seconds')); $sequence = $pipelineFactory->createAnomalyAction($datetimeStartInterval, $data['datetime']); $anomalyList = $pipeline->run($sequence); $isAnomaly = count($anomalyList) > 0 and count($anomalyList[0]['anomalies']) > 0; if ($isAnomaly or $expectedAnomaly) { echo $data['datetime']->format('Y-m-d H:i') . ' - ' . $data['value']; if ($isAnomaly) { echo ' Detected anomaly! (predicted avg ' . $anomalyList[0]['anomalies'][0]->predicted . ')'; } if ($expectedAnomaly) { echo ' Actual anomaly!'; } if ($isAnomaly and $expectedAnomaly) { $hits++;