loggregator_emitter 5.0.1 → 5.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0d1ef9bf97fbc5930c29130a377344fa40b1264b
4
- data.tar.gz: 9fd666bb99d2120fa012cb2f372e17a8f335de35
3
+ metadata.gz: ce623535025497b97a8f11adcae61e83d3da8f97
4
+ data.tar.gz: edaff20710aef2d52d43ea383c808cbd21f86349
5
5
  SHA512:
6
- metadata.gz: 800c01ae3b281d7738fac0c5473a3f28a15d9a7c9cf4a52a6b2d4381888e116c4532c1ea9786e1e02cc52f421e24a282ebcba8b29755dd426e232ed9c83da7e6
7
- data.tar.gz: 80df9ff95e024d76be537843d3c70cf725b8366ca6c64ff02a5396ab698bc8385a1e571c11724d8790c1d6cef47af21b4ef6c1eef8151f8708c90bad0059f0fa
6
+ metadata.gz: 2a19fe40d7843694e3e12c35e0928355ab56f83703838766460ec573533980445a4e4270e2db5e0f81e07ec64091b6572d1f2d84fafdde868b5f98c233b607df
7
+ data.tar.gz: c037d51137815da7e2c1d6b0a541d9c5f1ef4524b35d87df326dbe578c96aeb7f47dd88ea78f4fda86aa3a17ed66a8898ae352f44c6883e9323f8d9709b4fd39
@@ -1,10 +1,15 @@
1
1
  notifications:
2
2
  email:
3
3
  - cf-loggregator@pivotallabs.com
4
+
5
+ sudo: required
6
+ dist: precise
7
+ group: legacy
4
8
  language: ruby
9
+
5
10
  rvm:
6
- - 1.9.3
7
11
  - 2.0.0
12
+ - 2.3.0
8
13
  script:
9
14
  - bundle exec rake nonperformance
10
15
  - DISABLE_COVERAGE=true bundle exec rake performance
data/README.md CHANGED
@@ -12,12 +12,12 @@ Call emit() or emit_error() on this emitter with the application GUID and the me
12
12
 
13
13
  ##### A valid source name is any 3 character string. Some common component sources are:
14
14
 
15
- API (Cloud Controller)
16
- RTR (Go Router)
17
- UAA
18
- DEA
19
- APP (Warden container)
20
- LGR (Loggregator)
15
+ API (Cloud Controller)
16
+ RTR (Go Router)
17
+ UAA
18
+ DEA
19
+ APP (Warden container)
20
+ LGR (Loggregator)
21
21
 
22
22
  ### Setup
23
23
 
@@ -33,9 +33,11 @@ Call emit() or emit_error() on this emitter with the application GUID and the me
33
33
 
34
34
  app_guid = "a8977cb6-3365-4be1-907e-0c878b3a4c6b" # The GUID(UUID) for the user's application
35
35
 
36
- emitter.emit(app_guid,message) # Emits messages with a message type of OUT
36
+ emitter.emit(app_guid, message) # Emits messages with a message type of OUT
37
37
 
38
- emitter.emit_error(app_guid,error_message) # Emits messages with a message type of ERR
38
+ emitter.emit(app_guid, message, {"key" => "value"}) # Emits messages with tags
39
+
40
+ emitter.emit_error(app_guid, error_message) # Emits messages with a message type of ERR
39
41
 
40
42
  ### Regenerating Protobuf library
41
43
 
@@ -16,7 +16,7 @@ module LoggregatorEmitter
16
16
  @host, @port = loggregator_server.split(/:([^:]*$)/)
17
17
 
18
18
  raise ArgumentError, "Must provide valid loggregator server: #{loggregator_server}" if !valid_hostname || !valid_port
19
- @host = ::Resolv.getaddresses(@host).last
19
+ @host = ::Resolv.getaddresses(@host).first
20
20
  raise ArgumentError, "Must provide valid loggregator server: #{loggregator_server}" unless @host
21
21
 
22
22
  raise ArgumentError, "Must provide a valid origin" unless origin
@@ -30,12 +30,30 @@ module LoggregatorEmitter
30
30
  @source_instance = source_instance && source_instance.to_s
31
31
  end
32
32
 
33
- def emit(app_id, message)
34
- emit_message(app_id, message, LogMessage::MessageType::OUT)
33
+ def emit(app_id, message, tags = nil)
34
+ emit_message(app_id, message, LogMessage::MessageType::OUT, tags)
35
35
  end
36
36
 
37
- def emit_error(app_id, message)
38
- emit_message(app_id, message, LogMessage::MessageType::ERR)
37
+ def emit_error(app_id, message, tags = nil)
38
+ emit_message(app_id, message, LogMessage::MessageType::ERR, tags)
39
+ end
40
+
41
+ def emit_value_metric(name, value, unit, tags = nil)
42
+ return unless name && value && unit
43
+
44
+ send_protobuffer(create_value_metric_envelope(name, value, unit, tags))
45
+ end
46
+
47
+ def emit_counter(name, delta, tags = nil)
48
+ return unless name && delta
49
+
50
+ send_protobuffer(create_counter_envelope(name, delta, tags))
51
+ end
52
+
53
+ def emit_container_metric(app_id, instanceIndex, cpu, memory, disk, tags = nil)
54
+ return unless app_id && instanceIndex && cpu && memory && disk
55
+
56
+ send_protobuffer(create_container_metric_envelope(app_id, instanceIndex, cpu, memory, disk, tags))
39
57
  end
40
58
 
41
59
  private
@@ -52,7 +70,15 @@ module LoggregatorEmitter
52
70
  message.split(/\n|\r/).reject { |a| a.empty? }
53
71
  end
54
72
 
55
- def emit_message(app_id, message, type)
73
+ def set_tags(tags)
74
+ envelope_tags = []
75
+ tags.each do |k, v|
76
+ envelope_tags << ::Sonde::Envelope::TagsEntry.new(:key => k, :value => v)
77
+ end
78
+ envelope_tags
79
+ end
80
+
81
+ def emit_message(app_id, message, type, tags = nil)
56
82
  return unless app_id && message && message.strip.length > 0
57
83
 
58
84
  split_message(message).each do |m|
@@ -60,13 +86,13 @@ module LoggregatorEmitter
60
86
  m = m.byteslice(0, MAX_MESSAGE_BYTE_SIZE-TRUNCATED_STRING.bytesize) + TRUNCATED_STRING
61
87
  end
62
88
 
63
- send_protobuffer(create_log_envelope(app_id, m, type))
89
+ send_protobuffer(create_log_envelope(app_id, m, type, tags))
64
90
  end
65
91
  end
66
92
 
67
- def create_log_message(app_id, message, type)
93
+ def create_log_message(app_id, message, type, time)
68
94
  lm = ::Sonde::LogMessage.new()
69
- lm.time = Time.now
95
+ lm.time = time
70
96
  lm.message = message
71
97
  lm.app_id = app_id
72
98
  lm.source_instance = @source_instance
@@ -75,14 +101,79 @@ module LoggregatorEmitter
75
101
  lm
76
102
  end
77
103
 
78
- def create_log_envelope(app_id, message, type)
104
+ def create_log_envelope(app_id, message, type, tags = nil)
79
105
  le = ::Sonde::Envelope.new()
80
106
  le.origin = @origin
107
+ le.time = Time.now
81
108
  le.eventType = ::Sonde::Envelope::EventType::LogMessage
82
- le.logMessage = create_log_message(app_id, message, type)
109
+ le.logMessage = create_log_message(app_id, message, type, le.time)
110
+ if tags != nil
111
+ le.tags = set_tags(tags)
112
+ end
83
113
  le
84
114
  end
85
115
 
116
+ def create_value_metric(name, value, unit)
117
+ metric = ::Sonde::ValueMetric.new()
118
+ metric.name = name
119
+ metric.value = value
120
+ metric.unit = unit
121
+ metric
122
+ end
123
+
124
+ def create_value_metric_envelope(name, value, unit, tags = nil)
125
+ envelope = ::Sonde::Envelope.new()
126
+ envelope.time = Time.now
127
+ envelope.origin = @origin
128
+ envelope.eventType = ::Sonde::Envelope::EventType::ValueMetric
129
+ envelope.valueMetric = create_value_metric(name, value, unit)
130
+ if tags != nil
131
+ envelope.tags = set_tags(tags)
132
+ end
133
+ envelope
134
+ end
135
+
136
+ def create_counter_event(name, delta)
137
+ counter = ::Sonde::CounterEvent.new()
138
+ counter.name = name
139
+ counter.delta = delta
140
+ counter
141
+ end
142
+
143
+ def create_counter_envelope(name, delta, tags = nil)
144
+ envelope = ::Sonde::Envelope.new()
145
+ envelope.time = Time.now
146
+ envelope.origin = @origin
147
+ envelope.eventType = ::Sonde::Envelope::EventType::CounterEvent
148
+ envelope.counterEvent = create_counter_event(name, delta)
149
+ if tags != nil
150
+ envelope.tags = set_tags(tags)
151
+ end
152
+ envelope
153
+ end
154
+
155
+ def create_container_metric(app_id, instanceIndex, cpu, memory, disk)
156
+ metric = ::Sonde::ContainerMetric.new()
157
+ metric.applicationId = app_id
158
+ metric.instanceIndex = instanceIndex
159
+ metric.cpuPercentage = cpu
160
+ metric.memoryBytes = memory
161
+ metric.diskBytes = disk
162
+ metric
163
+ end
164
+
165
+ def create_container_metric_envelope(app_id, instanceIndex, cpu, memory, disk, tags = nil)
166
+ envelope = ::Sonde::Envelope.new()
167
+ envelope.time = Time.now
168
+ envelope.origin = @origin
169
+ envelope.eventType = ::Sonde::Envelope::EventType::ContainerMetric
170
+ envelope.containerMetric = create_container_metric(app_id, instanceIndex, cpu, memory, disk)
171
+ if tags != nil
172
+ envelope.tags = set_tags(tags)
173
+ end
174
+ envelope
175
+ end
176
+
86
177
  def send_protobuffer(lm)
87
178
  result = lm.encode.buf
88
179
  result.unpack("C*")
@@ -7,8 +7,6 @@ module Sonde
7
7
  include Beefcake::Message
8
8
 
9
9
  module EventType
10
- HttpStart = 2
11
- HttpStop = 3
12
10
  HttpStartStop = 4
13
11
  LogMessage = 5
14
12
  ValueMetric = 6
@@ -16,9 +14,18 @@ module Sonde
16
14
  Error = 8
17
15
  ContainerMetric = 9
18
16
  end
17
+
18
+ class TagsEntry
19
+ include Beefcake::Message
20
+ end
19
21
  end
20
22
 
21
23
  class Envelope
24
+
25
+ class TagsEntry
26
+ optional :key, :string, 1
27
+ optional :value, :string, 2
28
+ end
22
29
  required :origin, :string, 1
23
30
  required :eventType, Envelope::EventType, 2
24
31
  optional :timestamp, :int64, 6
@@ -26,8 +33,7 @@ module Sonde
26
33
  optional :job, :string, 14
27
34
  optional :index, :string, 15
28
35
  optional :ip, :string, 16
29
- optional :httpStart, HttpStart, 4
30
- optional :httpStop, HttpStop, 5
36
+ repeated :tags, Envelope::TagsEntry, 17
31
37
  optional :httpStartStop, HttpStartStop, 7
32
38
  optional :logMessage, LogMessage, 8
33
39
  optional :valueMetric, ValueMetric, 9
@@ -55,42 +55,10 @@ module Sonde
55
55
  VERSION_CONTROL = 44
56
56
  end
57
57
 
58
- class HttpStart
59
- include Beefcake::Message
60
- end
61
-
62
- class HttpStop
63
- include Beefcake::Message
64
- end
65
-
66
58
  class HttpStartStop
67
59
  include Beefcake::Message
68
60
  end
69
61
 
70
- class HttpStart
71
- required :timestamp, :int64, 1
72
- required :requestId, UUID, 2
73
- required :peerType, PeerType, 3
74
- required :method, Method, 4
75
- required :uri, :string, 5
76
- required :remoteAddress, :string, 6
77
- required :userAgent, :string, 7
78
- optional :parentRequestId, UUID, 8
79
- optional :applicationId, UUID, 9
80
- optional :instanceIndex, :int32, 10
81
- optional :instanceId, :string, 11
82
- end
83
-
84
- class HttpStop
85
- required :timestamp, :int64, 1
86
- required :uri, :string, 2
87
- required :requestId, UUID, 3
88
- required :peerType, PeerType, 4
89
- required :statusCode, :int32, 5
90
- required :contentLength, :int64, 6
91
- optional :applicationId, UUID, 7
92
- end
93
-
94
62
  class HttpStartStop
95
63
  required :startTimestamp, :int64, 1
96
64
  required :stopTimestamp, :int64, 2
@@ -102,9 +70,9 @@ module Sonde
102
70
  required :userAgent, :string, 8
103
71
  required :statusCode, :int32, 9
104
72
  required :contentLength, :int64, 10
105
- optional :parentRequestId, UUID, 11
106
73
  optional :applicationId, UUID, 12
107
74
  optional :instanceIndex, :int32, 13
108
75
  optional :instanceId, :string, 14
76
+ repeated :forwarded, :string, 15
109
77
  end
110
78
  end
@@ -33,5 +33,7 @@ module Sonde
33
33
  required :cpuPercentage, :double, 3
34
34
  required :memoryBytes, :uint64, 4
35
35
  required :diskBytes, :uint64, 5
36
+ optional :memoryBytesQuota, :uint64, 6
37
+ optional :diskBytesQuota, :uint64, 7
36
38
  end
37
39
  end
@@ -14,4 +14,16 @@ module Sonde
14
14
  Time.at(num_secs, fractional_usecs)
15
15
  end
16
16
  end
17
- end
17
+
18
+ class Envelope
19
+ def time=(time)
20
+ self.timestamp = (time.tv_sec * 1000000000) + time.tv_nsec
21
+ end
22
+
23
+ def time
24
+ num_secs = @timestamp / 1000000000
25
+ fractional_usecs = (@timestamp % 1000000000).to_f / 1000
26
+ Time.at(num_secs, fractional_usecs)
27
+ end
28
+ end
29
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "loggregator_emitter"
5
- spec.version = '5.0.1'
5
+ spec.version = '5.1.1'
6
6
  spec.authors = ["Pivotal"]
7
7
  spec.email = ["cf-eng@pivotallabs.com"]
8
8
  spec.description = "Library to emit data to Loggregator"
@@ -15,12 +15,13 @@ Gem::Specification.new do |spec|
15
15
  spec.test_files = spec.files.grep(%r{^(spec)/})
16
16
  spec.require_paths = ["lib"]
17
17
 
18
- spec.required_ruby_version = Gem::Requirement.new(">= 1.9.3")
18
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.0.0")
19
19
 
20
20
  spec.add_dependency "beefcake", "~> 1.0.0"
21
21
 
22
22
  spec.add_development_dependency "bundler", "~> 1.3"
23
+ spec.add_development_dependency "coveralls", "~> 0.8", ">= 0.8.14"
23
24
  spec.add_development_dependency "rake"
24
- spec.add_development_dependency "rspec", "~> 2.14.1"
25
- spec.add_development_dependency "coveralls"
25
+ spec.add_development_dependency "rspec", "~> 2.14", ">= 2.14.1"
26
+ spec.add_development_dependency "timecop"
26
27
  end
@@ -6,7 +6,7 @@ require "loggregator_emitter"
6
6
  describe LoggregatorEmitter do
7
7
 
8
8
  before :all do
9
- @free_port = 12345
9
+ @free_port = test_port
10
10
  @server = FakeLoggregatorServer.new(@free_port)
11
11
  @server.start
12
12
  end
@@ -19,68 +19,84 @@ describe LoggregatorEmitter do
19
19
  @server.reset
20
20
  end
21
21
 
22
+ def test_port
23
+ server = TCPServer.new('localhost', 0)
24
+ server.addr[1]
25
+ end
26
+
22
27
  describe "configuring emitter" do
23
28
  describe "valid configurations" do
24
29
  it "is valid with IP and proper source name" do
25
- expect { LoggregatorEmitter::Emitter.new("0.0.0.0:12345", "origin", "DEA") }.not_to raise_error
30
+ expect { LoggregatorEmitter::Emitter.new("0.0.0.0:#{@free_port}", "origin", "DEA") }.not_to raise_error
26
31
  end
27
32
 
28
33
  it "is valid with resolveable hostname and proper source name" do
29
- expect { LoggregatorEmitter::Emitter.new("localhost:12345", "origin", "DEA") }.not_to raise_error
34
+ expect { LoggregatorEmitter::Emitter.new("localhost:#{@free_port}", "origin", "DEA") }.not_to raise_error
30
35
  end
31
36
 
32
37
  it "accepts a string as source type/name" do
33
- expect { LoggregatorEmitter::Emitter.new("localhost:12345", "origin", "STG") }.not_to raise_error
38
+ expect { LoggregatorEmitter::Emitter.new("localhost:#{@free_port}", "origin", "STG") }.not_to raise_error
34
39
  end
35
40
  end
36
41
 
37
42
  describe "invalid configurations" do
38
43
  describe "error based on loggregator_server" do
39
44
  it "raises if host has protocol" do
40
- expect { LoggregatorEmitter::Emitter.new("http://0.0.0.0:12345", "origin", "DEA") }.to raise_error(ArgumentError)
45
+ expect { LoggregatorEmitter::Emitter.new("http://0.0.0.0:#{@free_port}", "origin", "DEA") }.to raise_error(ArgumentError)
41
46
  end
42
47
 
43
48
  it "raises if host is blank" do
44
- expect { LoggregatorEmitter::Emitter.new(":12345", "origin", "DEA") }.to raise_error(ArgumentError)
49
+ expect { LoggregatorEmitter::Emitter.new(":#{@free_port}", "origin", "DEA") }.to raise_error(ArgumentError)
45
50
  end
46
51
 
47
52
  it "raises if host is unresolvable" do
48
- expect { LoggregatorEmitter::Emitter.new("i.cant.resolve.foo:12345", "origin", "DEA") }.to raise_error(ArgumentError)
53
+ expect { LoggregatorEmitter::Emitter.new("i.cant.resolve.foo:#{@free_port}", "origin", "DEA") }.to raise_error(ArgumentError)
49
54
  end
50
55
 
51
56
  it "raises if origin is blank" do
52
- expect { LoggregatorEmitter::Emitter.new(":12345", "", "DEA") }.to raise_error(ArgumentError)
57
+ expect { LoggregatorEmitter::Emitter.new(":#{@free_port}", "", "DEA") }.to raise_error(ArgumentError)
53
58
  end
54
59
 
55
60
  it "raises if source_type is an unknown integer" do
56
- expect { LoggregatorEmitter::Emitter.new("localhost:12345", "origin", 7) }.to raise_error(ArgumentError)
61
+ expect { LoggregatorEmitter::Emitter.new("localhost:#{@free_port}", "origin", 7) }.to raise_error(ArgumentError)
57
62
  end
58
63
 
59
64
  it "raises if source_type is not an integer or string" do
60
- expect { LoggregatorEmitter::Emitter.new("localhost:12345", "origin", nil) }.to raise_error(ArgumentError)
61
- expect { LoggregatorEmitter::Emitter.new("localhost:12345", "origin", 12.0) }.to raise_error(ArgumentError)
65
+ expect { LoggregatorEmitter::Emitter.new("localhost:#{@free_port}", "origin", nil) }.to raise_error(ArgumentError)
66
+ expect { LoggregatorEmitter::Emitter.new("localhost:#{@free_port}", "origin", 12.0) }.to raise_error(ArgumentError)
62
67
  end
63
68
 
64
69
  it "raises if source_type is too large of a string" do
65
- expect { LoggregatorEmitter::Emitter.new("localhost:12345", "origin", "ABCD") }.to raise_error(ArgumentError)
70
+ expect { LoggregatorEmitter::Emitter.new("localhost:#{@free_port}", "origin", "ABCD") }.to raise_error(ArgumentError)
66
71
  end
67
72
 
68
73
  it "raises if source_type is too small of a string" do
69
- expect { LoggregatorEmitter::Emitter.new("localhost:12345", "origin", "AB") }.to raise_error(ArgumentError)
74
+ expect { LoggregatorEmitter::Emitter.new("localhost:#{@free_port}", "origin", "AB") }.to raise_error(ArgumentError)
70
75
  end
71
76
  end
72
77
  end
73
78
  end
74
79
 
80
+ def test_tags(tags)
81
+ expected_tags = []
82
+ tags.each do |k, v|
83
+ expected_tags << ::Sonde::Envelope::TagsEntry.new(:key => k, :value => v)
84
+ end
85
+ expected_tags
86
+ end
75
87
 
88
+ let(:timestamp) {Time.now}
76
89
  describe "emit_log_envelope" do
77
90
  def make_emitter(host)
78
91
  LoggregatorEmitter::Emitter.new("#{host}:#{@free_port}", "origin", "API", 42)
79
92
  end
80
93
 
81
94
  it "successfully writes envelope protobuffers" do
95
+ tag = {"key1" => "value1"}
82
96
  emitter = make_emitter("0.0.0.0")
83
- emitter.emit("my_app_id", "Hello there!")
97
+ Timecop.freeze timestamp do
98
+ emitter.emit("my_app_id", "Hello there!", tag)
99
+ end
84
100
 
85
101
  @server.wait_for_messages(1)
86
102
 
@@ -89,12 +105,32 @@ describe LoggregatorEmitter do
89
105
  expect(messages.length).to eq 1
90
106
  message = messages[0]
91
107
 
108
+ expect(message.time).to be_within(1).of timestamp
109
+ expect(message.logMessage.time).to be_within(1).of timestamp
92
110
  expect(message.logMessage.message).to eq "Hello there!"
93
111
  expect(message.logMessage.app_id).to eq "my_app_id"
94
112
  expect(message.logMessage.source_instance).to eq "42"
113
+ expect(message.tags).to eq test_tags(tag)
95
114
  expect(message.logMessage.message_type).to eq ::Sonde::LogMessage::MessageType::OUT
96
115
  end
97
116
 
117
+ it "successfully handles envelope with multiple tags" do
118
+ tags = {"key1" => "value1", "key2" => "value2"}
119
+ emitter = make_emitter("0.0.0.0")
120
+ Timecop.freeze timestamp do
121
+ emitter.emit("my_app_id", "Hello there!", tags)
122
+ end
123
+
124
+ @server.wait_for_messages(1)
125
+
126
+ messages = @server.messages
127
+
128
+ expect(messages.length).to eq 1
129
+ message = messages[0]
130
+
131
+ expect(message.tags).to eq test_tags(tags)
132
+ end
133
+
98
134
  it "gracefully handles failures to send messages" do
99
135
  emitter = make_emitter("0.0.0.0")
100
136
  UDPSocket.any_instance.stub(:sendmsg_nonblock).and_raise("Operation not permitted - sendmsg(2) (Errno::EPERM)")
@@ -118,6 +154,131 @@ describe LoggregatorEmitter do
118
154
  end
119
155
  end
120
156
 
157
+ describe "#emit_value_metric" do
158
+ let(:emitter) { LoggregatorEmitter::Emitter.new("0.0.0.0:#{@free_port}", "origin", "DEA")}
159
+
160
+ it 'successfully writes envelope protobuffers' do
161
+ tag = {"key1" => "value1"}
162
+ Timecop.freeze timestamp do
163
+ emitter.emit_value_metric('my-metric', 5155, 'my-units', tag)
164
+ end
165
+
166
+ @server.wait_for_messages(1)
167
+ messages = @server.messages
168
+
169
+ expect(messages.length).to eq 1
170
+ message = messages[0]
171
+
172
+ expect(message.time).to be_within(1).of(timestamp)
173
+ expect(message.valueMetric.value).to eq(5155)
174
+ expect(message.valueMetric.name).to eq('my-metric')
175
+ expect(message.valueMetric.unit).to eq('my-units')
176
+ expect(message.tags).to eq test_tags(tag)
177
+ end
178
+
179
+ it "successfully handles envelope with multiple tags" do
180
+ tags = {"key1" => "value1", "key2" => "value2"}
181
+ Timecop.freeze timestamp do
182
+ emitter.emit_value_metric('my-metric', 5155, 'my-units', tags)
183
+ end
184
+
185
+ @server.wait_for_messages(1)
186
+ messages = @server.messages
187
+
188
+ expect(messages.length).to eq 1
189
+ message = messages[0]
190
+
191
+ expect(message.tags).to eq test_tags(tags)
192
+ end
193
+ end
194
+
195
+ describe "#emit_counter" do
196
+ let(:emitter) { LoggregatorEmitter::Emitter.new("0.0.0.0:#{@free_port}", "origin", "DEA")}
197
+
198
+ it 'successfully writes envelope protobuffers' do
199
+ tag = {"key1" => "value1"}
200
+ Timecop.freeze timestamp do
201
+ emitter.emit_counter('my-counter', 5, tag)
202
+ end
203
+
204
+ @server.wait_for_messages(1)
205
+
206
+ messages = @server.messages
207
+
208
+ expect(messages.length).to eq 1
209
+ message = messages[0]
210
+
211
+ expect(message.time).to be_within(1).of(timestamp)
212
+ expect(message.counterEvent.delta).to eq(5)
213
+ expect(message.counterEvent.name).to eq('my-counter')
214
+ expect(message.tags).to eq test_tags(tag)
215
+ end
216
+
217
+ it "successfully handles envelope with multiple tags" do
218
+ tags = {"key1" => "value1", "key2" => "value2"}
219
+ Timecop.freeze timestamp do
220
+ emitter.emit_counter('my-counter', 5, tags)
221
+ end
222
+
223
+ @server.wait_for_messages(1)
224
+
225
+ messages = @server.messages
226
+
227
+ expect(messages.length).to eq 1
228
+ message = messages[0]
229
+
230
+ expect(message.tags).to eq test_tags(tags)
231
+ end
232
+ end
233
+
234
+ describe "#emit_container_metric" do
235
+ let(:emitter) { LoggregatorEmitter::Emitter.new("0.0.0.0:#{@free_port}", "origin", "DEA")}
236
+
237
+ it 'successfully writes envelope protobuffers' do
238
+ tag = {"key1" => "value1"}
239
+ Timecop.freeze timestamp do
240
+ emitter.emit_container_metric('app-id', 3, 1.3, 1024, 2048, tag)
241
+ end
242
+
243
+ @server.wait_for_messages(1)
244
+
245
+ messages = @server.messages
246
+
247
+ expect(messages.length).to eq 1
248
+ message = messages[0]
249
+
250
+ expect(message.time).to be_within(1).of(timestamp)
251
+ expect(message.containerMetric.applicationId).to eq('app-id')
252
+ expect(message.containerMetric.instanceIndex).to eq(3)
253
+ expect(message.containerMetric.cpuPercentage).to eq(1.3)
254
+ expect(message.containerMetric.memoryBytes).to eq(1024)
255
+ expect(message.containerMetric.diskBytes).to eq(2048)
256
+ expect(message.tags).to eq test_tags(tag)
257
+ end
258
+
259
+ it "successfully handles envelope with multiple tags" do
260
+ tags = {"key1" => "value1", "key2" => "value2"}
261
+ Timecop.freeze timestamp do
262
+ emitter.emit_container_metric('app-id', 3, 1.3, 1024, 2048, tags)
263
+ end
264
+
265
+ @server.wait_for_messages(1)
266
+
267
+ messages = @server.messages
268
+
269
+ expect(messages.length).to eq 1
270
+ message = messages[0]
271
+
272
+ expect(message.time).to be_within(1).of(timestamp)
273
+ expect(message.containerMetric.applicationId).to eq('app-id')
274
+ expect(message.containerMetric.instanceIndex).to eq(3)
275
+ expect(message.containerMetric.cpuPercentage).to eq(1.3)
276
+ expect(message.containerMetric.memoryBytes).to eq(1024)
277
+ expect(message.containerMetric.diskBytes).to eq(2048)
278
+ expect(message.tags).to eq test_tags(tags)
279
+ end
280
+ end
281
+
121
282
  {"emit" => LogMessage::MessageType::OUT, "emit_error" => LogMessage::MessageType::ERR}.each do |emit_method, message_type|
122
283
  describe "##{emit_method}" do
123
284
  def make_emitter(host)
@@ -1,4 +1,5 @@
1
1
  unless ENV['DISABLE_COVERAGE'] == 'true'
2
2
  require 'coveralls'
3
+ require 'timecop'
3
4
  Coveralls.wear!
4
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loggregator_emitter
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.1
4
+ version: 5.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pivotal
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-13 00:00:00.000000000 Z
11
+ date: 2016-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: beefcake
@@ -38,6 +38,26 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: coveralls
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.8'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 0.8.14
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '0.8'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 0.8.14
41
61
  - !ruby/object:Gem::Dependency
42
62
  name: rake
43
63
  requirement: !ruby/object:Gem::Requirement
@@ -57,6 +77,9 @@ dependencies:
57
77
  requirement: !ruby/object:Gem::Requirement
58
78
  requirements:
59
79
  - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '2.14'
82
+ - - ">="
60
83
  - !ruby/object:Gem::Version
61
84
  version: 2.14.1
62
85
  type: :development
@@ -64,10 +87,13 @@ dependencies:
64
87
  version_requirements: !ruby/object:Gem::Requirement
65
88
  requirements:
66
89
  - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '2.14'
92
+ - - ">="
67
93
  - !ruby/object:Gem::Version
68
94
  version: 2.14.1
69
95
  - !ruby/object:Gem::Dependency
70
- name: coveralls
96
+ name: timecop
71
97
  requirement: !ruby/object:Gem::Requirement
72
98
  requirements:
73
99
  - - ">="
@@ -126,7 +152,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
152
  requirements:
127
153
  - - ">="
128
154
  - !ruby/object:Gem::Version
129
- version: 1.9.3
155
+ version: 2.0.0
130
156
  required_rubygems_version: !ruby/object:Gem::Requirement
131
157
  requirements:
132
158
  - - ">="
@@ -134,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
160
  version: '0'
135
161
  requirements: []
136
162
  rubyforge_project:
137
- rubygems_version: 2.4.5.1
163
+ rubygems_version: 2.5.1
138
164
  signing_key:
139
165
  specification_version: 4
140
166
  summary: Library to emit data to Loggregator