optics-agent 0.1.0 → 0.1.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 +8 -8
- data/README.md +4 -3
- data/lib/apollo/optics/proto/reports_pb.rb +2 -0
- data/lib/optics-agent/reporting/helpers.rb +5 -0
- data/lib/optics-agent/reporting/query-trace.rb +4 -2
- data/lib/optics-agent/reporting/query.rb +4 -2
- data/lib/optics-agent/reporting/report.rb +3 -10
- data/spec/query_trace_spec.rb +1 -1
- data/spec/report_spec.rb +11 -11
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YmZmOWU0ZjllNzk5YzI5ZDU4ZGQ3ZjQ2ZmQzNGQxYTE1OWYyMDFiYw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MzkyZTYyNDJlZjZlNmYwZTk4ODIyMGQyZjk0ZGRjNjE0MzdlZDllMg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MjZlNTA4NTZjMTRmMDAxMmUzOTgyNGE5YWJlOTM1YjdiNTlmNmZjMTA3MmYw
|
10
|
+
NTAyZWI5OTRjMGMwYThlM2JkY2JhNzE0NmRiODQ4MjQ3ZTUzNDA0Yzc2NDU4
|
11
|
+
Y2VmOGRjYWQyOGNiM2YxZTQ4OTVkM2JjMWE2ZGYxNzRiZDExMDE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MmI1NjhiNzI4YTNiOGJkMmY2NGY5ZTYwMTExMmFlMDA1YTAyNWRhMzllYWVm
|
14
|
+
ZDgzMGQzYTM2OTU5MzcxZjIzN2UxODhmYzQ1NDgyZWQ2NDUyMDZiZTRkZGI5
|
15
|
+
OWI2MGMyMWEyNzcyYTM1NThiZmRiNTZjODA5M2YzMmZiYmNjZDY=
|
data/README.md
CHANGED
@@ -3,7 +3,8 @@ Optics Agent for GraphQL Monitoring in Ruby.
|
|
3
3
|
|
4
4
|
This is an alpha release, suitable for use in development contexts. There are still some outstanding improvements to make it ready for production contexts; see the [known limitations](#known-limitations) section below.
|
5
5
|
|
6
|
-
[](https://travis-ci.org/apollostack/optics-agent-ruby)
|
6
|
+
[](https://badge.fury.io/rb/optics-agent) [](https://travis-ci.org/apollostack/optics-agent-ruby)
|
7
|
+
|
7
8
|
|
8
9
|
## Installing
|
9
10
|
|
@@ -19,7 +20,7 @@ To your `Gemfile`
|
|
19
20
|
|
20
21
|
### API key
|
21
22
|
|
22
|
-
You'll need to run your app with the `OPTICS_API_KEY` environment variable set to the
|
23
|
+
You'll need to run your app with the `OPTICS_API_KEY` environment variable set to the API key of your Apollo Optics service; at the moment Optics is in early access alpha--[get in touch](http://www.apollostack.com/optics) if you want to be part of our early access program.
|
23
24
|
|
24
25
|
### Basic Rack/Sinatra
|
25
26
|
|
@@ -135,5 +136,5 @@ bundle install
|
|
135
136
|
Compile the `.proto` definitions with
|
136
137
|
|
137
138
|
```bash
|
138
|
-
bundle exec rake
|
139
|
+
bundle exec rake protobuf:compile
|
139
140
|
```
|
@@ -19,6 +19,8 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
19
19
|
optional :server_id, :message, 1, "apollo.optics.proto.Id128"
|
20
20
|
optional :client_id, :message, 2, "apollo.optics.proto.Id128"
|
21
21
|
optional :start_time, :message, 4, "apollo.optics.proto.Timestamp"
|
22
|
+
optional :end_time, :message, 3, "apollo.optics.proto.Timestamp"
|
23
|
+
optional :duration_ns, :uint64, 11
|
22
24
|
optional :signature, :string, 5
|
23
25
|
optional :details, :message, 6, "apollo.optics.proto.Trace.Details"
|
24
26
|
optional :client_name, :string, 7
|
@@ -15,6 +15,11 @@ module OpticsAgent::Reporting
|
|
15
15
|
});
|
16
16
|
end
|
17
17
|
|
18
|
+
def duration_nanos(start_time, end_time)
|
19
|
+
throw "start_time before end_time" if (start_time > end_time)
|
20
|
+
((end_time - start_time) * 1e9).to_i
|
21
|
+
end
|
22
|
+
|
18
23
|
# XXX: implement
|
19
24
|
def client_info(rack_env)
|
20
25
|
{
|
@@ -14,6 +14,8 @@ module OpticsAgent::Reporting
|
|
14
14
|
def initialize(query, rack_env, start_time, end_time)
|
15
15
|
trace = Trace.new({
|
16
16
|
start_time: generate_timestamp(start_time),
|
17
|
+
end_time: generate_timestamp(end_time),
|
18
|
+
duration_ns: duration_nanos(start_time, end_time),
|
17
19
|
signature: query.signature
|
18
20
|
})
|
19
21
|
|
@@ -33,8 +35,8 @@ module OpticsAgent::Reporting
|
|
33
35
|
query.each_report do |type_name, field_name, field_start_time, field_end_time|
|
34
36
|
nodes << Trace::Node.new({
|
35
37
|
field_name: "#{type_name}.#{field_name}",
|
36
|
-
start_time: (
|
37
|
-
end_time: (
|
38
|
+
start_time: duration_nanos(start_time, field_start_time),
|
39
|
+
end_time: duration_nanos(start_time, field_end_time)
|
38
40
|
})
|
39
41
|
end
|
40
42
|
trace.execute = Trace::Node.new({
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'apollo/optics/proto/reports_pb'
|
2
2
|
require 'optics-agent/reporting/helpers'
|
3
3
|
require 'optics-agent/normalization/latency'
|
4
|
+
require 'optics-agent/normalization/query'
|
4
5
|
|
5
6
|
module OpticsAgent::Reporting
|
6
7
|
# This is a convenience class that enables us to fairly blindly
|
@@ -9,6 +10,7 @@ module OpticsAgent::Reporting
|
|
9
10
|
include Apollo::Optics::Proto
|
10
11
|
include OpticsAgent::Reporting
|
11
12
|
include OpticsAgent::Normalization
|
13
|
+
include OpticsAgent::Normalization::Query
|
12
14
|
|
13
15
|
attr_accessor :document
|
14
16
|
|
@@ -16,6 +18,7 @@ module OpticsAgent::Reporting
|
|
16
18
|
@reports = []
|
17
19
|
|
18
20
|
@document = nil
|
21
|
+
@signature
|
19
22
|
end
|
20
23
|
|
21
24
|
def signature
|
@@ -25,8 +28,7 @@ module OpticsAgent::Reporting
|
|
25
28
|
throw "You must call .with_document on the optics context"
|
26
29
|
end
|
27
30
|
|
28
|
-
|
29
|
-
return document["query"].to_s
|
31
|
+
@signature ||= normalize(document["query"].to_s)
|
30
32
|
end
|
31
33
|
|
32
34
|
# we do nothing when reporting to minimize impact
|
@@ -20,20 +20,13 @@ module OpticsAgent::Reporting
|
|
20
20
|
header: ReportHeader.new({
|
21
21
|
agent_version: '1'
|
22
22
|
}),
|
23
|
-
start_time:
|
24
|
-
# XXX pass this in?
|
25
|
-
seconds: Time.now.to_i,
|
26
|
-
nanos: 0
|
27
|
-
})
|
23
|
+
start_time: generate_timestamp(Time.now)
|
28
24
|
})
|
29
25
|
end
|
30
26
|
|
31
27
|
def finish!
|
32
|
-
@report.end_time ||=
|
33
|
-
|
34
|
-
seconds: Time.now.to_i,
|
35
|
-
nanos: 0
|
36
|
-
})
|
28
|
+
@report.end_time ||= generate_timestamp(Time.now)
|
29
|
+
@report.realtime_duration || duration_nanos(@report.start_time, @report.end_time)
|
37
30
|
end
|
38
31
|
|
39
32
|
def send
|
data/spec/query_trace_spec.rb
CHANGED
@@ -23,7 +23,7 @@ describe QueryTrace do
|
|
23
23
|
query.report_field 'Person', 'firstName', 1, 1.1
|
24
24
|
query.report_field 'Person', 'lastName', 1, 1.1
|
25
25
|
query.report_field 'Query', 'person', 1, 1.22
|
26
|
-
query.document = DocumentMock.new('
|
26
|
+
query.document = DocumentMock.new('{field}')
|
27
27
|
|
28
28
|
trace = QueryTrace.new(query, {}, 1, 1.25)
|
29
29
|
|
data/spec/report_spec.rb
CHANGED
@@ -23,7 +23,7 @@ describe Report do
|
|
23
23
|
query.report_field 'Person', 'firstName', 1, 1.1
|
24
24
|
query.report_field 'Person', 'lastName', 1, 1.1
|
25
25
|
query.report_field 'Query', 'person', 1, 1.22
|
26
|
-
query.document = DocumentMock.new('
|
26
|
+
query.document = DocumentMock.new('{field}')
|
27
27
|
|
28
28
|
report = Report.new
|
29
29
|
report.add_query query, {}, 1, 1.25
|
@@ -31,7 +31,7 @@ describe Report do
|
|
31
31
|
|
32
32
|
expect(report.report).to be_an_instance_of(StatsReport)
|
33
33
|
stats_report = report.report
|
34
|
-
expect(stats_report.per_signature.keys).to match_array(['
|
34
|
+
expect(stats_report.per_signature.keys).to match_array(['{field}'])
|
35
35
|
|
36
36
|
signature_stats = stats_report.per_signature.values.first
|
37
37
|
expect(signature_stats.per_type.length).to equal(2)
|
@@ -52,13 +52,13 @@ describe Report do
|
|
52
52
|
queryOne.report_field 'Person', 'firstName', 1, 1.1
|
53
53
|
queryOne.report_field 'Person', 'lastName', 1, 1.1
|
54
54
|
queryOne.report_field 'Query', 'person', 1, 1.22
|
55
|
-
queryOne.document = DocumentMock.new('
|
55
|
+
queryOne.document = DocumentMock.new('{field}')
|
56
56
|
|
57
57
|
queryTwo = Query.new
|
58
58
|
queryTwo.report_field 'Person', 'firstName', 1, 1.05
|
59
59
|
queryTwo.report_field 'Person', 'lastName', 1, 1.05
|
60
60
|
queryTwo.report_field 'Query', 'person', 1, 1.2
|
61
|
-
queryTwo.document = DocumentMock.new('
|
61
|
+
queryTwo.document = DocumentMock.new('{field}')
|
62
62
|
|
63
63
|
report = Report.new
|
64
64
|
report.add_query queryOne, {}, 1, 1.1
|
@@ -67,7 +67,7 @@ describe Report do
|
|
67
67
|
|
68
68
|
expect(report.report).to be_an_instance_of(StatsReport)
|
69
69
|
stats_report = report.report
|
70
|
-
expect(stats_report.per_signature.keys).to match_array(['
|
70
|
+
expect(stats_report.per_signature.keys).to match_array(['{field}'])
|
71
71
|
|
72
72
|
signature_stats = stats_report.per_signature.values.first
|
73
73
|
expect(signature_stats.per_type.length).to equal(2)
|
@@ -88,13 +88,13 @@ describe Report do
|
|
88
88
|
queryOne.report_field 'Person', 'firstName', 1, 1.1
|
89
89
|
queryOne.report_field 'Person', 'lastName', 1, 1.1
|
90
90
|
queryOne.report_field 'Query', 'person', 1, 1.22
|
91
|
-
queryOne.document = DocumentMock.new('
|
91
|
+
queryOne.document = DocumentMock.new('{fieldOne}')
|
92
92
|
|
93
93
|
queryTwo = Query.new
|
94
94
|
queryTwo.report_field 'Person', 'firstName', 1, 1.05
|
95
95
|
queryTwo.report_field 'Person', 'lastName', 1, 1.05
|
96
96
|
queryTwo.report_field 'Query', 'person', 1, 1.02
|
97
|
-
queryTwo.document = DocumentMock.new('
|
97
|
+
queryTwo.document = DocumentMock.new('{fieldTwo}')
|
98
98
|
|
99
99
|
report = Report.new
|
100
100
|
report.add_query queryOne, {}, 1, 1.1
|
@@ -103,9 +103,9 @@ describe Report do
|
|
103
103
|
|
104
104
|
expect(report.report).to be_an_instance_of(StatsReport)
|
105
105
|
stats_report = report.report
|
106
|
-
expect(stats_report.per_signature.keys).to match_array(['
|
106
|
+
expect(stats_report.per_signature.keys).to match_array(['{fieldOne}', '{fieldTwo}'])
|
107
107
|
|
108
|
-
signature_stats = stats_report.per_signature['
|
108
|
+
signature_stats = stats_report.per_signature['{fieldOne}']
|
109
109
|
expect(signature_stats.per_type.length).to equal(2)
|
110
110
|
expect(signature_stats.per_type.map &:name).to match_array(['Person', 'Query'])
|
111
111
|
|
@@ -123,7 +123,7 @@ describe Report do
|
|
123
123
|
query = Query.new
|
124
124
|
query.report_field 'Person', 'firstName', 1, 1.1
|
125
125
|
query.report_field 'Person', 'age', 1, 1.1
|
126
|
-
query.document = DocumentMock.new('
|
126
|
+
query.document = DocumentMock.new('{field}')
|
127
127
|
|
128
128
|
report = Report.new
|
129
129
|
report.add_query query, {}, 1, 1.25
|
@@ -161,7 +161,7 @@ describe Report do
|
|
161
161
|
query.report_field 'Query', '__schema', 1, 1.1
|
162
162
|
query.report_field 'Query', '__typename', 1, 1.1
|
163
163
|
query.report_field 'Query', '__type', 1, 1.1
|
164
|
-
query.document = DocumentMock.new('
|
164
|
+
query.document = DocumentMock.new('{field}')
|
165
165
|
|
166
166
|
report = Report.new
|
167
167
|
report.add_query query, {}, 1, 1.25
|