gql_metrics_tracer 0.0.5.pre.beta1 → 0.0.5

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: 1c2653b0e1af097aff74971b5951dbc597f85051f7f97bf19ecc49e154c7a4ac
4
- data.tar.gz: 4f9b60bc43d6b2ebfe5f4ac507446bf4671a2d410a1a505ceec12805c1809616
3
+ metadata.gz: 932d56d4a22e85406cba06faebc9e220ea9da7389049fca1266cc7796684a0ba
4
+ data.tar.gz: 91f73c97ec02642e48576da8f0c24522b137b4b83a64dc705ab339bb4dae6edc
5
5
  SHA512:
6
- metadata.gz: 9e174d161fcbf9c33844659368a079b31d13c0d5991a72a36260cb1df50e28a2b1184eaccfa6ae8e54c55b4fde4dc89d220fc34f29f70737f467d37d75f58057
7
- data.tar.gz: 2095cbc96d3e7d51c6dd1727a086c55ccceb4238845e52b24bcd74dfbd8e19c9dfc490ec687bf9367eac42888facf2cdd0feb66a6bdea8ca53ee0da4057a1c78
6
+ metadata.gz: 16d5cf2b5e49c0c09a7fe5ad356d09432baf46400c4b48ff86e517a17121cfead10a088718a84696ff400d283730de27f8bd6f6d49f1111aeb1d2178fe9e123e
7
+ data.tar.gz: f47e07317b13d0130e298d41d4171990c8670af9d8b3090822e251460a938a092020caf822d82b41f57aa478a029effa74471f7b887d0bb12d1b9cad9d8b5e54
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gql_metrics_tracer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5.pre.beta1
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Andreasson
@@ -30,30 +30,30 @@ dependencies:
30
30
  name: graphql
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - "~>"
33
+ - - ">="
34
34
  - !ruby/object:Gem::Version
35
- version: '1.11'
35
+ version: '0'
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
- - - "~>"
40
+ - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: '1.11'
42
+ version: '0'
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: activesupport
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - "~>"
47
+ - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: '6.0'
49
+ version: '0'
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - "~>"
54
+ - - ">="
55
55
  - !ruby/object:Gem::Version
56
- version: '6.0'
56
+ version: '0'
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: rspec
59
59
  requirement: !ruby/object:Gem::Requirement
@@ -86,16 +86,16 @@ dependencies:
86
86
  name: timecop
87
87
  requirement: !ruby/object:Gem::Requirement
88
88
  requirements:
89
- - - "~>"
89
+ - - ">="
90
90
  - !ruby/object:Gem::Version
91
- version: '0.9'
91
+ version: '0'
92
92
  type: :development
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
95
95
  requirements:
96
- - - "~>"
96
+ - - ">="
97
97
  - !ruby/object:Gem::Version
98
- version: '0.9'
98
+ version: '0'
99
99
  description: Explore your GraphQL metrics
100
100
  email: dan@saits.se
101
101
  executables: []
@@ -103,17 +103,10 @@ extensions: []
103
103
  extra_rdoc_files: []
104
104
  files:
105
105
  - lib/gql_metrics_tracer.rb
106
- - lib/gql_metrics_tracer/api_client.rb
107
- - lib/gql_metrics_tracer/field_tracer.rb
108
- - lib/gql_metrics_tracer/json_serializer.rb
109
- - lib/gql_metrics_tracer/precise_time.rb
110
- - lib/gql_metrics_tracer/query_tracer.rb
111
- - lib/gql_metrics_tracer/sql_tracer.rb
112
106
  homepage: https://rubygems.org/gems/tracer
113
107
  licenses:
114
108
  - MIT
115
- metadata:
116
- github_repo: ssh://github.com/gql-metrics/tracer
109
+ metadata: {}
117
110
  post_install_message:
118
111
  rdoc_options: []
119
112
  require_paths:
@@ -125,9 +118,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
125
118
  version: '0'
126
119
  required_rubygems_version: !ruby/object:Gem::Requirement
127
120
  requirements:
128
- - - ">"
121
+ - - ">="
129
122
  - !ruby/object:Gem::Version
130
- version: 1.3.1
123
+ version: '0'
131
124
  requirements: []
132
125
  rubygems_version: 3.1.2
133
126
  signing_key:
@@ -1,88 +0,0 @@
1
- require "gql_metrics_tracer/json_serializer"
2
-
3
- module GQLMetrics
4
- class ApiClient
5
- attr_reader :schema_id
6
-
7
- def initialize(schema_definition:)
8
- @schema_id = nil
9
- @schema_definition = schema_definition
10
- end
11
-
12
- def send_trace!(query_tracer)
13
- return unless graph_token_configured?
14
- return if schema_id.nil?
15
-
16
- response = Typhoeus.post(
17
- "#{gqlmetrics_http_host}/api/traces",
18
- headers: {
19
- 'Content-Type': "application/json",
20
- 'Authorization': "Bearer #{ENV['GQLMETRICS_GRAPH_ID']}",
21
- },
22
- timeout: 30,
23
- body: JSON.dump(JsonSerializer.new(query_tracer).as_json),
24
- )
25
-
26
- trace_id = JSON.parse(response.body)["id"]
27
-
28
- if !trace_id.nil?
29
- Rails.logger.info "[GQLMetricsTracer] Sent trace #{trace_id}"
30
- else
31
- Rails.logger.warn "[GQLMetricsTracer] Failed to send the trace..."
32
- end
33
- end
34
-
35
- def publish_schema!
36
- return unless graph_token_configured?
37
-
38
- schema = schema_definition.execute(GraphQL::Introspection::INTROSPECTION_QUERY)
39
-
40
- payload = {
41
- query: PUBLISH_SCHEMA_QUERY,
42
- variables: {
43
- schema: schema.to_json,
44
- },
45
- }
46
-
47
- response = Typhoeus.post(
48
- "#{gqlmetrics_http_host}/graphql",
49
- headers: {
50
- 'Content-Type': "application/json",
51
- 'Authorization': "Bearer #{ENV['GQLMETRICS_GRAPH_ID']}",
52
- },
53
- timeout: 10,
54
- body: payload.to_json,
55
- )
56
-
57
- json_response = JSON.parse(response.body)
58
- schema_id = json_response.dig("data", "publishSchema", "id")
59
-
60
- if !schema_id.nil?
61
- @schema_id = schema_id
62
- else
63
- Rails.logger.warn "[GQLMetricsTracer] Failed to publish the latest schema..."
64
- nil
65
- end
66
- end
67
-
68
- private
69
-
70
- attr_reader :schema_definition
71
-
72
- def graph_token_configured?
73
- !ENV["GQLMETRICS_GRAPH_ID"].nil?
74
- end
75
-
76
- def gqlmetrics_http_host
77
- ENV.fetch("GQLMETRICS_HTTP_HOST", "http://localhost:5000")
78
- end
79
-
80
- PUBLISH_SCHEMA_QUERY = <<~PUBLISH_SCHEMA_QUERY
81
- mutation PublishSchema($schema: String!) {
82
- publishSchema(schema: $schema) {
83
- id
84
- }
85
- }
86
- PUBLISH_SCHEMA_QUERY
87
- end
88
- end
@@ -1,49 +0,0 @@
1
- require "gql_metrics_tracer/precise_time"
2
- require "gql_metrics_tracer/sql_tracer"
3
-
4
- module GQLMetrics
5
- class FieldTracer
6
- def self.trace!(query_start_time:, &block)
7
- self.new(query_start_time, &block).tap(&:trace!)
8
- end
9
-
10
- attr_reader :started_at, :ended_at, :result
11
-
12
- def duration_ns
13
- precise_end - precise_start
14
- end
15
-
16
- def relative_start_time
17
- precise_start - query_start_time
18
- end
19
-
20
- def relative_end_time
21
- precise_end - query_start_time
22
- end
23
-
24
- def sql_queries
25
- @sql_tracer.queries
26
- end
27
-
28
- def trace!
29
- @started_at = Time.now
30
- @precise_start = PreciseTime.now
31
-
32
- @sql_tracer = SqlTracer.trace! do
33
- @result = block.call
34
- end
35
- ensure
36
- @precise_end = PreciseTime.now
37
- @ended_at = Time.now
38
- end
39
-
40
- private
41
-
42
- attr_reader :block, :sql_tracer, :precise_start, :precise_end, :query_start_time
43
-
44
- def initialize(query_start_time, &block)
45
- @query_start_time = query_start_time
46
- @block = block
47
- end
48
- end
49
- end
@@ -1,27 +0,0 @@
1
- module GQLMetrics
2
- class JsonSerializer
3
- def initialize(query_tracer)
4
- @query_tracer = query_tracer
5
- end
6
-
7
- def as_json
8
- {
9
- schema_id: query_tracer.schema_id,
10
- operation_name: query_tracer.operation_name,
11
- query: query_tracer.query,
12
- started_at_ms: timestamp_to_ms(query_tracer.start_timestamp),
13
- ended_at_ms: timestamp_to_ms(query_tracer.end_timestamp),
14
- duration_ns: query_tracer.duration_ns,
15
- traces: query_tracer.trace_nodes,
16
- }
17
- end
18
-
19
- private
20
-
21
- attr_reader :query_tracer
22
-
23
- def timestamp_to_ms(timestamp)
24
- (timestamp.to_f * 1_000).to_i
25
- end
26
- end
27
- end
@@ -1,7 +0,0 @@
1
- module GQLMetrics
2
- module PreciseTime
3
- def self.now
4
- Process.clock_gettime(Process::CLOCK_MONOTONIC, :nanosecond)
5
- end
6
- end
7
- end
@@ -1,49 +0,0 @@
1
- module GQLMetrics
2
- class QueryTracer
3
- attr_reader(
4
- :schema_id,
5
- :query,
6
- :precise_start_time,
7
- :precise_end_time,
8
- :start_timestamp,
9
- :end_timestamp,
10
- :trace_nodes,
11
- :operation_name,
12
- )
13
-
14
- def initialize(schema_id:, query:, operation_name:)
15
- @schema_id = schema_id
16
- @query = query
17
- @operation_name = operation_name
18
- @precise_start_time = PreciseTime.now
19
- @start_timestamp = Time.now
20
- @trace_nodes = []
21
- end
22
-
23
- def trace_field!(field:, path:, parent_type:, context:, &block)
24
- field_trace = FieldTracer.trace!(query_start_time: precise_start_time, &block)
25
-
26
- @trace_nodes << {
27
- "response_name" => path.last.split(".").last,
28
- "original_field_name" => field.name,
29
- "type" => field.type.to_type_signature,
30
- "parent_type" => parent_type.to_s,
31
- "start_time" => field_trace.relative_start_time,
32
- "end_time" => field_trace.relative_end_time,
33
- "sql_queries" => field_trace.sql_queries,
34
- "path" => path,
35
- }
36
-
37
- field_trace.result
38
- end
39
-
40
- def duration_ns
41
- precise_end_time - precise_start_time
42
- end
43
-
44
- def end_trace!
45
- @precise_end_time = PreciseTime.now
46
- @end_timestamp = Time.now
47
- end
48
- end
49
- end
@@ -1,38 +0,0 @@
1
- module GQLMetrics
2
- class SqlTracer
3
- attr_reader :queries
4
-
5
- def self.trace!(&block)
6
- self.new(&block).tap(&:trace!)
7
- end
8
-
9
- def trace!
10
- ActiveSupport::Notifications.subscribe "sql.active_record" do |event|
11
- unless /(pg_)|(max_identifier_length)/.match?(event.payload[:sql])
12
- @queries.push(
13
- {
14
- sql: event.payload[:sql],
15
- start_time: event.time,
16
- end_time: event.end,
17
- duration_ns: event.duration * 1_000_000,
18
- allocations_count: event.allocations,
19
- },
20
- )
21
- end
22
- end
23
-
24
- block.call
25
- ensure
26
- ActiveSupport::Notifications.unsubscribe("sql.active_record")
27
- end
28
-
29
- private
30
-
31
- attr_reader :block
32
-
33
- def initialize(&block)
34
- @block = block
35
- @queries = []
36
- end
37
- end
38
- end