timber 1.0.7 → 1.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -21
- data/lib/timber/log_devices/http.rb +20 -4
- data/lib/timber/log_devices/http/triggered_buffer.rb +12 -4
- data/lib/timber/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e48b303535350b36a68d4af296da5a9ee1ddfe1
|
4
|
+
data.tar.gz: accd259a2827a8a466e5cb2aadfc93ac8d350cb9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2f4bf4cf69e07973acc22b59892bcb0b33c76af23de8023fa6fde65807752d7f2d5739ecbed720e0c344bf2c14eda2b994772ec0450fc36c40922d9681e65ea1
|
7
|
+
data.tar.gz: 5917a43860fe36328e1a5246596eca5124ce4a4ca589f41a7b1a3da529484c5b04fab5760f96e98d74f64e90a75b782b7188f2057aa6d2423705a9f03f151ed4
|
data/README.md
CHANGED
@@ -58,9 +58,8 @@ Into this:
|
|
58
58
|
}
|
59
59
|
```
|
60
60
|
|
61
|
-
|
62
|
-
|
63
|
-
your framework logs.
|
61
|
+
It does the same for `http requests`, `sql queries`, `exceptions`, `template renderings`,
|
62
|
+
and any other event your framework logs.
|
64
63
|
|
65
64
|
(for a full list see [`Timber::Events`](lib/timber/events))
|
66
65
|
|
@@ -69,19 +68,13 @@ your framework logs.
|
|
69
68
|
|
70
69
|
Glad you asked! :)
|
71
70
|
|
72
|
-
1. It's application aware and enriches your logs with data you can't get otherwise.
|
73
|
-
entire process is fully managed for you.
|
71
|
+
1. It's application aware and enriches your logs with data you can't get otherwise.
|
74
72
|
2. It defines a shared schema across all of our libraries. Meaning your log data, across all
|
75
|
-
applications,
|
73
|
+
applications, is normalized.
|
76
74
|
3. It does not alter the original log message, giving you the best of both worlds: human
|
77
75
|
readable logs *and* rich structured events.
|
78
|
-
4. It's completely transparent with absolutely no vendor lock-in or risk of code debt.
|
79
|
-
|
80
|
-
any reprocusion.
|
81
|
-
|
82
|
-
What really makes Timber unique is that at the end of the day it's just good ol' loggin'.
|
83
|
-
No special API, no proprietary data format, the data is accessible and owned by you.
|
84
|
-
[Woo!](http://i.giphy.com/7JYWGKgwxga5i.gif)
|
76
|
+
4. It's completely transparent with absolutely no vendor lock-in or risk of code debt. It
|
77
|
+
does not introduce a special API, it's just good ol' loggin'.
|
85
78
|
|
86
79
|
|
87
80
|
## Logging Custom Events
|
@@ -113,8 +106,6 @@ No mention of Timber anywhere!
|
|
113
106
|
|
114
107
|
## The Timber Console / Pricing
|
115
108
|
|
116
|
-
Like my mother always said:
|
117
|
-
|
118
109
|
> What good is structured log data if you can't search and visualize it?
|
119
110
|
|
120
111
|
Enter [the Timber Console](https://timber.io). It's a modern, fast, and beautiful console for
|
@@ -182,14 +173,8 @@ No probs! Use it as normal, Timber will even pull out the tags and include them
|
|
182
173
|
config.logger = ActiveSupport::TaggedLogging.new(Timber::Logger.new(STDOUT))
|
183
174
|
```
|
184
175
|
|
185
|
-
**Warning**: Tags lack meaningful descriptions, they are a poor mans context. Not to worry though!
|
186
|
-
Timber provides a simple system for adding custom context that you can optionally use. Checkout
|
187
|
-
[the `Timber::CurrentContext` docs](lib/timber/current_context.rb) for examples.
|
188
|
-
|
189
176
|
---
|
190
177
|
|
191
|
-
I leave you with one final thought:
|
192
|
-
|
193
178
|
<p align="center" style="background: #140f2a;">
|
194
179
|
<a href="http://github.com/timberio/timber-ruby"><img src="http://files.timber.io/images/ruby-library-readme-log-truth.png" height="947" /></a>
|
195
180
|
</p>
|
@@ -8,7 +8,7 @@ module Timber
|
|
8
8
|
#
|
9
9
|
# See {#initialize} for options and more details.
|
10
10
|
class HTTP
|
11
|
-
API_URI = URI.parse("https://logs.timber.io/frames")
|
11
|
+
API_URI = URI.parse(ENV["TIMBER_INGESTION_URL"] || "https://logs.timber.io/frames")
|
12
12
|
CONTENT_TYPE = "application/x-timber-msgpack-frame-1".freeze
|
13
13
|
CONNECTION_HEADER = "keep-alive".freeze
|
14
14
|
USER_AGENT = "Timber Ruby Gem/#{Timber::VERSION}".freeze
|
@@ -16,6 +16,7 @@ module Timber
|
|
16
16
|
https.use_ssl = true
|
17
17
|
https.read_timeout = 30
|
18
18
|
https.ssl_timeout = 10
|
19
|
+
# Ruby 1.9.X doesn't have this setting.
|
19
20
|
if https.respond_to?(:keep_alive_timeout=)
|
20
21
|
https.keep_alive_timeout = 60
|
21
22
|
end
|
@@ -64,6 +65,15 @@ module Timber
|
|
64
65
|
@delivery_interval_thread = Thread.new do
|
65
66
|
loop do
|
66
67
|
sleep(options[:delivery_frequency_seconds] || DELIVERY_FREQUENCY_SECONDS)
|
68
|
+
|
69
|
+
@last_messages_overflow_count = 0
|
70
|
+
messages_overflown_count = @buffer.messages_overflown_count
|
71
|
+
if messages_overflown_count >= @last_messages_overflow_count
|
72
|
+
difference = messages_overflown_count - @last_messages_overflow_count
|
73
|
+
@last_messages_overflow_count = messages_overflown_count
|
74
|
+
logger.warn("Timber HTTP buffer has overflown #{difference} times")
|
75
|
+
end
|
76
|
+
|
67
77
|
buffer_for_delivery = @buffer.reserve
|
68
78
|
if buffer_for_delivery
|
69
79
|
deliver(buffer_for_delivery)
|
@@ -106,11 +116,13 @@ module Timber
|
|
106
116
|
res = HTTPS.request(request)
|
107
117
|
code = res.code.to_i
|
108
118
|
if code < 200 || code >= 300
|
109
|
-
|
110
|
-
|
119
|
+
try = try_index + 1
|
120
|
+
logger.debug("Timber HTTP delivery failed, try #{try} - #{res.code}: #{res.body}")
|
121
|
+
sleep(try * BACKOFF_RATE_SECONDS)
|
111
122
|
else
|
112
123
|
@buffer.remove(body)
|
113
|
-
|
124
|
+
logger.debug("Timber HTTP delivery successful - #{code}")
|
125
|
+
logger.debug("Timber new buffer size - #{@buffer.total_bytesize}")
|
114
126
|
break # exit the loop
|
115
127
|
end
|
116
128
|
end
|
@@ -120,6 +132,10 @@ module Timber
|
|
120
132
|
def authorization_payload
|
121
133
|
@authorization_payload ||= "Basic #{Base64.strict_encode64(@api_key).chomp}"
|
122
134
|
end
|
135
|
+
|
136
|
+
def logger
|
137
|
+
Config.instance.logger
|
138
|
+
end
|
123
139
|
end
|
124
140
|
end
|
125
141
|
end
|
@@ -15,12 +15,15 @@ module Timber
|
|
15
15
|
DEFAULT_PAYLOAD_LIMIT_BYTES = 5_000_000 # 5mb, the Timber API will not accept messages larger than this
|
16
16
|
DEFAULT_LIMIT_BYTES = 50_000_000 # 50mb
|
17
17
|
|
18
|
+
attr_reader :messages_overflown_count
|
19
|
+
|
18
20
|
def initialize(options = {})
|
19
21
|
@buffers = []
|
20
22
|
@monitor = Monitor.new
|
21
23
|
@payload_limit_bytes = options[:payload_limit_bytes] || DEFAULT_PAYLOAD_LIMIT_BYTES
|
22
24
|
@limit_bytes = options[:limit_bytes] || DEFAULT_LIMIT_BYTES
|
23
25
|
@overflow_handler = options[:overflow_handler]
|
26
|
+
@messages_overflown_count = 0
|
24
27
|
end
|
25
28
|
|
26
29
|
def write(msg)
|
@@ -59,20 +62,25 @@ module Timber
|
|
59
62
|
end
|
60
63
|
end
|
61
64
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
end
|
65
|
+
def total_bytesize
|
66
|
+
@buffers.reduce(0) { |acc, buffer| acc + buffer.bytesize }
|
67
|
+
end
|
66
68
|
|
69
|
+
private
|
67
70
|
def writable_buffer
|
68
71
|
@buffers.find { |buffer| !buffer.frozen? }
|
69
72
|
end
|
70
73
|
|
71
74
|
def handle_overflow(msg)
|
75
|
+
@messages_overflown_count += 1
|
72
76
|
if @overflow_handler
|
73
77
|
@overflow_handler.call(msg)
|
74
78
|
end
|
75
79
|
end
|
80
|
+
|
81
|
+
def logger
|
82
|
+
Config.instance.logger
|
83
|
+
end
|
76
84
|
end
|
77
85
|
end
|
78
86
|
end
|
data/lib/timber/version.rb
CHANGED