opentelemetry-instrumentation-mysql2 0.14.0 → 0.18.1

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: 33c89d297e9af1a48742f784e6a736cf83dc36cb589e238b1e54b0e5dc4655a4
4
- data.tar.gz: 7c924db007a234f7c27c6d3c43785eeda43bd562d1b9171974911003cbe92261
3
+ metadata.gz: 2f530562f160f11a117621eb56ea9d984052e437c3f16b12c50a96f765b5538a
4
+ data.tar.gz: 48e436cc15d6c39b44729db0ead43eb659224cda5308f5e23fc4b98e345247f7
5
5
  SHA512:
6
- metadata.gz: b3f8a5fe27b7287b033d1b44ef01324c2c0a38d4720c0784785d784939be8600ea4d10654ebff1fc52f891f1c782a434f0468ab056c6cda2c830c4d7122c75c2
7
- data.tar.gz: 55ea655d90536d5f9f03c28082f93a63ff6df108e6972dc667a2bcb55409344566a89e99cc24d9de0483fa768435b8dff0b7ca75f95f7ba8f860eeb2849d933a
6
+ metadata.gz: ddddcb7135cb84b62ee91741aaa5c2653cdc11f8b542b7a13029befcb43aa47d282ee5c2654c3e62f3a6a6e5cde48940928fe53f6329362ea0b340fd5ff3ea98
7
+ data.tar.gz: 4f46285dbc8786989f5b7d0e0d3ccbdf9c33cf08014235ea79d1d183d81eb49fac46b1956e73d51e098517238a4dd10125d0e13ba2264d514a71663095e4351e
data/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # Release History: opentelemetry-instrumentation-mysql2
2
2
 
3
+ ### v0.18.1 / 2021-06-23
4
+
5
+ * (No significant changes)
6
+
7
+ ### v0.18.0 / 2021-05-21
8
+
9
+ * ADDED: Updated API depedency for 1.0.0.rc1
10
+ * Fix: Nil value for db.name attribute #744
11
+
12
+ ### v0.17.0 / 2021-04-22
13
+
14
+ * (No significant changes)
15
+
16
+ ### v0.16.0 / 2021-03-17
17
+
18
+ * FIXED: Update DB semantic conventions
19
+ * FIXED: Example scripts now reference local common lib
20
+ * ADDED: Configurable obfuscation of sql in mysql2 instrumentation to avoid logging sensitive data
21
+
22
+ ### v0.15.0 / 2021-02-18
23
+
24
+ * ADDED: Add instrumentation config validation
25
+
3
26
  ### v0.14.0 / 2021-02-03
4
27
 
5
28
  * (No significant changes)
@@ -14,12 +37,12 @@
14
37
 
15
38
  ### v0.11.0 / 2020-12-11
16
39
 
17
- * ADDED: Add peer service config to mysql
18
- * FIXED: Copyright comments to not reference year
40
+ * ADDED: Add peer service config to mysql
41
+ * FIXED: Copyright comments to not reference year
19
42
 
20
43
  ### v0.10.1 / 2020-12-09
21
44
 
22
- * FIXED: Semantic conventions db.type -> db.system
45
+ * FIXED: Semantic conventions db.type -> db.system
23
46
 
24
47
  ### v0.10.0 / 2020-12-03
25
48
 
@@ -27,19 +50,19 @@
27
50
 
28
51
  ### v0.9.0 / 2020-11-27
29
52
 
30
- * BREAKING CHANGE: Add timeout for force_flush and shutdown
53
+ * BREAKING CHANGE: Add timeout for force_flush and shutdown
31
54
 
32
- * ADDED: Add timeout for force_flush and shutdown
55
+ * ADDED: Add timeout for force_flush and shutdown
33
56
 
34
57
  ### v0.8.0 / 2020-10-27
35
58
 
36
- * BREAKING CHANGE: Remove 'canonical' from status codes
59
+ * BREAKING CHANGE: Remove 'canonical' from status codes
37
60
 
38
- * FIXED: Remove 'canonical' from status codes
61
+ * FIXED: Remove 'canonical' from status codes
39
62
 
40
63
  ### v0.7.0 / 2020-10-07
41
64
 
42
- * DOCS: Standardize toplevel docs structure and readme
65
+ * DOCS: Standardize toplevel docs structure and readme
43
66
 
44
67
  ### v0.6.0 / 2020-09-10
45
68
 
data/README.md ADDED
@@ -0,0 +1,65 @@
1
+ # OpenTelemetry Mysql2 Instrumentation
2
+
3
+ The OpenTelemetry Mysql2 Ruby gem is a community maintained instrumentation for [Mysql2][mysql2-home].
4
+
5
+ ## How do I get started?
6
+
7
+ Install the gem using:
8
+
9
+ ```
10
+ gem install opentelemetry-instrumentation-mysql2
11
+ ```
12
+
13
+ Or, if you use [bundler][bundler-home], include `opentelemetry-instrumentation-mysql2` in your `Gemfile`.
14
+
15
+ ## Usage
16
+
17
+ To use the instrumentation, call `use` with the name of the instrumentation:
18
+
19
+ ```ruby
20
+ OpenTelemetry::SDK.configure do |c|
21
+ c.use 'OpenTelemetry::Instrumentation::Mysql2'
22
+ end
23
+ ```
24
+
25
+ Alternatively, you can also call `use_all` to install all the available instrumentation.
26
+
27
+ ```ruby
28
+ OpenTelemetry::SDK.configure do |c|
29
+ c.use_all
30
+ end
31
+ ```
32
+
33
+ ### Configuration options
34
+
35
+ ```ruby
36
+ OpenTelemetry::SDK.configure do |c|
37
+ c.use 'OpenTelemetry::Instrumentation::Mysql2', {
38
+ # The obfuscation of SQL in the db.statement attribute is disabled by default.
39
+ # To enable, set enable_sql_obfuscation to true.
40
+ enable_sql_obfuscation: false,
41
+ }
42
+ end
43
+ ```
44
+
45
+ ## Examples
46
+
47
+ An example of usage can be seen in [`example/mysql2.rb`](https://github.com/open-telemetry/opentelemetry-ruby/blob/main/instrumentation/mysql2/example/mysql2.rb).
48
+
49
+ ## How can I get involved?
50
+
51
+ The `opentelemetry-instrumentation-mysql2` gem source is [on github][repo-github], along with related gems including `opentelemetry-api` and `opentelemetry-sdk`.
52
+
53
+ 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].
54
+
55
+ ## License
56
+
57
+ The `opentelemetry-instrumentation-mysql2` gem is distributed under the Apache 2.0 license. See [LICENSE][license-github] for more information.
58
+
59
+ [mysql2-home]: https://github.com/brianmario/mysql2
60
+ [bundler-home]: https://bundler.io
61
+ [repo-github]: https://github.com/open-telemetry/opentelemetry-ruby
62
+ [license-github]: https://github.com/open-telemetry/opentelemetry-ruby/blob/main/LICENSE
63
+ [ruby-sig]: https://github.com/open-telemetry/community#ruby-sig
64
+ [community-meetings]: https://github.com/open-telemetry/community#community-meetings
65
+ [ruby-gitter]: https://gitter.im/open-telemetry/opentelemetry-ruby
@@ -5,6 +5,7 @@
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
7
7
  require 'opentelemetry'
8
+ require 'opentelemetry-instrumentation-base'
8
9
 
9
10
  module OpenTelemetry
10
11
  module Instrumentation
@@ -19,6 +19,9 @@ module OpenTelemetry
19
19
  defined?(::Mysql2)
20
20
  end
21
21
 
22
+ option :peer_service, default: nil, validate: :string
23
+ option :enable_sql_obfuscation, default: false, validate: :boolean
24
+
22
25
  private
23
26
 
24
27
  def require_dependencies
@@ -30,11 +30,31 @@ module OpenTelemetry
30
30
 
31
31
  QUERY_NAME_RE = Regexp.new("^(#{QUERY_NAMES.join('|')})", Regexp::IGNORECASE)
32
32
 
33
+ COMPONENTS_REGEX_MAP = {
34
+ single_quotes: /'(?:[^']|'')*?(?:\\'.*|'(?!'))/,
35
+ double_quotes: /"(?:[^"]|"")*?(?:\\".*|"(?!"))/,
36
+ numeric_literals: /-?\b(?:[0-9]+\.)?[0-9]+([eE][+-]?[0-9]+)?\b/,
37
+ boolean_literals: /\b(?:true|false|null)\b/i,
38
+ hexadecimal_literals: /0x[0-9a-fA-F]+/,
39
+ comments: /(?:#|--).*?(?=\r|\n|$)/i,
40
+ multi_line_comments: %r{\/\*(?:[^\/]|\/[^*])*?(?:\*\/|\/\*.*)}
41
+ }.freeze
42
+
43
+ MYSQL_COMPONENTS = %i[
44
+ single_quotes
45
+ double_quotes
46
+ numeric_literals
47
+ boolean_literals
48
+ hexadecimal_literals
49
+ comments
50
+ multi_line_comments
51
+ ].freeze
52
+
33
53
  def query(sql, options = {})
34
54
  tracer.in_span(
35
55
  database_span_name(sql),
36
56
  attributes: client_attributes.merge(
37
- 'db.statement' => sql
57
+ 'db.statement' => obfuscate_sql(sql)
38
58
  ),
39
59
  kind: :client
40
60
  ) do
@@ -44,6 +64,31 @@ module OpenTelemetry
44
64
 
45
65
  private
46
66
 
67
+ def obfuscate_sql(sql)
68
+ return sql unless config[:enable_sql_obfuscation]
69
+
70
+ if sql.size > 2000
71
+ 'SQL query too large to remove sensitive data ...'
72
+ else
73
+ obfuscated = sql.gsub(generated_mysql_regex, '?')
74
+ obfuscated = 'Failed to obfuscate SQL query - quote characters remained after obfuscation' if detect_unmatched_pairs(obfuscated)
75
+ obfuscated
76
+ end
77
+ end
78
+
79
+ def generated_mysql_regex
80
+ @generated_mysql_regex ||= Regexp.union(MYSQL_COMPONENTS.map { |component| COMPONENTS_REGEX_MAP[component] })
81
+ end
82
+
83
+ def detect_unmatched_pairs(obfuscated)
84
+ # We use this to check whether the query contains any quote characters
85
+ # after obfuscation. If so, that's a good indication that the original
86
+ # query was malformed, and so our obfuscation can't reliably find
87
+ # literals. In such a case, we'll replace the entire query with a
88
+ # placeholder.
89
+ %r{'|"|\/\*|\*\/}.match(obfuscated)
90
+ end
91
+
47
92
  def database_span_name(sql)
48
93
  # Setting span name to the SQL query without obfuscation would
49
94
  # result in PII + cardinality issues.
@@ -74,11 +119,10 @@ module OpenTelemetry
74
119
 
75
120
  attributes = {
76
121
  'db.system' => 'mysql',
77
- 'db.instance' => database_name,
78
- 'db.url' => "mysql://#{host}:#{port}",
79
122
  'net.peer.name' => host,
80
123
  'net.peer.port' => port
81
124
  }
125
+ attributes['db.name'] = database_name if database_name
82
126
  attributes['peer.service'] = config[:peer_service] if config[:peer_service]
83
127
  attributes
84
128
  end
@@ -7,7 +7,7 @@
7
7
  module OpenTelemetry
8
8
  module Instrumentation
9
9
  module Mysql2
10
- VERSION = '0.14.0'
10
+ VERSION = '0.18.1'
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-mysql2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.18.1
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-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opentelemetry-api
@@ -16,14 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.14.0
19
+ version: 1.0.0.rc2
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.rc2
27
+ - !ruby/object:Gem::Dependency
28
+ name: opentelemetry-instrumentation-base
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.18.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.18.1
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: appraisal
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +100,14 @@ dependencies:
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '0.0'
103
+ version: 1.0.0.rc1
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '0.0'
110
+ version: 1.0.0.rc1
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: rubocop
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -160,6 +174,7 @@ files:
160
174
  - ".yardopts"
161
175
  - CHANGELOG.md
162
176
  - LICENSE
177
+ - README.md
163
178
  - lib/opentelemetry-instrumentation-mysql2.rb
164
179
  - lib/opentelemetry/instrumentation.rb
165
180
  - lib/opentelemetry/instrumentation/mysql2.rb
@@ -170,10 +185,10 @@ homepage: https://github.com/open-telemetry/opentelemetry-ruby
170
185
  licenses:
171
186
  - Apache-2.0
172
187
  metadata:
173
- changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-instrumentation-mysql2/v0.14.0/file.CHANGELOG.html
188
+ changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-instrumentation-mysql2/v0.18.1/file.CHANGELOG.html
174
189
  source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/main/instrumentation/mysql2
175
190
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby/issues
176
- documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-instrumentation-mysql2/v0.14.0
191
+ documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-instrumentation-mysql2/v0.18.1
177
192
  post_install_message:
178
193
  rdoc_options: []
179
194
  require_paths:
@@ -189,7 +204,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
189
204
  - !ruby/object:Gem::Version
190
205
  version: '0'
191
206
  requirements: []
192
- rubygems_version: 3.1.4
207
+ rubygems_version: 3.1.6
193
208
  signing_key:
194
209
  specification_version: 4
195
210
  summary: Mysql2 instrumentation for the OpenTelemetry framework