Skip to content

Commit

Permalink
Let's talk about Metrics 2.0
Browse files Browse the repository at this point in the history
  • Loading branch information
lyrixx committed Jan 21, 2015
1 parent a966ce4 commit 76be2c3
Show file tree
Hide file tree
Showing 28 changed files with 474 additions and 420 deletions.
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
composer.lock
vendor
/composer.lock
/vendor/
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ php:
- 5.4
- 5.5
- 5.6
- hhvm

before_script:
- composer install --dev --prefer-source
66 changes: 21 additions & 45 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,53 +9,46 @@ metrics.

Currently supported backends:

* StatsD
* Doctrine DBAL
* Graphite
* Zabbix
* Librato
* Doctrine DBAL
* Monolog
* Logger (Psr\Log\LoggerInterface)
* Null (Dummy that does nothing)
* StatsD
* Zabbix

## Installation

Using Composer:

{
"require": {
"beberlei/metrics": "~1.0"
}
}
```bash
composer require beberlei/metrics
```

## API

You can instantiate clients:

```php
<?php
$metrics = \Beberlei\Metrics\Factory::create('statsd');
\Beberlei\Metrics\Registry::set('name', $metrics);
\Beberlei\Metrics\Registry::setDefaultName('name');

$metrics = \Beberlei\Metrics\Registry::get('name');
$metrics = \Beberlei\Metrics\Registry::get(); // Will returns the default metrics
$collector = \Beberlei\Metrics\Factory::create('statsd');
```

You can measure stats:

```php
<?php

$metrics = \Beberlei\Metrics\Registry::get('name');
$metrics->increment('foo.bar');
$metrics->decrement('foo.bar');
$collector->increment('foo.bar');
$collector->decrement('foo.bar');

$start = microtime(true);
$diff = microtime(true) - $start;
$metrics->timing('foo.bar', $diff);
$collector->timing('foo.bar', $diff);

$value = 1234;
$metrics->measure('foo.bar', $value);
$collector->measure('foo.bar', $value);
```

Some backends defer sending and aggregate all information, make sure to call
Expand All @@ -64,26 +57,9 @@ flush:
```php
<?php

$metrics = \Beberlei\Metrics\Registry::get('name');
$metrics->flush();
```

There is a convenience functional API. It works with the registry names. If null
is provided, the default registry entry is used.

```php
<?php
$registryName = 'name';

bmetrics_increment('foo.bar', $registryName);
bmetrics_decrement('foo.bar', null);
bmetrics_measure('foo.bar', $value, $registryName);
bmetrics_timing('foo.bar', $diff, null);
$collector->flush();
```

The functions are automatically available through the Composer autoload files
mechanism.

## Configuration

```php
Expand Down Expand Up @@ -138,12 +114,12 @@ Do Configuration:
type: statsd
bar:
type: zabbix
hostname: foo.beberlei.de
server: localhost
previx: foo.beberlei.de
host: localhost
port: 10051
baz:
type: zabbix_file
hostname: foo.beberlei.de
previx: foo.beberlei.de
file: /etc/zabbix/zabbix_agentd.conf
librato:
type: librato
Expand All @@ -161,15 +137,15 @@ convenience functions. Metrics are also added as services:

```php
<?php

$metrics = $container->get('beberlei_metrics.collector.foo');
```

Some backends defer sending and aggregate all information, make sure to call
flush. But if symfony handle a request, the framework do it for you. But if
symfony handle a cli task, or if symfony is running as a deamon, you have to
flush by yourself:
and the default collactor can be fetch:

```php
<?php
$container->get('beberlei_metrics.flush_service')->onTerminate();

$metrics = $container->get('beberlei_metrics.collector');
```

17 changes: 17 additions & 0 deletions UPGRADE-2.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
Upgrade from 1.x to 2.0
=======================

* [BC BREAK] Collector `Beberlei\Metrics\Collector\Monolog` is renamed to `Beberlei\Metrics\Collector\Logger`.

* [BC BREAK] Collector `Beberlei\Metrics\Collector\Monolog` takes a `Psr\Log\LoggerInterface`.

* [BC BREAK] The bundle does not rely on `Beberlei\Metrics\Factory` and `Beberlei\Metrics\Registry` anymore.

* [BC BREAK] The bundle configuration has a new "standard" key mapping. The
`hostname` key for `Librato` is now `source`. The `hostname` key for `Zabbix` is
now `prefix`. `hostname`, and `servername` are now `host`. `serverport` is now
`port`.

* [BC BREAK] The `Registry` is removed.

* [BC BREAK] The `functions.php` is removed.
25 changes: 18 additions & 7 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,25 @@
"description": "Simple library to talk to metrics collector services.",
"keywords": ["metrics", "logging"],
"authors": [
{"name": "Benjamin Eberlei", "email": "[email protected]"}
{
"name": "Benjamin Eberlei",
"email": "[email protected]",
"role": "Project Founder"
},
{
"name": "Grégoire Pineau",
"email": "[email protected]",
"role": "Lead Developer"
}
],
"license": "MIT",
"suggest": {
"okitsu/zabbix-sender": "For zabbix integration",
"kriswallsmith/buzz": "For Librato integration"
},
"require": {
"psr/log": "~1.0"
},
"require-dev": {
"doctrine/dbal": "~2.0",
"kriswallsmith/buzz": "*",
Expand All @@ -20,15 +32,14 @@
"symfony/http-kernel": "~2.3"
},
"autoload": {
"psr-0": {
"Beberlei\\Metrics": "src/",
"Beberlei\\Bundle\\MetricsBundle": "src/"
},
"files": ["src/Beberlei/Metrics/functions.php"]
"psr-4": {
"Beberlei\\Metrics\\": "src/Beberlei/Metrics",
"Beberlei\\Bundle\\MetricsBundle\\": "src/Beberlei/Bundle/MetricsBundle"
}
},
"extra": {
"branch-alias": {
"dev-master": "1.x-dev"
"dev-master": "2.x-dev"
}
}
}
4 changes: 2 additions & 2 deletions example/statsd.php
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
<?php

require_once __DIR__ . "/../vendor/autoload.php";
require_once __DIR__.'/../vendor/autoload.php';

$metrics = \Beberlei\Metrics\Factory::create('statsd');

while (true) {
$metrics->increment('foo.bar');
$metrics->decrement('foo.baz');
$metrics->measure('foo', rand(1, 10));
$metrics->flush();
usleep(500);
}

8 changes: 4 additions & 4 deletions phpunit.xml.dist
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,21 @@
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
bootstrap="tests/bootstrap.php"
bootstrap="vendor/autoload.php"
>
<testsuites>
<testsuite name="Beberlei Metrics">
<directory>./src/Beberlei/Bundle/MetricsBundle/Tests</directory>
<directory>./tests</directory>
<directory>./src/Beberlei/Metrics/Tests/</directory>
</testsuite>
</testsuites>

<filter>
<whitelist>
<directory>src</directory>
<directory>./src</directory>
<exclude>
<directory>./src/Beberlei/Bundle/MetricsBundle/Tests</directory>
<directory>./tests</directory>
<directory>./src/Beberlei/Metrics/Tests/</directory>
</exclude>
</whitelist>
</filter>
Expand Down
18 changes: 0 additions & 18 deletions src/Beberlei/Bundle/MetricsBundle/BeberleiMetricsBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,4 @@

class BeberleiMetricsBundle extends Bundle
{
public function boot()
{
if ( ! function_exists('bmetrics_increment')) {
require_once __DIR__ . "/../../Metrics/functions.php";
}

parent::boot();

// initialize all collectors
$this->container->get('beberlei_metrics.registry');
}

public function shutdown()
{
$flush = $this->container->get('beberlei_metrics.flush_service');
$flush->onTerminate();
}
}

Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
<?php
namespace Beberlei\Bundle\MetricsBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\DefinitionDecorator;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\Config\FileLocator;

class BeberleiMetricsExtension extends Extension
{
Expand All @@ -18,31 +19,80 @@ public function load(array $configs, ContainerBuilder $container)
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('metrics.xml');

$registry = $container->getDefinition('beberlei_metrics.registry');
$registry->addMethodCall('setDefaultName', array($config['default']));
foreach ($config['collectors'] as $name => $colConfig) {
$definition = $this->createCollector($colConfig['type'], $colConfig);
$container->setDefinition('beberlei_metrics.collector.'.$name, $definition);
}

if (!$config['default'] && 1 === count($config['collectors'])) {
$container->setAlias('beberlei_metrics.collector', 'beberlei_metrics.collector.'.$name);
} elseif ($container->hasDefinition('beberlei_metrics.collector.'.$config['default'])) {
$container->setAlias('beberlei_metrics.collector', 'beberlei_metrics.collector.'.$config['default']);
} else {
throw new \LogicException('You should select a default collector');
}
}

private function createCollector($type, $config)
{
$definition = new DefinitionDecorator('beberlei_metrics.collector_proto.'.$config['type']);

// Theses listeners should be as late as possible
$definition->addTag('kernel.event_listener', array(
'method' => 'flush',
'priority' => -1024,
'event' => 'kernel.terminate',
));
$definition->addTag('kernel.event_listener', array(
'method' => 'flush',
'priority' => -1024,
'event' => 'console.terminate',
));

foreach ($config['collectors'] as $name => $collector) {
if (isset($collector['connection'])) {
$collector['connection'] = new Reference(sprintf(
'doctrine.dbal.%s_connection', $collector['connection']
));
}
switch ($type) {
case 'doctrine_dbal':
$ref = $config['connection'] ? sprintf('doctrine.dbal.%s_connection', $config['connection']) : 'database_connection';
$definition->replaceArgument(0, new Reference($ref));

if ($collector['type'] === "monolog") {
$collector['logger'] = new Reference('logger');
}
return $definition;
case 'graphite':
$definition->replaceArgument(0, $config['host'] ?: 'localhost');
$definition->replaceArgument(1, $config['port'] ?: 2003);
$definition->replaceArgument(2, $config['protocol'] ?: 'tcp');

$def = new Definition('Beberlei\Metrics\Collector\Collector');
$def->setFactoryMethod('create');
$def->setFactoryClass('%beberlei_metrics.factory.class%');
$def->setArguments(array($collector['type'], $collector));
return $definition;
case 'librato':
$definition->replaceArgument(1, $config['source']);
$definition->replaceArgument(2, $config['username']);
$definition->replaceArgument(3, $config['password']);

$container->setDefinition('beberlei_metrics.collector.' . $name, $def);
return $definition;
case 'logger':
case 'null':
return $definition;
case 'statsd':
$definition->replaceArgument(0, $config['host'] ?: 'localhost');
$definition->replaceArgument(1, $config['port'] ?: 8125);
$definition->replaceArgument(2, (string) $config['prefix']);

$registry->addMethodCall('set', array(
$name, new Reference('beberlei_metrics.collector.' . $name)
));
return $definition;
case 'zabbix':
$sender = new Definition('Net\Zabbix\Sender');
if ($config['file']) {
$senderConfig = new Definition('Net\Zabbix\Agent\Config');
$senderConfig->addArgument($config['file']);
$sender->addMethodCall('importAgentConfig', array($senderConfig));
} else {
$sender->addArgument($config['host'] ?: 'localhost');
$sender->addArgument((int) $config['port'] ?: 10051);
}

$definition->replaceArgument(0, $sender);
$definition->replaceArgument(1, $config['prefix']);

return $definition;
default:
throw new \InvalidArgumentException(sprintf('The type "%s" is not supported', $type));
}
}
}

Loading

0 comments on commit 76be2c3

Please sign in to comment.