contextualized_logs 0.0.1.pre.alpha → 0.0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2999bdeabefea3e6d361b02314d3746a98f2205e2af9b1ca48abd66cbeb2338d
4
- data.tar.gz: 6dd09536859433929a51c184571af703611c69d10beddf6e7ba78280905288a6
3
+ metadata.gz: 4d2a30eaa931eb9013ce4e8007229c24f71150d89d7399372820eb33e1e72deb
4
+ data.tar.gz: 1b7a809fb3ea83334a7248a97a63c9728b899400c8e5869d7be28a55379fc832
5
5
  SHA512:
6
- metadata.gz: 119a4ec8c01cf01261b122bcd9f0a8526e0c888ab25444ae0f20487e1528f282e8f58592c424a8b78f1b0fa198265be1168aa0304348ad185c26d10419d2ea98
7
- data.tar.gz: bf2d43f375f0b1b1800b7febc9bcfcb76827ec4143a49487059d307e4dd2f5bf651f4434a6230007acdb4e0420aa29a5000e9e2f819e61fcf1fd63011a419341
6
+ metadata.gz: d1543991e0904103f8bd6dbf0fc791fa6fe6f8302aea6e49049ae49adbf35d352d5d226fc7075f48bbc956b9d7a2b7f7f136e0b9e980cd00a03be47658070552
7
+ data.tar.gz: 99b5866d81903a8bb4e7e3231acdd15931de535bb8297a2a6bd60c9c5ec9d7b397194b0f44f1f7e48ce9554962ab3a2174815033d736f6d4392d6ba89f4f517b
data/README.md CHANGED
@@ -26,31 +26,30 @@ class MyController < ApplicationController
26
26
  end
27
27
  ```
28
28
 
29
- ```
30
- curl --referer 'referer' --user-agent 'user_agent' -H "Origin: http://localhost" http://localhost/my_controller?param=a
29
+ $ curl --referer "referer" --user-agent "user_agent" -H "Origin: http://localhost" http://localhost/my_controller?param=a
31
30
 
32
- # development.log
31
+ ```json
33
32
  {
34
- syslog: {
35
- env: 'development',
36
- host: 'localhost'
33
+ "syslog": {
34
+ "env": "development",
35
+ "host": "localhost"
37
36
  },
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'
37
+ "type": "INFO",
38
+ "time": "2020-04-24T19:52:51.452+02:00",
39
+ "log_type": "log",
40
+ "resource_name": "mycontroller_show",
41
+ "http": {
42
+ "referer": "referer",
43
+ "request_id": "xxxx-xxxx-xxxx-xxxx",
44
+ "useragent": "user_agent",
45
+ "origin": "http://localhost"
47
46
  },
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'
47
+ "network": {
48
+ "client": {
49
+ "ip": "127.0.0.1",
50
+ "remote_addr": "127.0.0.1",
51
+ "remote_ip": "127.0.0.1",
52
+ "x_forwarded_for": "127.0.0.1"
54
53
  }
55
54
  }
56
55
  }
@@ -64,7 +63,7 @@ end
64
63
 
65
64
  class UserController < ApplicationController
66
65
  include ContextualizedLogs::ContextualizedController
67
- contextualized_model true
66
+ contextualize_model true
68
67
 
69
68
  def show
70
69
  User.find(params[:id])
@@ -72,31 +71,30 @@ class UserController < ApplicationController
72
71
  end
73
72
  ```
74
73
 
75
- ```
76
- curl http://localhost/users/1
74
+ $ curl http://localhost/users/1
77
75
 
78
- # development.log
76
+ ```json
79
77
  {
80
- syslog: {
81
- env: 'development',
82
- host: 'localhost'
78
+ "syslog": {
79
+ "env": "development",
80
+ "host": "localhost"
83
81
  },
84
- type: 'INFO',
85
- time: '2020-04-24T19:52:51.452+02:00',
86
- log_type: 'log',
87
- context_values: {
88
- user_ids: [1]
82
+ "type": "INFO",
83
+ "time": "2020-04-24T19:52:51.452+02:00",
84
+ "log_type": "log",
85
+ "context_values": {
86
+ "user_ids": [1]
89
87
  },
90
- resource_name: 'mycontroller_show',
91
- http: {
92
- request_id: 'xxxx-xxxx-xxxx-xxxx'
88
+ "resource_name": "mycontroller_show",
89
+ "http": {
90
+ "request_id": "xxxx-xxxx-xxxx-xxxx"
93
91
  },
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'
92
+ "network": {
93
+ "client": {
94
+ "ip": "127.0.0.1",
95
+ "remote_addr": "127.0.0.1",
96
+ "remote_ip": "127.0.0.1",
97
+ "x_forwarded_for": "127.0.0.1"
100
98
  }
101
99
  }
102
100
  }
@@ -118,7 +116,7 @@ end
118
116
 
119
117
  class UserController < ApplicationController
120
118
  include ContextualizedLogs::ContextualizedController
121
- contextualized_model true
119
+ contextualize_model true
122
120
 
123
121
  def show
124
122
  user_id = params[:id]
@@ -130,8 +128,8 @@ end
130
128
  class UserTrackerWorker
131
129
  include Sidekiq::Worker
132
130
  include ContextualizedLogs::ContextualizedWorker
133
- contextualized_worker true
134
- contextualized_model true
131
+ contextualize_worker true
132
+ contextualize_model true
135
133
  def self.contextualize_args(args)
136
134
  { user_id: args.first, action: args.last }
137
135
  end
@@ -142,102 +140,107 @@ class UserTrackerWorker
142
140
  end
143
141
  ```
144
142
 
145
- ```
146
- curl http://localhost/users/1
143
+ $ curl http://localhost/users/1
147
144
 
148
- # development.log
145
+ ```json
149
146
  {
150
- syslog: {
151
- env: 'development',
152
- host: 'localhost'
147
+ "syslog": {
148
+ "env": "development",
149
+ "host": "localhost"
153
150
  },
154
- type: 'INFO',
155
- time: '2020-04-24T19:52:51.452+02:00',
156
- log_type: 'log',
157
- context_values: {
158
- user_ids: [1]
151
+ "type": "INFO",
152
+ "time": "2020-04-24T19:52:51.452+02:00",
153
+ "log_type": "log",
154
+ "context_values": {
155
+ "user_ids": [1]
159
156
  },
160
- enqueued_jobs_ids: ['1234-xxxx-xxxx-xxxx']
161
- resource_name: 'mycontroller_show',
162
- http: {
163
- request_id: 'xxxx-xxxx-xxxx-xxxx'
157
+ "enqueued_jobs_ids": ["1234-xxxx-xxxx-xxxx"],
158
+ "resource_name": "mycontroller_show",
159
+ "http": {
160
+ "request_id": "xxxx-xxxx-xxxx-xxxx"
164
161
  },
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'
162
+ "network": {
163
+ "client": {
164
+ "ip": "127.0.0.1",
165
+ "remote_addr": "127.0.0.1",
166
+ "remote_ip": "127.0.0.1",
167
+ "x_forwarded_for": "127.0.0.1"
171
168
  }
172
169
  }
173
170
  }
171
+ ```
172
+
173
+ ```json
174
174
  {
175
- syslog: {
176
- env: 'development',
177
- host: 'localhost'
175
+ "syslog": {
176
+ "env": "development",
177
+ "host": "localhost"
178
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'
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
189
  }
190
- }
191
- context_values: {
192
- user_ids: [1],
193
- user_tracker_ids: [1]
194
190
  },
195
- enqueued_jobs_ids: ['xxxx-xxxx-xxxx-xxxx']
196
- resource_name: 'mycontroller_show',
197
- http: {
198
- request_id: 'xxxx-xxxx-xxxx-xxxx'
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
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'
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
206
  }
207
207
  }
208
208
  }
209
+ ```
210
+
211
+ ```json
209
212
  {
210
- syslog: {
211
- env: 'development',
212
- host: 'localhost'
213
+ "syslog": {
214
+ "env": "development",
215
+ "host": "localhost"
213
216
  },
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'
217
+ "type": "INFO",
218
+ "time": "2020-04-24T19:52:51.452+02:00",
219
+ "log_type": "log",
220
+ "message": "sidekiq: completing job UserWorker: 1234-xxxx-xxxx-xxxx, on queue default",
221
+ "job": {
222
+ "worker": "UserWorker",
223
+ "id": "1234-xxxx-xxxx-xxxx",
224
+ "args": {
225
+ "user_id": 1,
226
+ "action": "show"
224
227
  }
225
- }
226
- context_values: {
227
- user_ids: [1],
228
- user_tracker_ids: [1]
229
228
  },
230
- enqueued_jobs_ids: ['xxxx-xxxx-xxxx-xxxx']
231
- resource_name: 'mycontroller_show',
232
- http: {
233
- request_id: 'xxxx-xxxx-xxxx-xxxx'
229
+ "context_values": {
230
+ "user_ids": [1],
231
+ "user_tracker_ids": [1]
232
+ },
233
+ "enqueued_jobs_ids": ["xxxx-xxxx-xxxx-xxxx"],
234
+ "resource_name": "mycontroller_show",
235
+ "http": {
236
+ "request_id": "xxxx-xxxx-xxxx-xxxx"
234
237
  },
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'
238
+ "network": {
239
+ "client": {
240
+ "ip": "127.0.0.1",
241
+ "remote_addr": "127.0.0.1",
242
+ "remote_ip": "127.0.0.1",
243
+ "x_forwarded_for": "127.0.0.1"
241
244
  }
242
245
  }
243
246
  }
@@ -246,23 +249,22 @@ curl http://localhost/users/1
246
249
  ## Demo
247
250
 
248
251
  ### start rails
249
- ```
250
- bin/setup
251
- bin/rails server
252
- ```
252
+
253
+ $ bin/setup
254
+ $ bin/rails server
253
255
 
254
256
  ### start sidekiq
255
- ```
256
- bundle exec sidekiq
257
- ```
257
+
258
+ $ bundle exec sidekiq
259
+
258
260
 
259
261
  ### tail logs
260
- ```
261
- tail -f log/development
262
- ```
262
+
263
+ $ tail -f log/development
263
264
 
264
265
  ### do some requests
265
- ```
266
+
267
+ ```shell
266
268
  curl -X POST -d '{"value": "value"}' -H 'Content-Type: application/json' "http://localhost:3000/model"
267
269
  curl "http://localhost:3000/model/1"
268
270
  curl "http://localhost:3000/model"
@@ -278,7 +280,7 @@ In order to enrich your logs, you needs to use (subclass of `ActiveSupport::Logg
278
280
  > ContextualizedLogger logs by default some request metadata following Datadog naming convention
279
281
  > https://docs.hq.com/logs/processing/attributes_naming_convention/#source-code
280
282
 
281
- ```
283
+ ```ruby
282
284
  Rails.application.configure do
283
285
  config.logger = ContextualizedLogs::ContextualizedLogger.new("log/#{Rails.env}.log")
284
286
  end
@@ -286,7 +288,7 @@ end
286
288
 
287
289
  ### ContextualizedController
288
290
 
289
- ```
291
+ ```ruby
290
292
  class Controller < ApplicationController
291
293
  include ContextualizedLogs::ContextualizedController
292
294
  end
@@ -296,7 +298,7 @@ end
296
298
 
297
299
  ### ContextualizedModel
298
300
 
299
- ```
301
+ ```ruby
300
302
  class Model < ActiveRecord::Base
301
303
  include ContextualizedLogs::ContextualizedModel
302
304
 
@@ -305,16 +307,16 @@ class Model < ActiveRecord::Base
305
307
  end
306
308
  ```
307
309
 
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 } }`.
310
+ If `ContextualizedLogs::CurrentContext.contextualize_model_enabled` is enable on the current tread, any Model which is created or find will add `{ context_values: { model_ids: ids } }`.
309
311
  So if you fetch model (`id == 1`), and create model (`id == 2`), your logs will now contain `{ context_values: { model_ids: [1, 2] } }`.
310
312
 
311
313
  ### ContextualizedWorker
312
314
 
313
- ```
315
+ ```ruby
314
316
  class Worker
315
317
  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
+ contextualize_worker true # enable logging of job enqueuing, performing, completing and failure
319
+ contextualize_model true # enable logging of any (contextualized) model found or created while performing job
318
320
 
319
321
  # enable adding jobs args (cherry picked) to log metadata (CurrentContext) to be logged alongs any job logs
320
322
  def self.contextualize_args(args)
@@ -323,12 +325,70 @@ class Worker
323
325
  end
324
326
  ```
325
327
 
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 } }`.
328
+ If `ContextualizedLogs::CurrentContext.contextualize_model_enabled` is enable on the current tread, any Model which is created or find will add `{ context_values: { model_ids: ids } }`.
327
329
  So if you fetch model (`id == 1`), and create model (`id == 2`), your logs will now contain `{ context_values: { model_ids: [1, 2] } }`.
328
330
 
329
- #### Metadata Customization
331
+ ## Configuration
332
+
333
+ `ContextualizedLogs` work with zero configuration by default.
334
+
335
+ It will log:
336
+ - basic request info (`http.request_id`, ....) on each (contextualized) controller
337
+ - basic job info (`enqueued_jobs_ids` on controller which enqueue the job, `job.worker, job.id` on each worker logs, and one log for `enqueuing`, `started`, `processing`, `completing`, [`failure`]) on each (contextualized) worker
338
+ - contextualized models are not logged by default, and needs to be enable on each controller, worker
330
339
 
331
- If you wish to logs different predefined metadata (`request.uuid`, `request.ip`, ...)
340
+ If you wish to logs different predefined metadata (`request.uuid`, `request.ip`, ...), or logging mechanism, you can use an initializer `ContextualizedLogs.configure`.
341
+
342
+ ```ruby
343
+ # config/initializers/contextualized_logs.rb
344
+ require 'contextualized_logs'
345
+
346
+ module ContextualizedLogs
347
+ configure do |config|
348
+ # enable logging of contextualized model values in all (contextualized) controller by default
349
+ # can be manually enabled on each controller otherwise (contextualize_model true)
350
+ config.controller_default_contextualize_model = true # default: false
351
+ # enable logging of worker enqueing/performing/completing/[failure] in all (contextualized) worker by default
352
+ # can be manually enabled on each worker otherwise (contextualize_worker true)
353
+ config.worker_default_contextualize_worker = true # default: true
354
+ # enable logging of contextualized model values in all (contextualized) worker by default
355
+ # can be manually enabled on each worker otherwise (contextualize_model true)
356
+ config.worker_default_contextualize_model = true # default: false
357
+ # customize logs at Logger level (not in context of a controller request or worker job)
358
+ config.log_formatter = proc do |severity, timestamp, progname, msg|
359
+ # call the default formatter
360
+ log = ContextualizedLogger.default_formatter.call(severity, timestamp, progname, msg)
361
+ # enhance log with Datadog APM trace correlation
362
+ log = JSON.parse(log)
363
+ datadog_correlation = Datadog.tracer.active_correlation
364
+ log.merge!(
365
+ dd: {
366
+ trace_id: datadog_correlation.trace_id,
367
+ span_id: datadog_correlation.span_id
368
+ },
369
+ ddsource: ['ruby']
370
+ )
371
+ # add your own log
372
+ log.merge!(
373
+ my_custom_log_value: 'my_custom_log_value'
374
+ )
375
+ log.to_json + "\n"
376
+ end
377
+ # customize logs extracted from controller (ie: request, ...)
378
+ config.controller_default_contextualizer = proc do |controller|
379
+ # call the default request logging
380
+ ContextualizedController.contextualize_request(controller)
381
+ if controller.current_user
382
+ ContextualizedController.current_context.attributes.merge!(
383
+ usr: {
384
+ id: controller.current_user.id
385
+ }
386
+ )
387
+ end
388
+ end
389
+ end
390
+ end
391
+ ```
332
392
 
333
393
  ## Installation
334
394
 
@@ -340,7 +400,7 @@ gem 'contextualized_logs'
340
400
 
341
401
  And then execute:
342
402
 
343
- $ bundle install
403
+ $ bundle install
344
404
 
345
405
 
346
406
  ## Roadmap
@@ -353,10 +413,8 @@ $ bundle install
353
413
 
354
414
  ## Specs
355
415
 
356
- ```
416
+ ```shell
357
417
  $ 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
418
 
361
419
  DummyController
362
420
  should set request details
@@ -382,18 +440,18 @@ ContextualizedLogs::ContextualizedModel
382
440
  .contextualizable
383
441
  set contextualizable keys
384
442
  .contextualize
385
- with contextualized_model_enabled == true
443
+ with contextualize_model_enabled == true
386
444
  set contextualizable values
387
- with contextualized_model_enabled == false
445
+ with contextualize_model_enabled == false
388
446
  set contextualizable values
389
- with CurrentContext.contextualized_model_enabled == true
447
+ with CurrentContext.contextualize_model_enabled == true
390
448
  behaves like after_create context
391
449
  .after_create
392
450
  set context
393
451
  behaves like after_find context
394
452
  .after_find
395
453
  does
396
- with CurrentContext.contextualized_model_enabled == false
454
+ with CurrentContext.contextualize_model_enabled == false
397
455
  behaves like after_create context
398
456
  .after_create
399
457
  set context
@@ -424,7 +482,7 @@ ContextualizedLogs::Sidekiq::Middleware::Server::RestoreCurrentContext
424
482
  behaves like it server yield
425
483
  should eq true
426
484
  behaves like enable model context values
427
- enable model context values
485
+ model context values
428
486
  with contextualized worker
429
487
  behaves like it server yield
430
488
  should eq true
@@ -433,7 +491,7 @@ ContextualizedLogs::Sidekiq::Middleware::Server::RestoreCurrentContext
433
491
  behaves like log with context
434
492
  log with context
435
493
  behaves like enable model context values
436
- enable model context values
494
+ model context values
437
495
  with contextualized model worker
438
496
  behaves like it server yield
439
497
  should eq true
@@ -442,7 +500,7 @@ ContextualizedLogs::Sidekiq::Middleware::Server::RestoreCurrentContext
442
500
  behaves like log with context
443
501
  log with context
444
502
  behaves like enable model context values
445
- enable model context values
503
+ model context values
446
504
  with contextualized model worker
447
505
  log with args
448
506
  behaves like it server yield
@@ -452,13 +510,17 @@ ContextualizedLogs::Sidekiq::Middleware::Server::RestoreCurrentContext
452
510
  behaves like log with context
453
511
  log with context
454
512
  behaves like enable model context values
455
- enable model context values
513
+ model context values
456
514
 
457
515
  ContextualizedLogs
458
516
  has a version number
459
517
 
460
- Finished in 0.73283 seconds (files took 1.34 seconds to load)
461
- 46 examples, 0 failures
518
+ CustomContextController
519
+ should set request details
520
+ should set custom attributes
521
+
522
+ Finished in 1.27 seconds (files took 1.58 seconds to load)
523
+ 48 examples, 0 failures
462
524
  ```
463
525
 
464
526
  ## Development