appdash 0.6.1 → 0.6.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +18 -36
- data/appdash.gemspec +2 -2
- data/lib/appdash/buffer.rb +37 -0
- data/lib/appdash/client.rb +28 -13
- data/lib/appdash/collector.pb.rb +18 -22
- data/lib/appdash/event/rack_server.rb +1 -1
- data/lib/appdash/span.rb +1 -1
- data/lib/appdash/wire.rb +2 -3
- data/spec/appdash/client_spec.rb +5 -4
- data/spec/appdash/span_spec.rb +2 -2
- data/spec/appdash/wire_spec.rb +13 -3
- data/spec/spec_helper.rb +8 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ad7c405c963438df0518090edb4fe540a0b1001
|
4
|
+
data.tar.gz: 3fda9cf94875dce0d5b65b6b9e4ca190aca0ee39
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db2a7a74f651e4f30011b4f2e2c30f942f1a1a49f4c4b92d67aabcfa13c02c4a3bbe0aa748da6f542414596e9dcbc10d0b2b5771ee0ea048f4bfc69d78b0b567
|
7
|
+
data.tar.gz: 32e1b82da195f0179f294fa214b5b37f41d1fa8f1aa95f26b1aeadfaa037c891e6a83254847c2abd2085af818385fac6b6c4f66fbca780e55dbadc3669a30217
|
data/Gemfile.lock
CHANGED
@@ -1,49 +1,31 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
appdash (0.6.
|
5
|
-
|
4
|
+
appdash (0.6.2)
|
5
|
+
ruby-protocol-buffers
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: http://rubygems.org/
|
9
9
|
specs:
|
10
|
-
|
11
|
-
|
12
|
-
json (~> 1.7, >= 1.7.7)
|
13
|
-
minitest (~> 5.1)
|
14
|
-
thread_safe (~> 0.3, >= 0.3.4)
|
15
|
-
tzinfo (~> 1.1)
|
16
|
-
diff-lcs (1.2.5)
|
17
|
-
i18n (0.7.0)
|
18
|
-
json (1.8.3)
|
19
|
-
middleware (0.1.0)
|
20
|
-
minitest (5.8.3)
|
21
|
-
protobuf (3.5.5)
|
22
|
-
activesupport (>= 3.2)
|
23
|
-
middleware
|
24
|
-
thor
|
25
|
-
thread_safe
|
26
|
-
rack (1.6.4)
|
10
|
+
diff-lcs (1.3)
|
11
|
+
rack (2.0.1)
|
27
12
|
rack-test (0.6.3)
|
28
13
|
rack (>= 1.0)
|
29
|
-
rake (
|
30
|
-
rspec (3.
|
31
|
-
rspec-core (~> 3.
|
32
|
-
rspec-expectations (~> 3.
|
33
|
-
rspec-mocks (~> 3.
|
34
|
-
rspec-core (3.4
|
35
|
-
rspec-support (~> 3.
|
36
|
-
rspec-expectations (3.
|
14
|
+
rake (12.0.0)
|
15
|
+
rspec (3.5.0)
|
16
|
+
rspec-core (~> 3.5.0)
|
17
|
+
rspec-expectations (~> 3.5.0)
|
18
|
+
rspec-mocks (~> 3.5.0)
|
19
|
+
rspec-core (3.5.4)
|
20
|
+
rspec-support (~> 3.5.0)
|
21
|
+
rspec-expectations (3.5.0)
|
37
22
|
diff-lcs (>= 1.2.0, < 2.0)
|
38
|
-
rspec-support (~> 3.
|
39
|
-
rspec-mocks (3.
|
23
|
+
rspec-support (~> 3.5.0)
|
24
|
+
rspec-mocks (3.5.0)
|
40
25
|
diff-lcs (>= 1.2.0, < 2.0)
|
41
|
-
rspec-support (~> 3.
|
42
|
-
rspec-support (3.
|
43
|
-
|
44
|
-
thread_safe (0.3.5)
|
45
|
-
tzinfo (1.2.2)
|
46
|
-
thread_safe (~> 0.1)
|
26
|
+
rspec-support (~> 3.5.0)
|
27
|
+
rspec-support (3.5.0)
|
28
|
+
ruby-protocol-buffers (1.6.1)
|
47
29
|
|
48
30
|
PLATFORMS
|
49
31
|
ruby
|
@@ -57,4 +39,4 @@ DEPENDENCIES
|
|
57
39
|
rspec
|
58
40
|
|
59
41
|
BUNDLED WITH
|
60
|
-
1.
|
42
|
+
1.14.5
|
data/appdash.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "appdash"
|
5
|
-
s.version = "0.6.
|
5
|
+
s.version = "0.6.2"
|
6
6
|
s.authors = ["Black Square Media"]
|
7
7
|
s.email = ["dimitrij@blacksquaremedia.com"]
|
8
8
|
s.summary = %q{Appdash client for ruby}
|
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.test_files = s.files.grep(%r{^(spec)/})
|
15
15
|
s.require_paths = ["lib"]
|
16
16
|
|
17
|
-
s.add_dependency(%q<
|
17
|
+
s.add_dependency(%q<ruby-protocol-buffers>)
|
18
18
|
|
19
19
|
s.add_development_dependency(%q<rake>)
|
20
20
|
s.add_development_dependency(%q<rack>)
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
|
3
|
+
module Appdash
|
4
|
+
class Buffer < ::StringIO
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
super
|
8
|
+
binmode
|
9
|
+
end
|
10
|
+
|
11
|
+
def push(packet)
|
12
|
+
payload = packet.serialize_to_string
|
13
|
+
write_uvarint payload.bytesize
|
14
|
+
write payload
|
15
|
+
end
|
16
|
+
|
17
|
+
def bytesize
|
18
|
+
string.bytesize
|
19
|
+
end
|
20
|
+
|
21
|
+
def reset
|
22
|
+
truncate(0)
|
23
|
+
rewind
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def write_uvarint(x)
|
29
|
+
while x >= 0x80
|
30
|
+
write ((x & 0xFF) | 0x80).chr
|
31
|
+
x >>= 7
|
32
|
+
end
|
33
|
+
write (x & 0xFF).chr
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
data/lib/appdash/client.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'socket'
|
2
2
|
require 'thread'
|
3
|
+
require 'appdash/buffer'
|
3
4
|
|
4
5
|
module Appdash
|
5
6
|
class Client
|
@@ -8,19 +9,19 @@ module Appdash
|
|
8
9
|
DEFAULTS = {
|
9
10
|
host: 'localhost',
|
10
11
|
port: 7701,
|
11
|
-
max_buffer_size:
|
12
|
+
max_buffer_size: 0,
|
12
13
|
}.freeze
|
13
14
|
|
14
15
|
# Initializes a new client
|
15
16
|
# @param [Hash] opts
|
16
17
|
# @option opts [String] :host the hostname, defaults to localhost
|
17
18
|
# @option opts [Integer] :port the port, defaults to 7701
|
18
|
-
# @option opts [Integer] :max_buffer_size
|
19
|
+
# @option opts [Integer] :max_buffer_size maximum buffer size in bytes, defaults to 0 (= no buffering, flushes on every span)
|
19
20
|
def initialize(opts = {})
|
20
21
|
@config = DEFAULTS.merge(opts)
|
21
|
-
@
|
22
|
-
@buffer = []
|
22
|
+
@buffer = Buffer.new
|
23
23
|
@mutex = Mutex.new
|
24
|
+
reconnect!
|
24
25
|
end
|
25
26
|
|
26
27
|
# Traces a new span with a series of associated events. Accepts an optional block. If no block is given you must flush
|
@@ -50,28 +51,42 @@ module Appdash
|
|
50
51
|
end
|
51
52
|
end
|
52
53
|
|
53
|
-
#
|
54
|
-
def
|
54
|
+
# Close flushes any remaining buffered packets and closes the connection
|
55
|
+
def close
|
55
56
|
flush_buffer!
|
56
|
-
@sock.
|
57
|
+
@sock.close
|
57
58
|
end
|
58
59
|
|
59
60
|
private
|
60
61
|
|
61
62
|
def write(packets)
|
62
63
|
packets.each do |packet|
|
63
|
-
|
64
|
-
@buffer.push(raw)
|
64
|
+
@buffer.push(packet)
|
65
65
|
end
|
66
|
-
flush_buffer!
|
66
|
+
flush_buffer! if @buffer.bytesize > @config[:max_buffer_size]
|
67
67
|
end
|
68
68
|
|
69
69
|
def flush_buffer!
|
70
|
-
|
71
|
-
@
|
72
|
-
|
70
|
+
with_reconnect do
|
71
|
+
@mutex.synchronize do
|
72
|
+
@sock.write @buffer.string unless @buffer.bytesize.zero?
|
73
|
+
@buffer.reset
|
74
|
+
end
|
73
75
|
end
|
74
76
|
end
|
75
77
|
|
78
|
+
def reconnect!
|
79
|
+
@sock.close if @sock
|
80
|
+
@sock = TCPSocket.new @config[:host], @config[:port]
|
81
|
+
end
|
82
|
+
|
83
|
+
def with_reconnect(attempt = 0, &block)
|
84
|
+
yield
|
85
|
+
rescue Errno::EPIPE
|
86
|
+
raise if attempt > 1
|
87
|
+
reconnect!
|
88
|
+
with_reconnect(attempt+1, &block)
|
89
|
+
end
|
90
|
+
|
76
91
|
end
|
77
92
|
end
|
data/lib/appdash/collector.pb.rb
CHANGED
@@ -1,41 +1,37 @@
|
|
1
|
-
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
3
|
|
3
|
-
|
4
|
-
# This file is auto-generated. DO NOT EDIT!
|
5
|
-
#
|
6
|
-
require 'protobuf/message'
|
4
|
+
require 'protocol_buffers'
|
7
5
|
|
8
6
|
module Appdash
|
7
|
+
# forward declarations
|
8
|
+
class CollectPacket < ::ProtocolBuffers::Message; end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
class SpanID < ::Protobuf::Message; end
|
15
|
-
class Annotation < ::Protobuf::Message; end
|
16
|
-
|
17
|
-
end
|
10
|
+
class CollectPacket < ::ProtocolBuffers::Message
|
11
|
+
# forward declarations
|
12
|
+
class SpanID < ::ProtocolBuffers::Message; end
|
13
|
+
class Annotation < ::ProtocolBuffers::Message; end
|
18
14
|
|
15
|
+
set_fully_qualified_name "appdash.CollectPacket"
|
19
16
|
|
17
|
+
# nested messages
|
18
|
+
class SpanID < ::ProtocolBuffers::Message
|
19
|
+
set_fully_qualified_name "appdash.CollectPacket.SpanID"
|
20
20
|
|
21
|
-
##
|
22
|
-
# Message Fields
|
23
|
-
#
|
24
|
-
class CollectPacket
|
25
|
-
class SpanID
|
26
21
|
required :fixed64, :trace, 2
|
27
22
|
required :fixed64, :span, 3
|
28
23
|
optional :fixed64, :parent, 4
|
29
24
|
end
|
30
25
|
|
31
|
-
class Annotation
|
26
|
+
class Annotation < ::ProtocolBuffers::Message
|
27
|
+
set_fully_qualified_name "appdash.CollectPacket.Annotation"
|
28
|
+
|
32
29
|
required :string, :key, 6
|
33
30
|
optional :bytes, :value, 7
|
34
31
|
end
|
35
32
|
|
36
|
-
required ::Appdash::CollectPacket::SpanID, :spanid, 1
|
37
|
-
repeated ::Appdash::CollectPacket::Annotation, :annotation, 5
|
33
|
+
required ::Appdash::CollectPacket::SpanID, :spanid, 1, :group => true
|
34
|
+
repeated ::Appdash::CollectPacket::Annotation, :annotation, 5, :group => true
|
38
35
|
end
|
39
36
|
|
40
37
|
end
|
41
|
-
|
@@ -4,7 +4,7 @@ module Appdash
|
|
4
4
|
module Event
|
5
5
|
|
6
6
|
# RackServer represents a HTTP event where a client's request was served via Rack.
|
7
|
-
class RackServer <
|
7
|
+
class RackServer < Base
|
8
8
|
|
9
9
|
# @param [Rack::Request] req a Rack request object
|
10
10
|
# @param [Rack::Response] resp an optional Rack response object
|
data/lib/appdash/span.rb
CHANGED
data/lib/appdash/wire.rb
CHANGED
@@ -1,12 +1,11 @@
|
|
1
|
-
require 'protobuf'
|
2
1
|
require 'appdash/collector.pb.rb'
|
3
2
|
|
4
3
|
module Appdash
|
5
4
|
class CollectPacket
|
6
5
|
|
7
|
-
def self.
|
6
|
+
def self.build(event, id)
|
8
7
|
wired = SpanID.new(trace: id.trace, span: id.span, parent: id.parent)
|
9
|
-
new(spanid: wired, annotation: event.to_a)
|
8
|
+
new(spanid: wired, annotation: event.to_a)
|
10
9
|
end
|
11
10
|
|
12
11
|
end
|
data/spec/appdash/client_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
RSpec.describe Appdash::Client do
|
4
4
|
|
5
|
-
let(:mock_socket) { double("TCPSocket",
|
5
|
+
let(:mock_socket) { double("TCPSocket", close: nil) }
|
6
6
|
before { allow(TCPSocket).to receive(:new).and_return(mock_socket) }
|
7
7
|
|
8
8
|
it "should collect spans" do
|
@@ -17,16 +17,17 @@ RSpec.describe Appdash::Client do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should support buffering" do
|
20
|
-
subject = described_class.new(max_buffer_size:
|
20
|
+
subject = described_class.new(max_buffer_size: 1000)
|
21
21
|
subject.span do |s|
|
22
22
|
s.message("Message A")
|
23
23
|
s.message("Message B")
|
24
24
|
end
|
25
25
|
|
26
26
|
expect(mock_socket).to receive(:write) do |raw|
|
27
|
-
expect(raw.bytesize).to eq(
|
27
|
+
expect(raw.bytesize).to eq(117)
|
28
28
|
end
|
29
|
-
subject.
|
29
|
+
subject.close
|
30
30
|
end
|
31
31
|
|
32
32
|
end
|
33
|
+
|
data/spec/appdash/span_spec.rb
CHANGED
@@ -24,8 +24,8 @@ RSpec.describe Appdash::Span do
|
|
24
24
|
|
25
25
|
expect(mock_client).to receive(:write) do |packets|
|
26
26
|
expect(packets.size).to eq(2)
|
27
|
-
expect(packets[0].
|
28
|
-
expect(packets[1].
|
27
|
+
expect(packets[0].annotation.map(&:to_hash)).to eq([{key: "Name", value: "test"}, {key: "_schema:name"}])
|
28
|
+
expect(packets[1].annotation.map(&:to_hash)).to eq([{key: "Msg", value: "test message"}, {key: "_schema:msg"}])
|
29
29
|
end
|
30
30
|
expect(subject.flush).to eq(2)
|
31
31
|
end
|
data/spec/appdash/wire_spec.rb
CHANGED
@@ -2,9 +2,19 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
RSpec.describe Appdash::CollectPacket do
|
4
4
|
|
5
|
-
it "should
|
6
|
-
packet = described_class.
|
7
|
-
expect(packet
|
5
|
+
it "should build" do
|
6
|
+
packet = described_class.build Appdash::Event::Message.new("Hello world!"), mock_span_id
|
7
|
+
expect(packet).to be_instance_of(described_class)
|
8
|
+
expect(packet.to_hash).to eq(
|
9
|
+
spanid: {
|
10
|
+
trace: 5678,
|
11
|
+
span: 1234,
|
12
|
+
},
|
13
|
+
annotation: [
|
14
|
+
{key: "Msg", value: "Hello world!"},
|
15
|
+
{key: "_schema:msg"},
|
16
|
+
]
|
17
|
+
)
|
8
18
|
end
|
9
19
|
|
10
20
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,6 +8,14 @@ helpers = Module.new do
|
|
8
8
|
def atoh(annotations)
|
9
9
|
annotations.inject({}) {|h, a| h[a.key] = a.value; h }
|
10
10
|
end
|
11
|
+
|
12
|
+
def mock_span_id
|
13
|
+
id = Appdash::Span::ID.new
|
14
|
+
id.instance_variable_set(:@span, 1234)
|
15
|
+
id.instance_variable_set(:@trace, 5678)
|
16
|
+
id
|
17
|
+
end
|
18
|
+
|
11
19
|
end
|
12
20
|
|
13
21
|
RSpec.configure do |c|
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appdash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Black Square Media
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-03-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: ruby-protocol-buffers
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
@@ -113,6 +113,7 @@ files:
|
|
113
113
|
- appdash.gemspec
|
114
114
|
- defs/appdash/collector.proto
|
115
115
|
- lib/appdash.rb
|
116
|
+
- lib/appdash/buffer.rb
|
116
117
|
- lib/appdash/client.rb
|
117
118
|
- lib/appdash/collector.pb.rb
|
118
119
|
- lib/appdash/event/base.rb
|
@@ -155,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
155
156
|
version: '0'
|
156
157
|
requirements: []
|
157
158
|
rubyforge_project:
|
158
|
-
rubygems_version: 2.
|
159
|
+
rubygems_version: 2.6.8
|
159
160
|
signing_key:
|
160
161
|
specification_version: 4
|
161
162
|
summary: Appdash client for ruby
|