optics-agent 0.4.4 → 0.5.3

Sign up to get free protection for your applications and to get access to all the features.
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