trailer 0.1.4 → 0.1.5
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +10 -0
- data/README.md +3 -0
- data/lib/trailer/concern.rb +6 -4
- data/lib/trailer/configuration.rb +9 -3
- data/lib/trailer/recorder.rb +7 -4
- data/lib/trailer/storage/cloud_watch.rb +12 -10
- data/lib/trailer/storage/null.rb +17 -0
- data/lib/trailer/version.rb +1 -1
- metadata +3 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '080993ef6144050d45a1c16f07593acdfa29c99fd8b9a6bf5166e7bcabecd336'
|
4
|
+
data.tar.gz: '09e3d367d1246daa91c7acfca32d37d2863ab7f758d5956f948c0f067ce3d9aa'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 789c1083fedc2c1c04972d0f96c35126768ac92203460da24e2fc0734144f36af708028a87db03bfe3921a583e67a28c10695c97f5f598572035e63a53ea63cf
|
7
|
+
data.tar.gz: e93b1ad62ea77c1247ab07d27d9b324b27dd44be65515ee84eaca663bfc57e13b78c4a8bb368e0b172fcdc872da8889c5aef97f28f0ac555371c211b40f98982
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.1.5 - 2020-09-08
|
4
|
+
|
5
|
+
### Features
|
6
|
+
|
7
|
+
* Attach all known data to exceptions. ([#3])
|
8
|
+
* Add tests. ([#2])
|
9
|
+
|
10
|
+
[#3]: https://github.com/shuttlerock/trailer/pull/3
|
11
|
+
[#2]: https://github.com/shuttlerock/trailer/pull/2
|
12
|
+
|
3
13
|
## 0.1.4 - 2020-08-27
|
4
14
|
|
5
15
|
### Features
|
data/README.md
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
[](https://circleci.com/gh/Shuttlerock/workflows/trailer/tree/master)
|
2
|
+
[](https://badge.fury.io/rb/trailer)
|
3
|
+
|
1
4
|
# Trailer
|
2
5
|
|
3
6
|
Trailer provides a Ruby framework for tracing events in the context of a request or background job. It allows you to tag and log events with metadata, so that you can search later for e.g. all events and exceptions related to a particular request.
|
data/lib/trailer/concern.rb
CHANGED
@@ -14,11 +14,12 @@ module Trailer
|
|
14
14
|
def trace_event(event, resource = nil, **tags, &block) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
15
15
|
return yield block unless Trailer.enabled?
|
16
16
|
|
17
|
-
event = Trailer::Utility.resource_name(event) unless event.is_a?(String)
|
17
|
+
event = Trailer::Utility.resource_name(event) unless event.is_a?(String) || event.is_a?(Symbol)
|
18
18
|
|
19
19
|
unless resource.nil?
|
20
|
-
resource_name = resource if resource.is_a?(String)
|
20
|
+
resource_name = resource if resource.is_a?(String) || resource.is_a?(Symbol)
|
21
21
|
resource_name ||= Trailer::Utility.resource_name(resource)
|
22
|
+
resource_name ||= 'unknown'
|
22
23
|
|
23
24
|
# If column_names() is available, we are probably looking at an ActiveRecord instance.
|
24
25
|
if resource.class.respond_to?(:column_names)
|
@@ -27,8 +28,8 @@ module Trailer
|
|
27
28
|
end
|
28
29
|
elsif resource.respond_to?(:to_h)
|
29
30
|
# This handles other types of data, such as GraphQL input objects.
|
30
|
-
resource.to_h.
|
31
|
-
tags[key] ||= value if key.
|
31
|
+
resource.to_h.transform_keys(&:to_sym).each do |key, value|
|
32
|
+
tags[key] ||= value if key.match?(Trailer.config.auto_tag_fields) || Trailer.config.tag_fields.include?(key)
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
@@ -53,6 +54,7 @@ module Trailer
|
|
53
54
|
|
54
55
|
# Put the keys in alphabetical order, with the event and resource first.
|
55
56
|
sorted = { event: event, resource: resource_name }.merge(tags.sort_by { |key, _val| key.to_s }.to_h)
|
57
|
+
sorted.transform_keys!(&:to_sym)
|
56
58
|
RequestStore.store[:trailer].write(sorted)
|
57
59
|
|
58
60
|
result
|
@@ -14,8 +14,9 @@ module Trailer
|
|
14
14
|
:environment,
|
15
15
|
:storage,
|
16
16
|
:host_name,
|
17
|
-
:service_name
|
18
|
-
|
17
|
+
:service_name
|
18
|
+
|
19
|
+
attr_reader :tag_fields
|
19
20
|
|
20
21
|
# Constructor.
|
21
22
|
def initialize
|
@@ -40,7 +41,12 @@ module Trailer
|
|
40
41
|
# The storage backend class to use.
|
41
42
|
@storage = Trailer::Storage::CloudWatch
|
42
43
|
# Optional - When tracing ActiveRecord instances, we can tag our trace with these fields explicitly.
|
43
|
-
@tag_fields = %
|
44
|
+
@tag_fields = %i[name]
|
45
|
+
end
|
46
|
+
|
47
|
+
# Make sure we store tag_fields as symbols for consistency.
|
48
|
+
def tag_fields=(fields)
|
49
|
+
@tag_fields = Array(fields).flatten.map(&:to_sym)
|
44
50
|
end
|
45
51
|
end
|
46
52
|
end
|
data/lib/trailer/recorder.rb
CHANGED
@@ -13,13 +13,14 @@ module Trailer
|
|
13
13
|
#
|
14
14
|
# @param err [Exception] The exception to record.
|
15
15
|
def add_exception(err)
|
16
|
-
write(
|
16
|
+
write(tags.merge(exception: err.class.name, message: err.message, trace: Array(err.backtrace)[0..9]))
|
17
17
|
end
|
18
18
|
|
19
19
|
# Finish tracing, and flush storage.
|
20
20
|
def finish
|
21
21
|
storage.async.flush
|
22
22
|
@trace_id = nil
|
23
|
+
@tags = {}
|
23
24
|
end
|
24
25
|
|
25
26
|
# Create a new trace ID to link log entries.
|
@@ -28,6 +29,7 @@ module Trailer
|
|
28
29
|
|
29
30
|
# See https://github.com/aws/aws-xray-sdk-ruby/blob/1869ca5/lib/aws-xray-sdk/model/segment.rb#L26-L30
|
30
31
|
@trace_id = %(1-#{Time.now.to_i.to_s(16)}-#{SecureRandom.hex(12)})
|
32
|
+
@tags = {} # This is used to accumulate tags in case we have an exception.
|
31
33
|
end
|
32
34
|
|
33
35
|
# Write the given hash to storage.
|
@@ -36,18 +38,19 @@ module Trailer
|
|
36
38
|
def write(data)
|
37
39
|
raise Trailer::Error, 'start() must be called before write()' if @trace_id.nil?
|
38
40
|
raise Trailer::Error, 'data must be an instance of Hash' unless data.is_a?(Hash)
|
39
|
-
raise Trailer::Error, 'could not convert data to JSON' unless data.respond_to?(:to_json)
|
40
41
|
|
41
42
|
# Include some standard tags.
|
42
43
|
data[:environment] ||= Trailer.config.environment
|
43
44
|
data[:host_name] ||= Trailer.config.host_name
|
44
45
|
data[:service_name] ||= Trailer.config.service_name
|
46
|
+
data = data.compact.merge(trace_id: trace_id)
|
45
47
|
|
46
|
-
storage.async.write(data
|
48
|
+
storage.async.write(data)
|
49
|
+
@tags.merge!(data)
|
47
50
|
end
|
48
51
|
|
49
52
|
private
|
50
53
|
|
51
|
-
attr_accessor :storage, :trace_id
|
54
|
+
attr_accessor :storage, :tags, :trace_id
|
52
55
|
end
|
53
56
|
end
|
@@ -16,16 +16,6 @@ module Trailer
|
|
16
16
|
ensure_log_stream
|
17
17
|
end
|
18
18
|
|
19
|
-
# Queues the given hash for writing to CloudWatch.
|
20
|
-
#
|
21
|
-
# @param data [Hash] A key-value hash of trace data to write to storage.
|
22
|
-
def write(data)
|
23
|
-
messages << {
|
24
|
-
timestamp: (Time.now.utc.to_f.round(3) * 1000).to_i,
|
25
|
-
message: data&.to_json,
|
26
|
-
}.compact
|
27
|
-
end
|
28
|
-
|
29
19
|
# Sends all of the queued messages to CloudWatch, and resets the messages queue.
|
30
20
|
#
|
31
21
|
# See https://stackoverflow.com/a/36901509
|
@@ -49,6 +39,18 @@ module Trailer
|
|
49
39
|
retry
|
50
40
|
end
|
51
41
|
|
42
|
+
# Queues the given hash for writing to CloudWatch.
|
43
|
+
#
|
44
|
+
# @param data [Hash] A key-value hash of trace data to write to storage.
|
45
|
+
def write(data)
|
46
|
+
return if data.empty?
|
47
|
+
|
48
|
+
messages << {
|
49
|
+
timestamp: (Time.now.utc.to_f.round(3) * 1000).to_i,
|
50
|
+
message: data&.to_json,
|
51
|
+
}.compact
|
52
|
+
end
|
53
|
+
|
52
54
|
private
|
53
55
|
|
54
56
|
attr_accessor :client, :messages, :sequence_token
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Trailer
|
4
|
+
module Storage
|
5
|
+
class Null
|
6
|
+
include Concurrent::Async
|
7
|
+
|
8
|
+
# Pretends to queue the given hash for writing.
|
9
|
+
#
|
10
|
+
# @param data [Hash] A key-value hash of trace data to write to storage.
|
11
|
+
def write(_data); end
|
12
|
+
|
13
|
+
# Pretends to flush the queued messages to the storage provider.
|
14
|
+
def flush; end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/trailer/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trailer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dave Perrett
|
@@ -34,7 +34,7 @@ cert_chain:
|
|
34
34
|
3Um/SScB6alBpv/eTa/qPXa+S84pZDU6kFDasnH7GEl6jYlVxZbzpHUIvkDIOp5J
|
35
35
|
6O1XOcLc39AfX5etu1WZ+wx3xUzux0oqS6rXcl63HmuKe8Son7RqJQ==
|
36
36
|
-----END CERTIFICATE-----
|
37
|
-
date: 2020-08
|
37
|
+
date: 2020-09-08 00:00:00.000000000 Z
|
38
38
|
dependencies:
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
40
|
name: aws-sdk-cloudwatchlogs
|
@@ -247,6 +247,7 @@ files:
|
|
247
247
|
- lib/trailer/railtie.rb
|
248
248
|
- lib/trailer/recorder.rb
|
249
249
|
- lib/trailer/storage/cloud_watch.rb
|
250
|
+
- lib/trailer/storage/null.rb
|
250
251
|
- lib/trailer/utility.rb
|
251
252
|
- lib/trailer/version.rb
|
252
253
|
- trailer.gemspec
|
metadata.gz.sig
CHANGED
Binary file
|