diff options
Diffstat (limited to 'application/clicommands/BenchmarkCommand.php')
-rw-r--r-- | application/clicommands/BenchmarkCommand.php | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/application/clicommands/BenchmarkCommand.php b/application/clicommands/BenchmarkCommand.php new file mode 100644 index 0000000..6ccd8c8 --- /dev/null +++ b/application/clicommands/BenchmarkCommand.php @@ -0,0 +1,152 @@ +<?php + +namespace Icinga\Module\Director\Clicommands; + +use Icinga\Application\Benchmark; +use Icinga\Data\Filter\Filter; +use Icinga\Data\Filter\FilterChain; +use Icinga\Data\Filter\FilterExpression; +use Icinga\Module\Director\Cli\Command; +use Icinga\Module\Director\CustomVariable\CustomVariable; +use Icinga\Module\Director\Data\Db\IcingaObjectFilterRenderer; +use Icinga\Module\Director\Data\Db\IcingaObjectQuery; +use Icinga\Module\Director\Objects\HostGroupMembershipResolver; +use Icinga\Module\Director\Objects\IcingaHost; +use Icinga\Module\Director\Objects\IcingaHostVar; +use Icinga\Module\Director\Objects\IcingaVar; + +class BenchmarkCommand extends Command +{ + public function testflatfilterAction() + { + $q = new IcingaObjectQuery('host', $this->db()); + $filter = Filter::fromQueryString( + // 'host.vars.snmp_community="*ub*"&(host.vars.location="London"|host.vars.location="Berlin")' + // 'host.vars.snmp_community="*ub*"&(host.vars.location="FRA DC"|host.vars.location="NBG DC")' + 'host.vars.priority="*igh"&(host.vars.location="FRA DC"|host.vars.location="NBG DC")' + ); + IcingaObjectFilterRenderer::apply($filter, $q); + echo $q->getSql() . "\n"; + + print_r($q->listNames()); + } + + public function rerendervarsAction() + { + $conn = $this->db(); + $db = $conn->getDbAdapter(); + $db->beginTransaction(); + $query = $db->select()->from( + array('v' => 'icinga_var'), + array( + 'v.varname', + 'v.varvalue', + 'v.checksum', + 'v.rendered_checksum', + 'v.rendered', + 'format' => "('json')", + ) + ); + Benchmark::measure('Ready to fetch all vars'); + $rows = $db->fetchAll($query); + Benchmark::measure('Got vars, storing flat'); + foreach ($rows as $row) { + $var = CustomVariable::fromDbRow($row); + $rendered = $var->render(); + $checksum = sha1($rendered, true); + if ($checksum === $row->rendered_checksum) { + continue; + } + + $where = $db->quoteInto('checksum = ?', $row->checksum); + $db->update( + 'icinga_var', + array( + 'rendered' => $rendered, + 'rendered_checksum' => $checksum + ), + $where + ); + } + + $db->commit(); + } + + public function flattenvarsAction() + { + $conn = $this->db(); + $db = $conn->getDbAdapter(); + $db->beginTransaction(); + $query = $db->select()->from(['v' => 'icinga_host_var'], [ + 'v.host_id', + 'v.varname', + 'v.varvalue', + 'v.format', + 'v.checksum' + ]); + Benchmark::measure('Ready to fetch all vars'); + $rows = $db->fetchAll($query); + Benchmark::measure('Got vars, storing flat'); + + foreach ($rows as $row) { + $var = CustomVariable::fromDbRow($row); + $checksum = $var->checksum(); + if (! IcingaVar::exists($checksum, $conn)) { + IcingaVar::generateForCustomVar($var, $conn); + } + + if ($row->checksum === null) { + $where = $db->quoteInto('host_id = ?', $row->host_id) + . $db->quoteInto(' AND varname = ?', $row->varname); + $db->update('icinga_host_var', ['checksum' => $checksum], $where); + } + } + + $db->commit(); + } + + public function resolvehostgroupsAction() + { + $resolver = new HostGroupMembershipResolver($this->db()); + $resolver->refreshDb(); + } + + public function filterAction() + { + $flat = []; + + /** @var FilterChain|FilterExpression $filter */ + $filter = Filter::fromQueryString( + // 'object_name=*ic*2*&object_type=object' + 'vars.bpconfig=*' + ); + Benchmark::measure('ready'); + $objs = IcingaHost::loadAll($this->db()); + Benchmark::measure('db done'); + + foreach ($objs as $host) { + $flat[$host->get('id')] = (object) []; + foreach ($host->getProperties() as $k => $v) { + $flat[$host->get('id')]->$k = $v; + } + } + Benchmark::measure('objects ready'); + + $vars = IcingaHostVar::loadAll($this->db()); + Benchmark::measure('vars loaded'); + foreach ($vars as $var) { + if (! array_key_exists($var->get('host_id'), $flat)) { + // Templates? + continue; + } + $flat[$var->get('host_id')]->{'vars.' . $var->get('varname')} = $var->get('varvalue'); + } + Benchmark::measure('vars done'); + + foreach ($flat as $host) { + if ($filter->matches($host)) { + echo $host->object_name . "\n"; + } + } + } +} |