contextualized_logs 0.0.1.pre.alpha → 0.0.2.pre.alpha

Sign up to get free protection for your applications and to get access to all the features.
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