graphql-metrics 4.0.2 → 4.1.0

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
  SHA256:
3
- metadata.gz: 2af911e9031c446b604b9c296caef2c89f00cb968ecf15350a6a196d6cab08d7
4
- data.tar.gz: 94e65ae882fd6222bf3b4ed9395f32dfc395ec00c85e061a458cb5fe54b9dc67
3
+ metadata.gz: 7c32ac33ad3d4dcce935518115cb51e8b619b4f06e5eaacf6eded57b0393e8d1
4
+ data.tar.gz: 466c20309ac8e7ca599580f9145c936bbcb76cb29c9f019fa28c3be3c9c46ba7
5
5
  SHA512:
6
- metadata.gz: aa3ffe4208e67594c3e65786a0a0477cdcee71506dea37988db388433eb155175d87f92e30082931e5e8c493937876e9a5a4043327b74e9e17bc474d58bd4ed9
7
- data.tar.gz: e876e9f5907cff0863a6ead3e319f34ab238b1904d0f72c8874420fdf50b5cb2941cb0f77fcfbefac35968c2bb86ec6364c5e338842dcee591eb165ee2ed14d6
6
+ metadata.gz: fc8fa91436e89b75faa0573007bb20ce3a381019231dcb6131f41a73395b4c62c990be07efadbf437c9f1c67f9a9a03ef328c3d379e57132dcee00332489bf7f
7
+ data.tar.gz: d465979e9f3b3ea7b7f17c0275a48bd629ab45f80eeb89e69dc7d8040dd8f615e7a23bfefdab0befb04402d192e11dfb818417c65f930dd8fdcdd3eae030715b
data/.gitignore CHANGED
@@ -7,5 +7,5 @@
7
7
  /spec/reports/
8
8
  /tmp/
9
9
  *.gem
10
-
10
+ Gemfile.lock
11
11
  /vendor/
data/CHANGELOG.md CHANGED
@@ -1,3 +1,25 @@
1
+ 4.1.0
2
+ -----
3
+ - [42](https://github.com/Shopify/graphql-metrics/pull/42) Capture timing of the `lex` phase.
4
+
5
+ 4.0.6
6
+ -----
7
+ - [35](https://github.com/Shopify/graphql-metrics/pull/35) Fix query start time, start time offset bugs.
8
+
9
+ 4.0.5
10
+ -----
11
+ - [34](https://github.com/Shopify/graphql-metrics/pull/34) Fix default of pre-parsed query `parsing_duration` to be Float (`0.0`) rather than Integer (`0`).
12
+
13
+ 4.0.4
14
+ -----
15
+ - [33](https://github.com/Shopify/graphql-metrics/pull/33) Setup tracing using lex or execute_multiplex tracer events.
16
+
17
+ 4.0.3
18
+ -----
19
+ - [32](https://github.com/Shopify/graphql-metrics/pull/32) Split validate and analyze_query tracer events (encompasses #30).
20
+ - [30](https://github.com/Shopify/graphql-metrics/pull/30) Handle queries that have already been parsed (thank you @jturkel).
21
+ - [29](https://github.com/Shopify/graphql-metrics/pull/29) Remove runtime dependency on activesupport (thank you @jturkel).
22
+
1
23
  4.0.2
2
24
  -----
3
25
  - [25](https://github.com/Shopify/graphql-metrics/pull/25) Safely handle interrupted runtime metrics.
data/README.md CHANGED
@@ -7,6 +7,9 @@ Compatible with the [`graphql-batch` gem](https://github.com/Shopify/graphql-bat
7
7
 
8
8
  Be sure to read the [CHANGELOG](CHANGELOG.md) to stay updated on feature additions, breaking changes made to this gem.
9
9
 
10
+ **NOTE**: Not tested with graphql-ruby's multiplexing feature. Metrics may not
11
+ be accurate if you execute multiple operations at once.
12
+
10
13
  ## Installation
11
14
 
12
15
  Add this line to your application's Gemfile:
@@ -44,18 +47,16 @@ etc.
44
47
 
45
48
  What you do with these captured metrics is up to you!
46
49
 
47
- **NOTE**: Runtime metrics on for queries (like `query_duration`, `parsing_start_time_offset` etc.) as well as field
48
- resolver timings (like `resolver_timings`, `lazy_resolver_timings`) may not be present in the extracted `metrics` hash,
50
+ **NOTE**: If any non-`graphql-ruby` gem-related exceptions occur in your application during query document
51
+ parsing and validation, **runtime metrics** for queries (like `query_duration`, `parsing_start_time_offset` etc.) as well as field
52
+ resolver timings (like `resolver_timings`, `lazy_resolver_timings`) **may not be present** in the extracted `metrics` hash,
49
53
  even if you opt to collect them by using `GraphQL::Metrics::Analyzer` and `GraphQL::Metrics::Tracer`.
50
54
 
51
- More specifically, if any non-`graphql-ruby` gem-related exceptions occur in your application during query document
52
- parsing and validation runtime metrics will not be added to the `metrics` hash.
53
-
54
55
  ### Define your own analyzer subclass
55
56
 
56
57
  ```ruby
57
- class CaptureAllMetricsAnalyzer < GraphQL::Metrics::Analyzer
58
- ANALYZER_NAMESPACE = :capture_all_metrics_analyzer_namespace
58
+ class SimpleAnalyzer < GraphQL::Metrics::Analyzer
59
+ ANALYZER_NAMESPACE = :simple_analyzer_namespace
59
60
 
60
61
  def initialize(query_or_multiplex)
61
62
  super
@@ -74,10 +75,15 @@ parsing and validation runtime metrics will not be added to the `metrics` hash.
74
75
  # operation_name: "PostDetails",
75
76
  # query_start_time: 1573833076.027327,
76
77
  # query_duration: 2.0207119999686256,
78
+ # lexing_start_time_offset: 0.0010339999571442604,
79
+ # lexing_duration: 0.0008190000080503523,
77
80
  # parsing_start_time_offset: 0.0010339999571442604,
78
81
  # parsing_duration: 0.0008190000080503523,
79
82
  # validation_start_time_offset: 0.0030819999519735575,
80
83
  # validation_duration: 0.01704599999357015,
84
+ # analysis_start_time_offset: 0.0010339999571442604,
85
+ # analysis_duration: 0.0008190000080503523,
86
+ # multiplex_start_time: 0.0008190000080503523,
81
87
  # }
82
88
  #
83
89
  # You can use these metrics to track high-level query performance, along with any other details you wish to
@@ -178,9 +184,6 @@ class Schema < GraphQL::Schema
178
184
  query QueryRoot
179
185
  mutation MutationRoot
180
186
 
181
- use GraphQL::Execution::Interpreter # Required.
182
- use GraphQL::Analysis::AST # Required.
183
-
184
187
  query_analyzer SimpleAnalyzer
185
188
 
186
189
  instrument :query, GraphQL::Metrics::Instrumentation.new # Both of these are required if either is used.
@@ -200,9 +203,6 @@ class Schema < GraphQL::Schema
200
203
  query QueryRoot
201
204
  mutation MutationRoot
202
205
 
203
- use GraphQL::Execution::Interpreter # Required.
204
- use GraphQL::Analysis::AST # Required.
205
-
206
206
  query_analyzer SimpleAnalyzer
207
207
  end
208
208
  ```
@@ -221,12 +221,15 @@ your application as intended, here's a breakdown of the order of execution of th
221
221
 
222
222
  When used as instrumentation, an analyzer and tracing, the order of execution is:
223
223
 
224
- * Tracer.setup_tracing_before_lexing
224
+ * Tracer.capture_lexing_time
225
225
  * Tracer.capture_parsing_time
226
+ * Tracer.capture_multiplex_start_time
226
227
  * Instrumentation.before_query (context setup)
227
- * Tracer.capture_validation_time (twice, once for `analyze_query`, then `analyze_multiplex`)
228
+ * Tracer.capture_validation_time
229
+ * Tracer.capture_analysis_time
228
230
  * Analyzer#initialize (bit more context setup, instance vars setup)
229
231
  * Analyzer#result
232
+ * Tracer.capture_query_start_time
230
233
  * Tracer.trace_field (n times)
231
234
  * Instrumentation.after_query (call query and field callbacks, now that we have all static and runtime metrics
232
235
  gathered)
@@ -250,7 +253,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
250
253
 
251
254
  ## Contributing
252
255
 
253
- Bug reports and pull requests are welcome on GitHub at https://github.com/Shopify/graphql_metrics. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
256
+ Bug reports and pull requests are welcome on GitHub at https://github.com/Shopify/graphql-metrics. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
254
257
 
255
258
  ## License
256
259
 
data/RELEASING ADDED
@@ -0,0 +1,15 @@
1
+ Releasing graphql-metrics
2
+
3
+ 1. Check the Semantic Versioning page for info on how to version the new release: http://semver.org
4
+ 2. Update VERSION in lib/graphql/metrics/version.rb
5
+ 3. Add a CHANGELOG entry for the new release
6
+ 4. Commit the changes with a commit message like "Packaging for release X.Y.Z"
7
+ 5. Tag the release with the version (Leave REV blank for HEAD or provide a SHA)
8
+ $ git tag vX.Y.Z REV
9
+ 6. Push out the changes
10
+ $ git push
11
+ 7. Push out the tags
12
+ $ git push --tags
13
+ 8. Publish the gem
14
+ $ gem build graphql_metrics.gemspec
15
+ $ gem push graphql-metrics-X.Y.Z.gem
@@ -22,12 +22,18 @@ module GraphQL
22
22
  ANALYZER_INSTANCE_KEY = :analyzer_instance
23
23
 
24
24
  # Context keys to store timings for query phases of execution, field resolver timings.
25
+ MULTIPLEX_START_TIME = :multiplex_start_time
26
+ MULTIPLEX_START_TIME_MONOTONIC = :multiplex_start_time_monotonic
25
27
  QUERY_START_TIME = :query_start_time
26
28
  QUERY_START_TIME_MONOTONIC = :query_start_time_monotonic
29
+ LEXING_START_TIME_OFFSET = :lexing_start_time_offset
30
+ LEXING_DURATION = :lexing_duration
27
31
  PARSING_START_TIME_OFFSET = :parsing_start_time_offset
28
32
  PARSING_DURATION = :parsing_duration
29
33
  VALIDATION_START_TIME_OFFSET = :validation_start_time_offset
30
34
  VALIDATION_DURATION = :validation_duration
35
+ ANALYSIS_START_TIME_OFFSET = :analysis_start_time_offset
36
+ ANALYSIS_DURATION = :analysis_duration
31
37
  INLINE_FIELD_TIMINGS = :inline_field_timings
32
38
  LAZY_FIELD_TIMINGS = :lazy_field_timings
33
39
 
@@ -50,7 +50,7 @@ module GraphQL
50
50
  field_name: node.name,
51
51
  return_type_name: visitor.type_definition.graphql_name,
52
52
  parent_type_name: visitor.parent_type_definition.graphql_name,
53
- deprecated: visitor.field_definition.deprecation_reason.present?,
53
+ deprecated: !visitor.field_definition.deprecation_reason.nil?,
54
54
  path: visitor.response_path,
55
55
  }
56
56
 
@@ -45,6 +45,11 @@ module GraphQL
45
45
  parsing_duration: ns[GraphQL::Metrics::PARSING_DURATION],
46
46
  validation_start_time_offset: ns[GraphQL::Metrics::VALIDATION_START_TIME_OFFSET],
47
47
  validation_duration: ns[GraphQL::Metrics::VALIDATION_DURATION],
48
+ lexing_start_time_offset: ns[GraphQL::Metrics::LEXING_START_TIME_OFFSET],
49
+ lexing_duration: ns[GraphQL::Metrics::LEXING_DURATION],
50
+ analysis_start_time_offset: ns[GraphQL::Metrics::ANALYSIS_START_TIME_OFFSET],
51
+ analysis_duration: ns[GraphQL::Metrics::ANALYSIS_DURATION],
52
+ multiplex_start_time: ns[GraphQL::Metrics::MULTIPLEX_START_TIME],
48
53
  }
49
54
 
50
55
  analyzer.extract_fields
@@ -3,10 +3,15 @@
3
3
  module GraphQL
4
4
  module Metrics
5
5
  class Tracer
6
- # NOTE: These constants come from the graphql ruby gem.
7
- GRAPHQL_GEM_LEXING_KEY = 'lex'
8
- GRAPHQL_GEM_PARSING_KEY = 'parse'
9
- GRAPHQL_GEM_VALIDATION_KEYS = ['validate', 'analyze_query']
6
+ # NOTE: These constants come from the graphql ruby gem and are in "chronological" order based on the phases
7
+ # of execution of the graphql-ruby gem. Most of them can be run multiple times when multiplexing multiple queries.
8
+ GRAPHQL_GEM_LEXING_KEY = 'lex' # may not trigger if the query is passed in pre-parsed
9
+ GRAPHQL_GEM_PARSING_KEY = 'parse' # may not trigger if the query is passed in pre-parsed
10
+ GRAPHQL_GEM_EXECUTE_MULTIPLEX_KEY = 'execute_multiplex' # wraps everything below this line; only run once
11
+ GRAPHQL_GEM_VALIDATION_KEY = 'validate'
12
+ GRAPHQL_GEM_ANALYZE_MULTIPLEX_KEY = 'analyze_multiplex' # wraps all `analyze_query`s; only run once
13
+ GRAPHQL_GEM_ANALYZE_QUERY_KEY = 'analyze_query'
14
+ GRAPHQL_GEM_EXECUTE_QUERY_KEY = 'execute_query'
10
15
  GRAPHQL_GEM_TRACING_FIELD_KEYS = [
11
16
  GRAPHQL_GEM_TRACING_FIELD_KEY = 'execute_field',
12
17
  GRAPHQL_GEM_TRACING_LAZY_FIELD_KEY = 'execute_field_lazy'
@@ -14,29 +19,32 @@ module GraphQL
14
19
 
15
20
  def trace(key, data, &block)
16
21
  # NOTE: Context doesn't exist yet during lexing, parsing.
17
- possible_context = data[:query]&.context
18
-
19
- skip_tracing = possible_context&.fetch(GraphQL::Metrics::SKIP_GRAPHQL_METRICS_ANALYSIS, false)
22
+ context = data[:query]&.context
23
+ skip_tracing = context&.fetch(GraphQL::Metrics::SKIP_GRAPHQL_METRICS_ANALYSIS, false)
20
24
  return yield if skip_tracing
21
25
 
22
- # NOTE: Not all tracing events are handled here, but those that are are handled in this case statement in
23
- # chronological order.
24
26
  case key
25
27
  when GRAPHQL_GEM_LEXING_KEY
26
- return setup_tracing_before_lexing(&block)
28
+ return capture_lexing_time(&block)
27
29
  when GRAPHQL_GEM_PARSING_KEY
28
30
  return capture_parsing_time(&block)
29
- when *GRAPHQL_GEM_VALIDATION_KEYS
30
- context = possible_context
31
-
32
- return yield unless context.query.valid?
31
+ when GRAPHQL_GEM_EXECUTE_MULTIPLEX_KEY
32
+ return capture_multiplex_start_time(&block)
33
+ when GRAPHQL_GEM_VALIDATION_KEY
33
34
  return capture_validation_time(context, &block)
35
+ when GRAPHQL_GEM_ANALYZE_MULTIPLEX_KEY
36
+ # Ensures that we reset potentially long-lived PreContext objects between multiplexs. We reset at this point
37
+ # since all parsing and validation will be done by this point, and a GraphQL::Query::Context will exist.
38
+ pre_context.reset
39
+ return yield
40
+ when GRAPHQL_GEM_ANALYZE_QUERY_KEY
41
+ return capture_analysis_time(context, &block)
42
+ when GRAPHQL_GEM_EXECUTE_QUERY_KEY
43
+ capture_query_start_time(context, &block)
34
44
  when *GRAPHQL_GEM_TRACING_FIELD_KEYS
35
- return yield if data[:query].context[SKIP_FIELD_AND_ARGUMENT_METRICS]
45
+ return yield if context[SKIP_FIELD_AND_ARGUMENT_METRICS]
36
46
  return yield unless GraphQL::Metrics.timings_capture_enabled?(data[:query].context)
37
47
 
38
- pre_context = nil
39
-
40
48
  context_key = case key
41
49
  when GRAPHQL_GEM_TRACING_FIELD_KEY
42
50
  GraphQL::Metrics::INLINE_FIELD_TIMINGS
@@ -52,44 +60,108 @@ module GraphQL
52
60
 
53
61
  private
54
62
 
63
+ PreContext = Struct.new(
64
+ :multiplex_start_time,
65
+ :multiplex_start_time_monotonic,
66
+ :parsing_start_time_offset,
67
+ :parsing_duration,
68
+ :lexing_start_time_offset,
69
+ :lexing_duration
70
+ ) do
71
+ def reset
72
+ self[:multiplex_start_time] = nil
73
+ self[:multiplex_start_time_monotonic] = nil
74
+ self[:parsing_start_time_offset] = nil
75
+ self[:parsing_duration] = nil
76
+ end
77
+ end
78
+
55
79
  def pre_context
56
80
  # NOTE: This is used to store timings from lexing, parsing, validation, before we have a context to store
57
81
  # values in. Uses thread-safe Concurrent::ThreadLocalVar to store a set of values per thread.
58
- @pre_context ||= Concurrent::ThreadLocalVar.new(OpenStruct.new)
82
+ @pre_context ||= Concurrent::ThreadLocalVar.new(PreContext.new)
83
+ @pre_context.value
59
84
  end
60
85
 
61
- def setup_tracing_before_lexing
62
- pre_context.value.query_start_time = GraphQL::Metrics.current_time
63
- pre_context.value.query_start_time_monotonic = GraphQL::Metrics.current_time_monotonic
86
+ def capture_multiplex_start_time
87
+ pre_context.multiplex_start_time = GraphQL::Metrics.current_time
88
+ pre_context.multiplex_start_time_monotonic = GraphQL::Metrics.current_time_monotonic
64
89
 
65
90
  yield
66
91
  end
67
92
 
93
+ def capture_lexing_time
94
+ # GraphQL::Query#result fires `lex` before the `execute_multiplex` event, so sometimes
95
+ # `pre_context.multiplex_start_time_monotonic` isn't set.
96
+ lexing_offset_time = pre_context.multiplex_start_time_monotonic || GraphQL::Metrics.current_time_monotonic
97
+ timed_result = GraphQL::Metrics.time(lexing_offset_time) { yield }
98
+
99
+ pre_context.lexing_start_time_offset = timed_result.start_time
100
+ pre_context.lexing_duration = timed_result.duration
101
+
102
+ timed_result.result
103
+ end
104
+
68
105
  def capture_parsing_time
69
- timed_result = GraphQL::Metrics.time { yield }
106
+ # GraphQL::Query#result fires `parse` before the `execute_multiplex` event, so sometimes
107
+ # `pre_context.multiplex_start_time_monotonic` isn't set.
108
+ parsing_offset_time = pre_context.multiplex_start_time_monotonic || GraphQL::Metrics.current_time_monotonic
109
+ timed_result = GraphQL::Metrics.time(parsing_offset_time) { yield }
70
110
 
71
- pre_context.value.parsing_start_time_offset = timed_result.start_time
72
- pre_context.value.parsing_duration = timed_result.duration
111
+ pre_context.parsing_start_time_offset = timed_result.start_time
112
+ pre_context.parsing_duration = timed_result.duration
73
113
 
74
114
  timed_result.result
75
115
  end
76
116
 
117
+ # Also consolidates parsing timings (if any) from the `pre_context`
77
118
  def capture_validation_time(context)
78
- timed_result = GraphQL::Metrics.time(pre_context.value.query_start_time_monotonic) { yield }
119
+ # Queries may already be lexed and parsed before execution (whether a single query or multiplex).
120
+ # If we don't have those values, use some sane defaults.
121
+ if pre_context.lexing_duration.nil?
122
+ pre_context.lexing_start_time_offset = pre_context.multiplex_start_time
123
+ pre_context.lexing_duration = 0.0
124
+ end
125
+ if pre_context.parsing_duration.nil?
126
+ pre_context.parsing_start_time_offset = pre_context.multiplex_start_time
127
+ pre_context.parsing_duration = 0.0
128
+ end
129
+
130
+ timed_result = GraphQL::Metrics.time(pre_context.multiplex_start_time_monotonic) { yield }
79
131
 
80
132
  ns = context.namespace(CONTEXT_NAMESPACE)
81
- previous_validation_duration = ns[GraphQL::Metrics::VALIDATION_DURATION] || 0
82
133
 
83
- ns[QUERY_START_TIME] = pre_context.value.query_start_time
84
- ns[QUERY_START_TIME_MONOTONIC] = pre_context.value.query_start_time_monotonic
85
- ns[PARSING_START_TIME_OFFSET] = pre_context.value.parsing_start_time_offset
86
- ns[PARSING_DURATION] = pre_context.value.parsing_duration
134
+ ns[MULTIPLEX_START_TIME] = pre_context.multiplex_start_time
135
+ ns[MULTIPLEX_START_TIME_MONOTONIC] = pre_context.multiplex_start_time_monotonic
136
+ ns[LEXING_START_TIME_OFFSET] = pre_context.lexing_start_time_offset
137
+ ns[LEXING_DURATION] = pre_context.lexing_duration
138
+ ns[PARSING_START_TIME_OFFSET] = pre_context.parsing_start_time_offset
139
+ ns[PARSING_DURATION] = pre_context.parsing_duration
87
140
  ns[VALIDATION_START_TIME_OFFSET] = timed_result.time_since_offset
88
- ns[VALIDATION_DURATION] = timed_result.duration + previous_validation_duration
141
+ ns[VALIDATION_DURATION] = timed_result.duration
89
142
 
90
143
  timed_result.result
91
144
  end
92
145
 
146
+ def capture_analysis_time(context)
147
+ ns = context.namespace(CONTEXT_NAMESPACE)
148
+
149
+ timed_result = GraphQL::Metrics.time(ns[MULTIPLEX_START_TIME_MONOTONIC]) { yield }
150
+
151
+ ns[ANALYSIS_START_TIME_OFFSET] = timed_result.time_since_offset
152
+ ns[ANALYSIS_DURATION] = timed_result.duration
153
+
154
+ timed_result.result
155
+ end
156
+
157
+ def capture_query_start_time(context)
158
+ ns = context.namespace(CONTEXT_NAMESPACE)
159
+ ns[QUERY_START_TIME] = GraphQL::Metrics.current_time
160
+ ns[QUERY_START_TIME_MONOTONIC] = GraphQL::Metrics.current_time_monotonic
161
+
162
+ yield
163
+ end
164
+
93
165
  def trace_field(context_key, data)
94
166
  ns = data[:query].context.namespace(CONTEXT_NAMESPACE)
95
167
  query_start_time_monotonic = ns[GraphQL::Metrics::QUERY_START_TIME_MONOTONIC]
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GraphQL
4
4
  module Metrics
5
- VERSION = "4.0.2"
5
+ VERSION = "4.1.0"
6
6
  end
7
7
  end
data/service.yml ADDED
@@ -0,0 +1 @@
1
+ classification: library
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql-metrics
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.2
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christopher Butcher
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-11 00:00:00.000000000 Z
11
+ date: 2021-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql
@@ -209,9 +209,9 @@ files:
209
209
  - CHANGELOG.md
210
210
  - CODE_OF_CONDUCT.md
211
211
  - Gemfile
212
- - Gemfile.lock
213
212
  - LICENSE.txt
214
213
  - README.md
214
+ - RELEASING
215
215
  - Rakefile
216
216
  - bin/console
217
217
  - bin/setup
@@ -221,6 +221,7 @@ files:
221
221
  - lib/graphql/metrics/instrumentation.rb
222
222
  - lib/graphql/metrics/tracer.rb
223
223
  - lib/graphql/metrics/version.rb
224
+ - service.yml
224
225
  homepage: https://github.com/Shopify/graphql-metrics
225
226
  licenses:
226
227
  - MIT
@@ -240,7 +241,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
240
241
  - !ruby/object:Gem::Version
241
242
  version: '0'
242
243
  requirements: []
243
- rubygems_version: 3.0.3
244
+ rubygems_version: 3.1.2
244
245
  signing_key:
245
246
  specification_version: 4
246
247
  summary: GraphQL Metrics Extractor
data/Gemfile.lock DELETED
@@ -1,67 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- graphql-metrics (4.0.1)
5
- concurrent-ruby (~> 1.1.0)
6
- graphql (>= 1.10.8)
7
-
8
- GEM
9
- remote: https://rubygems.org/
10
- specs:
11
- activesupport (5.1.7)
12
- concurrent-ruby (~> 1.0, >= 1.0.2)
13
- i18n (>= 0.7, < 2)
14
- minitest (~> 5.1)
15
- tzinfo (~> 1.1)
16
- byebug (11.0.1)
17
- coderay (1.1.2)
18
- concurrent-ruby (1.1.5)
19
- diffy (3.3.0)
20
- fakeredis (0.7.0)
21
- redis (>= 3.2, < 5.0)
22
- graphql (1.10.8)
23
- graphql-batch (0.4.2)
24
- graphql (>= 1.3, < 2)
25
- promise.rb (~> 0.7.2)
26
- hashdiff (1.0.0)
27
- i18n (1.7.0)
28
- concurrent-ruby (~> 1.0)
29
- metaclass (0.0.4)
30
- method_source (0.9.2)
31
- minitest (5.13.0)
32
- minitest-focus (1.1.2)
33
- minitest (>= 4, < 6)
34
- mocha (1.9.0)
35
- metaclass (~> 0.0.1)
36
- promise.rb (0.7.4)
37
- pry (0.12.2)
38
- coderay (~> 1.1.0)
39
- method_source (~> 0.9.0)
40
- pry-byebug (3.7.0)
41
- byebug (~> 11.0)
42
- pry (~> 0.10)
43
- rake (13.0.1)
44
- redis (4.1.3)
45
- thread_safe (0.3.6)
46
- tzinfo (1.2.5)
47
- thread_safe (~> 0.1)
48
-
49
- PLATFORMS
50
- ruby
51
-
52
- DEPENDENCIES
53
- activesupport (~> 5.1.5)
54
- diffy
55
- fakeredis
56
- graphql-batch
57
- graphql-metrics!
58
- hashdiff
59
- minitest (~> 5.0)
60
- minitest-focus
61
- mocha
62
- pry
63
- pry-byebug
64
- rake
65
-
66
- BUNDLED WITH
67
- 2.1.4