contextualized_logs 0.0.1.pre.alpha
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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +480 -0
- data/Rakefile +28 -0
- data/app/assets/config/manifest.js +3 -0
- data/app/assets/javascripts/application.js +16 -0
- data/app/assets/javascripts/cable.js +13 -0
- data/app/assets/stylesheets/application.css +15 -0
- data/app/channels/application_cable/channel.rb +4 -0
- data/app/channels/application_cable/connection.rb +4 -0
- data/app/controllers/application_controller.rb +2 -0
- data/app/controllers/model_controller.rb +26 -0
- data/app/helpers/application_helper.rb +2 -0
- data/app/jobs/application_job.rb +2 -0
- data/app/mailers/application_mailer.rb +4 -0
- data/app/models/application_record.rb +3 -0
- data/app/models/model.rb +4 -0
- data/app/views/layouts/application.html.erb +15 -0
- data/app/views/layouts/mailer.html.erb +13 -0
- data/app/views/layouts/mailer.text.erb +1 -0
- data/app/workers/model_worker.rb +13 -0
- data/config/application.rb +19 -0
- data/config/boot.rb +4 -0
- data/config/cable.yml +10 -0
- data/config/credentials.yml.enc +1 -0
- data/config/database.yml +25 -0
- data/config/environment.rb +5 -0
- data/config/environments/development.rb +62 -0
- data/config/environments/production.rb +94 -0
- data/config/environments/test.rb +47 -0
- data/config/initializers/application_controller_renderer.rb +8 -0
- data/config/initializers/assets.rb +14 -0
- data/config/initializers/backtrace_silencers.rb +7 -0
- data/config/initializers/content_security_policy.rb +25 -0
- data/config/initializers/cookies_serializer.rb +5 -0
- data/config/initializers/filter_parameter_logging.rb +4 -0
- data/config/initializers/inflections.rb +16 -0
- data/config/initializers/mime_types.rb +4 -0
- data/config/initializers/sidekiq.rb +23 -0
- data/config/initializers/wrap_parameters.rb +14 -0
- data/config/locales/en.yml +33 -0
- data/config/master.key +1 -0
- data/config/puma.rb +37 -0
- data/config/routes.rb +3 -0
- data/config/spring.rb +6 -0
- data/config/storage.yml +34 -0
- data/db/development.sqlite3 +0 -0
- data/db/migrate/20200424081113_create_model.rb +7 -0
- data/db/schema.rb +19 -0
- data/db/seeds.rb +7 -0
- data/db/test.sqlite3 +0 -0
- data/lib/contextualized_logs/contextualized_controller.rb +63 -0
- data/lib/contextualized_logs/contextualized_logger.rb +90 -0
- data/lib/contextualized_logs/contextualized_model.rb +54 -0
- data/lib/contextualized_logs/contextualized_worker.rb +41 -0
- data/lib/contextualized_logs/current_context.rb +99 -0
- data/lib/contextualized_logs/railtie.rb +9 -0
- data/lib/contextualized_logs/sidekiq/middleware/client/inject_current_context.rb +38 -0
- data/lib/contextualized_logs/sidekiq/middleware/server/restore_current_context.rb +43 -0
- data/lib/contextualized_logs/version.rb +3 -0
- data/lib/contextualized_logs.rb +11 -0
- data/lib/tasks/contextualized_logs_tasks.rake +4 -0
- metadata +123 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2999bdeabefea3e6d361b02314d3746a98f2205e2af9b1ca48abd66cbeb2338d
|
4
|
+
data.tar.gz: 6dd09536859433929a51c184571af703611c69d10beddf6e7ba78280905288a6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 119a4ec8c01cf01261b122bcd9f0a8526e0c888ab25444ae0f20487e1528f282e8f58592c424a8b78f1b0fa198265be1168aa0304348ad185c26d10419d2ea98
|
7
|
+
data.tar.gz: bf2d43f375f0b1b1800b7febc9bcfcb76827ec4143a49487059d307e4dd2f5bf651f4434a6230007acdb4e0420aa29a5000e9e2f819e61fcf1fd63011a419341
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2020 Hugues Bernet-Rollande
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,480 @@
|
|
1
|
+
# ContextualizedLogs
|
2
|
+
|
3
|
+
Online logging solution (like [Datadog](https://www.datadoghq.com)) have drastically transform the way we log.
|
4
|
+
|
5
|
+
An app will nowdays logs dozen (hundred) of logs per requests.
|
6
|
+
|
7
|
+
The issue is often to correlate this logs, with the initiating request (or job) and add shared metadata on this logs.
|
8
|
+
|
9
|
+
Here come `ContextualizedLogs`.
|
10
|
+
|
11
|
+
The main idea is to enhance your logs from your controller (including `ContextualizedController`, which use a before action), which will add the params to your logs (and some metadata about the request itself, like `request.uuid`).
|
12
|
+
|
13
|
+
This metadata are stored in a `ActiveSupport::CurrentAttributes` which is a singleton (reset per request).
|
14
|
+
|
15
|
+
Each subsequent logs in this thread (request) will also be enriched with this metadata, making it easier to find all the logs associated with a request (`uuid`, `ip`, `params.xxx`).
|
16
|
+
|
17
|
+
On top of this, logs can also be enriched by the ActiveRecord model they use (`create` or `find`) (models including `ContextualizedModel`). So any time a contextualized model is created or find, some metadata related to the model (`id`, ...) will also be added to the logs.
|
18
|
+
|
19
|
+
Allowing you to find all logs which "touched" this models.
|
20
|
+
|
21
|
+
All logs are (by default in json format)
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
class MyController < ApplicationController
|
25
|
+
include ContextualizedLogs::ContextualizedController
|
26
|
+
end
|
27
|
+
```
|
28
|
+
|
29
|
+
```
|
30
|
+
curl --referer 'referer' --user-agent 'user_agent' -H "Origin: http://localhost" http://localhost/my_controller?param=a
|
31
|
+
|
32
|
+
# development.log
|
33
|
+
{
|
34
|
+
syslog: {
|
35
|
+
env: 'development',
|
36
|
+
host: 'localhost'
|
37
|
+
},
|
38
|
+
type: 'INFO',
|
39
|
+
time: '2020-04-24T19:52:51.452+02:00',
|
40
|
+
log_type: 'log',
|
41
|
+
resource_name: 'mycontroller_show',
|
42
|
+
http: {
|
43
|
+
referer: 'referer',
|
44
|
+
request_id: 'xxxx-xxxx-xxxx-xxxx'
|
45
|
+
useragent: 'user_agent',
|
46
|
+
origin: 'http://localhost'
|
47
|
+
},
|
48
|
+
network: {
|
49
|
+
client: {
|
50
|
+
ip: '127.0.0.1',
|
51
|
+
remote_addr: '127.0.0.1',
|
52
|
+
remote_ip: '127.0.0.1',
|
53
|
+
x_forwarded_for: '127.0.0.1'
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|
57
|
+
```
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
class User < ActiveRecord::Base
|
61
|
+
include ContextualizedLogs::ContextualizedModel
|
62
|
+
contextualizable { user_ids: :id }
|
63
|
+
end
|
64
|
+
|
65
|
+
class UserController < ApplicationController
|
66
|
+
include ContextualizedLogs::ContextualizedController
|
67
|
+
contextualized_model true
|
68
|
+
|
69
|
+
def show
|
70
|
+
User.find(params[:id])
|
71
|
+
end
|
72
|
+
end
|
73
|
+
```
|
74
|
+
|
75
|
+
```
|
76
|
+
curl http://localhost/users/1
|
77
|
+
|
78
|
+
# development.log
|
79
|
+
{
|
80
|
+
syslog: {
|
81
|
+
env: 'development',
|
82
|
+
host: 'localhost'
|
83
|
+
},
|
84
|
+
type: 'INFO',
|
85
|
+
time: '2020-04-24T19:52:51.452+02:00',
|
86
|
+
log_type: 'log',
|
87
|
+
context_values: {
|
88
|
+
user_ids: [1]
|
89
|
+
},
|
90
|
+
resource_name: 'mycontroller_show',
|
91
|
+
http: {
|
92
|
+
request_id: 'xxxx-xxxx-xxxx-xxxx'
|
93
|
+
},
|
94
|
+
network: {
|
95
|
+
client: {
|
96
|
+
ip: '127.0.0.1',
|
97
|
+
remote_addr: '127.0.0.1',
|
98
|
+
remote_ip: '127.0.0.1',
|
99
|
+
x_forwarded_for: '127.0.0.1'
|
100
|
+
}
|
101
|
+
}
|
102
|
+
}
|
103
|
+
```
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
class User < ActiveRecord::Base
|
107
|
+
include ContextualizedLogs::ContextualizedModel
|
108
|
+
contextualizable { user_ids: :id }
|
109
|
+
end
|
110
|
+
|
111
|
+
class UserTracker < ActiveRecord::Base
|
112
|
+
include ContextualizedLogs::ContextualizedModel
|
113
|
+
|
114
|
+
belongs_to :user
|
115
|
+
|
116
|
+
contextualizable { user_tracker_ids: :id }
|
117
|
+
end
|
118
|
+
|
119
|
+
class UserController < ApplicationController
|
120
|
+
include ContextualizedLogs::ContextualizedController
|
121
|
+
contextualized_model true
|
122
|
+
|
123
|
+
def show
|
124
|
+
user_id = params[:id]
|
125
|
+
User.find(user_id)
|
126
|
+
UserTrackerWorker.perform_async(user_id, 'show')
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
class UserTrackerWorker
|
131
|
+
include Sidekiq::Worker
|
132
|
+
include ContextualizedLogs::ContextualizedWorker
|
133
|
+
contextualized_worker true
|
134
|
+
contextualized_model true
|
135
|
+
def self.contextualize_args(args)
|
136
|
+
{ user_id: args.first, action: args.last }
|
137
|
+
end
|
138
|
+
|
139
|
+
def perform(user_id, action)
|
140
|
+
UserTracker.create(user_id: user_id, action: action)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
```
|
144
|
+
|
145
|
+
```
|
146
|
+
curl http://localhost/users/1
|
147
|
+
|
148
|
+
# development.log
|
149
|
+
{
|
150
|
+
syslog: {
|
151
|
+
env: 'development',
|
152
|
+
host: 'localhost'
|
153
|
+
},
|
154
|
+
type: 'INFO',
|
155
|
+
time: '2020-04-24T19:52:51.452+02:00',
|
156
|
+
log_type: 'log',
|
157
|
+
context_values: {
|
158
|
+
user_ids: [1]
|
159
|
+
},
|
160
|
+
enqueued_jobs_ids: ['1234-xxxx-xxxx-xxxx']
|
161
|
+
resource_name: 'mycontroller_show',
|
162
|
+
http: {
|
163
|
+
request_id: 'xxxx-xxxx-xxxx-xxxx'
|
164
|
+
},
|
165
|
+
network: {
|
166
|
+
client: {
|
167
|
+
ip: '127.0.0.1',
|
168
|
+
remote_addr: '127.0.0.1',
|
169
|
+
remote_ip: '127.0.0.1',
|
170
|
+
x_forwarded_for: '127.0.0.1'
|
171
|
+
}
|
172
|
+
}
|
173
|
+
}
|
174
|
+
{
|
175
|
+
syslog: {
|
176
|
+
env: 'development',
|
177
|
+
host: 'localhost'
|
178
|
+
},
|
179
|
+
type: 'INFO',
|
180
|
+
time: '2020-04-24T19:52:51.452+02:00',
|
181
|
+
log_type: 'log',
|
182
|
+
message: 'sidekiq: completing job UserWorker: 1234-xxxx-xxxx-xxxx, on queue default',
|
183
|
+
job: {
|
184
|
+
worker: 'UserWorker',
|
185
|
+
id: '1234-xxxx-xxxx-xxxx',
|
186
|
+
args: {
|
187
|
+
user_id: 1,
|
188
|
+
action: 'show'
|
189
|
+
}
|
190
|
+
}
|
191
|
+
context_values: {
|
192
|
+
user_ids: [1],
|
193
|
+
user_tracker_ids: [1]
|
194
|
+
},
|
195
|
+
enqueued_jobs_ids: ['xxxx-xxxx-xxxx-xxxx']
|
196
|
+
resource_name: 'mycontroller_show',
|
197
|
+
http: {
|
198
|
+
request_id: 'xxxx-xxxx-xxxx-xxxx'
|
199
|
+
},
|
200
|
+
network: {
|
201
|
+
client: {
|
202
|
+
ip: '127.0.0.1',
|
203
|
+
remote_addr: '127.0.0.1',
|
204
|
+
remote_ip: '127.0.0.1',
|
205
|
+
x_forwarded_for: '127.0.0.1'
|
206
|
+
}
|
207
|
+
}
|
208
|
+
}
|
209
|
+
{
|
210
|
+
syslog: {
|
211
|
+
env: 'development',
|
212
|
+
host: 'localhost'
|
213
|
+
},
|
214
|
+
type: 'INFO',
|
215
|
+
time: '2020-04-24T19:52:51.452+02:00',
|
216
|
+
log_type: 'log',
|
217
|
+
message: 'sidekiq: completing job UserWorker: 1234-xxxx-xxxx-xxxx, on queue default',
|
218
|
+
job: {
|
219
|
+
worker: 'UserWorker',
|
220
|
+
id: '1234-xxxx-xxxx-xxxx',
|
221
|
+
args: {
|
222
|
+
user_id: 1,
|
223
|
+
action: 'show'
|
224
|
+
}
|
225
|
+
}
|
226
|
+
context_values: {
|
227
|
+
user_ids: [1],
|
228
|
+
user_tracker_ids: [1]
|
229
|
+
},
|
230
|
+
enqueued_jobs_ids: ['xxxx-xxxx-xxxx-xxxx']
|
231
|
+
resource_name: 'mycontroller_show',
|
232
|
+
http: {
|
233
|
+
request_id: 'xxxx-xxxx-xxxx-xxxx'
|
234
|
+
},
|
235
|
+
network: {
|
236
|
+
client: {
|
237
|
+
ip: '127.0.0.1',
|
238
|
+
remote_addr: '127.0.0.1',
|
239
|
+
remote_ip: '127.0.0.1',
|
240
|
+
x_forwarded_for: '127.0.0.1'
|
241
|
+
}
|
242
|
+
}
|
243
|
+
}
|
244
|
+
```
|
245
|
+
|
246
|
+
## Demo
|
247
|
+
|
248
|
+
### start rails
|
249
|
+
```
|
250
|
+
bin/setup
|
251
|
+
bin/rails server
|
252
|
+
```
|
253
|
+
|
254
|
+
### start sidekiq
|
255
|
+
```
|
256
|
+
bundle exec sidekiq
|
257
|
+
```
|
258
|
+
|
259
|
+
### tail logs
|
260
|
+
```
|
261
|
+
tail -f log/development
|
262
|
+
```
|
263
|
+
|
264
|
+
### do some requests
|
265
|
+
```
|
266
|
+
curl -X POST -d '{"value": "value"}' -H 'Content-Type: application/json' "http://localhost:3000/model"
|
267
|
+
curl "http://localhost:3000/model/1"
|
268
|
+
curl "http://localhost:3000/model"
|
269
|
+
curl -X DELETE "http://localhost:3000/model/1"
|
270
|
+
```
|
271
|
+
|
272
|
+
## Usage
|
273
|
+
|
274
|
+
### ContextualizedLogger
|
275
|
+
|
276
|
+
In order to enrich your logs, you needs to use (subclass of `ActiveSupport::Logger`) `ContextualizedLogger`
|
277
|
+
|
278
|
+
> ContextualizedLogger logs by default some request metadata following Datadog naming convention
|
279
|
+
> https://docs.hq.com/logs/processing/attributes_naming_convention/#source-code
|
280
|
+
|
281
|
+
```
|
282
|
+
Rails.application.configure do
|
283
|
+
config.logger = ContextualizedLogs::ContextualizedLogger.new("log/#{Rails.env}.log")
|
284
|
+
end
|
285
|
+
````
|
286
|
+
|
287
|
+
### ContextualizedController
|
288
|
+
|
289
|
+
```
|
290
|
+
class Controller < ApplicationController
|
291
|
+
include ContextualizedLogs::ContextualizedController
|
292
|
+
end
|
293
|
+
```
|
294
|
+
|
295
|
+
**All** (from the controller or any service, model, ... it used) this controller logs will now be enriched with some controller related metadata.
|
296
|
+
|
297
|
+
### ContextualizedModel
|
298
|
+
|
299
|
+
```
|
300
|
+
class Model < ActiveRecord::Base
|
301
|
+
include ContextualizedLogs::ContextualizedModel
|
302
|
+
|
303
|
+
# cherry picking which model value/column should be added to CurrentContext metadata
|
304
|
+
contextualizable keys: {model_ids: :id}
|
305
|
+
end
|
306
|
+
```
|
307
|
+
|
308
|
+
If `ContextualizedLogs::CurrentContext.contextualized_model_enabled` is enable on the current tread, any Model which is created or find will add `{ context_values: { model_ids: ids } }`.
|
309
|
+
So if you fetch model (`id == 1`), and create model (`id == 2`), your logs will now contain `{ context_values: { model_ids: [1, 2] } }`.
|
310
|
+
|
311
|
+
### ContextualizedWorker
|
312
|
+
|
313
|
+
```
|
314
|
+
class Worker
|
315
|
+
include ContextualizedLogs::ContextualizedWorker
|
316
|
+
contextualized_worker true # enable logging of job enqueuing, performing, completing and failure
|
317
|
+
contextualized_model true # enable logging of any (contextualized) model found or created while performing job
|
318
|
+
|
319
|
+
# enable adding jobs args (cherry picked) to log metadata (CurrentContext) to be logged alongs any job logs
|
320
|
+
def self.contextualize_args(args)
|
321
|
+
{ first: args.first }
|
322
|
+
end
|
323
|
+
end
|
324
|
+
```
|
325
|
+
|
326
|
+
If `ContextualizedLogs::CurrentContext.contextualized_model_enabled` is enable on the current tread, any Model which is created or find will add `{ context_values: { model_ids: ids } }`.
|
327
|
+
So if you fetch model (`id == 1`), and create model (`id == 2`), your logs will now contain `{ context_values: { model_ids: [1, 2] } }`.
|
328
|
+
|
329
|
+
#### Metadata Customization
|
330
|
+
|
331
|
+
If you wish to logs different predefined metadata (`request.uuid`, `request.ip`, ...)
|
332
|
+
|
333
|
+
## Installation
|
334
|
+
|
335
|
+
Add this line to your application's Gemfile:
|
336
|
+
|
337
|
+
```ruby
|
338
|
+
gem 'contextualized_logs'
|
339
|
+
```
|
340
|
+
|
341
|
+
And then execute:
|
342
|
+
|
343
|
+
$ bundle install
|
344
|
+
|
345
|
+
|
346
|
+
## Roadmap
|
347
|
+
|
348
|
+
- [x] contextualized logger
|
349
|
+
- [x] contextualized controller
|
350
|
+
- [x] contextualized model
|
351
|
+
- [x] contextualized worker
|
352
|
+
- [ ] lograge
|
353
|
+
|
354
|
+
## Specs
|
355
|
+
|
356
|
+
```
|
357
|
+
$ rake
|
358
|
+
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
|
359
|
+
/Users/hugues/.rvm/rubies/ruby-2.5.1/bin/ruby -I/Users/hugues/.rvm/gems/ruby-2.5.1/gems/rspec-core-3.8.2/lib:/Users/hugues/.rvm/gems/ruby-2.5.1/gems/rspec-support-3.8.3/lib /Users/hugues/.rvm/gems/ruby-2.5.1/gems/rspec-core-3.8.2/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
|
360
|
+
|
361
|
+
DummyController
|
362
|
+
should set request details
|
363
|
+
should NOT set enable model context values
|
364
|
+
should set resource_name
|
365
|
+
should set request details
|
366
|
+
|
367
|
+
ContextualizedModelDummyController
|
368
|
+
should set request details
|
369
|
+
should set enable model context values
|
370
|
+
|
371
|
+
ContextualizedLogs::ContextualizedLogger
|
372
|
+
format log
|
373
|
+
includes stack
|
374
|
+
format exception
|
375
|
+
inject context
|
376
|
+
dump
|
377
|
+
respect severity debug (default)
|
378
|
+
dump message
|
379
|
+
dump exception
|
380
|
+
|
381
|
+
ContextualizedLogs::ContextualizedModel
|
382
|
+
.contextualizable
|
383
|
+
set contextualizable keys
|
384
|
+
.contextualize
|
385
|
+
with contextualized_model_enabled == true
|
386
|
+
set contextualizable values
|
387
|
+
with contextualized_model_enabled == false
|
388
|
+
set contextualizable values
|
389
|
+
with CurrentContext.contextualized_model_enabled == true
|
390
|
+
behaves like after_create context
|
391
|
+
.after_create
|
392
|
+
set context
|
393
|
+
behaves like after_find context
|
394
|
+
.after_find
|
395
|
+
does
|
396
|
+
with CurrentContext.contextualized_model_enabled == false
|
397
|
+
behaves like after_create context
|
398
|
+
.after_create
|
399
|
+
set context
|
400
|
+
behaves like after_find context
|
401
|
+
.after_find
|
402
|
+
does
|
403
|
+
|
404
|
+
ContextualizedLogs::Sidekiq::Middleware::Client::InjectCurrentContext
|
405
|
+
ContextualizedWorker
|
406
|
+
with uncontextualized worker
|
407
|
+
DOES NOT change job context
|
408
|
+
DOES NOT log job enqueued
|
409
|
+
DOES NOT enable model context values
|
410
|
+
behaves like it client yield
|
411
|
+
should eq true
|
412
|
+
with contextualized worker
|
413
|
+
DOES change job context
|
414
|
+
DOES log job enqueued
|
415
|
+
behaves like it client yield
|
416
|
+
should eq true
|
417
|
+
with contextualized model
|
418
|
+
DOES enable model context values
|
419
|
+
|
420
|
+
ContextualizedLogs::Sidekiq::Middleware::Server::RestoreCurrentContext
|
421
|
+
with uncontextualized worker
|
422
|
+
DOES NOT log job
|
423
|
+
DOES NOT log job failure
|
424
|
+
behaves like it server yield
|
425
|
+
should eq true
|
426
|
+
behaves like enable model context values
|
427
|
+
enable model context values
|
428
|
+
with contextualized worker
|
429
|
+
behaves like it server yield
|
430
|
+
should eq true
|
431
|
+
behaves like log job failure
|
432
|
+
log job failure
|
433
|
+
behaves like log with context
|
434
|
+
log with context
|
435
|
+
behaves like enable model context values
|
436
|
+
enable model context values
|
437
|
+
with contextualized model worker
|
438
|
+
behaves like it server yield
|
439
|
+
should eq true
|
440
|
+
behaves like log job failure
|
441
|
+
log job failure
|
442
|
+
behaves like log with context
|
443
|
+
log with context
|
444
|
+
behaves like enable model context values
|
445
|
+
enable model context values
|
446
|
+
with contextualized model worker
|
447
|
+
log with args
|
448
|
+
behaves like it server yield
|
449
|
+
should eq true
|
450
|
+
behaves like log job failure
|
451
|
+
log job failure
|
452
|
+
behaves like log with context
|
453
|
+
log with context
|
454
|
+
behaves like enable model context values
|
455
|
+
enable model context values
|
456
|
+
|
457
|
+
ContextualizedLogs
|
458
|
+
has a version number
|
459
|
+
|
460
|
+
Finished in 0.73283 seconds (files took 1.34 seconds to load)
|
461
|
+
46 examples, 0 failures
|
462
|
+
```
|
463
|
+
|
464
|
+
## Development
|
465
|
+
|
466
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
467
|
+
|
468
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
469
|
+
|
470
|
+
## Contributing
|
471
|
+
|
472
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/huguesbr/contextualized_logs. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
473
|
+
|
474
|
+
## License
|
475
|
+
|
476
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
477
|
+
|
478
|
+
## Code of Conduct
|
479
|
+
|
480
|
+
Everyone interacting in the sidekiq_lockable_job project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/huguesbr/sidekiq_lockable_job/blob/master/CODE_OF_CONDUCT.md).
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'ContextualizedLogs'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'bundler/gem_tasks'
|
18
|
+
require "rspec/core/rake_task"
|
19
|
+
|
20
|
+
# RSpec::Core::RakeTask.new(:spec)
|
21
|
+
#
|
22
|
+
task :default => :spec
|
23
|
+
# # Add your own tasks in files placed in lib/tasks ending in .rake,
|
24
|
+
# # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
25
|
+
#
|
26
|
+
require_relative 'config/application'
|
27
|
+
#
|
28
|
+
Rails.application.load_tasks
|
@@ -0,0 +1,16 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's
|
5
|
+
// vendor/assets/javascripts directory can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file. JavaScript code in this file should be added after the last require_* statement.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require rails-ujs
|
14
|
+
//= require activestorage
|
15
|
+
//= require turbolinks
|
16
|
+
//= require_tree .
|
@@ -0,0 +1,13 @@
|
|
1
|
+
// Action Cable provides the framework to deal with WebSockets in Rails.
|
2
|
+
// You can generate new channels where WebSocket features live using the `rails generate channel` command.
|
3
|
+
//
|
4
|
+
//= require action_cable
|
5
|
+
//= require_self
|
6
|
+
//= require_tree ./channels
|
7
|
+
|
8
|
+
(function() {
|
9
|
+
this.App || (this.App = {});
|
10
|
+
|
11
|
+
App.cable = ActionCable.createConsumer();
|
12
|
+
|
13
|
+
}).call(this);
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's
|
6
|
+
* vendor/assets/stylesheets directory can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the bottom of the
|
9
|
+
* compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
|
10
|
+
* files in this directory. Styles in this file should be added after the last require_* statement.
|
11
|
+
* It is generally better to create a new file per style scope.
|
12
|
+
*
|
13
|
+
*= require_tree .
|
14
|
+
*= require_self
|
15
|
+
*/
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class ModelController < ApplicationController
|
2
|
+
include ContextualizedLogs::ContextualizedController
|
3
|
+
contextualized_model true
|
4
|
+
|
5
|
+
def index
|
6
|
+
models = Model.all.map { |model| { id: model.id, value: model.value} }
|
7
|
+
render json: { models: models }, status: 200
|
8
|
+
end
|
9
|
+
|
10
|
+
def show
|
11
|
+
model = Model.find(params[:id])
|
12
|
+
ModelWorker.perform_async(model.id, 'show')
|
13
|
+
render json: { models: { id: model.id, value: model.value} }, status: 200
|
14
|
+
end
|
15
|
+
|
16
|
+
def destroy
|
17
|
+
Model.find(params[:id]).destroy!
|
18
|
+
render json: { success: 'true' }, status: 200
|
19
|
+
end
|
20
|
+
|
21
|
+
def create
|
22
|
+
model = Model.create(value: params[:value])
|
23
|
+
ModelWorker.perform_async(model.id, 'create')
|
24
|
+
render json: { models: { id: model.id, value: model.value} }, status: 201
|
25
|
+
end
|
26
|
+
end
|
data/app/models/model.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Demo</title>
|
5
|
+
<%= csrf_meta_tags %>
|
6
|
+
<%= csp_meta_tag %>
|
7
|
+
|
8
|
+
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
|
9
|
+
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
|
10
|
+
</head>
|
11
|
+
|
12
|
+
<body>
|
13
|
+
<%= yield %>
|
14
|
+
</body>
|
15
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= yield %>
|