logstash-core 2.4.1-java → 5.0.0.alpha1-java

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of logstash-core might be problematic. Click here for more details.

Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/lib/logstash-core/version.rb +1 -1
  3. data/lib/logstash/agent.rb +124 -411
  4. data/lib/logstash/api/init.ru +31 -0
  5. data/lib/logstash/api/lib/app.rb +40 -0
  6. data/lib/logstash/api/lib/app/command.rb +29 -0
  7. data/lib/logstash/api/lib/app/command_factory.rb +29 -0
  8. data/lib/logstash/api/lib/app/commands/stats/events_command.rb +13 -0
  9. data/lib/logstash/api/lib/app/commands/stats/hotthreads_command.rb +120 -0
  10. data/lib/logstash/api/lib/app/commands/stats/memory_command.rb +25 -0
  11. data/lib/logstash/api/lib/app/commands/system/basicinfo_command.rb +15 -0
  12. data/lib/logstash/api/lib/app/commands/system/plugins_command.rb +28 -0
  13. data/lib/logstash/api/lib/app/modules/node.rb +25 -0
  14. data/lib/logstash/api/lib/app/modules/node_stats.rb +51 -0
  15. data/lib/logstash/api/lib/app/modules/plugins.rb +15 -0
  16. data/lib/logstash/api/lib/app/modules/stats.rb +21 -0
  17. data/lib/logstash/api/lib/app/root.rb +13 -0
  18. data/lib/logstash/api/lib/app/service.rb +61 -0
  19. data/lib/logstash/api/lib/app/stats.rb +56 -0
  20. data/lib/logstash/api/lib/helpers/app_helpers.rb +23 -0
  21. data/lib/logstash/codecs/base.rb +1 -29
  22. data/lib/logstash/config/config_ast.rb +18 -31
  23. data/lib/logstash/config/loader.rb +3 -5
  24. data/lib/logstash/config/mixin.rb +25 -64
  25. data/lib/logstash/filter_delegator.rb +65 -0
  26. data/lib/logstash/inputs/base.rb +1 -1
  27. data/lib/logstash/inputs/metrics.rb +47 -0
  28. data/lib/logstash/instrument/collector.rb +109 -0
  29. data/lib/logstash/instrument/metric.rb +102 -0
  30. data/lib/logstash/instrument/metric_store.rb +228 -0
  31. data/lib/logstash/instrument/metric_type.rb +24 -0
  32. data/lib/logstash/instrument/metric_type/base.rb +35 -0
  33. data/lib/logstash/instrument/metric_type/counter.rb +29 -0
  34. data/lib/logstash/instrument/metric_type/gauge.rb +22 -0
  35. data/lib/logstash/instrument/metric_type/mean.rb +33 -0
  36. data/lib/logstash/instrument/namespaced_metric.rb +54 -0
  37. data/lib/logstash/instrument/null_metric.rb +4 -3
  38. data/lib/logstash/instrument/periodic_poller/base.rb +57 -0
  39. data/lib/logstash/instrument/periodic_poller/jvm.rb +92 -0
  40. data/lib/logstash/instrument/periodic_poller/os.rb +13 -0
  41. data/lib/logstash/instrument/periodic_poller/periodic_poller_observer.rb +19 -0
  42. data/lib/logstash/instrument/periodic_pollers.rb +26 -0
  43. data/lib/logstash/instrument/snapshot.rb +16 -0
  44. data/lib/logstash/json.rb +2 -3
  45. data/lib/logstash/namespace.rb +1 -0
  46. data/lib/logstash/output_delegator.rb +16 -3
  47. data/lib/logstash/outputs/base.rb +1 -32
  48. data/lib/logstash/pipeline.rb +67 -8
  49. data/lib/logstash/plugin.rb +57 -19
  50. data/lib/logstash/runner.rb +348 -84
  51. data/lib/logstash/util.rb +9 -0
  52. data/lib/logstash/util/duration_formatter.rb +15 -0
  53. data/lib/logstash/util/java_version.rb +2 -4
  54. data/lib/logstash/util/loggable.rb +29 -0
  55. data/lib/logstash/version.rb +1 -1
  56. data/lib/logstash/webserver.rb +98 -0
  57. data/locales/en.yml +42 -24
  58. data/logstash-core.gemspec +9 -6
  59. data/spec/api/lib/api/node_spec.rb +64 -0
  60. data/spec/api/lib/api/node_stats_spec.rb +68 -0
  61. data/spec/api/lib/api/plugins_spec.rb +57 -0
  62. data/spec/api/lib/api/root_spec.rb +20 -0
  63. data/spec/api/lib/api/stats_spec.rb +19 -0
  64. data/spec/api/lib/commands/events_spec.rb +17 -0
  65. data/spec/api/lib/commands/jvm_spec.rb +45 -0
  66. data/spec/api/spec_helper.rb +128 -0
  67. data/spec/logstash/agent_spec.rb +62 -169
  68. data/spec/logstash/config/config_ast_spec.rb +2 -47
  69. data/spec/logstash/config/mixin_spec.rb +0 -157
  70. data/spec/logstash/filter_delegator_spec.rb +143 -0
  71. data/spec/logstash/inputs/metrics_spec.rb +52 -0
  72. data/spec/logstash/instrument/collector_spec.rb +49 -0
  73. data/spec/logstash/instrument/metric_spec.rb +110 -0
  74. data/spec/logstash/instrument/metric_store_spec.rb +163 -0
  75. data/spec/logstash/instrument/metric_type/counter_spec.rb +40 -0
  76. data/spec/logstash/instrument/metric_type/gauge_spec.rb +40 -0
  77. data/spec/logstash/instrument/namespaced_metric_spec.rb +25 -0
  78. data/spec/logstash/instrument/null_metric_spec.rb +9 -51
  79. data/spec/logstash/json_spec.rb +14 -0
  80. data/spec/logstash/output_delegator_spec.rb +6 -3
  81. data/spec/logstash/outputs/base_spec.rb +0 -107
  82. data/spec/logstash/pipeline_spec.rb +204 -33
  83. data/spec/logstash/plugin_spec.rb +80 -15
  84. data/spec/logstash/runner_spec.rb +134 -38
  85. data/spec/logstash/shutdown_watcher_spec.rb +0 -1
  86. data/spec/logstash/util/duration_formatter_spec.rb +11 -0
  87. data/spec/logstash/util/java_version_spec.rb +10 -2
  88. data/spec/logstash/util_spec.rb +28 -0
  89. data/spec/support/matchers.rb +30 -0
  90. metadata +154 -20
  91. data/lib/logstash/logging/json.rb +0 -21
  92. data/lib/logstash/special_agent.rb +0 -8
  93. data/lib/logstash/util/safe_uri.rb +0 -50
  94. data/spec/logstash/codecs/base_spec.rb +0 -74
  95. data/spec/static/i18n_spec.rb +0 -25
@@ -0,0 +1,110 @@
1
+ # encoding: utf-8
2
+ require "logstash/instrument/metric"
3
+ require "logstash/instrument/collector"
4
+ require_relative "../../support/matchers"
5
+ require "spec_helper"
6
+
7
+ describe LogStash::Instrument::Metric do
8
+ let(:collector) { [] }
9
+ let(:namespace) { :root }
10
+
11
+ subject { LogStash::Instrument::Metric.new(collector) }
12
+
13
+ context "#increment" do
14
+ it "a counter by 1" do
15
+ metric = subject.increment(:root, :error_rate)
16
+ expect(collector).to be_a_metric_event([:root, :error_rate], :counter, :increment, 1)
17
+ end
18
+
19
+ it "a counter by a provided value" do
20
+ metric = subject.increment(:root, :error_rate, 20)
21
+ expect(collector).to be_a_metric_event([:root, :error_rate], :counter, :increment, 20)
22
+ end
23
+
24
+ it "raises an exception if the key is an empty string" do
25
+ expect { subject.increment(:root, "", 20) }.to raise_error(LogStash::Instrument::MetricNoKeyProvided)
26
+ end
27
+
28
+ it "raise an exception if the key is nil" do
29
+ expect { subject.increment(:root, nil, 20) }.to raise_error(LogStash::Instrument::MetricNoKeyProvided)
30
+ end
31
+ end
32
+
33
+ context "#decrement" do
34
+ it "a counter by 1" do
35
+ metric = subject.decrement(:root, :error_rate)
36
+ expect(collector).to be_a_metric_event([:root, :error_rate], :counter, :decrement, 1)
37
+ end
38
+
39
+ it "a counter by a provided value" do
40
+ metric = subject.decrement(:root, :error_rate, 20)
41
+ expect(collector).to be_a_metric_event([:root, :error_rate], :counter, :decrement, 20)
42
+ end
43
+
44
+ it "raises an exception if the key is an empty string" do
45
+ expect { subject.decrement(:root, "", 20) }.to raise_error(LogStash::Instrument::MetricNoKeyProvided)
46
+ end
47
+
48
+ it "raise an exception if the key is nil" do
49
+ expect { subject.decrement(:root, nil, 20) }.to raise_error(LogStash::Instrument::MetricNoKeyProvided)
50
+ end
51
+ end
52
+
53
+ context "#gauge" do
54
+ it "set the value of a key" do
55
+ metric = subject.gauge(:root, :size_queue, 20)
56
+ expect(collector).to be_a_metric_event([:root, :size_queue], :gauge, :set, 20)
57
+ end
58
+
59
+ it "raises an exception if the key is an empty string" do
60
+ expect { subject.gauge(:root, "", 20) }.to raise_error(LogStash::Instrument::MetricNoKeyProvided)
61
+ end
62
+
63
+ it "raise an exception if the key is nil" do
64
+ expect { subject.gauge(:root, nil, 20) }.to raise_error(LogStash::Instrument::MetricNoKeyProvided)
65
+ end
66
+ end
67
+
68
+ context "#time" do
69
+ let(:sleep_time) { 2 }
70
+ let(:sleep_time_ms) { sleep_time * 1_000_000 }
71
+
72
+ it "records the duration" do
73
+ subject.time(:root, :duration_ms) { sleep(sleep_time) }
74
+
75
+ expect(collector.last).to be_within(sleep_time_ms).of(sleep_time_ms + 5000)
76
+ expect(collector[0]).to match(:root)
77
+ expect(collector[1]).to be(:duration_ms)
78
+ expect(collector[2]).to be(:mean)
79
+ end
80
+
81
+ it "returns the value of the executed block" do
82
+ expect(subject.time(:root, :testing) { "hello" }).to eq("hello")
83
+ end
84
+
85
+ it "return a TimedExecution" do
86
+ execution = subject.time(:root, :duration_ms)
87
+ sleep(sleep_time)
88
+ execution.stop
89
+
90
+ expect(collector.last).to be_within(sleep_time_ms).of(sleep_time_ms + 0.1)
91
+ expect(collector[0]).to match(:root)
92
+ expect(collector[1]).to be(:duration_ms)
93
+ expect(collector[2]).to be(:mean)
94
+ end
95
+ end
96
+
97
+ context "#namespace" do
98
+ let(:sub_key) { :my_sub_key }
99
+
100
+ it "creates a new metric object and append the `sub_key` to the `base_key`" do
101
+ expect(subject.namespace(sub_key).namespace_name).to eq([sub_key])
102
+ end
103
+
104
+ it "uses the same collector as the creator class" do
105
+ child = subject.namespace(sub_key)
106
+ metric = child.increment(:error_rate)
107
+ expect(collector).to be_a_metric_event([sub_key, :error_rate], :counter, :increment, 1)
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,163 @@
1
+ # encoding: utf-8
2
+ require "logstash/instrument/metric_store"
3
+ require "logstash/instrument/metric_type/base"
4
+
5
+ describe LogStash::Instrument::MetricStore do
6
+ let(:namespaces) { [ :root, :pipelines, :pipeline_01 ] }
7
+ let(:key) { :events_in }
8
+ let(:counter) { LogStash::Instrument::MetricType::Counter.new(namespaces, key) }
9
+
10
+ context "when the metric object doesn't exist" do
11
+ it "store the object" do
12
+ expect(subject.fetch_or_store(namespaces, key, counter)).to eq(counter)
13
+ end
14
+
15
+ it "support a block as argument" do
16
+ expect(subject.fetch_or_store(namespaces, key) { counter }).to eq(counter)
17
+ end
18
+ end
19
+
20
+ context "when the metric object exist in the namespace" do
21
+ let(:new_counter) { LogStash::Instrument::MetricType::Counter.new(namespaces, key) }
22
+
23
+ it "return the object" do
24
+ subject.fetch_or_store(namespaces, key, counter)
25
+ expect(subject.fetch_or_store(namespaces, key, new_counter)).to eq(counter)
26
+ end
27
+ end
28
+
29
+ context "when the namespace end node isn't a map" do
30
+ let(:conflicting_namespaces) { [:root, :pipelines, :pipeline_01, :events_in] }
31
+
32
+ it "raise an exception" do
33
+ subject.fetch_or_store(namespaces, key, counter)
34
+ expect { subject.fetch_or_store(conflicting_namespaces, :new_key, counter) }.to raise_error(LogStash::Instrument::MetricStore::NamespacesExpectedError)
35
+ end
36
+ end
37
+
38
+ context "retrieving events" do
39
+ let(:metric_events) {
40
+ [
41
+ [[:node, :sashimi, :pipelines, :pipeline01, :plugins, :"logstash-output-elasticsearch"], :event_in, :increment],
42
+ [[:node, :sashimi, :pipelines, :pipeline01], :processed_events_in, :increment],
43
+ [[:node, :sashimi, :pipelines, :pipeline01], :processed_events_out, :increment],
44
+ [[:node, :sashimi, :pipelines, :pipeline02], :processed_events_out, :increment],
45
+ ]
46
+ }
47
+
48
+ before :each do
49
+ # Lets add a few metrics in the store before trying to find them
50
+ metric_events.each do |namespaces, metric_key, action|
51
+ metric = subject.fetch_or_store(namespaces, metric_key, LogStash::Instrument::MetricType::Counter.new(namespaces, metric_key))
52
+ metric.execute(action)
53
+ end
54
+ end
55
+
56
+ describe "#get" do
57
+ context "when the path exist" do
58
+ it "retrieves end of of a branch" do
59
+ metrics = subject.get(:node, :sashimi, :pipelines, :pipeline01, :plugins, :"logstash-output-elasticsearch")
60
+ expect(metrics).to match(a_hash_including(:node => a_hash_including(:sashimi => a_hash_including(:pipelines => a_hash_including(:pipeline01 => a_hash_including(:plugins => a_hash_including(:"logstash-output-elasticsearch" => anything)))))))
61
+ end
62
+
63
+ it "retrieves branch" do
64
+ metrics = subject.get(:node, :sashimi, :pipelines, :pipeline01)
65
+ expect(metrics).to match(a_hash_including(:node => a_hash_including(:sashimi => a_hash_including(:pipelines => a_hash_including(:pipeline01 => anything)))))
66
+ end
67
+
68
+ it "allow to retrieve a specific metrics" do
69
+ metrics = subject.get(:node, :sashimi, :pipelines, :pipeline01, :plugins, :"logstash-output-elasticsearch", :event_in)
70
+ expect(metrics).to match(a_hash_including(:node => a_hash_including(:sashimi => a_hash_including(:pipelines => a_hash_including(:pipeline01 => a_hash_including(:plugins => a_hash_including(:"logstash-output-elasticsearch" => a_hash_including(:event_in => be_kind_of(LogStash::Instrument::MetricType::Base)))))))))
71
+ end
72
+
73
+ context "with filtered keys" do
74
+ it "allows to retrieve multiple keys on the same level" do
75
+ metrics = subject.get(:node, :sashimi, :pipelines, :"pipeline01,pipeline02")
76
+ expect(metrics).to match(a_hash_including(:node => a_hash_including(:sashimi => a_hash_including(:pipelines => a_hash_including(:pipeline01 => anything, :pipeline02 => anything)))))
77
+ end
78
+
79
+ it "supports space in the keys" do
80
+ metrics = subject.get(:node, :sashimi, :pipelines, :"pipeline01, pipeline02 ")
81
+ expect(metrics).to match(a_hash_including(:node => a_hash_including(:sashimi => a_hash_including(:pipelines => a_hash_including(:pipeline01 => anything, :pipeline02 => anything)))))
82
+ end
83
+
84
+ it "retrieves only the requested keys" do
85
+ metrics = subject.get(:node, :sashimi, :pipelines, :"pipeline01,pipeline02", :processed_events_in)
86
+ expect(metrics[:node][:sashimi][:pipelines].keys).to include(:pipeline01, :pipeline02)
87
+ end
88
+ end
89
+
90
+ context "when the path doesnt exist" do
91
+ it "raise an exception" do
92
+ expect { subject.get(:node, :sashimi, :dontexist) }.to raise_error(LogStash::Instrument::MetricStore::MetricNotFound, /dontexist/)
93
+ end
94
+ end
95
+ end
96
+
97
+ describe "#get_with_path" do
98
+ context "when the path exist" do
99
+ it "removes the first `/`" do
100
+ metrics = subject.get_with_path("/node/sashimi/")
101
+ expect(metrics).to match(a_hash_including(:node => a_hash_including(:sashimi => anything)))
102
+ end
103
+
104
+ it "retrieves end of of a branch" do
105
+ metrics = subject.get_with_path("node/sashimi/pipelines/pipeline01/plugins/logstash-output-elasticsearch")
106
+ expect(metrics).to match(a_hash_including(:node => a_hash_including(:sashimi => a_hash_including(:pipelines => a_hash_including(:pipeline01 => a_hash_including(:plugins => a_hash_including(:"logstash-output-elasticsearch" => anything)))))))
107
+ end
108
+
109
+ it "retrieves branch" do
110
+ metrics = subject.get_with_path("node/sashimi/pipelines/pipeline01")
111
+ expect(metrics).to match(a_hash_including(:node => a_hash_including(:sashimi => a_hash_including(:pipelines => a_hash_including(:pipeline01 => anything)))))
112
+ end
113
+
114
+ it "allow to retrieve a specific metrics" do
115
+ metrics = subject.get_with_path("node/sashimi/pipelines/pipeline01/plugins/logstash-output-elasticsearch/event_in")
116
+ expect(metrics).to match(a_hash_including(:node => a_hash_including(:sashimi => a_hash_including(:pipelines => a_hash_including(:pipeline01 => a_hash_including(:plugins => a_hash_including(:"logstash-output-elasticsearch" => a_hash_including(:event_in => be_kind_of(LogStash::Instrument::MetricType::Base)))))))))
117
+ end
118
+
119
+ context "with filtered keys" do
120
+ it "allows to retrieve multiple keys on the same level" do
121
+ metrics = subject.get_with_path("node/sashimi/pipelines/pipeline01,pipeline02/plugins/logstash-output-elasticsearch/event_in")
122
+ expect(metrics).to match(a_hash_including(:node => a_hash_including(:sashimi => a_hash_including(:pipelines => a_hash_including(:pipeline01 => anything, :pipeline02 => anything)))))
123
+ end
124
+
125
+ it "supports space in the keys" do
126
+ metrics = subject.get_with_path("node/sashimi/pipelines/pipeline01, pipeline02 /plugins/logstash-output-elasticsearch/event_in")
127
+ expect(metrics).to match(a_hash_including(:node => a_hash_including(:sashimi => a_hash_including(:pipelines => a_hash_including(:pipeline01 => anything, :pipeline02 => anything)))))
128
+ end
129
+
130
+ it "retrieves only the requested keys" do
131
+ metrics = subject.get(:node, :sashimi, :pipelines, :"pipeline01,pipeline02", :processed_events_in)
132
+ expect(metrics[:node][:sashimi][:pipelines].keys).to include(:pipeline01, :pipeline02)
133
+ end
134
+ end
135
+ end
136
+ end
137
+
138
+ context "when the path doesnt exist" do
139
+ it "raise an exception" do
140
+ expect { subject.get_with_path("node/sashimi/dontexist, pipeline02 /plugins/logstash-output-elasticsearch/event_in") }.to raise_error(LogStash::Instrument::MetricStore::MetricNotFound, /dontexist/)
141
+ end
142
+ end
143
+ end
144
+
145
+ describe "#each" do
146
+ it "retrieves all the metric" do
147
+ expect(subject.each.size).to eq(metric_events.size)
148
+ end
149
+
150
+ it "returns metric types" do
151
+ metrics = []
152
+ subject.each { |i| metrics << i }
153
+ expect(metrics.size).to eq(metric_events.size)
154
+ end
155
+
156
+ it "retrieves all the metrics from a specific branch" do
157
+ metrics = []
158
+ subject.each("node/sashimi/pipelines/pipeline01") { |i| metrics << i }
159
+ expect(metrics.size).to eq(3)
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+ require "logstash/instrument/metric_type/counter"
3
+ require "spec_helper"
4
+
5
+ describe LogStash::Instrument::MetricType::Counter do
6
+ let(:namespaces) { [:root, :pipelines, :pipeline_01] }
7
+ let(:key) { :mykey }
8
+
9
+ subject { LogStash::Instrument::MetricType::Counter.new(namespaces, key) }
10
+
11
+ describe "#increment" do
12
+ it "increment the counter" do
13
+ expect{ subject.increment }.to change { subject.value }.by(1)
14
+ end
15
+ end
16
+
17
+ describe "#decrement" do
18
+ it "decrement the counter" do
19
+ expect{ subject.decrement }.to change { subject.value }.by(-1)
20
+ end
21
+ end
22
+
23
+ context "When serializing to JSON" do
24
+ it "serializes the value" do
25
+ expect(LogStash::Json.dump(subject)).to eq("0")
26
+ end
27
+ end
28
+
29
+ context "When creating a hash " do
30
+ it "creates the hash from all the values" do
31
+ metric_hash = {
32
+ "key" => key,
33
+ "namespaces" => namespaces,
34
+ "value" => 0,
35
+ "type" => "counter"
36
+ }
37
+ expect(subject.to_hash).to match(metric_hash)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+ require "logstash/instrument/metric_type/gauge"
3
+ require "logstash/json"
4
+ require "spec_helper"
5
+
6
+ describe LogStash::Instrument::MetricType::Gauge do
7
+ let(:namespaces) { [:root, :pipelines, :pipeline_01] }
8
+ let(:key) { :mykey }
9
+ let(:value) { "hello" }
10
+
11
+ subject { described_class.new(namespaces, key) }
12
+
13
+ before :each do
14
+ subject.execute(:set, value)
15
+ end
16
+
17
+ describe "#execute" do
18
+ it "set the value of the gauge" do
19
+ expect(subject.value).to eq(value)
20
+ end
21
+ end
22
+
23
+ context "When serializing to JSON" do
24
+ it "serializes the value" do
25
+ expect(LogStash::Json.dump(subject)).to eq("\"#{value}\"")
26
+ end
27
+ end
28
+
29
+ context "When creating a hash " do
30
+ it "creates the hash from all the values" do
31
+ metric_hash = {
32
+ "key" => key,
33
+ "namespaces" => namespaces,
34
+ "value" => value,
35
+ "type" => "gauge"
36
+ }
37
+ expect(subject.to_hash).to match(metric_hash)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,25 @@
1
+ # encoding: utf-8
2
+ require "logstash/instrument/namespaced_metric"
3
+ require "logstash/instrument/metric"
4
+ require_relative "../../support/matchers"
5
+ require "spec_helper"
6
+
7
+ describe LogStash::Instrument::NamespacedMetric do
8
+ let(:namespace) { :stats }
9
+ let(:collector) { [] }
10
+ let(:metric) { LogStash::Instrument::Metric.new(collector) }
11
+
12
+ subject { described_class.new(metric, namespace) }
13
+
14
+ it "defines the same interface as `Metric`" do
15
+ expect(described_class).to implement_interface_of(LogStash::Instrument::Metric)
16
+ end
17
+
18
+ it "returns a TimedException when we call without a block" do
19
+ expect(subject.time(:duration_ms)).to be_kind_of(LogStash::Instrument::Metric::TimedExecution)
20
+ end
21
+
22
+ it "returns the value of the block" do
23
+ expect(subject.time(:duration_ms) { "hello" }).to eq("hello")
24
+ end
25
+ end
@@ -1,63 +1,21 @@
1
1
  # encoding: utf-8
2
2
  require "logstash/instrument/null_metric"
3
+ require "logstash/instrument/namespaced_metric"
4
+ require_relative "../../support/matchers"
3
5
 
4
6
  describe LogStash::Instrument::NullMetric do
5
- let(:key) { "galaxy" }
6
-
7
- describe "#increment" do
8
- it "allows to increment a key with no amount" do
9
- expect { subject.increment(key, 100) }.not_to raise_error
10
- end
11
-
12
- it "allow to increment a key" do
13
- expect { subject.increment(key) }.not_to raise_error
14
- end
15
- end
16
-
17
- describe "#decrement" do
18
- it "allows to decrement a key with no amount" do
19
- expect { subject.decrement(key, 100) }.not_to raise_error
20
- end
21
-
22
- it "allow to decrement a key" do
23
- expect { subject.decrement(key) }.not_to raise_error
24
- end
25
- end
26
-
27
- describe "#gauge" do
28
- it "allows to set a value" do
29
- expect { subject.gauge(key, "pluto") }.not_to raise_error
30
- end
31
- end
32
-
33
- describe "#report_time" do
34
- it "allow to record time" do
35
- expect { subject.report_time(key, 1000) }.not_to raise_error
36
- end
7
+ it "defines the same interface as `Metric`" do
8
+ expect(described_class).to implement_interface_of(LogStash::Instrument::NamespacedMetric)
37
9
  end
38
10
 
39
11
  describe "#time" do
40
- it "allow to record time with a block given" do
41
- expect do
42
- subject.time(key) { 1+1 }
43
- end.not_to raise_error
12
+ it "returns the value of the block without recording any metrics" do
13
+ expect(subject.time(:execution_time) { "hello" }).to eq("hello")
44
14
  end
45
15
 
46
- it "when using a block it return the generated value" do
47
- expect(subject.time(key) { 1+1 }).to eq(2)
48
- end
49
-
50
- it "allow to record time with no block given" do
51
- expect do
52
- clock = subject.time(key)
53
- clock.stop
54
- end.not_to raise_error
55
- end
56
- end
57
-
58
- describe "#namespace" do
59
- it "return a NullMetric" do
60
- expect(subject.namespace(key)).to be_kind_of LogStash::Instrument::NullMetric
16
+ it "return a TimedExecution" do
17
+ execution = subject.time(:do_something)
18
+ expect { execution.stop }.not_to raise_error
61
19
  end
62
20
  end
63
21
  end