opentelemetry-instrumentation-redis 0.14.0 → 0.19.0

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
  SHA256:
3
- metadata.gz: 7f0a344dc34f6777df024cd84afa6a05979cd21bf055f66ec544e76b83a5117e
4
- data.tar.gz: '06386792485258022142face04832b22fbdeaa76b2d87d88afd8331d99232b9d'
3
+ metadata.gz: 4a358148a99762d16da53ed24dbdd31ebe490a73a3474dabf404a567de51feec
4
+ data.tar.gz: b3c86124ed7e9c63dc27057ed055c27a26bfa8e81fa04800c5ff362033141952
5
5
  SHA512:
6
- metadata.gz: 785c71ed34c8af3590d99a9b546f7a3a45e7714a3cf4262eeab37537a90a783e7a6e4ff4f80027cedfa356dda80d0d2139a2abf6531d77be7a769adab00cb754
7
- data.tar.gz: '054488c01e124f57e4b00a10f3ea51a4920aeea33f6b9b00a3d378be9910b372b9ad74ea3fca4fcd49f296ce7c2c656c8a1427a139b839f3527df0d793d6920b'
6
+ metadata.gz: '085395644553eb96d70ebb7fd26aab5dcd8489528faafacba229dab6ab31dac40dd6a29871e52e3d3be851559bc255d1017d4591386c39b9b1f0af6cb27baba3'
7
+ data.tar.gz: 8de51fbd8aabe59ea79277d59dc5ff003e23a8e812c58112fbef613b7ffacc7f58d7898d6af2678a15a30e828f891e058582f73c98c78a8ae8573c82547956d7
data/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # Release History: opentelemetry-instrumentation-redis
2
2
 
3
+ ### v0.19.0 / 2021-05-28
4
+
5
+ * ADDED: Configuration option to enable or disable redis root spans [#777](https://github.com/open-telemetry/opentelemetry-ruby/pull/777)
6
+
7
+ ### v0.18.0 / 2021-05-21
8
+
9
+ * ADDED: Updated API depedency for 1.0.0.rc1
10
+ refactor: redis attribute utils [#760](https://github.com/open-telemetry/opentelemetry-ruby/pull/760)
11
+ refactor: simplify redis attribute assignment [#758](https://github.com/open-telemetry/opentelemetry-ruby/pull/758)
12
+ test: split redis instrumentation test [#754](https://github.com/open-telemetry/opentelemetry-ruby/pull/754)
13
+ * ADDED: Option to obfuscate redis arguments
14
+ * FIXED: Instrument Redis more thoroughly by patching Client#process.
15
+
16
+ ### v0.17.0 / 2021-04-22
17
+
18
+ * (No significant changes)
19
+
20
+ ### v0.16.0 / 2021-03-17
21
+
22
+ * FIXED: Update DB semantic conventions
23
+ * FIXED: Example scripts now reference local common lib
24
+ * DOCS: Replace Gitter with GitHub Discussions
25
+
26
+ ### v0.15.0 / 2021-02-18
27
+
28
+ * ADDED: Add instrumentation config validation
29
+
3
30
  ### v0.14.0 / 2021-02-03
4
31
 
5
32
  * (No significant changes)
@@ -14,13 +41,13 @@
14
41
 
15
42
  ### v0.11.0 / 2020-12-11
16
43
 
17
- * ADDED: Accept config for redis peer service attribute
18
- * ADDED: Move utf8 encoding to common utils
19
- * FIXED: Copyright comments to not reference year
44
+ * ADDED: Accept config for redis peer service attribute
45
+ * ADDED: Move utf8 encoding to common utils
46
+ * FIXED: Copyright comments to not reference year
20
47
 
21
48
  ### v0.10.1 / 2020-12-09
22
49
 
23
- * FIXED: Semantic conventions db.type -> db.system
50
+ * FIXED: Semantic conventions db.type -> db.system
24
51
 
25
52
  ### v0.10.0 / 2020-12-03
26
53
 
@@ -28,21 +55,21 @@
28
55
 
29
56
  ### v0.9.0 / 2020-11-27
30
57
 
31
- * BREAKING CHANGE: Add timeout for force_flush and shutdown
58
+ * BREAKING CHANGE: Add timeout for force_flush and shutdown
32
59
 
33
- * ADDED: Redis attribute propagation
34
- * ADDED: Add timeout for force_flush and shutdown
60
+ * ADDED: Redis attribute propagation
61
+ * ADDED: Add timeout for force_flush and shutdown
35
62
 
36
63
  ### v0.8.0 / 2020-10-27
37
64
 
38
- * BREAKING CHANGE: Remove 'canonical' from status codes
65
+ * BREAKING CHANGE: Remove 'canonical' from status codes
39
66
 
40
- * FIXED: Remove 'canonical' from status codes
67
+ * FIXED: Remove 'canonical' from status codes
41
68
 
42
69
  ### v0.7.0 / 2020-10-07
43
70
 
44
- * DOCS: Added redis documentation
45
- * DOCS: Standardize toplevel docs structure and readme
71
+ * DOCS: Added redis documentation
72
+ * DOCS: Standardize toplevel docs structure and readme
46
73
 
47
74
  ### v0.6.0 / 2020-09-10
48
75
 
data/README.md CHANGED
@@ -41,15 +41,32 @@ OpenTelemetry::Instrumentation::Redis.with_attributes('peer.service' => 'cache')
41
41
  end
42
42
  ```
43
43
 
44
+ ### Configuration options
45
+
46
+ ```ruby
47
+ OpenTelemetry::SDK.configure do |c|
48
+ c.use 'OpenTelemetry::Instrumentation::Redis', {
49
+ # The obfuscation of arguments in the db.statement attribute is enabled by default.
50
+ # To disable, set enable_statement_obfuscation to false.
51
+ enable_statement_obfuscation: true,
52
+ }
53
+ end
54
+ ```
55
+
44
56
  ## Example
45
57
 
46
58
  An example of usage can be seen in [`example/redis.rb`](https://github.com/open-telemetry/opentelemetry-ruby/blob/main/instrumentation/redis/example/redis.rb).
47
59
 
60
+ ## Development
61
+
62
+ You'll need Redis installed locally to run the test suite. Once you've
63
+ installed it, it will start and stop automatically when you run `rake`.
64
+
48
65
  ## How can I get involved?
49
66
 
50
67
  The `opentelemetry-instrumentation-redis` gem source is [on github][repo-github], along with related gems including `opentelemetry-api` and `opentelemetry-sdk`.
51
68
 
52
- The OpenTelemetry Ruby gems are maintained by the OpenTelemetry-Ruby special interest group (SIG). You can get involved by joining us on our [gitter channel][ruby-gitter] or attending our weekly meeting. See the [meeting calendar][community-meetings] for dates and times. For more information on this and other language SIGs, see the OpenTelemetry [community page][ruby-sig].
69
+ The OpenTelemetry Ruby gems are maintained by the OpenTelemetry-Ruby special interest group (SIG). You can get involved by joining us in [GitHub Discussions][discussions-url] or attending our weekly meeting. See the [meeting calendar][community-meetings] for dates and times. For more information on this and other language SIGs, see the OpenTelemetry [community page][ruby-sig].
53
70
 
54
71
  ## License
55
72
 
@@ -61,4 +78,4 @@ Apache 2.0 license. See [LICENSE][license-github] for more information.
61
78
  [license-github]: https://github.com/open-telemetry/opentelemetry-ruby/blob/main/LICENSE
62
79
  [ruby-sig]: https://github.com/open-telemetry/community#ruby-sig
63
80
  [community-meetings]: https://github.com/open-telemetry/community#community-meetings
64
- [ruby-gitter]: https://gitter.im/open-telemetry/opentelemetry-ruby
81
+ [discussions-url]: https://github.com/open-telemetry/opentelemetry-ruby/discussions
@@ -6,6 +6,7 @@
6
6
 
7
7
  require 'opentelemetry'
8
8
  require 'opentelemetry/common'
9
+ require 'opentelemetry-instrumentation-base'
9
10
 
10
11
  module OpenTelemetry
11
12
  module Instrumentation
@@ -19,10 +19,13 @@ module OpenTelemetry
19
19
  defined?(::Redis)
20
20
  end
21
21
 
22
+ option :peer_service, default: nil, validate: :string
23
+ option :trace_root_spans, default: true, validate: :boolean
24
+ option :enable_statement_obfuscation, default: true, validate: :boolean
25
+
22
26
  private
23
27
 
24
28
  def require_dependencies
25
- require_relative 'utils'
26
29
  require_relative 'patches/client'
27
30
  end
28
31
 
@@ -10,53 +10,75 @@ module OpenTelemetry
10
10
  module Patches
11
11
  # Module to prepend to Redis::Client for instrumentation
12
12
  module Client
13
- def call(*args, &block)
14
- response = nil
13
+ MAX_STATEMENT_LENGTH = 500
14
+ private_constant :MAX_STATEMENT_LENGTH
15
15
 
16
- attributes = client_attributes
17
- attributes['db.statement'] = Utils.format_statement(args)
18
- tracer.in_span(
19
- Utils.format_command(args),
20
- attributes: attributes,
21
- kind: :client
22
- ) do
23
- response = super(*args, &block)
24
- end
25
-
26
- response
27
- end
28
-
29
- def call_pipeline(*args, &block)
30
- response = nil
31
-
32
- attributes = client_attributes
33
- attributes['db.statement'] = Utils.format_pipeline_statement(args)
34
- tracer.in_span(
35
- 'pipeline',
36
- attributes: attributes,
37
- kind: :client
38
- ) do
39
- response = super(*args, &block)
40
- end
16
+ def process(commands) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
17
+ return super unless config[:trace_root_spans] || OpenTelemetry::Trace.current_span.context.valid?
41
18
 
42
- response
43
- end
44
-
45
- private
46
-
47
- def client_attributes
48
19
  host = options[:host]
49
20
  port = options[:port]
50
21
 
51
22
  attributes = {
52
23
  'db.system' => 'redis',
53
- 'db.instance' => options[:db].to_s,
54
- 'db.url' => "redis://#{host}:#{port}",
55
24
  'net.peer.name' => host,
56
25
  'net.peer.port' => port
57
26
  }
27
+
28
+ attributes['db.redis.database_index'] = options[:db] unless options[:db].zero?
58
29
  attributes['peer.service'] = config[:peer_service] if config[:peer_service]
59
- attributes.merge(OpenTelemetry::Instrumentation::Redis.attributes)
30
+ attributes.merge!(OpenTelemetry::Instrumentation::Redis.attributes)
31
+
32
+ parsed_commands = parse_commands(commands)
33
+ parsed_commands = OpenTelemetry::Common::Utilities.truncate(parsed_commands, MAX_STATEMENT_LENGTH)
34
+ parsed_commands = OpenTelemetry::Common::Utilities.utf8_encode(parsed_commands, binary: true)
35
+ attributes['db.statement'] = parsed_commands
36
+
37
+ span_name = if commands.length == 1
38
+ commands[0][0].to_s.upcase
39
+ else
40
+ 'PIPELINED'
41
+ end
42
+
43
+ tracer.in_span(span_name, attributes: attributes, kind: :client) do |s|
44
+ super(commands).tap do |reply|
45
+ if reply.is_a?(::Redis::CommandError)
46
+ s.record_exception(reply)
47
+ s.status = Trace::Status.new(
48
+ Trace::Status::ERROR,
49
+ description: reply.message
50
+ )
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ private
57
+
58
+ # Examples of commands received for parsing
59
+ # Redis#queue [[[:set, "v1", "0"]], [[:incr, "v1"]], [[:get, "v1"]]]
60
+ # Redis#pipeline: [[:set, "v1", "0"], [:incr, "v1"], [:get, "v1"]]
61
+ # Redis#hmset [[:hmset, "hash", "f1", 1234567890.0987654]]
62
+ # Redis#set [[:set, "K", "x"]]
63
+ def parse_commands(commands) # rubocop:disable Metrics/AbcSize
64
+ commands.map do |command|
65
+ # We are checking for the use of Redis#queue command, if we detect the
66
+ # extra level of array nesting we return the first element so it
67
+ # can be parsed.
68
+ command = command[0] if command.is_a?(Array) && command[0].is_a?(Array)
69
+
70
+ # If we receive an authentication request command
71
+ # we want to short circuit parsing the commands
72
+ # and return the obfuscated command
73
+ return 'AUTH ?' if command[0] == :auth
74
+
75
+ command[0] = command[0].to_s.upcase
76
+ if config[:enable_statement_obfuscation]
77
+ command[0] + ' ?' * (command.size - 1)
78
+ else
79
+ command.join(' ')
80
+ end
81
+ end.join("\n")
60
82
  end
61
83
 
62
84
  def tracer
@@ -7,7 +7,7 @@
7
7
  module OpenTelemetry
8
8
  module Instrumentation
9
9
  module Redis
10
- VERSION = '0.14.0'
10
+ VERSION = '0.19.0'
11
11
  end
12
12
  end
13
13
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentelemetry-instrumentation-redis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenTelemetry Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-03 00:00:00.000000000 Z
11
+ date: 2021-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opentelemetry-api
@@ -16,70 +16,70 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.14.0
19
+ version: 1.0.0.rc1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.14.0
26
+ version: 1.0.0.rc1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: opentelemetry-common
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.14.0
33
+ version: 0.18.0
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: 0.14.0
40
+ version: 0.18.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: appraisal
42
+ name: opentelemetry-instrumentation-base
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 2.2.0
48
- type: :development
47
+ version: 0.18.0
48
+ type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 2.2.0
54
+ version: 0.18.0
55
55
  - !ruby/object:Gem::Dependency
56
- name: bundler
56
+ name: appraisal
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.17'
61
+ version: 2.2.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '1.17'
68
+ version: 2.2.0
69
69
  - !ruby/object:Gem::Dependency
70
- name: fakeredis
70
+ name: bundler
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: 0.7.0
75
+ version: '1.17'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: 0.7.0
82
+ version: '1.17'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: minitest
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0.0'
103
+ version: 1.0.0.rc1
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0.0'
110
+ version: 1.0.0.rc1
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: redis
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -194,16 +194,15 @@ files:
194
194
  - lib/opentelemetry/instrumentation/redis.rb
195
195
  - lib/opentelemetry/instrumentation/redis/instrumentation.rb
196
196
  - lib/opentelemetry/instrumentation/redis/patches/client.rb
197
- - lib/opentelemetry/instrumentation/redis/utils.rb
198
197
  - lib/opentelemetry/instrumentation/redis/version.rb
199
198
  homepage: https://github.com/open-telemetry/opentelemetry-ruby
200
199
  licenses:
201
200
  - Apache-2.0
202
201
  metadata:
203
- changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-instrumentation-redis/v0.14.0/file.CHANGELOG.html
202
+ changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-instrumentation-redis/v0.19.0/file.CHANGELOG.html
204
203
  source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/main/instrumentation/redis
205
204
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby/issues
206
- documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-instrumentation-redis/v0.14.0
205
+ documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-instrumentation-redis/v0.19.0
207
206
  post_install_message:
208
207
  rdoc_options: []
209
208
  require_paths:
@@ -219,7 +218,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
219
218
  - !ruby/object:Gem::Version
220
219
  version: '0'
221
220
  requirements: []
222
- rubygems_version: 3.1.4
221
+ rubygems_version: 3.1.6
223
222
  signing_key:
224
223
  specification_version: 4
225
224
  summary: Redis instrumentation for the OpenTelemetry framework
@@ -1,65 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright The OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
-
7
- module OpenTelemetry
8
- module Instrumentation
9
- module Redis
10
- # Utility functions
11
- module Utils
12
- extend self
13
-
14
- PLACEHOLDER = '?'
15
- VALUE_MAX_LEN = 50
16
- CMD_MAX_LEN = 500
17
-
18
- def format_command(command_args)
19
- format_arg(resolve_command_args(command_args).first)
20
- end
21
-
22
- def format_pipeline_statement(command_args)
23
- command_args[0].commands.map do |args|
24
- format_statement(args)
25
- end.join("\n")
26
- end
27
-
28
- def format_statement(command_args)
29
- command_args = resolve_command_args(command_args)
30
- return 'AUTH ?' if auth_command?(command_args)
31
-
32
- cmd = command_args.map { |x| format_arg(x) }.join(' ')
33
- truncate(cmd, CMD_MAX_LEN)
34
- end
35
-
36
- def format_arg(arg)
37
- str = arg.is_a?(Symbol) ? arg.to_s.upcase : arg.to_s
38
- str = OpenTelemetry::Common::Utilities.utf8_encode(str, binary: true)
39
- truncate(str, VALUE_MAX_LEN)
40
- rescue StandardError => e
41
- OpenTelemetry.logger.debug("non formattable Redis arg #{str}: #{e}")
42
- PLACEHOLDER
43
- end
44
-
45
- def auth_command?(command_args)
46
- return false unless command_args.is_a?(Array) && !command_args.empty?
47
-
48
- command_args.first.to_sym == :auth
49
- end
50
-
51
- # Unwraps command array when Redis is called with the following syntax:
52
- # redis.call([:cmd, 'arg1', ...])
53
- def resolve_command_args(command_args)
54
- return command_args.first if command_args.is_a?(Array) && command_args.first.is_a?(Array)
55
-
56
- command_args
57
- end
58
-
59
- def truncate(string, size)
60
- string.size > size ? "#{string[0...size - 3]}..." : string
61
- end
62
- end
63
- end
64
- end
65
- end