2
2
3
3
namespace Enqueue \Monitoring ;
4
4
5
+ use Enqueue \Client \Config ;
6
+ use Enqueue \Dsn \Dsn ;
5
7
use InfluxDB \Client ;
6
8
use InfluxDB \Database ;
7
9
use InfluxDB \Point ;
8
10
9
11
class InfluxDbStorage implements StatsStorage
10
12
{
11
13
/**
12
- * @var Client
14
+ * @var array
13
15
*/
14
- private $ client ;
16
+ private $ config ;
15
17
16
18
/**
17
- * @var string
18
- */
19
- private $ dbName ;
20
-
21
- /**
22
- * @var string
23
- */
24
- private $ measurementMessages ;
25
-
26
- /**
27
- * @var string
19
+ * @var Client
28
20
*/
29
- private $ measurementConsumers ;
21
+ private $ client ;
30
22
31
23
/**
32
24
* @var Database
33
25
*/
34
26
private $ database ;
35
27
36
28
/**
37
- * The config could be an array, string DSN or null . In case of null it will attempt to connect to localhost.
29
+ * The config could be an array, string DSN, null or instance of InfluxDB\Client . In case of null it will attempt to connect to localhost.
38
30
*
39
31
* $config = [
40
- * 'dsn' => 'wamp://127.0.0.1:9090',
41
- * 'host' => '127.0.0.1',
42
- * 'port' => '9090',
43
- * 'topic' => 'stats',
44
- * 'max_retries' => 15,
45
- * 'initial_retry_delay' => 1.5,
46
- * 'max_retry_delay' => 300,
47
- * 'retry_delay_growth' => 1.5,
32
+ * 'dsn' => 'influxdb://127.0.0.1:8086',
33
+ * 'host' => '127.0.0.1',
34
+ * 'port' => '8086',
35
+ * 'user' => '',
36
+ * 'password' => '',
37
+ * 'db' => 'enqueue',
38
+ * 'measurementSentMessages' => 'sent-messages',
39
+ * 'measurementConsumedMessages' => 'consumed-messages',
40
+ * 'measurementConsumers' => 'consumers',
48
41
* ]
49
42
*
50
43
* or
51
44
*
52
- * wamp ://127.0.0.1:9090?max_retries=10
45
+ * influxdb ://127.0.0.1:8086?user=Jon&password=secret
53
46
*
54
47
* @param array|string|null $config
55
48
*/
56
49
public function __construct ($ config = 'influxdb: ' )
57
50
{
58
- $ this ->client = $ client ;
59
- $ this ->dbName = $ dbName ;
60
- $ this ->measurementMessages = 'messages ' ;
61
- $ this ->measurementConsumers = 'consumers ' ;
62
-
63
51
if (false == class_exists (Client::class)) {
64
52
throw new \LogicException ('Seems client library is not installed. Please install "influxdb/influxdb-php" ' );
65
53
}
66
54
67
55
if (empty ($ config )) {
68
- $ config = $ this -> parseDsn ( ' influxdb: ' ) ;
56
+ $ config = [] ;
69
57
} elseif (is_string ($ config )) {
70
58
$ config = $ this ->parseDsn ($ config );
71
59
} elseif (is_array ($ config )) {
72
60
$ config = empty ($ config ['dsn ' ]) ? $ config : $ this ->parseDsn ($ config ['dsn ' ]);
61
+ } elseif ($ config instanceof Client) {
62
+ $ this ->client = $ config ;
63
+ $ config = [];
73
64
} else {
74
65
throw new \LogicException ('The config must be either an array of options, a DSN string or null ' );
75
66
}
76
67
77
68
$ config = array_replace ([
78
69
'host ' => '127.0.0.1 ' ,
79
- 'port ' => '9090 ' ,
80
- 'topic ' => 'stats ' ,
81
- 'max_retries ' => 15 ,
82
- 'initial_retry_delay ' => 1.5 ,
83
- 'max_retry_delay ' => 300 ,
84
- 'retry_delay_growth ' => 1.5 ,
70
+ 'port ' => '8086 ' ,
71
+ 'user ' => '' ,
72
+ 'password ' => '' ,
73
+ 'db ' => 'enqueue ' ,
74
+ 'measurementSentMessages ' => 'sent-messages ' ,
75
+ 'measurementConsumedMessages ' => 'consumed-messages ' ,
76
+ 'measurementConsumers ' => 'consumers ' ,
85
77
], $ config );
86
78
87
79
$ this ->config = $ config ;
88
80
}
89
81
90
- public function pushConsumerStats (ConsumerStats $ event ): void
82
+ public function pushConsumerStats (ConsumerStats $ stats ): void
91
83
{
92
84
$ points = [];
93
85
94
- foreach ($ event ->getQueues () as $ queue ) {
86
+ foreach ($ stats ->getQueues () as $ queue ) {
95
87
$ tags = [
96
88
'queue ' => $ queue ,
97
- 'consumerId ' => $ event ->getConsumerId (),
89
+ 'consumerId ' => $ stats ->getConsumerId (),
98
90
];
99
91
100
92
$ values = [
101
- 'startedAtMs ' => $ event ->getStartedAtMs (),
102
- 'started ' => $ event ->isStarted (),
103
- 'finished ' => $ event ->isFinished (),
104
- 'failed ' => $ event ->isFailed (),
105
- 'received ' => $ event ->getReceived (),
106
- 'acknowledged ' => $ event ->getAcknowledged (),
107
- 'rejected ' => $ event ->getRejected (),
108
- 'requeued ' => $ event ->getRequeued (),
109
- 'memoryUsage ' => $ event ->getMemoryUsage (),
110
- 'systemLoad ' => $ event ->getSystemLoad (),
93
+ 'startedAtMs ' => $ stats ->getStartedAtMs (),
94
+ 'started ' => $ stats ->isStarted (),
95
+ 'finished ' => $ stats ->isFinished (),
96
+ 'failed ' => $ stats ->isFailed (),
97
+ 'received ' => $ stats ->getReceived (),
98
+ 'acknowledged ' => $ stats ->getAcknowledged (),
99
+ 'rejected ' => $ stats ->getRejected (),
100
+ 'requeued ' => $ stats ->getRequeued (),
101
+ 'memoryUsage ' => $ stats ->getMemoryUsage (),
102
+ 'systemLoad ' => $ stats ->getSystemLoad (),
111
103
];
112
104
113
- if ($ event ->getFinishedAtMs ()) {
114
- $ values ['finishedAtMs ' ] = $ event ->getFinishedAtMs ();
105
+ if ($ stats ->getFinishedAtMs ()) {
106
+ $ values ['finishedAtMs ' ] = $ stats ->getFinishedAtMs ();
115
107
}
116
108
117
- $ points [] = new Point ($ this ->measurementConsumers , null , $ tags , $ values , $ event ->getTimestampMs ());
109
+ $ points [] = new Point ($ this ->config [ ' measurementConsumers ' ] , null , $ tags , $ values , $ stats ->getTimestampMs ());
118
110
}
119
111
120
112
$ this ->getDb ()->writePoints ($ points , Database::PRECISION_MILLISECONDS );
121
113
}
122
114
123
- public function pushMessageStats ( MessageStats $ event ): void
115
+ public function pushConsumedMessageStats ( ConsumedMessageStats $ stats ): void
124
116
{
125
117
$ tags = [
126
- 'queue ' => $ event ->getQueue (),
127
- 'status ' => $ event ->getStatus (),
118
+ 'queue ' => $ stats ->getQueue (),
119
+ 'status ' => $ stats ->getStatus (),
128
120
];
129
121
130
122
$ values = [
131
- 'receivedAt ' => $ event ->getReceivedAtMs (),
132
- 'processedAt ' => $ event ->getTimestampMs (),
123
+ 'receivedAt ' => $ stats ->getReceivedAtMs (),
124
+ 'processedAt ' => $ stats ->getTimestampMs (),
133
125
];
134
126
135
- if (MessageStats ::STATUS_FAILED === $ event ->getStatus ()) {
127
+ if (ConsumedMessageStats ::STATUS_FAILED === $ stats ->getStatus ()) {
136
128
$ values ['failed ' ] = 1 ;
137
129
}
138
130
139
- $ runtime = $ event ->getTimestampMs () - $ event ->getReceivedAtMs ();
131
+ $ runtime = $ stats ->getTimestampMs () - $ stats ->getReceivedAtMs ();
140
132
141
133
$ points = [
142
- new Point ($ this ->measurementMessages , $ runtime , $ tags , $ values , $ event ->getTimestampMs ()),
134
+ new Point ($ this ->config ['measurementConsumedMessages ' ], $ runtime , $ tags , $ values , $ stats ->getTimestampMs ()),
135
+ ];
136
+
137
+ $ this ->getDb ()->writePoints ($ points , Database::PRECISION_MILLISECONDS );
138
+ }
139
+
140
+ public function pushSentMessageStats (SentMessageStats $ stats ): void
141
+ {
142
+ $ tags = [];
143
+ $ properties = $ stats ->getProperties ();
144
+
145
+ if (false === empty ($ properties [Config::TOPIC ])) {
146
+ $ tags ['topic ' ] = $ properties [Config::TOPIC ];
147
+ }
148
+
149
+ if (false === empty ($ properties [Config::COMMAND ])) {
150
+ $ tags ['command ' ] = $ properties [Config::COMMAND ];
151
+ }
152
+
153
+ $ points = [
154
+ new Point ($ this ->config ['measurementSentMessages ' ], null , $ tags , [], $ stats ->getTimestampMs ()),
143
155
];
144
156
145
157
$ this ->getDb ()->writePoints ($ points , Database::PRECISION_MILLISECONDS );
@@ -148,7 +160,16 @@ public function pushMessageStats(MessageStats $event): void
148
160
private function getDb (): Database
149
161
{
150
162
if (null === $ this ->database ) {
151
- $ this ->database = $ this ->client ->selectDB ($ this ->dbName );
163
+ if (null === $ this ->client ) {
164
+ $ this ->client = new Client (
165
+ $ this ->config ['host ' ],
166
+ $ this ->config ['port ' ],
167
+ $ this ->config ['user ' ],
168
+ $ this ->config ['password ' ]
169
+ );
170
+ }
171
+
172
+ $ this ->database = $ this ->client ->selectDB ($ this ->config ['db ' ]);
152
173
$ this ->database ->create ();
153
174
}
154
175
@@ -159,21 +180,22 @@ private function parseDsn(string $dsn): array
159
180
{
160
181
$ dsn = new Dsn ($ dsn );
161
182
162
- if (false === in_array ($ dsn ->getSchemeProtocol (), ['wamp ' , ' ws ' ], true )) {
183
+ if (false === in_array ($ dsn ->getSchemeProtocol (), ['influxdb ' ], true )) {
163
184
throw new \LogicException (sprintf (
164
- 'The given scheme protocol "%s" is not supported. It must be "wamp " ' ,
185
+ 'The given scheme protocol "%s" is not supported. It must be "influxdb " ' ,
165
186
$ dsn ->getSchemeProtocol ()
166
187
));
167
188
}
168
189
169
190
return array_filter (array_replace ($ dsn ->getQuery (), [
170
191
'host ' => $ dsn ->getHost (),
171
192
'port ' => $ dsn ->getPort (),
172
- 'topic ' => $ dsn ->getQueryParameter ('topic ' ),
173
- 'max_retries ' => $ dsn ->getInt ('max_retries ' ),
174
- 'initial_retry_delay ' => $ dsn ->getFloat ('initial_retry_delay ' ),
175
- 'max_retry_delay ' => $ dsn ->getInt ('max_retry_delay ' ),
176
- 'retry_delay_growth ' => $ dsn ->getFloat ('retry_delay_growth ' ),
193
+ 'user ' => $ dsn ->getUser (),
194
+ 'password ' => $ dsn ->getPassword (),
195
+ 'db ' => $ dsn ->getQueryParameter ('db ' ),
196
+ 'measurementSentMessages ' => $ dsn ->getQueryParameter ('measurementSentMessages ' ),
197
+ 'measurementConsumedMessages ' => $ dsn ->getQueryParameter ('measurementConsumedMessages ' ),
198
+ 'measurementConsumers ' => $ dsn ->getQueryParameter ('measurementConsumers ' ),
177
199
]), function ($ value ) { return null !== $ value ; });
178
200
}
179
201
}
0 commit comments