fnordmetric 0.3.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/Gemfile +6 -0
  2. data/Gemfile.lock +21 -0
  3. data/Procfile +1 -2
  4. data/VERSION +1 -1
  5. data/_spec/app_spec.rb +178 -0
  6. data/{spec → _spec}/cache_spec.rb +0 -0
  7. data/{spec → _spec}/combine_metric_spec.rb +0 -0
  8. data/{spec → _spec}/core_spec.rb +0 -0
  9. data/{spec → _spec}/count_metric_spec.rb +0 -0
  10. data/_spec/dashboard_spec.rb +67 -0
  11. data/_spec/event_spec.rb +46 -0
  12. data/{spec → _spec}/metric_spec.rb +0 -0
  13. data/{spec → _spec}/report_spec.rb +0 -0
  14. data/{spec → _spec}/sum_metric_spec.rb +0 -0
  15. data/_spec/widget_spec.rb +107 -0
  16. data/doc/import_dump.rb +26 -0
  17. data/em_runner.rb +33 -0
  18. data/fnordmetric.gemspec +59 -20
  19. data/haml/app.haml +26 -12
  20. data/lib/fnordmetric.rb +150 -15
  21. data/lib/fnordmetric/app.rb +70 -11
  22. data/lib/fnordmetric/cache.rb +4 -4
  23. data/lib/fnordmetric/context.rb +65 -0
  24. data/lib/fnordmetric/dashboard.rb +16 -12
  25. data/lib/fnordmetric/event.rb +65 -15
  26. data/lib/fnordmetric/gauge.rb +46 -0
  27. data/lib/fnordmetric/gauge_calculations.rb +43 -0
  28. data/lib/fnordmetric/gauge_modifiers.rb +43 -0
  29. data/lib/fnordmetric/inbound_stream.rb +66 -0
  30. data/lib/fnordmetric/logger.rb +38 -0
  31. data/lib/fnordmetric/namespace.rb +120 -0
  32. data/lib/fnordmetric/numbers_widget.rb +29 -11
  33. data/lib/fnordmetric/session.rb +131 -0
  34. data/lib/fnordmetric/standalone.rb +31 -0
  35. data/lib/fnordmetric/timeline_widget.rb +29 -9
  36. data/lib/fnordmetric/widget.rb +50 -45
  37. data/lib/fnordmetric/worker.rb +80 -0
  38. data/pub/fnordmetric/fnordmetric.css +76 -9
  39. data/pub/fnordmetric/fnordmetric.js +541 -42
  40. data/pub/raphael-min.js +8 -0
  41. data/pub/raphael-utils.js +221 -0
  42. data/readme.rdoc +172 -27
  43. data/server.rb +22 -0
  44. data/spec/app_spec.rb +359 -117
  45. data/spec/context_spec.rb +42 -0
  46. data/spec/dashboard_spec.rb +7 -47
  47. data/spec/event_spec.rb +114 -33
  48. data/spec/gauge_modifiers_spec.rb +276 -0
  49. data/spec/gauge_spec.rb +128 -0
  50. data/spec/namespace_spec.rb +104 -0
  51. data/spec/session_spec.rb +231 -0
  52. data/spec/spec_helper.rb +27 -4
  53. data/spec/widget_spec.rb +81 -75
  54. data/spec/worker_spec.rb +37 -0
  55. data/test_stream.sh +187 -0
  56. data/ulm_stats.rb +198 -0
  57. metadata +114 -35
  58. data/lib/fnordmetric/core.rb +0 -66
  59. data/lib/fnordmetric/engine.rb +0 -3
data/spec/spec_helper.rb CHANGED
@@ -1,13 +1,36 @@
1
1
  require 'rubygems'
2
+ require 'json'
2
3
  require 'rspec'
3
- require 'mongoid'
4
+ require 'redis'
4
5
  require 'rack'
5
6
  require 'rack/test'
6
7
  require 'delorean'
7
8
 
8
9
  ENV['RACK_ENV'] = "test"
9
-
10
- Mongoid.configure{ |c| c.master = Mongo::Connection.new.db("fnordmetric_test") }
10
+ ENV['FNORDMETRIC_ENV'] = 'test'
11
11
 
12
12
  $: << ::File.expand_path('../../lib', __FILE__)
13
- require "fnordmetric"
13
+ require "fnordmetric"
14
+ require "eventmachine"
15
+ require 'em-hiredis'
16
+
17
+ class RedisWrap
18
+
19
+ def initialize(redis, callbackable=true)
20
+ @redis = redis
21
+ @callbackable = callbackable
22
+ end
23
+
24
+ def method_missing(m, *args)
25
+ @last_return = @redis.send(m, *args)
26
+ if ENV["VERBOSE_REDIS"]
27
+ puts ">> REDIS: #{m} #{args.join(" ")} => #{@last_return}"
28
+ end
29
+ @callbackable ? self : @last_return
30
+ end
31
+
32
+ def callback(&block)
33
+ block.call(*@last_return)
34
+ end
35
+
36
+ end
data/spec/widget_spec.rb CHANGED
@@ -3,102 +3,108 @@ require ::File.expand_path('../spec_helper.rb', __FILE__)
3
3
  describe FnordMetric::Widget do
4
4
 
5
5
  before(:each) do
6
- FnordMetric::Event.destroy_all
6
+ @gauge1 = FnordMetric::Gauge.new(
7
+ :key => "foooobar",
8
+ :tick => 60*60*24,
9
+ :key_prefix => "blubb"
10
+ )
11
+ @gauge2 = FnordMetric::Gauge.new(
12
+ :key => "fooo234obar",
13
+ :tick => 60*60,
14
+ :key_prefix => "blubb"
15
+ )
7
16
  end
8
17
 
9
- it "should remembe it's own title" do
10
- widget = FnordMetric::Widget.new(:title => "My Widget")
18
+ it "should remember it's own title" do
19
+ widget = FnordMetric::Widget.new(
20
+ :title => "My Widget",
21
+ :gauges => [@gauge1]
22
+ )
11
23
  widget.title.should == "My Widget"
12
24
  end
13
-
14
- it "should add the report on init" do
15
- FnordMetric.metric(:my_metric, :sum => :my_field)
16
- report = FnordMetric.report(:range => (4.days.ago..Time.now))
17
- widget = FnordMetric::Widget.new(:report => report)
18
- widget.report.should == report
25
+
26
+ it "should remember it's gauges" do
27
+ widget = FnordMetric::Widget.new(
28
+ :title => "My Widget",
29
+ :gauges => [@gauge1]
30
+ )
31
+ widget.gauges.should == [@gauge1]
19
32
  end
20
-
21
- it "should add the report after init" do
22
- FnordMetric.metric(:my_metric, :sum => :my_field)
23
- report = FnordMetric.report(:range => (4.days.ago..Time.now))
24
- widget = FnordMetric::Widget.new
25
- widget.report.should be_nil
26
- widget.add_report(report)
27
- widget.report.should == report
33
+
34
+ it "should calculate the correct tick" do
35
+ widget = FnordMetric::Widget.new(
36
+ :title => "My Widget",
37
+ :gauges => [@gauge1]
38
+ )
39
+ widget.tick.should == 60*60*24
28
40
  end
29
-
30
- it "should define a new widget when given two metric-token" do
31
- FnordMetric.metric(:first_metric, :count => :true)
32
- FnordMetric.metric(:second_metric, :count => :true)
33
- widget = FnordMetric::Widget.new(:metrics => [:first_metric, :second_metric], :title => "My Widget", :type => :timeline)
34
- widget.metrics.length.should == 2
35
- widget.metrics.first.should be_a(FnordMetric::CountMetric)
36
- widget.metrics.first.token.should == :first_metric
37
- widget.metrics.last.should be_a(FnordMetric::CountMetric)
38
- widget.metrics.last.token.should == :second_metric
41
+
42
+ it "should raise an error if two gauges with different ticks are added" do
43
+ lambda{
44
+ widget = FnordMetric::Widget.new(
45
+ :title => "My Widget",
46
+ :gauges => [@gauge1, @gauge2]
47
+ )
48
+ }.should raise_error
39
49
  end
40
50
 
41
- it "should define a new widget when given two metrics" do
42
- my_metrics = [
43
- FnordMetric.metric(:first_metric, :count => :true),
44
- FnordMetric.metric(:second_metric, :count => :true)
45
- ]
46
- widget = FnordMetric::Widget.new(:metrics => my_metrics, :title => "My Widget", :type => :timeline)
47
- widget.metrics.length.should == 2
48
- widget.metrics.first.should be_a(FnordMetric::CountMetric)
49
- widget.metrics.first.token.should == :first_metric
50
- widget.metrics.last.should be_a(FnordMetric::CountMetric)
51
- widget.metrics.last.token.should == :second_metric
51
+ it "should generate the correct default range for daily graphs without include current" do
52
+ widget = FnordMetric::Widget.new(
53
+ :title => "My Widget",
54
+ :include_current => false,
55
+ :gauges => [@gauge1]
56
+ )
57
+ range = widget.default_range(Time.utc(1992,01,13,18,23,23))
58
+ Time.at(range.last).utc.should == Time.utc(1992,01,13,00,00)
59
+ Time.at(range.first).utc.should == Time.utc(1991,12,14,00,00)
52
60
  end
53
61
 
54
- it "should return the right ticks for 1h intervals" do
55
- t = Time.now
56
- widget = FnordMetric::Widget.new(:range => (t-2.days)..t, :tick => 1.hour)
57
- widget.ticks.length.should == 49
58
- ranges_should_match! widget.ticks.first, ((t-48.hours)..(t-47.hours))
59
- ranges_should_match! widget.ticks.last, (t..(t+1.hour))
62
+ it "should generate the correct default range for daily graphs with include current" do
63
+ widget = FnordMetric::Widget.new(
64
+ :title => "My Widget",
65
+ :gauges => [@gauge1]
66
+ )
67
+ range = widget.default_range(Time.utc(1992,01,13,18,23,23))
68
+ Time.at(range.last).utc.should == Time.utc(1992,01,14,00,00)
69
+ Time.at(range.first).utc.should == Time.utc(1991,12,15,00,00)
60
70
  end
61
71
 
62
- it "should generate a default range for daily graphs" do
63
- widget = FnordMetric::Widget.new(:tick => 1.day)
64
- Delorean.time_travel_to(Time.utc(1992,01,13,18,23,23)) do
65
- widget.default_range.first.should == Time.utc(1991,12,15,00,00,00)
66
- widget.default_range.last.should == Time.utc(1992,1,13,23,59,59)
67
- end
72
+ it "should generate the correct default range for hourly graphs with include current" do
73
+ widget = FnordMetric::Widget.new(
74
+ :title => "My Widget",
75
+ :gauges => [@gauge2]
76
+ )
77
+ range = widget.default_range(Time.utc(1992,01,13,18,23,23))
78
+ Time.at(range.last).utc.should == Time.utc(1992,01,13,19,00)
79
+ Time.at(range.first).utc.should == Time.utc(1992,01,12,19,00)
68
80
  end
69
81
 
70
- it "should generate ticks with default range for daily graphs" do
71
- widget = FnordMetric::Widget.new(:tick => 1.day)
72
- Delorean.time_travel_to(Time.utc(1992,01,13,18,23,23)) do
73
- widget.ticks.length.should == 30
74
- widget.ticks.first.first.utc.should == Time.utc(1991,12,15,00,00,00)
75
- widget.ticks.first.last.utc.should == Time.utc(1991,12,16,00,00,00)
76
- widget.ticks.last.first.utc.should == Time.utc(1992,1,13,0,0,0)
77
- widget.ticks.last.last.utc.should == Time.utc(1992,1,14,0,0,0)
78
- end
82
+ it "should generate the correct default range for hourly graphs with include current" do
83
+ widget = FnordMetric::Widget.new(
84
+ :title => "My Widget",
85
+ :include_current => false,
86
+ :gauges => [@gauge2]
87
+ )
88
+ range = widget.default_range(Time.utc(1992,01,13,18,23,23))
89
+ Time.at(range.last).utc.should == Time.utc(1992,01,13,18,00)
90
+ Time.at(range.first).utc.should == Time.utc(1992,01,12,18,00)
79
91
  end
80
92
 
81
- it "should generate a default range for hourly graphs" do
82
- widget = FnordMetric::Widget.new(:tick => 1.hour)
93
+ it "should generate the correct ticks" do
94
+ widget = FnordMetric::Widget.new(
95
+ :title => "My Widget",
96
+ :gauges => [@gauge2]
97
+ )
83
98
  Delorean.time_travel_to(Time.utc(1992,01,13,18,23,23)) do
84
- widget.default_range.first.should == Time.utc(1992,1,12,19,00,00)
85
- widget.default_range.last.should == Time.utc(1992,1,13,18,59,59)
86
- end
87
- end
88
-
89
- it "should generate a default range for hourly graphs" do
90
- widget = FnordMetric::Widget.new(:tick => 1.hour)
91
- Delorean.time_travel_to(Time.utc(1992,01,13,18,23,23)) do
92
- widget.ticks.length.should == 24
93
- widget.ticks.first.first.utc.should == Time.utc(1992,1,12,19,00,00)
94
- widget.ticks.first.last.utc.should == Time.utc(1992,1,12,20,00,00)
95
- widget.ticks.last.first.utc.should == Time.utc(1992,1,13,18,0,0)
96
- widget.ticks.last.last.utc.should == Time.utc(1992,1,13,19,00,00)
99
+ Time.at(widget.ticks[0]).should == Time.utc(1992,01,12,19,00)
100
+ Time.at(widget.ticks[1]).should == Time.utc(1992,01,12,20,00)
101
+ Time.at(widget.ticks[-1]).should == Time.utc(1992,01,13,19,00)
102
+ Time.at(widget.ticks[-2]).should == Time.utc(1992,01,13,18,00)
97
103
  end
98
104
  end
99
105
 
100
106
  private
101
-
107
+
102
108
  def ranges_should_match!(a, b)
103
109
  (a.first.to_i - b.first.to_i).should == 0
104
110
  (a.last.to_i - b.last.to_i).should == 0
@@ -0,0 +1,37 @@
1
+ require ::File.expand_path('../spec_helper.rb', __FILE__)
2
+
3
+ describe FnordMetric::Worker do
4
+
5
+ before(:each) do
6
+ @worker = FnordMetric::Worker.new(
7
+ { :fnordpsace => proc{} },
8
+ :redis_prefix => "fnordmetric"
9
+ )
10
+ end
11
+
12
+ it "should generate the correct pubsub-key" do
13
+ @worker.pubsub_key.should == "fnordmetric-announce"
14
+ end
15
+
16
+ it "should generate the correct queue-key" do
17
+ @worker.queue_key.should == "fnordmetric-queue"
18
+ end
19
+
20
+ it "should generate the correct event-key" do
21
+ @worker.event_key("myevent").should == "fnordmetric-event-myevent"
22
+ end
23
+
24
+ it "should generate the correct stats-key" do
25
+ @worker.stats_key.should == "fnordmetric-stats"
26
+ end
27
+
28
+ it "should add a namespace"
29
+ it "should add a namespace and pass options"
30
+ it "should add a namespace and the key"
31
+ it "should add a namespace and instance_eval the block"
32
+
33
+ it "should find a namespace by key"
34
+ it "should find the namespace default namespace without key"
35
+
36
+ end
37
+
data/test_stream.sh ADDED
@@ -0,0 +1,187 @@
1
+ #!/bin/sh
2
+
3
+ if [ "$1" != "stream" ]
4
+ then
5
+ if [ "$2" != "" ]
6
+ then
7
+ sh $0 stream | nc $1 $2
8
+ else
9
+ echo "usage: $0 host port"
10
+ exit
11
+ fi
12
+ else
13
+ while true; do
14
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
15
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
16
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
17
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
18
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
19
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
20
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
21
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
22
+ echo "{\"_type\": \"foobar\", \"_session\": \"cnhsdgas6456\"}"
23
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
24
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
25
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
26
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
27
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
28
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
29
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
30
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
31
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
32
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
33
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
34
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
35
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
36
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
37
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
38
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
39
+ echo "{\"_type\": \"foobar\", \"_session\": \"cnhsdgas6456\"}"
40
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
41
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
42
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
43
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
44
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
45
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
46
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
47
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
48
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
49
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
50
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
51
+ echo "{\"_type\": \"foobar\", \"_session\": \"cnhsdgas6456\"}"
52
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
53
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
54
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
55
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
56
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
57
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
58
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
59
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
60
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
61
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
62
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
63
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
64
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
65
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
66
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
67
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
68
+ echo "{\"_type\": \"foobar\", \"_session\": \"cnhsdgas6456\"}"
69
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
70
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
71
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
72
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
73
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
74
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
75
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
76
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
77
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
78
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
79
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
80
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
81
+ echo "{\"_type\": \"foobar\", \"_session\": \"cnhsdgas6456\"}"
82
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
83
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
84
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
85
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
86
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
87
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
88
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
89
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
90
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
91
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
92
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
93
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
94
+ echo "{\"_type\": \"foobar\", \"_session\": \"cnhsdgas6456\"}"
95
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
96
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
97
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
98
+ sleep 0.06
99
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
100
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
101
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
102
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
103
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
104
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
105
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
106
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
107
+ echo "{\"_type\": \"foobar\", \"_session\": \"cnhsdgas6456\"}"
108
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
109
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
110
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
111
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
112
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
113
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
114
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
115
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
116
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
117
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
118
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
119
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
120
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
121
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
122
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
123
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
124
+ echo "{\"_type\": \"foobar\", \"_session\": \"cnhsdgas6456\"}"
125
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
126
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
127
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
128
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
129
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
130
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
131
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
132
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
133
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
134
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
135
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
136
+ echo "{\"_type\": \"foobar\", \"_session\": \"cnhsdgas6456\"}"
137
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
138
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
139
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
140
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
141
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
142
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
143
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
144
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
145
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
146
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
147
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
148
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
149
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
150
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
151
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
152
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
153
+ echo "{\"_type\": \"foobar\", \"_session\": \"cnhsdgas6456\"}"
154
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
155
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
156
+ echo "{\"_type\": \"foobar\", \"_session\": \"43sdf5435syf\"}"
157
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
158
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
159
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
160
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
161
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
162
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
163
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
164
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
165
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
166
+ echo "{\"_type\": \"foobar\", \"_session\": \"cnhsdgas6456\"}"
167
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
168
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
169
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
170
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
171
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
172
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
173
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
174
+ echo "{\"_type\": \"foobar\", \"_session\": \"hgfhw3ydgfsd\"}"
175
+ echo "{\"_type\": \"foobar\", \"_session\": \"wurfhjfghfgh\"}"
176
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
177
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
178
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
179
+ echo "{\"_type\": \"foobar\", \"_session\": \"cnhsdgas6456\"}"
180
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
181
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
182
+ echo "{\"_type\": \"foobar\", \"_session\": \"fghfgh7asdfa\"}"
183
+
184
+ sleep 0.15
185
+ done
186
+ fi
187
+