logtail 0.1.1 → 0.1.6

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: 5a701070a19f4a33ac78a22d48f7eb3f9c2a6f794bf1e1abcc95a535d29fc9c0
4
- data.tar.gz: fc2ed9e71f8d4b6c43ec5b18d2f28b55e4bc05163da236fda364081147b6fd8b
3
+ metadata.gz: 0af39db5d892f490e82d5c495f4e51b0646f418a13d4b940566c997aff7e5b1a
4
+ data.tar.gz: c3e756d0ecc74b2d8128d43914cf677458edce92c8d3bf261047f23a8ae54d65
5
5
  SHA512:
6
- metadata.gz: bc08401deaf074e084929ac7964a90680adc463077466ba95b170022f4b30438c339d5fb8ea47e468ffbb94b9be34e2da13270bc829d59148ae208be4d4f2092
7
- data.tar.gz: a1d1518ce6c835031eb6c01b945df19d7fec6626905aa4c49c830d73619bd617f1452d6fe3596ae28a90ac0bc46b8f33bad4d7437f1f912323a0997495d115d9
6
+ metadata.gz: abd7b6e30cbaa22c698259a59fdaf31a1f46b5c194a14ee9f24b03db08140876c19d25784038235574d9ddbd4b2429ae09f85400291767be88bae60adf023354
7
+ data.tar.gz: e99b8366d6dcd585f0472091e48b3e4f17f350a3d7ff3a8d97c05022e821a7ab1c05daf5420a512eec76e18ea7e53c3367429bddd53dfeea6488951c9e844c9c
data/CHANGELOG.md CHANGED
@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ## [1.0.0] - 2021-02-11
10
+ ## [0.1.0] - 2021-02-11
11
11
 
12
12
  - The first version of the client.
13
+
14
+ ## [0.1.2] - 2021-04-22
15
+
16
+ - Fixed string encoding.
17
+
18
+ ## [0.1.3] - 2021-06-11
19
+
20
+ - Fixed detection of the frame that calls the logger.
@@ -201,10 +201,20 @@ MESSAGE
201
201
  req['Authorization'] = authorization_payload
202
202
  req['Content-Type'] = CONTENT_TYPE
203
203
  req['User-Agent'] = USER_AGENT
204
- req.body = msgs.to_msgpack
204
+ req.body = msgs.map { |msg| force_utf8_encoding(msg.to_hash) }.to_msgpack
205
205
  req
206
206
  end
207
207
 
208
+ def force_utf8_encoding(data)
209
+ if data.respond_to?(:force_encoding)
210
+ data.dup.force_encoding('UTF-8')
211
+ elsif data.respond_to?(:transform_values)
212
+ data.transform_values { |val| force_utf8_encoding(val) }
213
+ else
214
+ data
215
+ end
216
+ end
217
+
208
218
  # Flushes the message buffer asynchronously. The reason we provide this
209
219
  # method is because the message buffer limit is constricted by the
210
220
  # Logtail API. The application limit is multiples of the buffer limit,
@@ -12,7 +12,7 @@ module Logtail
12
12
  BINARY_LIMIT_THRESHOLD = 1_000.freeze
13
13
  DT_PRECISION = 6.freeze
14
14
  MESSAGE_MAX_BYTES = 8192.freeze
15
- LOGTAIL_GEM_REGEX = /\/logtail(?:-ruby|-rails|-rack)?(?:-\d+(?:\.\d+)*)?\/lib$/.freeze
15
+ LOGGER_FILE = '/logtail/logger.rb'.freeze
16
16
 
17
17
  attr_reader :context_snapshot, :event, :level, :message, :progname, :tags, :time
18
18
 
@@ -39,6 +39,7 @@ module Logtail
39
39
  @tags = options[:tags]
40
40
  @context_snapshot = context_snapshot
41
41
  @event = event
42
+ @runtime_context = current_runtime_context || {}
42
43
  end
43
44
 
44
45
  # Builds a hash representation containing simple objects, suitable for serialization (JSON).
@@ -64,7 +65,7 @@ module Logtail
64
65
 
65
66
  hash[:context] ||= {}
66
67
  hash[:context][:runtime] ||= {}
67
- hash[:context][:runtime].merge!(current_runtime_context || {})
68
+ hash[:context][:runtime].merge!(@runtime_context)
68
69
 
69
70
  if options[:only]
70
71
  hash.select do |key, _value|
@@ -114,32 +115,43 @@ module Logtail
114
115
  end
115
116
 
116
117
  def current_runtime_context
117
- index = caller_locations.rindex { |x| logtail_frame?(x) }
118
- frame = caller_locations[index + 1] unless index.nil?
119
- return convert_to_runtime_context(frame) unless frame.nil?
118
+ last_logger_invocation_index = caller_locations.rindex { |frame| logtail_logger_frame?(frame) }
119
+ return {} if last_logger_invocation_index.nil?
120
+
121
+ calling_frame_index = last_logger_invocation_index + 1
122
+ frame = caller_locations[calling_frame_index]
123
+ return {} if frame.nil?
124
+
125
+ return convert_to_runtime_context(frame)
120
126
  end
121
127
 
122
128
  def convert_to_runtime_context(frame)
123
129
  {
124
- file: relative_to_main_module(frame.absolute_path),
130
+ file: path_relative_to_app_root(frame),
125
131
  line: frame.lineno,
126
132
  frame_label: frame.label,
127
133
  }
128
134
  end
129
135
 
130
- def logtail_frame?(frame)
131
- return false if frame.absolute_path.nil? || logtail_gem_paths.empty?
132
- logtail_gem_paths.any? { |path| frame.absolute_path.start_with?(path) }
136
+ def logtail_logger_frame?(frame)
137
+ !frame.absolute_path.nil? && frame.absolute_path.end_with?(LOGGER_FILE)
133
138
  end
134
139
 
135
- def logtail_gem_paths
136
- @logtail_gem_paths ||= $LOAD_PATH.select { |path| path.match(LOGTAIL_GEM_REGEX) }
140
+ def path_relative_to_app_root(frame)
141
+ Pathname.new(frame.absolute_path).relative_path_from(root_path).to_s
142
+ rescue
143
+ frame.absolute_path
137
144
  end
138
145
 
139
- def relative_to_main_module(path)
140
- base_file = caller_locations.last.absolute_path
141
- base_path = Pathname.new(File.dirname(base_file || '/'))
142
- Pathname.new(path).relative_path_from(base_path).to_s
146
+ def root_path
147
+ if Object.const_defined?('Rails')
148
+ Rails.root
149
+ elsif Object.const_defined?('Rack::Directory')
150
+ Pathname.new(Rack::Directory.new('').root)
151
+ else
152
+ base_file = caller_locations.last.absolute_path
153
+ Pathname.new(File.dirname(base_file || '/'))
154
+ end
143
155
  end
144
156
  end
145
157
  end
@@ -34,14 +34,13 @@ module Logtail
34
34
  def build_log_entry(severity, time, progname, logged_obj)
35
35
  context_snapshot = CurrentContext.instance.snapshot
36
36
  level = SEVERITY_MAP.fetch(severity)
37
- tags = extract_active_support_tagged_logging_tags
37
+ tags = extract_active_support_tagged_logging_tags.clone
38
38
 
39
39
  if logged_obj.is_a?(Event)
40
40
  LogEntry.new(level, time, progname, logged_obj.message, context_snapshot, logged_obj,
41
41
  tags: tags)
42
42
  elsif logged_obj.is_a?(Hash)
43
43
  # Extract the tags
44
- tags = tags.clone
45
44
  tags.push(logged_obj.delete(:tag)) if logged_obj.key?(:tag)
46
45
  tags.concat(logged_obj.delete(:tags)) if logged_obj.key?(:tags)
47
46
  tags.uniq!
@@ -56,7 +55,8 @@ module Logtail
56
55
 
57
56
  # Because of all the crazy ways Rails has attempted tags, we need this crazy method.
58
57
  def extract_active_support_tagged_logging_tags
59
- Thread.current[:activesupport_tagged_logging_tags] ||
58
+ @current_tags ||
59
+ Thread.current[:activesupport_tagged_logging_tags] ||
60
60
  Thread.current[tagged_logging_object_key_name] ||
61
61
  EMPTY_ARRAY
62
62
  end
@@ -1,3 +1,3 @@
1
1
  module Logtail
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.6"
3
3
  end
@@ -1,7 +1,7 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Logtail::LogEntry do
4
- let(:time) { Time.utc(2016, 9, 1, 12, 0, 0) }
4
+ let(:time) { Time.utc(2021, 06, 11, 12, 0, 0) }
5
5
 
6
6
  describe "#to_msgpack" do
7
7
  it "should encode properly with an event and context" do
@@ -16,20 +16,19 @@ describe Logtail::LogEntry do
16
16
  context = {custom: {a: "b"}}
17
17
  log_entry = described_class.new("INFO", time, nil, "log message", context, event)
18
18
  msgpack = log_entry.to_msgpack
19
- expect(msgpack).to start_with("\x85\xA5level\xA4INFO\xA2dt\xBB2016-09-01T12:00:00.000000Z".force_encoding("ASCII-8BIT"))
19
+ expect(msgpack).to start_with("\x85\xA5level\xA4INFO\xA2dt\xBB2021-06-11T12:00:00.000000Z".force_encoding("ASCII-8BIT"))
20
20
  end
21
21
  end
22
22
 
23
23
  describe "#to_hash" do
24
24
  it "should include runtime context information" do
25
- $:.unshift(File.expand_path(__dir__ + '/../../lib'))
25
+ log_entry = Logtail::Logger::PassThroughFormatter.new.call("INFO", time, "", "log message")
26
26
 
27
- log_entry = described_class.new("INFO", time, nil, "log message", {}, {})
28
27
  hash = log_entry.to_hash
29
28
  expect(hash[:context]).to_not be_nil
30
29
  expect(hash[:context][:runtime]).to_not be_nil
31
- expect(hash[:context][:runtime][:file]).to_not be_nil
32
- expect(hash[:context][:runtime][:line]).to_not be_nil
30
+ expect(hash[:context][:runtime][:file]).to end_with('/spec/logtail/log_entry_spec.rb')
31
+ expect(hash[:context][:runtime][:line]).to be(25)
33
32
  expect(hash[:context][:runtime][:frame_label]).to_not be_nil
34
33
  end
35
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logtail
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Logtail
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-26 00:00:00.000000000 Z
11
+ date: 2021-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack