-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStatsDLogger.php
127 lines (114 loc) · 3.34 KB
/
StatsDLogger.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php
namespace OpenSky\Bundle\GraphiteBundle;
/**
* statsd logger built on the etsy example from:
* https://github.com/etsy/statsd/blob/master/examples/php-example.php
*/
class StatsDLogger
{
protected $connection;
protected $prefix;
/**
* @param Connection $connection
* @param string $prefix prefix for all stats, configure per server or environemnt
*/
public function __construct(Connection $connection, $prefix = '')
{
$this->connection = $connection;
$this->prefix = $prefix;
}
/**
* Log timing information
*
* @param string $stats The metric to in log timing info for.
* @param float $time The ellapsed time (ms) to log
* @param float|1 $sampleRate the rate (0-1) for sampling.
*/
public function timing($stat, $time, $sampleRate = 1)
{
$this->send(array($stat => sprintf('%s|ms', $time)), $sampleRate);
}
/**
* Increments one or more stats counters
*
* @param string|array $stats The metric(s) to increment.
* @param float|1 $sampleRate the rate (0-1) for sampling.
* @return boolean
*/
public function increment($stats, $sampleRate = 1)
{
$this->updateStats($stats, 1, $sampleRate);
}
/**
* Decrements one or more stats counters.
*
* @param string|array $stats The metric(s) to decrement.
* @param float|1 $sampleRate the rate (0-1) for sampling.
* @return boolean
*/
public function decrement($stats, $sampleRate = 1)
{
$this->updateStats($stats, -1, $sampleRate);
}
/**
* Updates one or more stats counters by arbitrary amounts.
*
* @param string|array $stats The metric(s) to update. Should be either a string or array of metrics.
* @param int|1 $delta The amount to increment/decrement each metric by.
* @param float|1 $sampleRate the rate (0-1) for sampling.
* @return boolean
*/
public function updateStats($stats, $delta = 1, $sampleRate = 1)
{
if (! is_array($stats)) {
$stats = array($stats);
}
$data = array();
foreach ($stats as $stat) {
$data[$stat] = sprintf('%s|c', $delta);
}
$this->send($data, $sampleRate);
}
/**
* Send statsd data over UDP
*
* @param array $data
* @param float $sampleRate
*/
public function send(array $data, $sampleRate = 1)
{
$sampledData = array();
if ($sampleRate < 1) {
foreach ($data as $stat => $value) {
if ($this->getRandomRate() <= $sampleRate) {
$sampledData[$stat] = sprintf('%s|@%s', $value, $sampleRate);
}
}
} else {
$sampledData = $data;
}
if (! empty($sampledData)) {
try {
foreach ($sampledData as $stat => $value) {
$this->connection->write(sprintf("%s%s:%s", $this->prefix, $stat, $value));
}
} catch (\Exception $e) {
}
}
}
/**
* Close connection
*/
public function closeConnection()
{
$this->connection->close();
}
/**
* Generate a random number between 0 and 1
* @return float
*/
protected function getRandomRate()
{
return mt_rand() / mt_getrandmax();
}
}