hshek-logstash-output-sumologic 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+ require "logstash/devutils/rspec/spec_helper"
3
+ require "logstash/outputs/sumologic"
4
+ include LogStash::Outputs
5
+
6
+ describe SumoLogic::MessageQueue do
7
+
8
+ context "working in pile mode if interval > 0 && pile_max > 0" do
9
+
10
+ let(:queue) { SumoLogic::MessageQueue.new(stats, "queue_max" => 10) }
11
+ let(:stats) { SumoLogic::Statistics.new }
12
+
13
+ it "enq() correctly" do
14
+ 10.times { |i|
15
+ queue.enq(SumoLogic::Batch.new(Hash.new, "test - #{i}"))
16
+ expect(queue.size()).to eq(i + 1)
17
+ expect(stats.total_enque_times.value).to eq(i + 1)
18
+ }
19
+ expect(queue.bytesize()).to eq(100)
20
+ end
21
+
22
+ it "deq() correctly" do
23
+ 10.times { |i|
24
+ queue.enq(SumoLogic::Batch.new(Hash.new, "test - #{i}"))
25
+ }
26
+ 10.times { |i|
27
+ expect(queue.size()).to eq(10 - i)
28
+ result = queue.deq()
29
+ expect(result.payload).to eq("test - #{i}")
30
+ expect(stats.total_deque_times.value).to eq(i + 1)
31
+ }
32
+ expect(queue.bytesize()).to eq(0)
33
+ end
34
+
35
+ it "drain() correctly" do
36
+ 10.times { |i|
37
+ queue.enq(SumoLogic::Batch.new(Hash.new, "test - #{i}"))
38
+ }
39
+ result = queue.drain()
40
+ expect(queue.size()).to eq(0)
41
+ expect(stats.total_deque_times.value).to eq(10)
42
+ expect(result.size).to eq(10)
43
+ expect(queue.bytesize()).to eq(0)
44
+ 10.times { |i|
45
+ expect(result[i].payload).to eq("test - #{i}")
46
+ }
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,522 @@
1
+ # encoding: utf-8
2
+ require "logstash/devutils/rspec/spec_helper"
3
+ require "logstash/outputs/sumologic"
4
+
5
+ describe LogStash::Outputs::SumoLogic::PayloadBuilder do
6
+
7
+ result = ""
8
+
9
+ before :each do
10
+ result = builder.build(event)
11
+ end
12
+
13
+ context "should build log payload in default format" do
14
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
15
+ let(:builder) { LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats, "url" => "http://localhost/1234") }
16
+ let(:event) { LogStash::Event.new("host" => "myHost", "message" => "Hello world") }
17
+
18
+ it "start with a valid timestamp" do
19
+ ts = result.split(" ")[0]
20
+ DateTime.parse(ts)
21
+ end
22
+
23
+ it "end with host and message" do
24
+ expect(result).to end_with("myHost Hello world")
25
+ end
26
+
27
+ end # context
28
+
29
+ context "should build log payload with @json tag" do
30
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
31
+ let(:builder) { LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats, "url" => "http://localhost/1234", "format" => "%{@json}") }
32
+ let(:event) { LogStash::Event.new("host" => "myHost", "message" => "Hello world") }
33
+
34
+ it "include host field" do
35
+ expect(result).to include("\"host\":\"myHost\"")
36
+ end
37
+
38
+ it "include host field" do
39
+ expect(result).to include("\"message\":\"Hello world\"")
40
+ end
41
+
42
+ it "include host field" do
43
+ expect(result).to include("\"@timestamp\"")
44
+ end
45
+
46
+ end # context
47
+
48
+ context "should build log payload with customized format" do
49
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
50
+ let(:builder) { LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats, "url" => "http://localhost/1234", "format" => "%{@timestamp} %{foo} %{bar}") }
51
+ let(:event) { LogStash::Event.new("host" => "myHost", "foo" => "fancy", "bar" => 24) }
52
+
53
+ it "start with a valid timestamp" do
54
+ ts = result.split(" ")[0]
55
+ DateTime.parse(ts)
56
+ end
57
+
58
+ it "end with host and message" do
59
+ expect(result).to end_with("fancy 24")
60
+ end
61
+
62
+ end # context
63
+
64
+ context "should build log payload with customized json_mapping" do
65
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
66
+ let(:builder) {
67
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
68
+ "url" => "http://localhost/1234",
69
+ "format" => "%{host} %{@json}",
70
+ "json_mapping" => {
71
+ "foo" => "%{foo}",
72
+ "bar" => "%{bar}"
73
+ })
74
+ }
75
+ let(:event) { LogStash::Event.new("host" => "myHost", "foo" => "fancy", "bar" => 24) }
76
+
77
+ specify {
78
+ expect(result).to eq("myHost {\"foo\":\"fancy\",\"bar\":\"24\"}")
79
+ }
80
+
81
+ end # context
82
+
83
+ context "should build metrics payload with graphite format" do
84
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
85
+ let(:builder) {
86
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
87
+ "url" => "http://localhost/1234",
88
+ "metrics" => {
89
+ "hurray.%{foo}" => "%{bar}"
90
+ },
91
+ "metrics_format" => "graphite")
92
+ }
93
+ let(:event) { LogStash::Event.new("host" => "myHost", "foo" => "fancy", "bar" => 24) }
94
+
95
+ it "start with metrics name and value" do
96
+ expect(result).to start_with("hurray.fancy 24 ")
97
+ end
98
+
99
+ it "end with epoch timestamp" do
100
+ expect(result).to match(/\d{10,}$/)
101
+ end
102
+
103
+ end # context
104
+
105
+ context "should build metrics payload with carbon2 format" do
106
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
107
+ let(:builder) {
108
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
109
+ "url" => "http://localhost/1234",
110
+ "metrics" => {
111
+ "hurray.%{foo}" => "%{bar}"
112
+ })
113
+ }
114
+ let(:event) { LogStash::Event.new("host" => "myHost", "foo" => "fancy", "bar" => 24) }
115
+
116
+ it "start with metrics name and value" do
117
+ expect(result).to start_with("metric=hurray.fancy 24 ")
118
+ end
119
+
120
+ it "end with epoch timestamp" do
121
+ expect(result).to match(/\d{10,}$/)
122
+ end
123
+
124
+ end # context
125
+
126
+ context "should build metrics payload with metrics_name override" do
127
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
128
+ let(:builder) {
129
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
130
+ "url" => "http://localhost/1234",
131
+ "metrics" => {
132
+ "hurray.%{foo}" => "%{bar}"
133
+ },
134
+ "metrics_name" => "mynamespace.*")
135
+ }
136
+ let(:event) { LogStash::Event.new("host" => "myHost", "foo" => "fancy", "bar" => 24) }
137
+
138
+ it "start with modified metrics name and value" do
139
+ expect(result).to start_with("metric=mynamespace.hurray.fancy 24 ")
140
+ end
141
+
142
+ it "end with epoch timestamp" do
143
+ expect(result).to match(/\d{10,}$/)
144
+ end
145
+
146
+ end # context
147
+
148
+ context "should build metrics payload with intrinsic_tags override" do
149
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
150
+ let(:builder) {
151
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
152
+ "url" => "http://localhost/1234",
153
+ "metrics" => {
154
+ "bar" => "%{bar}"
155
+ },
156
+ "intrinsic_tags" => {
157
+ "host" => "%{host}"
158
+ })
159
+ }
160
+ let(:event) { LogStash::Event.new("host" => "myHost", "foo" => "fancy", "bar" => 24) }
161
+
162
+ it "start with modified intrinsic tags and value" do
163
+ expect(result).to start_with("host=myHost metric=bar 24 ")
164
+ end
165
+
166
+ it "end with epoch timestamp" do
167
+ expect(result).to match(/\d{10,}$/)
168
+ end
169
+
170
+ end # context
171
+
172
+ context "should build metrics payload with meta_tags override" do
173
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
174
+ let(:builder) {
175
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
176
+ "url" => "http://localhost/1234",
177
+ "metrics" => {
178
+ "bar" => "%{bar}"
179
+ },
180
+ "intrinsic_tags" => {
181
+ "host" => "%{host}"
182
+ },
183
+ "meta_tags" => {
184
+ "foo" => "%{foo}"
185
+ })
186
+ }
187
+ let(:event) { LogStash::Event.new("host" => "myHost", "foo" => "fancy", "bar" => 24) }
188
+
189
+ it "start with modified intrinsic/meta tags and value" do
190
+ expect(result).to start_with("host=myHost metric=bar foo=fancy 24 ")
191
+ end
192
+
193
+ it "end with epoch timestamp" do
194
+ expect(result).to match(/\d{10,}$/)
195
+ end
196
+
197
+ end # context
198
+
199
+ context "should build metrics payload with multi lines with different values (graphite)" do
200
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
201
+ let(:builder) {
202
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
203
+ "url" => "http://localhost/1234",
204
+ "metrics" => {
205
+ "cpu1" => "%{cpu1}",
206
+ "cpu2" => "%{cpu2}"
207
+ },
208
+ "metrics_name" => "mynamespace.*",
209
+ "metrics_format" => "graphite")
210
+ }
211
+ let(:event) { LogStash::Event.new("host" => "myHost", "foo" => "fancy", "cpu1" => 0.24, "cpu2" => 0.11) }
212
+
213
+ specify {
214
+ lines = result.split(/\n/).sort
215
+ expect(lines.length).to eq(2)
216
+ expect(lines.shift).to match(/^mynamespace\.cpu1 0\.24 \d{10,}$/)
217
+ expect(lines.shift).to match(/^mynamespace\.cpu2 0\.11 \d{10,}$/)
218
+ }
219
+
220
+ end # context
221
+
222
+ context "should build metrics payload with multi lines with different values (carbon2)" do
223
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
224
+ let(:builder) {
225
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
226
+ "url" => "http://localhost/1234",
227
+ "metrics" => {
228
+ "cpu1" => "%{cpu1}",
229
+ "cpu2" => "%{cpu2}"
230
+ },
231
+ "intrinsic_tags" => {
232
+ "host" => "%{host}"
233
+ },
234
+ "meta_tags" => {
235
+ "foo" => "%{foo}"
236
+ })
237
+ }
238
+ let(:event) { LogStash::Event.new("host" => "myHost", "foo" => "fancy", "cpu1" => 0.24, "cpu2" => 0.11) }
239
+
240
+ specify {
241
+ lines = result.split(/\n/).sort
242
+ expect(lines.length).to eq(2)
243
+ expect(lines.shift).to match(/^host=myHost metric=cpu1 foo=fancy 0\.24 \d{10,}$/)
244
+ expect(lines.shift).to match(/^host=myHost metric=cpu2 foo=fancy 0\.11 \d{10,}$/)
245
+ }
246
+
247
+ end # context
248
+
249
+ context "should build metrics payload with non-number value dropped (graphite)" do
250
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
251
+ let(:builder) {
252
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
253
+ "url" => "http://localhost/1234",
254
+ "metrics" => {
255
+ "cpu1" => "%{cpu1}",
256
+ "cpu2" => "%{cpu2}",
257
+ "cpu3" => "%{cpu3}"
258
+ },
259
+ "metrics_format" => "graphite")
260
+ }
261
+ let(:event) { LogStash::Event.new("host" => "myHost", "foo" => "fancy", "cpu1" => 0.24, "cpu2" => "abc", "cpu3" => 0.11) }
262
+
263
+ it "include all points" do
264
+ lines = result.split(/\n/).sort
265
+ expect(lines.length).to eq(2)
266
+ expect(lines.shift).to match(/^cpu1 0\.24 \d{10,}$/)
267
+ expect(lines.shift).to match(/^cpu3 0\.11 \d{10,}$/)
268
+ end
269
+
270
+ end # context
271
+
272
+ context "should build metrics payload with non-number value dropped (carbon2)" do
273
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
274
+ let(:builder) {
275
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
276
+ "url" => "http://localhost/1234",
277
+ "metrics" => {
278
+ "cpu1" => "%{cpu1}",
279
+ "cpu2" => "%{cpu2}",
280
+ "cpu3" => "%{cpu3}"
281
+ },
282
+ "intrinsic_tags" => {
283
+ "host" => "%{host}"
284
+ },
285
+ "metrics_name" => "mynamespace.*",
286
+ "meta_tags" => {
287
+ "foo" => "%{foo}"
288
+ })
289
+ }
290
+ let(:event) { LogStash::Event.new("host" => "myHost", "foo" => "fancy", "cpu1" => 0.24, "cpu2" => "abc", "cpu3" => 0.11) }
291
+
292
+ specify {
293
+ lines = result.split(/\n/).sort
294
+ expect(lines.length).to eq(2)
295
+ expect(lines.shift).to match(/^host=myHost metric=mynamespace\.cpu1 foo=fancy 0\.24 \d{10,}$/)
296
+ expect(lines.shift).to match(/^host=myHost metric=mynamespace\.cpu3 foo=fancy 0\.11 \d{10,}$/)
297
+ }
298
+
299
+ end # context
300
+
301
+ context "should build metrics payload with fields_as_metrics (graphite)" do
302
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
303
+ let(:builder) {
304
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
305
+ "url" => "http://localhost/1234",
306
+ "fields_as_metrics" => true,
307
+ "metrics_format" => "graphite")
308
+ }
309
+ let(:event) {
310
+ LogStash::Event.new(
311
+ "host" => "myHost",
312
+ "foo" => "fancy",
313
+ "cpu" => [0.24, 0.11, 0.75, 0.28],
314
+ "storageRW" => 51,
315
+ "bar" => "blahblah",
316
+ "blkio" => {
317
+ "write_ps" => 0,
318
+ "read_ps" => 0,
319
+ "total_ps" => 0
320
+ })
321
+ }
322
+
323
+ specify {
324
+ lines = result.split(/\n/).sort
325
+ expect(lines.length).to eq(8)
326
+ expect(lines.shift).to match(/^blkio\.read_ps 0 \d{10,}$/)
327
+ expect(lines.shift).to match(/^blkio\.total_ps 0 \d{10,}$/)
328
+ expect(lines.shift).to match(/^blkio\.write_ps 0 \d{10,}$/)
329
+ expect(lines.shift).to match(/^cpu\.0 0\.24 \d{10,}$/)
330
+ expect(lines.shift).to match(/^cpu\.1 0\.11 \d{10,}$/)
331
+ expect(lines.shift).to match(/^cpu\.2 0\.75 \d{10,}$/)
332
+ expect(lines.shift).to match(/^cpu\.3 0\.28 \d{10,}$/)
333
+ expect(lines.shift).to match(/^storageRW 51 \d{10,}$/)
334
+ }
335
+
336
+ end # context
337
+
338
+ context "should build metrics payload with fields_as_metrics (carbon2)" do
339
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
340
+ let(:builder) {
341
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
342
+ "url" => "http://localhost/1234",
343
+ "fields_as_metrics" => true,
344
+ "intrinsic_tags" => {
345
+ "host"=>"%{host}"
346
+ },
347
+ "meta_tags" => {
348
+ "foo" => "%{foo}"
349
+ })
350
+ }
351
+ let(:event) {
352
+ LogStash::Event.new(
353
+ "host" => "myHost",
354
+ "foo" => "fancy",
355
+ "cpu" => [0.24, 0.11, 0.75, 0.28],
356
+ "storageRW" => 51,
357
+ "bar" => "blahblah",
358
+ "blkio" => {
359
+ "write_ps" => 5,
360
+ "read_ps" => 2,
361
+ "total_ps" => 0
362
+ })
363
+ }
364
+
365
+ specify {
366
+ lines = result.split(/\n/).sort
367
+ expect(lines.length).to eq(8)
368
+ expect(lines.shift).to match(/^host=myHost metric=blkio\.read_ps foo=fancy 2 \d{10,}$/)
369
+ expect(lines.shift).to match(/^host=myHost metric=blkio\.total_ps foo=fancy 0 \d{10,}$/)
370
+ expect(lines.shift).to match(/^host=myHost metric=blkio\.write_ps foo=fancy 5 \d{10,}$/)
371
+ expect(lines.shift).to match(/^host=myHost metric=cpu\.0 foo=fancy 0\.24 \d{10,}$/)
372
+ expect(lines.shift).to match(/^host=myHost metric=cpu\.1 foo=fancy 0\.11 \d{10,}$/)
373
+ expect(lines.shift).to match(/^host=myHost metric=cpu\.2 foo=fancy 0\.75 \d{10,}$/)
374
+ expect(lines.shift).to match(/^host=myHost metric=cpu\.3 foo=fancy 0\.28 \d{10,}$/)
375
+ expect(lines.shift).to match(/^host=myHost metric=storageRW foo=fancy 51 \d{10,}$/)
376
+ }
377
+
378
+ end # context
379
+
380
+ context "should hornor fields_include when fields_as_metrics (graphite)" do
381
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
382
+ let(:builder) {
383
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
384
+ "url" => "http://localhost/1234",
385
+ "fields_as_metrics" => true,
386
+ "metrics_format" => "graphite",
387
+ "fields_include" => ["cpu*"])
388
+ }
389
+ let(:event) {
390
+ LogStash::Event.new(
391
+ "host" => "myHost",
392
+ "foo" => "fancy",
393
+ "cpu" => [0.24, 0.11, 0.75, 0.28],
394
+ "storageRW" => 51,
395
+ "bar" => "blahblah",
396
+ "blkio" => {
397
+ "write_ps" => 5,
398
+ "read_ps" => 2,
399
+ "total_ps" => 0
400
+ })
401
+ }
402
+
403
+ specify {
404
+ lines = result.split(/\n/).sort
405
+ expect(lines.length).to eq(4)
406
+ expect(lines.shift).to match(/^cpu\.0 0\.24 \d{10,}$/)
407
+ expect(lines.shift).to match(/^cpu\.1 0\.11 \d{10,}$/)
408
+ expect(lines.shift).to match(/^cpu\.2 0\.75 \d{10,}$/)
409
+ expect(lines.shift).to match(/^cpu\.3 0\.28 \d{10,}$/)
410
+ }
411
+
412
+ end # context
413
+
414
+ context "should hornor fields_include when fields_as_metrics (carbon2)" do
415
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
416
+ let(:builder) {
417
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
418
+ "url" => "http://localhost/1234",
419
+ "fields_as_metrics" => true,
420
+ "intrinsic_tags" => {
421
+ "host" => "%{host}"
422
+ },
423
+ "meta_tags" => {
424
+ "foo" => "%{foo}"
425
+ },
426
+ "fields_include" => ["cpu*"])
427
+ }
428
+ let(:event) {
429
+ LogStash::Event.new(
430
+ "host" => "myHost",
431
+ "foo" => "fancy",
432
+ "cpu" => [0.24, 0.11, 0.75, 0.28],
433
+ "storageRW" => 51,
434
+ "bar" => "blahblah",
435
+ "blkio" => {
436
+ "write_ps" => 5,
437
+ "read_ps" => 2,
438
+ "total_ps" => 0
439
+ })
440
+ }
441
+
442
+ specify {
443
+ lines = result.split(/\n/).sort
444
+ expect(lines.length).to eq(4)
445
+ expect(lines.shift).to match(/^host=myHost metric=cpu\.0 foo=fancy 0\.24 \d{10,}$/)
446
+ expect(lines.shift).to match(/^host=myHost metric=cpu\.1 foo=fancy 0\.11 \d{10,}$/)
447
+ expect(lines.shift).to match(/^host=myHost metric=cpu\.2 foo=fancy 0\.75 \d{10,}$/)
448
+ expect(lines.shift).to match(/^host=myHost metric=cpu\.3 foo=fancy 0\.28 \d{10,}$/)
449
+ }
450
+
451
+ end # context
452
+
453
+ context "should hornor fields_exclude when fields_as_metrics (graphite)" do
454
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
455
+ let(:builder) {
456
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
457
+ "url" => "http://localhost/1234",
458
+ "fields_as_metrics" => true,
459
+ "metrics_format" => "graphite",
460
+ "fields_include" => ["cpu*"],
461
+ "fields_exclude" => [".*1"])
462
+ }
463
+ let(:event) { LogStash::Event.new(
464
+ "host" => "myHost",
465
+ "foo" => "fancy",
466
+ "cpu" => [0.24, 0.11, 0.75, 0.28],
467
+ "storageRW" => 51,
468
+ "bar" => "blahblah",
469
+ "blkio" => {
470
+ "write_ps" => 5,
471
+ "read_ps" => 2,
472
+ "total_ps" => 0
473
+ })}
474
+
475
+ specify {
476
+ lines = result.split(/\n/).sort
477
+ expect(lines.length).to eq(3)
478
+ expect(lines.shift).to match(/^cpu\.0 0\.24 \d{10,}$/)
479
+ expect(lines.shift).to match(/^cpu\.2 0\.75 \d{10,}$/)
480
+ expect(lines.shift).to match(/^cpu\.3 0\.28 \d{10,}$/)
481
+ }
482
+
483
+ end # context
484
+
485
+ context "should hornor fields_exclude when fields_as_metrics (carbon2)" do
486
+ let(:stats) { LogStash::Outputs::SumoLogic::Statistics.new() }
487
+ let(:builder) {
488
+ LogStash::Outputs::SumoLogic::PayloadBuilder.new(stats,
489
+ "url" => "http://localhost/1234",
490
+ "fields_as_metrics" => true,
491
+ "intrinsic_tags" => {
492
+ "host" => "%{host}"
493
+ },
494
+ "meta_tags" => {
495
+ "foo" => "%{foo}"
496
+ },
497
+ "fields_include" => ["cpu*"],
498
+ "fields_exclude" => [".*1"])
499
+ }
500
+ let(:event) { LogStash::Event.new(
501
+ "host" => "myHost",
502
+ "foo" => "fancy",
503
+ "cpu" => [0.24, 0.11, 0.75, 0.28],
504
+ "storageRW" => 51,
505
+ "bar" => "blahblah",
506
+ "blkio" => {
507
+ "write_ps" => 5,
508
+ "read_ps" => 2,
509
+ "total_ps" => 0
510
+ })}
511
+
512
+ specify {
513
+ lines = result.split(/\n/).sort
514
+ expect(lines.length).to eq(3)
515
+ expect(lines.shift).to match(/^host=myHost metric=cpu\.0 foo=fancy 0\.24 \d{10,}$/)
516
+ expect(lines.shift).to match(/^host=myHost metric=cpu\.2 foo=fancy 0\.75 \d{10,}$/)
517
+ expect(lines.shift).to match(/^host=myHost metric=cpu\.3 foo=fancy 0\.28 \d{10,}$/)
518
+ }
519
+
520
+ end # context
521
+
522
+ end # describe