optics-agent 0.4.4 → 0.5.3
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/README.md +23 -5
- data/lib/lib.iml +14 -0
- data/lib/optics-agent/agent.rb +68 -16
- data/lib/optics-agent/instrumenters/field.rb +1 -13
- data/lib/optics-agent/instrumenters/patch-graphql-schema.rb +9 -5
- data/lib/optics-agent/instrumenters/query.rb +43 -0
- data/lib/optics-agent/query_context.rb +31 -0
- data/lib/optics-agent/rack-middleware.rb +6 -25
- data/lib/optics-agent/reporting/detect_server_side_error.rb +18 -0
- data/lib/optics-agent/reporting/report.rb +1 -1
- data/lib/optics-agent/reporting/report_job.rb +1 -2
- data/spec/spec.iml +11 -0
- metadata +16 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0a16e6bcb59a19202e8fd8d27ee54144553f047
|
4
|
+
data.tar.gz: 3afbe9155a7e006478d9f83d5e21878205f8deac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b329520e3efac3a5b884c5bba531cdf53fd246065092a7a2be252aef290d5fac15c8e6c10fc1d193237149d826ef8fb7d44d7966d518cfc552a6c56b9446d566
|
7
|
+
data.tar.gz: 34372adda6e7e5a346ebdd9b19e41fc068c9b26b5b93fe783f003b5effce7fdfd0891fbbd081b6ab996f7276844ab8e94e51f18d590d776b63eece8b379507b5
|
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# optics-agent-ruby
|
2
|
-
Optics
|
2
|
+
Apollo Optics agent for GraphQL Monitoring in Ruby.
|
3
3
|
|
4
4
|
[](https://badge.fury.io/rb/optics-agent) [](https://travis-ci.org/apollostack/optics-agent-ruby)
|
5
5
|
|
@@ -30,7 +30,7 @@ end
|
|
30
30
|
Rails.application.config.middleware.use optics_agent.rack_middleware
|
31
31
|
```
|
32
32
|
|
33
|
-
Register Optics
|
33
|
+
Register Apollo Optics agent from your on the GraphQL context within your `graphql` action as below:
|
34
34
|
```ruby
|
35
35
|
def create
|
36
36
|
query_string = params[:query]
|
@@ -41,8 +41,8 @@ def create
|
|
41
41
|
variables: query_variables,
|
42
42
|
context: {
|
43
43
|
# This is the key line: we take the optics_agent passed in from the
|
44
|
-
# Rack environment
|
45
|
-
optics_agent: env[:optics_agent]
|
44
|
+
# Rack environment and pass it as context
|
45
|
+
optics_agent: env[:optics_agent]
|
46
46
|
}
|
47
47
|
)
|
48
48
|
|
@@ -61,6 +61,24 @@ You must:
|
|
61
61
|
3. Attach the `agent.rack_middleware` to your Rack router
|
62
62
|
4. Ensure you pass the `optics_agent` context from the rack environment to your schema execution.
|
63
63
|
|
64
|
+
### Non-HTTP queries
|
65
|
+
|
66
|
+
If you aren't actually servicing a HTTP/Rack request in executing the query, simply pass:
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
context: { optics_agent: :no_rack }
|
70
|
+
```
|
71
|
+
|
72
|
+
This will mean the query is instrumented without HTTP timings or client versions.
|
73
|
+
|
74
|
+
### Skipping queries
|
75
|
+
|
76
|
+
If you want to skip a particular query, pass:
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
context: { optics_agent: :skip }
|
80
|
+
```
|
81
|
+
|
64
82
|
### Configuration
|
65
83
|
|
66
84
|
After creating an agent, you can configure it with (the values listed are the defaults):
|
@@ -104,7 +122,7 @@ end
|
|
104
122
|
|
105
123
|
## Troubleshooting
|
106
124
|
|
107
|
-
The Optics agent is designed to allow your application to continue working, even if the agent is not configured properly.
|
125
|
+
The Apollo Optics agent is designed to allow your application to continue working, even if the agent is not configured properly.
|
108
126
|
|
109
127
|
### No data in Optics
|
110
128
|
|
data/lib/lib.iml
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<module type="RUBY_MODULE" version="4">
|
3
|
+
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
4
|
+
<exclude-output />
|
5
|
+
<content url="file://$MODULE_DIR$" />
|
6
|
+
<orderEntry type="jdk" jdkName="rbenv: 2.3.3" jdkType="RUBY_SDK" />
|
7
|
+
<orderEntry type="sourceFolder" forTests="false" />
|
8
|
+
<orderEntry type="library" scope="PROVIDED" name="faraday (v0.10.1, rbenv: 2.3.3) [gem]" level="application" />
|
9
|
+
<orderEntry type="library" scope="PROVIDED" name="google-protobuf (v3.1.0, rbenv: 2.3.3) [gem]" level="application" />
|
10
|
+
<orderEntry type="library" scope="PROVIDED" name="graphql (v1.4.0, rbenv: 2.3.3) [gem]" level="application" />
|
11
|
+
<orderEntry type="library" scope="PROVIDED" name="hitimes (v1.2.4, rbenv: 2.3.3) [gem]" level="application" />
|
12
|
+
<orderEntry type="library" scope="PROVIDED" name="io-console (v0.4.5, rbenv: 2.3.3) [gem]" level="application" />
|
13
|
+
</component>
|
14
|
+
</module>
|
data/lib/optics-agent/agent.rb
CHANGED
@@ -3,9 +3,11 @@ require 'optics-agent/instrumenters/field'
|
|
3
3
|
require 'optics-agent/reporting/report_job'
|
4
4
|
require 'optics-agent/reporting/schema_job'
|
5
5
|
require 'optics-agent/reporting/query-trace'
|
6
|
+
require 'optics-agent/reporting/detect_server_side_error'
|
6
7
|
require 'net/http'
|
7
8
|
require 'faraday'
|
8
9
|
require 'logger'
|
10
|
+
require 'time'
|
9
11
|
|
10
12
|
module OpticsAgent
|
11
13
|
class Agent
|
@@ -20,6 +22,7 @@ module OpticsAgent
|
|
20
22
|
attr_reader :schema, :report_traces
|
21
23
|
|
22
24
|
def initialize
|
25
|
+
@stats_reporting_thread = nil
|
23
26
|
@query_queue = []
|
24
27
|
@semaphone = Mutex.new
|
25
28
|
|
@@ -75,7 +78,7 @@ Perhaps you are calling both `agent.configure { schema YourSchema }` and
|
|
75
78
|
|
76
79
|
# We call this method on every request to ensure that the reporting thread
|
77
80
|
# is active in the correct process for pre-forking webservers like unicorn
|
78
|
-
def
|
81
|
+
def ensure_reporting_stats!
|
79
82
|
unless @schema
|
80
83
|
warn """No schema instrumented.
|
81
84
|
Use the `schema` configuration setting, or call `agent.instrument_schema`
|
@@ -83,30 +86,80 @@ Use the `schema` configuration setting, or call `agent.instrument_schema`
|
|
83
86
|
return
|
84
87
|
end
|
85
88
|
|
86
|
-
unless
|
89
|
+
unless reporting_stats? || disabled?
|
87
90
|
schedule_report
|
88
|
-
@reporting_thread_active = true
|
89
91
|
end
|
90
92
|
end
|
91
93
|
|
94
|
+
# @deprecated Use ensure_reporting_stats! instead
|
95
|
+
def ensure_reporting!
|
96
|
+
ensure_reporting_stats!
|
97
|
+
end
|
98
|
+
|
92
99
|
def reporting_connection
|
93
100
|
@reporting_connection ||=
|
94
|
-
Faraday.new(:url => @configuration.endpoint_url) do |
|
101
|
+
Faraday.new(:url => @configuration.endpoint_url) do |conn|
|
102
|
+
conn.request :retry,
|
103
|
+
:max => 5,
|
104
|
+
:interval => 0.1,
|
105
|
+
:max_interval => 10,
|
106
|
+
:backoff_factor => 2,
|
107
|
+
:exceptions => [Exception],
|
108
|
+
:retry_if => ->(env, exc) { true }
|
109
|
+
conn.use OpticsAgent::Reporting::DetectServerSideError
|
110
|
+
|
95
111
|
# XXX: allow setting adaptor in config
|
96
|
-
|
112
|
+
conn.adapter :net_http_persistent
|
97
113
|
end
|
98
114
|
end
|
99
115
|
|
116
|
+
def reporting_stats?
|
117
|
+
@stats_reporting_thread != nil && !!@stats_reporting_thread.status
|
118
|
+
end
|
119
|
+
|
100
120
|
def schedule_report
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
121
|
+
@semaphone.synchronize do
|
122
|
+
return if reporting_stats?
|
123
|
+
|
124
|
+
debug "spawning reporting thread"
|
125
|
+
|
126
|
+
thread = Thread.new do
|
127
|
+
begin
|
128
|
+
debug "reporting thread spawned"
|
129
|
+
|
130
|
+
report_interval = @configuration.report_interval_ms / 1000.0
|
131
|
+
last_started = Time.now
|
132
|
+
|
133
|
+
while true
|
134
|
+
next_send = last_started + report_interval
|
135
|
+
sleep_time = next_send - Time.now
|
136
|
+
|
137
|
+
if sleep_time < 0
|
138
|
+
warn 'Report took more than one interval! Some requests might appear at the wrong time.'
|
139
|
+
else
|
140
|
+
sleep sleep_time
|
141
|
+
end
|
142
|
+
|
143
|
+
debug "running reporting job"
|
144
|
+
last_started = Time.now
|
145
|
+
ReportJob.new.perform(self)
|
146
|
+
debug "finished running reporting job"
|
147
|
+
end
|
148
|
+
rescue Exception => e
|
149
|
+
warn "Stats report thread dying: #{e}"
|
150
|
+
end
|
109
151
|
end
|
152
|
+
|
153
|
+
at_exit do
|
154
|
+
if thread.status
|
155
|
+
debug 'sending last stats report before exiting'
|
156
|
+
thread.exit
|
157
|
+
ReportJob.new.perform(self)
|
158
|
+
debug 'last stats report sent'
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
@stats_reporting_thread = thread
|
110
163
|
end
|
111
164
|
end
|
112
165
|
|
@@ -142,16 +195,15 @@ Use the `schema` configuration setting, or call `agent.instrument_schema`
|
|
142
195
|
request.url path
|
143
196
|
request.headers['x-api-key'] = @configuration.api_key
|
144
197
|
request.headers['user-agent'] = "optics-agent-rb"
|
145
|
-
|
146
198
|
request.body = message.class.encode(message)
|
199
|
+
|
147
200
|
if @configuration.debug || @configuration.print_reports
|
148
201
|
log "sending message: #{message.class.encode_json(message)}"
|
149
202
|
end
|
150
203
|
end
|
151
204
|
|
152
205
|
if @configuration.debug || @configuration.print_reports
|
153
|
-
log "got response: #{response}"
|
154
|
-
log "response body: #{response.body}"
|
206
|
+
log "got response body: #{response.body}"
|
155
207
|
end
|
156
208
|
end
|
157
209
|
|
@@ -27,21 +27,9 @@ module OpticsAgent
|
|
27
27
|
def middleware(agent, parent_type, parent_object, field_definition, field_args, query_context, next_middleware)
|
28
28
|
agent_context = query_context[:optics_agent]
|
29
29
|
|
30
|
-
unless agent_context
|
31
|
-
agent.warn """No agent passed in graphql context.
|
32
|
-
Ensure you set `context: {optics_agent: env[:optics_agent].with_document(document) }``
|
33
|
-
when executing your graphql query.
|
34
|
-
If you don't want to instrument this query, pass `context: {optics_agent: :skip}`.
|
35
|
-
"""
|
36
|
-
# don't warn again for this query
|
37
|
-
agent_context = query_context[:optics_agent] = :skip
|
38
|
-
end
|
39
|
-
|
40
30
|
# This happens when an introspection query occurs (reporting schema)
|
41
31
|
# Also, people could potentially use it to skip reporting
|
42
|
-
if agent_context == :skip
|
43
|
-
return next_middleware.call
|
44
|
-
end
|
32
|
+
return next_middleware.call if agent_context == :skip
|
45
33
|
|
46
34
|
query = agent_context.query
|
47
35
|
|
@@ -4,22 +4,26 @@
|
|
4
4
|
|
5
5
|
require 'graphql'
|
6
6
|
require 'optics-agent/instrumenters/field'
|
7
|
+
require 'optics-agent/instrumenters/query'
|
7
8
|
|
8
9
|
module OpticsAgent::GraphQLSchemaExtensions
|
9
10
|
def define(**kwargs, &block)
|
10
|
-
@
|
11
|
+
@field_instrumenter = OpticsAgent::Instrumenters::Field.new
|
12
|
+
@query_instrumenter = OpticsAgent::Instrumenters::Query.new
|
11
13
|
|
12
14
|
class << self
|
13
15
|
def _attach_optics_agent(agent)
|
14
|
-
agent.debug "Attaching agent to
|
15
|
-
@
|
16
|
+
agent.debug "Attaching agent to instrumenters"
|
17
|
+
@field_instrumenter.agent = @query_instrumenter.agent = agent
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
19
|
-
|
21
|
+
field_instrumenter = @field_instrumenter
|
22
|
+
query_instrumenter = @query_instrumenter
|
20
23
|
super **kwargs do
|
21
24
|
instance_eval(&block) if block
|
22
|
-
instrument :field,
|
25
|
+
instrument :field, field_instrumenter
|
26
|
+
instrument :query, query_instrumenter
|
23
27
|
end
|
24
28
|
end
|
25
29
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'optics-agent/query_context'
|
2
|
+
|
3
|
+
module OpticsAgent
|
4
|
+
module Instrumenters
|
5
|
+
class Query
|
6
|
+
attr_accessor :agent
|
7
|
+
|
8
|
+
def before_query(query)
|
9
|
+
return unless @agent
|
10
|
+
query_context = query.context[:optics_agent]
|
11
|
+
return if query_context == :skip
|
12
|
+
|
13
|
+
@agent.ensure_reporting_stats!
|
14
|
+
|
15
|
+
# the rack request didn't add the agent, maybe there is none?
|
16
|
+
unless query_context
|
17
|
+
@agent.warn """No agent passed in graphql context.
|
18
|
+
Ensure you set `context: { optics_agent: env[:optics_agent] }` when executing your graphql query (where `env` is the rack environment).
|
19
|
+
If you aren't using the rack middleware, `context: {optics_agent: :no_rack}` to avoid this warning.
|
20
|
+
If you don't want to instrument this query, pass `context: {optics_agent: :skip}`.
|
21
|
+
"""
|
22
|
+
query_context = :no_rack
|
23
|
+
end
|
24
|
+
|
25
|
+
if query_context == :no_rack
|
26
|
+
query.context[:optics_agent] = QueryContext.new(agent)
|
27
|
+
query_context = query.context[:optics_agent]
|
28
|
+
end
|
29
|
+
|
30
|
+
query_context.with_document(query.query_string)
|
31
|
+
end
|
32
|
+
|
33
|
+
def after_query(query)
|
34
|
+
return unless @agent
|
35
|
+
query_context = query.context[:optics_agent]
|
36
|
+
return if query_context == :skip
|
37
|
+
|
38
|
+
agent.debug { "query_instrumenter: query completed" }
|
39
|
+
query_context.query_finished!
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'optics-agent/reporting/query'
|
2
|
+
|
3
|
+
class QueryContext
|
4
|
+
attr_reader :agent, :query, :no_rack
|
5
|
+
def initialize(agent, rack_env = false)
|
6
|
+
@agent = agent
|
7
|
+
@query = OpticsAgent::Reporting::Query.new
|
8
|
+
@rack_env = rack_env
|
9
|
+
end
|
10
|
+
|
11
|
+
def with_document(query_string)
|
12
|
+
@query.document = query_string
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
16
|
+
def query_finished!
|
17
|
+
finish! unless @rack_env
|
18
|
+
end
|
19
|
+
|
20
|
+
def request_finished!
|
21
|
+
finish!
|
22
|
+
end
|
23
|
+
|
24
|
+
private def finish!
|
25
|
+
if (@query.document)
|
26
|
+
@agent.debug { "query_context: Adding a query with #{@query.reports.length} field reports" }
|
27
|
+
@query.finish!
|
28
|
+
@agent.add_query(@query, @rack_env)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'optics-agent/
|
2
|
-
|
1
|
+
require 'optics-agent/query_context'
|
2
|
+
|
3
3
|
module OpticsAgent
|
4
4
|
class RackMiddleware
|
5
5
|
# Right now we assume there'll only be a single rack middleware in an
|
@@ -17,37 +17,18 @@ module OpticsAgent
|
|
17
17
|
|
18
18
|
def call(env)
|
19
19
|
agent = self.class.agent
|
20
|
-
agent.
|
20
|
+
agent.ensure_reporting_stats!
|
21
21
|
agent.debug { "rack-middleware: request started" }
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
# Attach so resolver middleware can access
|
26
|
-
env[:optics_agent] = RackAgent.new(agent, query)
|
23
|
+
# Attach so field instrumenters can access
|
24
|
+
env[:optics_agent] = QueryContext.new(agent, env)
|
27
25
|
|
28
26
|
result = @app.call(env)
|
29
27
|
|
30
28
|
agent.debug { "rack-middleware: request finished" }
|
31
|
-
|
32
|
-
agent.debug { "rack-middleware: Adding a query with #{query.reports.length} field reports" }
|
33
|
-
query.finish!
|
34
|
-
agent.add_query(query, env)
|
35
|
-
end
|
29
|
+
query = env[:optics_agent].request_finished!
|
36
30
|
|
37
31
|
result
|
38
32
|
end
|
39
33
|
end
|
40
|
-
|
41
|
-
class RackAgent
|
42
|
-
attr_reader :agent, :query
|
43
|
-
def initialize(agent, query)
|
44
|
-
@agent = agent
|
45
|
-
@query = query
|
46
|
-
end
|
47
|
-
|
48
|
-
def with_document(query_string)
|
49
|
-
@query.document = query_string
|
50
|
-
self
|
51
|
-
end
|
52
|
-
end
|
53
34
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
module OpticsAgent
|
5
|
+
module Reporting
|
6
|
+
class DetectServerSideError < Faraday::Middleware
|
7
|
+
RETRY_ON = Set.new [500, 502, 503, 504]
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
@app.call(env).on_complete do |r|
|
11
|
+
if RETRY_ON.include? env[:status]
|
12
|
+
raise "#{r[:status]} status code"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -52,7 +52,7 @@ module OpticsAgent::Reporting
|
|
52
52
|
agent.send_message('/api/ss/stats', @report)
|
53
53
|
end
|
54
54
|
|
55
|
-
def add_query(query, rack_env)
|
55
|
+
def add_query(query, rack_env = nil)
|
56
56
|
@report.per_signature[query.signature] ||= StatsPerSignature.new
|
57
57
|
signature_stats = @report.per_signature[query.signature]
|
58
58
|
|
data/spec/spec.iml
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<module type="RUBY_MODULE" version="4">
|
3
|
+
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
4
|
+
<exclude-output />
|
5
|
+
<content url="file://$MODULE_DIR$" />
|
6
|
+
<orderEntry type="jdk" jdkName="rbenv: 2.3.3" jdkType="RUBY_SDK" />
|
7
|
+
<orderEntry type="sourceFolder" forTests="false" />
|
8
|
+
<orderEntry type="library" scope="PROVIDED" name="graphql (v1.4.0, rbenv: 2.3.3) [gem]" level="application" />
|
9
|
+
<orderEntry type="library" scope="PROVIDED" name="io-console (v0.4.5, rbenv: 2.3.3) [gem]" level="application" />
|
10
|
+
</component>
|
11
|
+
</module>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: optics-agent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 'Tom Coleman '
|
@@ -30,34 +30,28 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '3.
|
33
|
+
version: '3.2'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '3.
|
40
|
+
version: '3.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: faraday
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0.
|
48
|
-
- - ">="
|
49
|
-
- !ruby/object:Gem::Version
|
50
|
-
version: 0.9.2
|
47
|
+
version: '0.11'
|
51
48
|
type: :runtime
|
52
49
|
prerelease: false
|
53
50
|
version_requirements: !ruby/object:Gem::Requirement
|
54
51
|
requirements:
|
55
52
|
- - "~>"
|
56
53
|
- !ruby/object:Gem::Version
|
57
|
-
version: '0.
|
58
|
-
- - ">="
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: 0.9.2
|
54
|
+
version: '0.11'
|
61
55
|
- !ruby/object:Gem::Dependency
|
62
56
|
name: net-http-persistent
|
63
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -65,9 +59,6 @@ dependencies:
|
|
65
59
|
- - "~>"
|
66
60
|
- !ruby/object:Gem::Version
|
67
61
|
version: '2.0'
|
68
|
-
- - ">="
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
version: 2.0.0
|
71
62
|
type: :runtime
|
72
63
|
prerelease: false
|
73
64
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -75,9 +66,6 @@ dependencies:
|
|
75
66
|
- - "~>"
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '2.0'
|
78
|
-
- - ">="
|
79
|
-
- !ruby/object:Gem::Version
|
80
|
-
version: 2.0.0
|
81
69
|
- !ruby/object:Gem::Dependency
|
82
70
|
name: hitimes
|
83
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -85,9 +73,6 @@ dependencies:
|
|
85
73
|
- - "~>"
|
86
74
|
- !ruby/object:Gem::Version
|
87
75
|
version: '1.2'
|
88
|
-
- - ">="
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
-
version: 1.2.4
|
91
76
|
type: :runtime
|
92
77
|
prerelease: false
|
93
78
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -95,37 +80,34 @@ dependencies:
|
|
95
80
|
- - "~>"
|
96
81
|
- !ruby/object:Gem::Version
|
97
82
|
version: '1.2'
|
98
|
-
- - ">="
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
version: 1.2.4
|
101
83
|
- !ruby/object:Gem::Dependency
|
102
84
|
name: rake
|
103
85
|
requirement: !ruby/object:Gem::Requirement
|
104
86
|
requirements:
|
105
87
|
- - "~>"
|
106
88
|
- !ruby/object:Gem::Version
|
107
|
-
version:
|
89
|
+
version: '12'
|
108
90
|
type: :development
|
109
91
|
prerelease: false
|
110
92
|
version_requirements: !ruby/object:Gem::Requirement
|
111
93
|
requirements:
|
112
94
|
- - "~>"
|
113
95
|
- !ruby/object:Gem::Version
|
114
|
-
version:
|
96
|
+
version: '12'
|
115
97
|
- !ruby/object:Gem::Dependency
|
116
98
|
name: rspec
|
117
99
|
requirement: !ruby/object:Gem::Requirement
|
118
100
|
requirements:
|
119
101
|
- - "~>"
|
120
102
|
- !ruby/object:Gem::Version
|
121
|
-
version: 3.5
|
103
|
+
version: '3.5'
|
122
104
|
type: :development
|
123
105
|
prerelease: false
|
124
106
|
version_requirements: !ruby/object:Gem::Requirement
|
125
107
|
requirements:
|
126
108
|
- - "~>"
|
127
109
|
- !ruby/object:Gem::Version
|
128
|
-
version: 3.5
|
110
|
+
version: '3.5'
|
129
111
|
description: An Agent for Apollo Optics, http://optics.apollodata.com
|
130
112
|
email: tom@meteor.com
|
131
113
|
executables: []
|
@@ -135,16 +117,20 @@ files:
|
|
135
117
|
- LICENSE
|
136
118
|
- README.md
|
137
119
|
- lib/apollo/optics/proto/reports_pb.rb
|
120
|
+
- lib/lib.iml
|
138
121
|
- lib/optics-agent.rb
|
139
122
|
- lib/optics-agent/agent.rb
|
140
123
|
- lib/optics-agent/instrumentation/introspection-query.graphql
|
141
124
|
- lib/optics-agent/instrumentation/query-schema.rb
|
142
125
|
- lib/optics-agent/instrumenters/field.rb
|
143
126
|
- lib/optics-agent/instrumenters/patch-graphql-schema.rb
|
127
|
+
- lib/optics-agent/instrumenters/query.rb
|
144
128
|
- lib/optics-agent/normalization/latency.rb
|
145
129
|
- lib/optics-agent/normalization/query.rb
|
130
|
+
- lib/optics-agent/query_context.rb
|
146
131
|
- lib/optics-agent/rack-middleware.rb
|
147
132
|
- lib/optics-agent/railtie.rb
|
133
|
+
- lib/optics-agent/reporting/detect_server_side_error.rb
|
148
134
|
- lib/optics-agent/reporting/helpers.rb
|
149
135
|
- lib/optics-agent/reporting/query-trace.rb
|
150
136
|
- lib/optics-agent/reporting/query.rb
|
@@ -161,6 +147,7 @@ files:
|
|
161
147
|
- spec/report_spec.rb
|
162
148
|
- spec/schema-introspection_spec.rb
|
163
149
|
- spec/schema_spec.rb
|
150
|
+
- spec/spec.iml
|
164
151
|
- spec/spec_helper.rb
|
165
152
|
- spec/support/create_starwars_schema.rb
|
166
153
|
homepage: http://rubygems.org/gems/optics-agent
|
@@ -183,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
183
170
|
version: '0'
|
184
171
|
requirements: []
|
185
172
|
rubyforge_project:
|
186
|
-
rubygems_version: 2.
|
173
|
+
rubygems_version: 2.6.8
|
187
174
|
signing_key:
|
188
175
|
specification_version: 4
|
189
176
|
summary: An Agent for Apollo Optics
|
@@ -197,5 +184,6 @@ test_files:
|
|
197
184
|
- spec/report_spec.rb
|
198
185
|
- spec/schema-introspection_spec.rb
|
199
186
|
- spec/schema_spec.rb
|
187
|
+
- spec/spec.iml
|
200
188
|
- spec/spec_helper.rb
|
201
189
|
- spec/support/create_starwars_schema.rb
|