test_bench-telemetry 2.1.1.0 → 3.0.0.0.pre.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 +4 -4
- data/lib/test_bench/telemetry/controls/event/metadata.rb +5 -5
- data/lib/test_bench/telemetry/controls/event.rb +26 -10
- data/lib/test_bench/telemetry/controls/event_data.rb +16 -34
- data/lib/test_bench/telemetry/controls/handler.rb +1 -1
- data/lib/test_bench/telemetry/controls/path/file.rb +37 -0
- data/lib/test_bench/telemetry/controls/process_id.rb +4 -0
- data/lib/test_bench/telemetry/controls/random.rb +3 -1
- data/lib/test_bench/telemetry/controls/time.rb +19 -40
- data/lib/test_bench/telemetry/controls.rb +4 -5
- data/lib/test_bench/telemetry/event.rb +23 -1
- data/lib/test_bench/telemetry/event_data/serialization.rb +50 -137
- data/lib/test_bench/telemetry/sink/file.rb +14 -8
- data/lib/test_bench/telemetry/substitute/sink.rb +0 -14
- data/lib/test_bench/telemetry/substitute.rb +10 -1
- data/lib/test_bench/telemetry/telemetry.rb +0 -19
- data/lib/test_bench/telemetry.rb +2 -1
- metadata +30 -25
- data/lib/test_bench/telemetry/controls/event/event_data.rb +0 -15
- data/lib/test_bench/telemetry/controls/file.rb +0 -84
- data/lib/test_bench/telemetry/controls/projection/receiver.rb +0 -31
- data/lib/test_bench/telemetry/controls/projection.rb +0 -84
- data/lib/test_bench/telemetry/sink/projection.rb +0 -132
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 554962ce7f2d4b3942e7c2a5eb8a155f1d68801bf88d6c5ae28411949eb0295e
|
4
|
+
data.tar.gz: ae674e5ddb59572c797e2384f460ac750b46a798f9b7a3ab82a8ae8f103c4406
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '09574fab865fcad0ba8e2d095721501a067ad50e727ce538e360d15f9e1b1449c2c0b1138248855e7d78641f0f526af34eaa60ded327aaf4f2dfd4a98e378817'
|
7
|
+
data.tar.gz: c2627c079ef9035c0cea001ff7e1055d4854131b07612c0525925d6d244c1c611f4a9b1fffab709666a0731c30dc97f722ed6b52dc1d9a434c4c122f55dd35b5
|
@@ -31,11 +31,11 @@ module TestBench
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def self.process_id
|
34
|
-
|
34
|
+
ProcessID.example
|
35
35
|
end
|
36
36
|
|
37
37
|
def self.time
|
38
|
-
|
38
|
+
Time.example
|
39
39
|
end
|
40
40
|
|
41
41
|
module Other
|
@@ -47,17 +47,17 @@ module TestBench
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def self.process_id
|
50
|
-
|
50
|
+
ProcessID.other_example
|
51
51
|
end
|
52
52
|
|
53
53
|
def self.time
|
54
|
-
|
54
|
+
Time.other_example
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
58
|
module Random
|
59
59
|
def self.example(process_id: nil, time: nil)
|
60
|
-
process_id ||=
|
60
|
+
process_id ||= ProcessID.random
|
61
61
|
time ||= Controls::Time.random
|
62
62
|
|
63
63
|
Metadata.example(process_id:, time:)
|
@@ -2,8 +2,6 @@ module TestBench
|
|
2
2
|
class Telemetry
|
3
3
|
module Controls
|
4
4
|
module Event
|
5
|
-
extend EventData
|
6
|
-
|
7
5
|
def self.example(some_attribute: nil, some_other_attribute: nil, event_class: nil, metadata: nil, process_id: nil, time: nil)
|
8
6
|
some_attribute ||= self.some_attribute
|
9
7
|
some_other_attribute ||= self.some_other_attribute
|
@@ -18,6 +16,11 @@ module TestBench
|
|
18
16
|
event
|
19
17
|
end
|
20
18
|
|
19
|
+
def self.event_data
|
20
|
+
event = self.example
|
21
|
+
Telemetry::Event::Export.(event)
|
22
|
+
end
|
23
|
+
|
21
24
|
def self.other_example
|
22
25
|
Other.example
|
23
26
|
end
|
@@ -39,19 +42,24 @@ module TestBench
|
|
39
42
|
end
|
40
43
|
|
41
44
|
def self.process_id
|
42
|
-
|
45
|
+
EventData.process_id
|
43
46
|
end
|
44
47
|
|
45
48
|
def self.time
|
46
|
-
|
49
|
+
EventData.time
|
47
50
|
end
|
48
51
|
|
49
|
-
SomeEvent =
|
50
|
-
|
52
|
+
SomeEvent = Telemetry::Event.define(
|
53
|
+
:some_attribute,
|
54
|
+
:some_other_attribute
|
55
|
+
)
|
51
56
|
|
52
|
-
|
53
|
-
|
57
|
+
SomeOtherEvent = Telemetry::Event.define(
|
58
|
+
:some_attribute,
|
59
|
+
:some_other_attribute
|
60
|
+
)
|
54
61
|
|
62
|
+
module Other
|
55
63
|
def self.example(some_attribute: nil, some_other_attribute: nil, metadata: nil, process_id: nil, time: nil)
|
56
64
|
some_attribute ||= self.some_attribute
|
57
65
|
some_other_attribute ||= self.some_other_attribute
|
@@ -71,11 +79,14 @@ module TestBench
|
|
71
79
|
def self.some_other_attribute
|
72
80
|
'some-other-alternate-value'
|
73
81
|
end
|
82
|
+
|
83
|
+
def self.event_data
|
84
|
+
event = self.example
|
85
|
+
Telemetry::Event::Export.(event)
|
86
|
+
end
|
74
87
|
end
|
75
88
|
|
76
89
|
module Random
|
77
|
-
extend EventData
|
78
|
-
|
79
90
|
def self.example(some_attribute: nil, some_other_attribute: nil, event_class: nil, metadata: nil, process_id: nil, time: nil)
|
80
91
|
some_attribute ||= self.some_attribute
|
81
92
|
some_other_attribute ||= self.some_other_attribute
|
@@ -104,6 +115,11 @@ module TestBench
|
|
104
115
|
|
105
116
|
"#{Event.some_other_attribute}-#{suffix}"
|
106
117
|
end
|
118
|
+
|
119
|
+
def self.event_data
|
120
|
+
event = self.example
|
121
|
+
Telemetry::Event::Export.(event)
|
122
|
+
end
|
107
123
|
end
|
108
124
|
|
109
125
|
module Data
|
@@ -4,10 +4,20 @@ module TestBench
|
|
4
4
|
module EventData
|
5
5
|
def self.example(type: nil, process_id: nil, time: nil, data: nil)
|
6
6
|
type ||= self.type
|
7
|
-
process_id ||= self.process_id
|
8
|
-
time ||= self.time
|
9
7
|
data ||= self.data
|
10
8
|
|
9
|
+
if process_id == :none
|
10
|
+
process_id = nil
|
11
|
+
else
|
12
|
+
process_id ||= self.process_id
|
13
|
+
end
|
14
|
+
|
15
|
+
if time == :none
|
16
|
+
time = nil
|
17
|
+
else
|
18
|
+
time ||= self.time
|
19
|
+
end
|
20
|
+
|
11
21
|
event_data = Telemetry::EventData.new
|
12
22
|
event_data.type = type
|
13
23
|
event_data.process_id = process_id
|
@@ -68,8 +78,7 @@ module TestBench
|
|
68
78
|
true,
|
69
79
|
false,
|
70
80
|
11,
|
71
|
-
'some-string'
|
72
|
-
Time.example
|
81
|
+
'some-string'
|
73
82
|
]
|
74
83
|
end
|
75
84
|
|
@@ -79,8 +88,7 @@ module TestBench
|
|
79
88
|
Controls::Random.boolean,
|
80
89
|
Controls::Random.boolean,
|
81
90
|
Controls::Random.integer,
|
82
|
-
Controls::Random.string
|
83
|
-
Time.random
|
91
|
+
Controls::Random.string
|
84
92
|
]
|
85
93
|
end
|
86
94
|
end
|
@@ -93,34 +101,8 @@ module TestBench
|
|
93
101
|
|
94
102
|
time_iso8601 = Time::ISO8601.example(time)
|
95
103
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
module Malformed
|
100
|
-
module Empty
|
101
|
-
def self.example
|
102
|
-
''
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
module IncorrectEventType
|
107
|
-
def self.example
|
108
|
-
Text.example(type:)
|
109
|
-
end
|
110
|
-
|
111
|
-
def self.type
|
112
|
-
:not_pascal_cased
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
module IncorrectNewlines
|
117
|
-
def self.example
|
118
|
-
text = Text.example
|
119
|
-
text.chomp!("\r\n")
|
120
|
-
text << "\n"
|
121
|
-
text
|
122
|
-
end
|
123
|
-
end
|
104
|
+
json_text = JSON.generate([type, process_id, time_iso8601, [nil, true, false, 11, "some-string"]])
|
105
|
+
"#{json_text}\n"
|
124
106
|
end
|
125
107
|
end
|
126
108
|
end
|
@@ -64,7 +64,7 @@ module TestBench
|
|
64
64
|
def self.example(event_type=nil)
|
65
65
|
event_type ||= Event::SomeEvent.event_type
|
66
66
|
|
67
|
-
event_name =
|
67
|
+
event_name = Telemetry::Event::EventName.get(event_type)
|
68
68
|
|
69
69
|
:"handle_#{event_name}"
|
70
70
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Telemetry
|
3
|
+
module Controls
|
4
|
+
module Path
|
5
|
+
module File
|
6
|
+
def self.example(basename: nil, extension: nil)
|
7
|
+
basename ||= self.basename
|
8
|
+
extension ||= self.extension
|
9
|
+
|
10
|
+
filename = "#{basename}#{extension}"
|
11
|
+
|
12
|
+
tempfile = Tempfile.create(filename)
|
13
|
+
tempfile.close
|
14
|
+
|
15
|
+
::File.unlink(tempfile)
|
16
|
+
|
17
|
+
tempfile.path
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.basename
|
21
|
+
"some-basename"
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.extension
|
25
|
+
".some-extension"
|
26
|
+
end
|
27
|
+
|
28
|
+
module Read
|
29
|
+
def self.call(file_path)
|
30
|
+
::File.read(file_path)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -2,55 +2,34 @@ module TestBench
|
|
2
2
|
class Telemetry
|
3
3
|
module Controls
|
4
4
|
module Time
|
5
|
-
def self.example(offset_milliseconds: nil, offset_nanoseconds: nil)
|
6
|
-
|
7
|
-
|
5
|
+
def self.example(offset_seconds: nil, offset_milliseconds: nil, offset_nanoseconds: nil)
|
6
|
+
offset_nanoseconds ||= 0
|
7
|
+
|
8
|
+
if not offset_seconds.nil?
|
9
|
+
offset_milliseconds = offset_seconds * 1_000
|
10
|
+
return example(offset_milliseconds:)
|
11
|
+
elsif not offset_milliseconds.nil?
|
8
12
|
offset_nanoseconds = offset_milliseconds * 1_000_000
|
13
|
+
return example(offset_nanoseconds:)
|
9
14
|
end
|
10
15
|
|
11
16
|
nanoseconds = 111_111_111
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
else
|
19
|
-
remaining_offset, seconds = remaining_offset.divmod(60)
|
20
|
-
end
|
17
|
+
seconds = 11
|
18
|
+
minutes = 11
|
19
|
+
hours = 11
|
20
|
+
day = 1
|
21
|
+
month = 1
|
22
|
+
year = 2000
|
21
23
|
|
22
|
-
|
23
|
-
minutes = 11
|
24
|
-
else
|
25
|
-
remaining_offset, minutes = remaining_offset.divmod(60)
|
26
|
-
end
|
24
|
+
nanoseconds += offset_nanoseconds
|
27
25
|
|
28
|
-
|
29
|
-
hours = 11
|
30
|
-
else
|
31
|
-
remaining_offset, hours = remaining_offset.divmod(24)
|
32
|
-
end
|
26
|
+
remaining_offset_seconds, nanoseconds = nanoseconds.divmod(1_000_000_000)
|
33
27
|
|
34
|
-
|
35
|
-
day = 1
|
36
|
-
else
|
37
|
-
remaining_offset, day = remaining_offset.divmod(28)
|
38
|
-
day += 1
|
39
|
-
end
|
40
|
-
|
41
|
-
if remaining_offset.zero?
|
42
|
-
month = 1
|
43
|
-
else
|
44
|
-
remaining_offset, month = remaining_offset.divmod(12)
|
45
|
-
month += 1
|
46
|
-
end
|
28
|
+
microseconds = Rational(nanoseconds, 1_000)
|
47
29
|
|
48
|
-
|
49
|
-
if not remaining_offset.zero?
|
50
|
-
year += remaining_offset
|
51
|
-
end
|
30
|
+
time = ::Time.utc(year, month, day, hours, minutes, seconds, microseconds)
|
52
31
|
|
53
|
-
|
32
|
+
time + remaining_offset_seconds
|
54
33
|
end
|
55
34
|
|
56
35
|
def self.other_example
|
@@ -1,17 +1,16 @@
|
|
1
|
-
require '
|
1
|
+
require 'tempfile'
|
2
2
|
|
3
|
-
require 'test_bench/telemetry/controls/
|
3
|
+
require 'test_bench/telemetry/controls/random'
|
4
4
|
|
5
5
|
require 'test_bench/telemetry/controls/process_id'
|
6
6
|
require 'test_bench/telemetry/controls/time'
|
7
7
|
|
8
|
+
require 'test_bench/telemetry/controls/path/file'
|
9
|
+
|
8
10
|
require 'test_bench/telemetry/controls/event_data'
|
9
11
|
|
10
|
-
require 'test_bench/telemetry/controls/event/event_data'
|
11
12
|
require 'test_bench/telemetry/controls/event'
|
12
13
|
require 'test_bench/telemetry/controls/event/metadata'
|
13
14
|
|
14
15
|
require 'test_bench/telemetry/controls/sink'
|
15
16
|
require 'test_bench/telemetry/controls/handler'
|
16
|
-
require 'test_bench/telemetry/controls/projection'
|
17
|
-
require 'test_bench/telemetry/controls/projection/receiver'
|
@@ -15,7 +15,10 @@ module TestBench
|
|
15
15
|
cls.class_exec do
|
16
16
|
extend EventType
|
17
17
|
extend EventName
|
18
|
+
|
18
19
|
extend Build
|
20
|
+
|
21
|
+
extend CaseEquality
|
19
22
|
end
|
20
23
|
end
|
21
24
|
|
@@ -76,9 +79,28 @@ module TestBench
|
|
76
79
|
|
77
80
|
module Build
|
78
81
|
def build(*attributes, process_id: nil, time: nil)
|
82
|
+
time ||= ::Time.now
|
83
|
+
process_id ||= ::Process.pid
|
84
|
+
|
79
85
|
metadata = Metadata.new(process_id, time)
|
80
86
|
|
81
|
-
new(*attributes
|
87
|
+
instance = new(*attributes)
|
88
|
+
instance.metadata = metadata
|
89
|
+
instance
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
module CaseEquality
|
94
|
+
def ===(object)
|
95
|
+
case object
|
96
|
+
in EventData => event_data
|
97
|
+
type = event_data.type
|
98
|
+
|
99
|
+
type == self.event_type
|
100
|
+
|
101
|
+
else
|
102
|
+
super(object)
|
103
|
+
end
|
82
104
|
end
|
83
105
|
end
|
84
106
|
|
@@ -2,167 +2,80 @@ module TestBench
|
|
2
2
|
class Telemetry
|
3
3
|
class EventData
|
4
4
|
module Serialization
|
5
|
-
Error = Class.new(RuntimeError)
|
6
|
-
|
7
5
|
def self.dump(event_data)
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
text << type
|
16
|
-
|
17
|
-
text << "\t"
|
18
|
-
text << process_id
|
19
|
-
|
20
|
-
text << "\t"
|
21
|
-
text << time
|
22
|
-
|
23
|
-
data.each do |value|
|
24
|
-
text << "\t"
|
25
|
-
text << dump_value(value)
|
6
|
+
data = event_data.data.map do |value|
|
7
|
+
case value
|
8
|
+
in Time => time
|
9
|
+
timestamp(time)
|
10
|
+
else
|
11
|
+
value
|
12
|
+
end
|
26
13
|
end
|
27
14
|
|
28
|
-
|
29
|
-
|
30
|
-
end
|
15
|
+
type = event_data.type
|
16
|
+
process_id = event_data.process_id
|
31
17
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
value.to_s
|
36
|
-
when Time
|
37
|
-
value.strftime('%Y-%m-%dT%H:%M:%S.%NZ')
|
38
|
-
when NilClass
|
39
|
-
''
|
40
|
-
when TrueClass, FalseClass
|
41
|
-
value.to_s
|
42
|
-
when String
|
43
|
-
value.dump
|
18
|
+
time = event_data.time
|
19
|
+
if not time.nil?
|
20
|
+
timestamp = timestamp(time)
|
44
21
|
end
|
22
|
+
|
23
|
+
json_text = JSON.generate([type, process_id, timestamp, data])
|
24
|
+
json_text << "\n"
|
25
|
+
json_text
|
45
26
|
end
|
46
27
|
|
47
28
|
def self.load(text)
|
48
|
-
|
49
|
-
if match_data.nil?
|
50
|
-
raise Error, "Cannot deserialize #{text.inspect}"
|
51
|
-
end
|
29
|
+
type, process_id, timestamp, data = JSON.parse(text)
|
52
30
|
|
53
|
-
type =
|
54
|
-
|
55
|
-
|
31
|
+
type = type.to_sym
|
32
|
+
|
33
|
+
if not timestamp.nil?
|
34
|
+
time = time(timestamp)
|
35
|
+
end
|
56
36
|
|
57
37
|
event_data = EventData.new
|
58
38
|
event_data.type = type
|
59
39
|
event_data.process_id = process_id
|
60
40
|
event_data.time = time
|
61
|
-
event_data.data =
|
62
|
-
|
63
|
-
data_text = match_data['data']
|
64
|
-
|
65
|
-
data_text.insert(0, "\t")
|
66
|
-
data_text.scan(/\t([^\t]*)/) do |(value_text)|
|
67
|
-
value = load_value(value_text)
|
68
|
-
event_data.data << value
|
69
|
-
end
|
41
|
+
event_data.data = data
|
70
42
|
|
71
43
|
event_data
|
72
44
|
end
|
73
45
|
|
74
|
-
def self.
|
75
|
-
|
76
|
-
|
77
|
-
if match_data['integer']
|
78
|
-
Integer(value_text)
|
79
|
-
elsif match_data['time']
|
80
|
-
year = match_data['year'].to_i
|
81
|
-
month = match_data['month'].to_i
|
82
|
-
day = match_data['day'].to_i
|
83
|
-
hour = match_data['hour'].to_i
|
84
|
-
minute = match_data['minute'].to_i
|
85
|
-
second = match_data['second'].to_i
|
86
|
-
|
87
|
-
nanosecond = match_data['nanosecond'].to_i
|
88
|
-
usec = Rational(nanosecond, 1_000)
|
89
|
-
|
90
|
-
Time.utc(year, month, day, hour, minute, second, usec)
|
91
|
-
elsif match_data['nil']
|
92
|
-
nil
|
93
|
-
elsif match_data['true']
|
94
|
-
true
|
95
|
-
elsif match_data['false']
|
96
|
-
false
|
97
|
-
elsif match_data['string']
|
98
|
-
value_text.undump
|
99
|
-
end
|
46
|
+
def self.timestamp(time)
|
47
|
+
time.strftime('%Y-%m-%dT%H:%M:%S.%NZ')
|
100
48
|
end
|
101
49
|
|
102
|
-
|
103
|
-
|
104
|
-
event_data.match(data)
|
105
|
-
end
|
50
|
+
def self.time(timestamp)
|
51
|
+
match_data = time_pattern.match(timestamp)
|
106
52
|
|
107
|
-
|
108
|
-
|
109
|
-
|
53
|
+
year = match_data['year'].to_i
|
54
|
+
month = match_data['month'].to_i
|
55
|
+
day = match_data['day'].to_i
|
56
|
+
hour = match_data['hour'].to_i
|
57
|
+
minute = match_data['minute'].to_i
|
58
|
+
second = match_data['second'].to_i
|
110
59
|
|
111
|
-
|
112
|
-
|
113
|
-
end
|
60
|
+
nanosecond = match_data['nanosecond'].to_i
|
61
|
+
usec = Rational(nanosecond, 1_000)
|
114
62
|
|
115
|
-
|
116
|
-
|
117
|
-
end
|
118
|
-
|
119
|
-
def self.process_id
|
120
|
-
%r{(?<process_id>#{integer})}
|
121
|
-
end
|
122
|
-
|
123
|
-
def self.value_pattern
|
124
|
-
@value_pattern ||= %r{\A#{value}\z}
|
125
|
-
end
|
126
|
-
|
127
|
-
def self.time_attribute
|
128
|
-
%r{(?<time_attribute>#{time})}
|
129
|
-
end
|
130
|
-
|
131
|
-
def self.data
|
132
|
-
%r{(?<data>#{value}(?:\t#{value})*)}
|
133
|
-
end
|
134
|
-
|
135
|
-
def self.value
|
136
|
-
%r{#{integer}|#{time}|#{self.nil}|#{boolean}|#{string}}
|
137
|
-
end
|
138
|
-
|
139
|
-
def self.integer
|
140
|
-
%r{(?<integer>[[:digit:]]+)}
|
141
|
-
end
|
142
|
-
|
143
|
-
def self.time
|
144
|
-
year = %r{(?<year>[[:digit:]]{4})}
|
145
|
-
month = %r{(?<month>[[:digit:]]{2})}
|
146
|
-
day = %r{(?<day>[[:digit:]]{2})}
|
147
|
-
hour = %r{(?<hour>[[:digit:]]{2})}
|
148
|
-
minute = %r{(?<minute>[[:digit:]]{2})}
|
149
|
-
second = %r{(?<second>[[:digit:]]{2})}
|
150
|
-
nanosecond = %r{(?<nanosecond>[[:digit:]]{9})}
|
151
|
-
|
152
|
-
%r{(?<time>#{year}-#{month}-#{day}T#{hour}:#{minute}:#{second}\.#{nanosecond}Z)}
|
153
|
-
end
|
154
|
-
|
155
|
-
def self.nil
|
156
|
-
%r{(?<nil>(?=[\t\r\z])?)}
|
157
|
-
end
|
158
|
-
|
159
|
-
def self.boolean
|
160
|
-
%r{(?<true>true)|(?<false>false)}
|
161
|
-
end
|
63
|
+
Time.utc(year, month, day, hour, minute, second, usec)
|
64
|
+
end
|
162
65
|
|
163
|
-
|
164
|
-
|
165
|
-
|
66
|
+
def self.time_pattern
|
67
|
+
@time_pattern ||=
|
68
|
+
begin
|
69
|
+
year = %r{(?<year>[[:digit:]]{4})}
|
70
|
+
month = %r{(?<month>[[:digit:]]{2})}
|
71
|
+
day = %r{(?<day>[[:digit:]]{2})}
|
72
|
+
hour = %r{(?<hour>[[:digit:]]{2})}
|
73
|
+
minute = %r{(?<minute>[[:digit:]]{2})}
|
74
|
+
second = %r{(?<second>[[:digit:]]{2})}
|
75
|
+
nanosecond = %r{(?<nanosecond>[[:digit:]]{9})}
|
76
|
+
|
77
|
+
%r{\A#{year}-#{month}-#{day}T#{hour}:#{minute}:#{second}\.#{nanosecond}Z\z}
|
78
|
+
end
|
166
79
|
end
|
167
80
|
end
|
168
81
|
end
|
@@ -4,17 +4,23 @@ module TestBench
|
|
4
4
|
class File
|
5
5
|
include Sink
|
6
6
|
|
7
|
-
attr_reader :
|
7
|
+
attr_reader :file
|
8
8
|
|
9
|
-
def initialize(
|
10
|
-
@
|
9
|
+
def initialize(file)
|
10
|
+
@file = file
|
11
11
|
end
|
12
12
|
|
13
|
-
def self.
|
14
|
-
::File.open(
|
15
|
-
instance = new(io)
|
13
|
+
def self.build(file_path)
|
14
|
+
file = ::File.open(file_path, 'w')
|
16
15
|
|
17
|
-
|
16
|
+
new(file)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.open(file_path, &block)
|
20
|
+
::File.open(file_path, 'w') do |file|
|
21
|
+
instance = new(file)
|
22
|
+
|
23
|
+
block.(instance, file)
|
18
24
|
|
19
25
|
return instance
|
20
26
|
end
|
@@ -23,7 +29,7 @@ module TestBench
|
|
23
29
|
def receive(event_data)
|
24
30
|
text = event_data.dump
|
25
31
|
|
26
|
-
|
32
|
+
file.write(text)
|
27
33
|
end
|
28
34
|
end
|
29
35
|
end
|
@@ -6,20 +6,6 @@ module TestBench
|
|
6
6
|
|
7
7
|
include Telemetry::Sink
|
8
8
|
|
9
|
-
def self.read(path)
|
10
|
-
file_text = ::File.read(path)
|
11
|
-
|
12
|
-
instance = new
|
13
|
-
|
14
|
-
file_text.each_line do |event_data_text|
|
15
|
-
event_data = Telemetry::EventData.load(event_data_text)
|
16
|
-
|
17
|
-
instance.receive(event_data)
|
18
|
-
end
|
19
|
-
|
20
|
-
instance
|
21
|
-
end
|
22
|
-
|
23
9
|
def received_events
|
24
10
|
@received_events ||= []
|
25
11
|
end
|
@@ -25,7 +25,16 @@ module TestBench
|
|
25
25
|
def any_event?(...) = sink.any_event?(...)
|
26
26
|
alias :event? :any_event?
|
27
27
|
def events(...) = sink.events(...)
|
28
|
-
|
28
|
+
|
29
|
+
def recorded?(event_or_event_data)
|
30
|
+
case event_or_event_data
|
31
|
+
in Event => event
|
32
|
+
event_data = Event::Export.(event)
|
33
|
+
in EventData => event_data
|
34
|
+
end
|
35
|
+
|
36
|
+
sink.received?(event_data)
|
37
|
+
end
|
29
38
|
end
|
30
39
|
end
|
31
40
|
end
|
@@ -34,9 +34,6 @@ module TestBench
|
|
34
34
|
event_data = event
|
35
35
|
end
|
36
36
|
|
37
|
-
event_data.process_id ||= process_id
|
38
|
-
event_data.time ||= current_time
|
39
|
-
|
40
37
|
sinks.each do |sink|
|
41
38
|
sink.receive(event_data)
|
42
39
|
end
|
@@ -44,22 +41,6 @@ module TestBench
|
|
44
41
|
event_data
|
45
42
|
end
|
46
43
|
|
47
|
-
def current_time
|
48
|
-
self.class.current_time
|
49
|
-
end
|
50
|
-
|
51
|
-
def process_id
|
52
|
-
self.class.process_id
|
53
|
-
end
|
54
|
-
|
55
|
-
def self.current_time
|
56
|
-
::Time.now
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.process_id
|
60
|
-
::Process.pid
|
61
|
-
end
|
62
|
-
|
63
44
|
def register(sink)
|
64
45
|
if registered?(sink)
|
65
46
|
raise RegistrationError, "Already registered #{sink.inspect}"
|
data/lib/test_bench/telemetry.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
1
3
|
require 'test_bench/random'
|
2
4
|
|
3
5
|
require 'test_bench/telemetry/event_data'
|
@@ -9,7 +11,6 @@ require 'test_bench/telemetry/sink'
|
|
9
11
|
require 'test_bench/telemetry/sink/file'
|
10
12
|
require 'test_bench/telemetry/sink/handler/event_registry'
|
11
13
|
require 'test_bench/telemetry/sink/handler'
|
12
|
-
require 'test_bench/telemetry/sink/projection'
|
13
14
|
|
14
15
|
require 'test_bench/telemetry/telemetry'
|
15
16
|
|
metadata
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: test_bench-telemetry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0.0.pre.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
8
|
-
autorequire:
|
7
|
+
- Brightworks Digital
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date: 2023-07-26 00:00:00.000000000 Z
|
12
10
|
dependencies:
|
13
11
|
- !ruby/object:Gem::Dependency
|
14
12
|
name: test_bench-random
|
@@ -25,7 +23,7 @@ dependencies:
|
|
25
23
|
- !ruby/object:Gem::Version
|
26
24
|
version: '0'
|
27
25
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: test_bench-
|
26
|
+
name: test_bench-bootstrap
|
29
27
|
requirement: !ruby/object:Gem::Requirement
|
30
28
|
requirements:
|
31
29
|
- - ">="
|
@@ -38,42 +36,50 @@ dependencies:
|
|
38
36
|
- - ">="
|
39
37
|
- !ruby/object:Gem::Version
|
40
38
|
version: '0'
|
41
|
-
description:
|
42
|
-
email:
|
39
|
+
description: Telemetry publication and subscription for TestBench.
|
40
|
+
email: development@bright.works
|
43
41
|
executables: []
|
44
42
|
extensions: []
|
45
43
|
extra_rdoc_files: []
|
46
44
|
files:
|
47
|
-
- lib/test_bench
|
48
|
-
- lib/test_bench/telemetry
|
49
|
-
- lib/test_bench/telemetry/controls
|
50
|
-
- lib/test_bench/telemetry/controls/event
|
45
|
+
- lib/test_bench
|
46
|
+
- lib/test_bench/telemetry
|
47
|
+
- lib/test_bench/telemetry/controls
|
48
|
+
- lib/test_bench/telemetry/controls/event
|
51
49
|
- lib/test_bench/telemetry/controls/event/metadata.rb
|
50
|
+
- lib/test_bench/telemetry/controls/event.rb
|
52
51
|
- lib/test_bench/telemetry/controls/event_data.rb
|
53
|
-
- lib/test_bench/telemetry/controls/file.rb
|
54
52
|
- lib/test_bench/telemetry/controls/handler.rb
|
53
|
+
- lib/test_bench/telemetry/controls/path
|
54
|
+
- lib/test_bench/telemetry/controls/path/file.rb
|
55
55
|
- lib/test_bench/telemetry/controls/process_id.rb
|
56
|
-
- lib/test_bench/telemetry/controls/projection.rb
|
57
|
-
- lib/test_bench/telemetry/controls/projection/receiver.rb
|
58
56
|
- lib/test_bench/telemetry/controls/random.rb
|
59
57
|
- lib/test_bench/telemetry/controls/sink.rb
|
60
58
|
- lib/test_bench/telemetry/controls/time.rb
|
59
|
+
- lib/test_bench/telemetry/controls.rb
|
61
60
|
- lib/test_bench/telemetry/event.rb
|
62
|
-
- lib/test_bench/telemetry/event_data
|
61
|
+
- lib/test_bench/telemetry/event_data
|
63
62
|
- lib/test_bench/telemetry/event_data/serialization.rb
|
64
|
-
- lib/test_bench/telemetry/
|
63
|
+
- lib/test_bench/telemetry/event_data.rb
|
64
|
+
- lib/test_bench/telemetry/sink
|
65
65
|
- lib/test_bench/telemetry/sink/file.rb
|
66
|
-
- lib/test_bench/telemetry/sink/handler
|
66
|
+
- lib/test_bench/telemetry/sink/handler
|
67
67
|
- lib/test_bench/telemetry/sink/handler/event_registry.rb
|
68
|
-
- lib/test_bench/telemetry/sink/
|
69
|
-
- lib/test_bench/telemetry/
|
68
|
+
- lib/test_bench/telemetry/sink/handler.rb
|
69
|
+
- lib/test_bench/telemetry/sink.rb
|
70
|
+
- lib/test_bench/telemetry/substitute
|
70
71
|
- lib/test_bench/telemetry/substitute/sink.rb
|
72
|
+
- lib/test_bench/telemetry/substitute.rb
|
71
73
|
- lib/test_bench/telemetry/telemetry.rb
|
72
|
-
|
74
|
+
- lib/test_bench/telemetry.rb
|
75
|
+
homepage: http://test-bench.software
|
73
76
|
licenses:
|
74
77
|
- MIT
|
75
|
-
metadata:
|
76
|
-
|
78
|
+
metadata:
|
79
|
+
homepage_uri: http://test-bench.software
|
80
|
+
source_code_uri: https://github.com/test-bench-demo/test-bench-telemetry
|
81
|
+
allowed_push_host: https://rubygems.org
|
82
|
+
namespace: TestBench::Telemetry
|
77
83
|
rdoc_options: []
|
78
84
|
require_paths:
|
79
85
|
- lib
|
@@ -88,8 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
88
94
|
- !ruby/object:Gem::Version
|
89
95
|
version: '0'
|
90
96
|
requirements: []
|
91
|
-
rubygems_version: 3.
|
92
|
-
signing_key:
|
97
|
+
rubygems_version: 3.6.9
|
93
98
|
specification_version: 4
|
94
|
-
summary: Telemetry
|
99
|
+
summary: Telemetry publication and subscription for TestBench
|
95
100
|
test_files: []
|
@@ -1,84 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Telemetry
|
3
|
-
module Controls
|
4
|
-
module File
|
5
|
-
def self.example(...)
|
6
|
-
Temporary.example(...)
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.random
|
10
|
-
Random.example
|
11
|
-
end
|
12
|
-
|
13
|
-
module Random
|
14
|
-
def self.example(...)
|
15
|
-
Temporary::Random.example(...)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
module Name
|
20
|
-
def self.example(basename: nil, extension: nil)
|
21
|
-
basename ||= self.basename
|
22
|
-
extension ||= self.extension
|
23
|
-
|
24
|
-
"#{basename}#{extension}"
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.random
|
28
|
-
Random.example
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.basename
|
32
|
-
'some-file'
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.extension
|
36
|
-
'.some-ext'
|
37
|
-
end
|
38
|
-
|
39
|
-
module Random
|
40
|
-
def self.example(basename: nil, extension: nil)
|
41
|
-
extension ||= self.extension
|
42
|
-
|
43
|
-
basename = Basename.example(basename:)
|
44
|
-
|
45
|
-
Name.example(basename:, extension:)
|
46
|
-
end
|
47
|
-
|
48
|
-
def self.extension
|
49
|
-
suffix = Controls::Random.string[0..4]
|
50
|
-
|
51
|
-
"#{Name.extension}-#{suffix}"
|
52
|
-
end
|
53
|
-
|
54
|
-
module Basename
|
55
|
-
def self.example(basename: nil)
|
56
|
-
basename ||= Name.basename
|
57
|
-
|
58
|
-
suffix = Controls::Random.string
|
59
|
-
|
60
|
-
"#{basename}-#{suffix}"
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
module Temporary
|
67
|
-
def self.example(...)
|
68
|
-
filename = Name.example(...)
|
69
|
-
|
70
|
-
::File.join('tmp', filename)
|
71
|
-
end
|
72
|
-
|
73
|
-
module Random
|
74
|
-
def self.example(...)
|
75
|
-
filename = Name::Random.example(...)
|
76
|
-
|
77
|
-
::File.join('tmp', filename)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Telemetry
|
3
|
-
module Controls
|
4
|
-
module Projection
|
5
|
-
module Receiver
|
6
|
-
def self.example
|
7
|
-
Example.new
|
8
|
-
end
|
9
|
-
|
10
|
-
class Example
|
11
|
-
def events
|
12
|
-
@events ||= []
|
13
|
-
end
|
14
|
-
|
15
|
-
def event(event)
|
16
|
-
events << event
|
17
|
-
end
|
18
|
-
|
19
|
-
def event?(event=nil)
|
20
|
-
if not event.nil?
|
21
|
-
events.include?(event)
|
22
|
-
else
|
23
|
-
events.any?
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,84 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Telemetry
|
3
|
-
module Controls
|
4
|
-
module Projection
|
5
|
-
def self.example(receiver=nil)
|
6
|
-
receiver ||= Receiver.example
|
7
|
-
|
8
|
-
Example.new(receiver)
|
9
|
-
end
|
10
|
-
|
11
|
-
class Example
|
12
|
-
include Telemetry::Sink::Projection
|
13
|
-
|
14
|
-
attr_accessor :applied_event_data
|
15
|
-
|
16
|
-
receiver_name :some_receiver
|
17
|
-
|
18
|
-
apply Event::SomeEvent do |some_event|
|
19
|
-
receiver.event(some_event)
|
20
|
-
end
|
21
|
-
|
22
|
-
def apply_event_data(event_data)
|
23
|
-
self.applied_event_data = event_data
|
24
|
-
end
|
25
|
-
|
26
|
-
def applied?(event=nil)
|
27
|
-
receiver.event?(event)
|
28
|
-
end
|
29
|
-
|
30
|
-
def applied_event_data?(event_data)
|
31
|
-
self.applied_event_data == event_data
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
module NoApplyMethod
|
36
|
-
def self.example(receiver=nil)
|
37
|
-
receiver ||= Receiver.example
|
38
|
-
|
39
|
-
Example.new(receiver)
|
40
|
-
end
|
41
|
-
|
42
|
-
class Example
|
43
|
-
include Telemetry::Sink::Projection
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
module NoArgument
|
48
|
-
def self.example(receiver=nil)
|
49
|
-
receiver ||= Receiver.example
|
50
|
-
|
51
|
-
Example.new(receiver)
|
52
|
-
end
|
53
|
-
|
54
|
-
class Example
|
55
|
-
include Telemetry::Sink::Projection
|
56
|
-
|
57
|
-
attr_accessor :applied_event
|
58
|
-
def applied? = !!applied_event
|
59
|
-
|
60
|
-
apply Event::SomeEvent do
|
61
|
-
self.applied_event = true
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
module ApplyMethod
|
67
|
-
def self.example(event_type=nil)
|
68
|
-
event_type ||= Event::SomeEvent.event_type
|
69
|
-
|
70
|
-
event_name = TestBench::Telemetry::Event::EventName.get(event_type)
|
71
|
-
|
72
|
-
:"apply_#{event_name}"
|
73
|
-
end
|
74
|
-
|
75
|
-
def self.other_example
|
76
|
-
event_type = Event::SomeOtherEvent.event_type
|
77
|
-
|
78
|
-
example(event_type)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
@@ -1,132 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Telemetry
|
3
|
-
module Sink
|
4
|
-
module Projection
|
5
|
-
def self.included(cls)
|
6
|
-
cls.class_exec do
|
7
|
-
include Sink
|
8
|
-
include Receive
|
9
|
-
|
10
|
-
extend ReceiverNameMacro
|
11
|
-
|
12
|
-
extend ApplyMethod
|
13
|
-
extend ApplyMacro
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
attr_accessor :receiver
|
18
|
-
|
19
|
-
def initialize(receiver)
|
20
|
-
@receiver = receiver
|
21
|
-
end
|
22
|
-
|
23
|
-
module Receive
|
24
|
-
def receive(event_data)
|
25
|
-
apply(event_data)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def apply(event_or_event_data)
|
30
|
-
applies = apply?(event_or_event_data)
|
31
|
-
|
32
|
-
if applies
|
33
|
-
if event_or_event_data.is_a?(Event)
|
34
|
-
event = event_or_event_data
|
35
|
-
else
|
36
|
-
event_data = event_or_event_data
|
37
|
-
event_type = event_data.type
|
38
|
-
event_class = self.class.event_registry.get(event_type)
|
39
|
-
|
40
|
-
event = Event::Import.(event_data, event_class)
|
41
|
-
end
|
42
|
-
|
43
|
-
apply_method = apply_method(event)
|
44
|
-
|
45
|
-
if method(apply_method).parameters.any?
|
46
|
-
__send__(apply_method, event)
|
47
|
-
else
|
48
|
-
__send__(apply_method)
|
49
|
-
end
|
50
|
-
|
51
|
-
event
|
52
|
-
elsif respond_to?(:apply_event_data)
|
53
|
-
if event_or_event_data.is_a?(Event)
|
54
|
-
event_data = Event::Export.(event_or_event_data)
|
55
|
-
else
|
56
|
-
event_data = event_or_event_data
|
57
|
-
end
|
58
|
-
|
59
|
-
apply_event_data(event_data)
|
60
|
-
|
61
|
-
event_data
|
62
|
-
else
|
63
|
-
nil
|
64
|
-
end
|
65
|
-
end
|
66
|
-
alias :call :apply
|
67
|
-
|
68
|
-
def apply?(...)
|
69
|
-
apply_method = apply_method(...)
|
70
|
-
|
71
|
-
not apply_method.nil?
|
72
|
-
end
|
73
|
-
|
74
|
-
def apply_method(event_or_event_data)
|
75
|
-
apply_method = self.class.apply_method(event_or_event_data)
|
76
|
-
|
77
|
-
if respond_to?(apply_method)
|
78
|
-
apply_method
|
79
|
-
else
|
80
|
-
nil
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
module ReceiverNameMacro
|
85
|
-
def receiver_name_macro(receiver_name)
|
86
|
-
define_method(receiver_name) do
|
87
|
-
receiver
|
88
|
-
end
|
89
|
-
end
|
90
|
-
alias :receiver_name :receiver_name_macro
|
91
|
-
end
|
92
|
-
|
93
|
-
module ApplyMacro
|
94
|
-
def apply_macro(event_class, &block)
|
95
|
-
event_registry.register(event_class)
|
96
|
-
|
97
|
-
event_type = event_class.event_type
|
98
|
-
|
99
|
-
apply_method = ApplyMethod.get(event_type)
|
100
|
-
|
101
|
-
define_method(apply_method, &block)
|
102
|
-
end
|
103
|
-
alias :apply :apply_macro
|
104
|
-
|
105
|
-
def event_registry
|
106
|
-
@event_registry ||= Handler::EventRegistry.new
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
module ApplyMethod
|
111
|
-
def apply_method(event_or_event_data)
|
112
|
-
if event_or_event_data.is_a?(Event)
|
113
|
-
event = event_or_event_data
|
114
|
-
event_type = event.event_type
|
115
|
-
else
|
116
|
-
event_data = event_or_event_data
|
117
|
-
event_type = event_data.type
|
118
|
-
end
|
119
|
-
|
120
|
-
ApplyMethod.get(event_type)
|
121
|
-
end
|
122
|
-
|
123
|
-
def self.get(event_type)
|
124
|
-
event_name = Event::EventName.get(event_type)
|
125
|
-
|
126
|
-
:"apply_#{event_name}"
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|