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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f59e8f0e2858f85ede7fbc3410cc249e213326f8
4
- data.tar.gz: dc667895f061a9edf99feb1d5bf44e1029ed0157
3
+ metadata.gz: c0a16e6bcb59a19202e8fd8d27ee54144553f047
4
+ data.tar.gz: 3afbe9155a7e006478d9f83d5e21878205f8deac
5
5
  SHA512:
6
- metadata.gz: 5859a00a6d4f2e051948dc7e64357453c7327cff2195846732e2da0abf0c13344093aecc8f4b93157e275accec009c6977fc14a74cc4f5fac5277a492df1f4e8
7
- data.tar.gz: 8c82ad95ee7d2363c76cfbc846323c23e87650aaf09f4e4ad00a5eda5785ecc46a2af5adf20b5fc6fbcdad7df23e3a77ee3b5a718646c746b1d4b4d4a2d19f8e
6
+ metadata.gz: b329520e3efac3a5b884c5bba531cdf53fd246065092a7a2be252aef290d5fac15c8e6c10fc1d193237149d826ef8fb7d44d7966d518cfc552a6c56b9446d566
7
+ data.tar.gz: 34372adda6e7e5a346ebdd9b19e41fc068c9b26b5b93fe783f003b5effce7fdfd0891fbbd081b6ab996f7276844ab8e94e51f18d590d776b63eece8b379507b5
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # optics-agent-ruby
2
- Optics Agent for GraphQL Monitoring in Ruby.
2
+ Apollo Optics agent for GraphQL Monitoring in Ruby.
3
3
 
4
4
  [![Gem Version](https://badge.fury.io/rb/optics-agent.svg)](https://badge.fury.io/rb/optics-agent) [![Build Status](https://travis-ci.org/apollostack/optics-agent-ruby.svg?branch=master)](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 Agent from your on the GraphQL context within your `graphql` action as below:
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, give it the query_string, and pass it as context
45
- optics_agent: env[:optics_agent].with_document(query_string)
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
 
@@ -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>
@@ -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 ensure_reporting!
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 @reporting_thread_active || disabled?
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 |faraday|
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
- faraday.adapter :net_http_persistent
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
- debug "spawning reporting thread"
102
- Thread.new do
103
- debug "reporting thread spawned"
104
- while true
105
- sleep @configuration.report_interval_ms / 1000.0
106
- debug "running reporting job"
107
- ReportJob.new.perform(self)
108
- debug "finished running reporting job"
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
- @instrumenter = OpticsAgent::Instrumenters::Field.new
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 field instrumenter"
15
- @instrumenter.agent = agent
16
+ agent.debug "Attaching agent to instrumenters"
17
+ @field_instrumenter.agent = @query_instrumenter.agent = agent
16
18
  end
17
19
  end
18
20
 
19
- instrumenter = @instrumenter
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, instrumenter
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/agent'
2
- require 'optics-agent/reporting/query'
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.ensure_reporting!
20
+ agent.ensure_reporting_stats!
21
21
  agent.debug { "rack-middleware: request started" }
22
22
 
23
- query = OpticsAgent::Reporting::Query.new
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
- if (query.document)
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
 
@@ -11,9 +11,8 @@ module OpticsAgent::Reporting
11
11
 
12
12
  report.decorate_from_schema(agent.schema)
13
13
  report.send_with(agent)
14
- rescue StandardError => e
14
+ rescue Exception => e
15
15
  agent.debug "report failed #{e}"
16
- raise
17
16
  end
18
17
  end
19
18
  end
@@ -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.4
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.1'
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.1'
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.9'
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.9'
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: 11.3.0
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: 11.3.0
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.0
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.0
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.4.5
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