traceable 1.0.0 → 1.1.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
  SHA1:
3
- metadata.gz: dc0fb1daa3bcf7f643a76c12767cb4b6879de019
4
- data.tar.gz: a477c637eefd5b76b28105a83279d7faa5880650
3
+ metadata.gz: 88b2d98b02d74da456bfdd4cd8e778e32b59e726
4
+ data.tar.gz: c1b4c9f98b6681d6221c7445b30f98932d3b87dd
5
5
  SHA512:
6
- metadata.gz: 3384130f5711e0c854c9b00d093b82cca25e8b9f7333c2be73b61d58eb741df9abab464ed07a5cbd3f50dafbaeee8b11aa062a1a9ef20d19699e5c06b9c883aa
7
- data.tar.gz: 34a461846b43e0015c1e5c67b53eeb306233729270283f5c546d2e42140930bf54d4472b7726cb31b8502829c935e55f16be910ec7df039f7109f5215634634a
6
+ metadata.gz: 5a796c8e3c1fee4476dc61bca60c74dbbc8fbd70ada3212e9092cb87b4bb3c911d461fc7e98141ea4384a46b9992b19d3549f198cb2876cc198955cdb909dc8d
7
+ data.tar.gz: 354c89710e81545b518ccf44358405bbe2faa37cdee58cce1eae40020423e07fc557a844a68177b46b1986a6229f0635a55cdba2c37269809ea7997ad5755404
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Traceable
4
+ class Args
5
+ # parameters comes from calling method(:foo).parameters,
6
+ # so it is an array of parameter descriptors e.g.
7
+ # [ [:req, :a], [:keyreq, :b] ]
8
+ # values is an array of values from an actual method invocation,
9
+ # so the two arrays are expected to match in length
10
+ def self.args_to_tags(parameters, values)
11
+ tags = {}
12
+ parameters.each_with_index do |param, i|
13
+ tags[param[1]] = format_value(values[i])
14
+ end
15
+ tags
16
+ end
17
+
18
+ def self.format_value(val)
19
+ return val.to_trace if val.respond_to? :to_trace
20
+ return format_array_of_values(val) if val.is_a? Array
21
+ return format_hash_of_values(val) if val.is_a? Hash
22
+ val
23
+ end
24
+
25
+ MAX_ARRAY_VALUES = 10
26
+
27
+ def self.format_array_of_values(val_array)
28
+ return format_array_of_values(truncated_array(val_array)) \
29
+ if val_array.size > MAX_ARRAY_VALUES
30
+ val_array.map { |v| format_value(v) }
31
+ end
32
+
33
+ def self.truncated_array(val_array)
34
+ subset = val_array[0..MAX_ARRAY_VALUES - 2]
35
+ subset << "...(#{val_array.size - subset.size})"
36
+ subset
37
+ end
38
+
39
+ MAX_HASH_KEYS = 10
40
+
41
+ def self.format_hash_of_values(val_hash)
42
+ return format_hash_of_values(truncated_hash(val_hash)) \
43
+ if val_hash.size > MAX_HASH_KEYS
44
+ Hash[val_hash.map { |k, v| [k, format_value(v)] }]
45
+ end
46
+
47
+ def self.truncated_hash(val_hash)
48
+ first_keys = val_hash.keys[0..MAX_HASH_KEYS - 2]
49
+ first_vals = first_keys.map { |k| val_hash[k] }
50
+ first_keys << :___
51
+ first_vals << "...(#{val_hash.size - first_vals.size})"
52
+ Hash[first_keys.zip(first_vals)]
53
+ end
54
+ end
55
+ end
@@ -29,13 +29,15 @@ module Traceable
29
29
  # end
30
30
  #
31
31
  # The generated log message(s) will include the class name and method name
32
- def traced_method(method_name)
33
- klass = self
34
- trace_name = "#{klass.name}##{method_name}"
35
- orig_method = klass.instance_method(method_name)
32
+ def traced_method(method_name, include_args: true)
33
+ trace_name = "#{name}##{method_name}"
34
+ orig_method = instance_method(method_name)
35
+ params = orig_method.parameters
36
+ include_args = false if params.empty?
36
37
 
37
- klass.send(:define_method, method_name) do |*args, &block|
38
- trace trace_name do
38
+ send(:define_method, method_name) do |*args, &block|
39
+ trace_tags = include_args ? Traceable::Args.args_to_tags(params, args) : {}
40
+ trace(trace_name, **trace_tags) do
39
41
  if block
40
42
  orig_method.bind(self).call(*args) { |*block_args| block.call(*block_args) }
41
43
  else
@@ -47,7 +49,7 @@ module Traceable
47
49
  method_name
48
50
  end
49
51
 
50
- # For the (relatively rare) case of calling trace() in a class method
52
+ # For the (relatively rare?) case of calling trace() in a class method
51
53
  # of a Traceable class - creates a new Tracer instance
52
54
  def trace(msg = nil, **tags)
53
55
  tracer = Tracer.new(Tracer.default_parent)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Traceable
4
- VERSION = '1.0.0'
4
+ VERSION = '1.1.0'
5
5
  end
data/lib/traceable.rb CHANGED
@@ -54,6 +54,7 @@ module Traceable
54
54
  end
55
55
  end
56
56
 
57
+ require 'traceable/args'
57
58
  require 'traceable/class_methods'
58
59
  require 'traceable/config'
59
60
  require 'traceable/tracer'
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Traceable::Args do
4
+ describe '#args_to_tags' do
5
+ class Foo
6
+ class << self
7
+ def m1(a, b); end
8
+ end
9
+ end
10
+
11
+ let(:m1_params) { Foo.method(:m1).parameters }
12
+
13
+ it 'converts simple params' do
14
+ expect(Traceable::Args.args_to_tags(m1_params, [1, 2]))
15
+ .to eq(a: 1, b: 2)
16
+ end
17
+
18
+ it 'converts array params' do
19
+ expect(Traceable::Args.args_to_tags(m1_params, [[1, 2], %i[a b c]]))
20
+ .to eq(a: [1, 2], b: %i[a b c])
21
+ end
22
+
23
+ it 'converts hash params' do
24
+ expect(Traceable::Args.args_to_tags(m1_params, [{ x: 1, y: 2 }, { 'z' => 3 }]))
25
+ .to eq(a: { x: 1, y: 2 }, b: { 'z' => 3 })
26
+ end
27
+ end
28
+
29
+ let(:letters) { %w[a b c d e f g h i j k l m n o p q r s t u v w x y z] }
30
+
31
+ describe '#format_array_of_values' do
32
+ it 'truncates long arrays' do
33
+ expect(Traceable::Args.format_array_of_values(letters))
34
+ .to eq(%w[a b c d e f g h i ...(17)])
35
+ end
36
+ end
37
+
38
+ describe '#format_hash_of_values' do
39
+ it 'truncates long hashes' do
40
+ h = Hash[letters.map { |l| [l.to_sym, l] }]
41
+ expect(Traceable::Args.format_hash_of_values(h))
42
+ .to eq(a: 'a', b: 'b', c: 'c', d: 'd', e: 'e',
43
+ f: 'f', g: 'g', h: 'h', i: 'i', ___: '...(17)')
44
+ end
45
+ end
46
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: traceable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Slade
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-23 00:00:00.000000000 Z
11
+ date: 2018-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -116,11 +116,13 @@ extensions: []
116
116
  extra_rdoc_files: []
117
117
  files:
118
118
  - lib/traceable.rb
119
+ - lib/traceable/args.rb
119
120
  - lib/traceable/class_methods.rb
120
121
  - lib/traceable/config.rb
121
122
  - lib/traceable/tracer.rb
122
123
  - lib/traceable/version.rb
123
124
  - spec/spec_helper.rb
125
+ - spec/traceable_args_spec.rb
124
126
  - spec/traceable_spec.rb
125
127
  homepage: https://github.com/instructure/inst-jobs-statsd
126
128
  licenses:
@@ -148,4 +150,5 @@ specification_version: 4
148
150
  summary: Instrument code with logging
149
151
  test_files:
150
152
  - spec/spec_helper.rb
153
+ - spec/traceable_args_spec.rb
151
154
  - spec/traceable_spec.rb