nexus_semantic_logger 1.0.1 → 1.2.0

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: 254ae3f7d789293f99846b1435b0f97c8f3189cad32d4e027ac27af5c16a65f9
4
- data.tar.gz: a451a5f7d0c6b40d106500fe4dc721a515a8dbc6b4d35fecced0d890f75a7375
3
+ metadata.gz: 5fb3fba7b28b1b186a3e601dc9901c94acf9db07c5f40b2a4c2357104fcda507
4
+ data.tar.gz: d32b561ab333d7240b4d752e3a3faffa1ad95102882644eb045224f3bb493f44
5
5
  SHA512:
6
- metadata.gz: eabd28429195882b4dc900623fc21e0f6e371bb82bf30d59bf5014577058ea60b8fa6494c5effb6bd94d5ffa0b189d8b1942af0e1cf041d8c2d686f27913086c
7
- data.tar.gz: cc9e6b8211b2b5dcd09cba22541a4d21fd2f82c077f6c6a6543193586bd242d95307b0eb861bf3b033ee31f7c6d1490c32a2adb414a822583d50466c404136fa
6
+ metadata.gz: 23af7bf651c2f48db0411ae861d36a81d652de9af6da5c275b04f66781d45657abecbf31521cb825a7977a90fa32dac3872f3fe47fc3ec07396928b717abb648
7
+ data.tar.gz: 9523b13f81fb98da9712e0af779f3b59ff85ae7ba23269c3c2f2845ac91b2ec77674e4cf5985334c1445273d1f12f81dbdba6049d6270ccfb5a6ff454ec30136
data/.rubocop.yml CHANGED
@@ -1,6 +1,10 @@
1
1
  inherit_gem:
2
2
  rubocop-shopify: rubocop.yml
3
3
 
4
+ Style/ClassVars:
5
+ Enabled: false
6
+ Style/ConditionalAssignment:
7
+ Enabled: false
4
8
  Style/GlobalVars:
5
9
  Enabled: false
6
10
  Style/FrozenStringLiteralComment:
data/README.md CHANGED
@@ -1,3 +1,36 @@
1
1
  # nexus_semantic_logger
2
2
 
3
3
  Configures a [semantic_logger](https://rubygems.org/gems/rails_semantic_logger) as required for NexusMods components.
4
+
5
+ # Local gem development
6
+
7
+ Steps to run this gem from local sources in one the nexus 'staged build' rails components:
8
+
9
+ ## Copy gem sources to component
10
+
11
+ ```
12
+ cd ~/legacy/users
13
+ cp -r ../nexus_semantic_logger .
14
+ ```
15
+
16
+ ## Adjust component Dockerfile to include gem sources
17
+
18
+ Within stage 1, append a COPY after the Gemfile copy:
19
+
20
+ ```
21
+ COPY --chown=nexus:nexus Gemfile* ./
22
+ COPY --chown=nexus:nexus nexus_semantic_logger/ ./nexus_semantic_logger/
23
+ ```
24
+
25
+ Within stage 2, append a COPY after the bundle copy:
26
+
27
+ ```
28
+ COPY --from=stage1 /usr/local/bundle /usr/local/bundle
29
+ COPY --from=stage1 /app/nexus_semantic_logger/ /app/nexus_semantic_logger/
30
+ ```
31
+
32
+ ## Adjust Gemfile to use local path
33
+
34
+ ```
35
+ gem 'nexus_semantic_logger', :path => "/app/nexus_semantic_logger"
36
+
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+ require 'rails_semantic_logger'
3
+
4
+ module NexusSemanticLogger
5
+ class AppenderFilter
6
+ def self.filter_lambda
7
+ -> (log) {
8
+ # log API see https://logger.rocketjob.io/log_struct.html
9
+ # and lib/semantic_logger/levels.rb
10
+ # level: :trace=>0, :debug=>1, :info=>2, :warn=>3, :error=>4, :fatal=>5
11
+ current_log_level = SemanticLogger::Levels.index(env_names_default_level)
12
+
13
+ # Names allow overriding the level that will be appended,
14
+ # else the global level is used to determine appending.
15
+ append = false
16
+ if log.name.in?(env_names_trace)
17
+ append = true
18
+ elsif log.name.in?(env_names_debug)
19
+ append = log.level_index >= 1
20
+ elsif log.name.in?(env_names_info)
21
+ append = log.level_index >= 2
22
+ elsif log.name.in?(env_names_warn)
23
+ append = log.level_index >= 3
24
+ elsif log.name.in?(env_names_error)
25
+ append = log.level_index >= 4
26
+ elsif log.name.in?(env_names_fatal)
27
+ append = log.level_index >= 5
28
+ else
29
+ append = log.level_index >= current_log_level
30
+ end
31
+ append
32
+ }
33
+ end
34
+
35
+ def self.env_names_default_level
36
+ @@names_default_level ||= ENV.fetch('LOG_NAMES_DEFAULT_LEVEL', Rails.application.config.log_level)
37
+ end
38
+
39
+ def self.env_names_trace
40
+ @@names_trace ||= fetch_env_names('LOG_NAMES_TRACE')
41
+ end
42
+
43
+ def self.env_names_debug
44
+ @@names_debug ||= fetch_env_names('LOG_NAMES_DEBUG')
45
+ end
46
+
47
+ def self.env_names_info
48
+ @@names_info ||= fetch_env_names('LOG_NAMES_INFO')
49
+ end
50
+
51
+ def self.env_names_warn
52
+ @@names_warn ||= fetch_env_names('LOG_NAMES_WARN')
53
+ end
54
+
55
+ def self.env_names_error
56
+ @@names_error ||= fetch_env_names('LOG_NAMES_ERROR')
57
+ end
58
+
59
+ def self.env_names_fatal
60
+ @@names_fatal ||= fetch_env_names('LOG_NAMES_FATAL')
61
+ end
62
+
63
+ def self.flush
64
+ @@names_default_level = nil
65
+ @@names_trace = nil
66
+ @@names_debug = nil
67
+ @@names_info = nil
68
+ @@names_warn = nil
69
+ @@names_error = nil
70
+ @@names_fatal = nil
71
+ end
72
+
73
+ def self.fetch_env_names(var)
74
+ ENV.fetch(var, '').split(',').to_set
75
+ end
76
+ end
77
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require 'semantic_logger'
2
+ require 'rails_semantic_logger'
3
3
 
4
4
  module NexusSemanticLogger
5
5
  class Application
@@ -33,7 +33,10 @@ module NexusSemanticLogger
33
33
  # Default logging is stdout in datadog compatible JSON.
34
34
  config.rails_semantic_logger.format = NexusSemanticLogger::DatadogFormatter.new(service)
35
35
  config.rails_semantic_logger.add_file_appender = false
36
- config.semantic_logger.add_appender(io: $stdout, formatter: config.rails_semantic_logger.format)
36
+ dd_appender = config.semantic_logger.add_appender(io: $stdout, formatter: config.rails_semantic_logger.format)
37
+ dd_appender.filter = NexusSemanticLogger::AppenderFilter.filter_lambda
38
+
39
+ NexusSemanticLogger::DatadogTracer.new(service)
37
40
 
38
41
  logger.info('SemanticLogger initialised.', level: config.log_level)
39
42
  end
@@ -44,13 +47,19 @@ module NexusSemanticLogger
44
47
 
45
48
  # Change default logging to coloured logging on stdout.
46
49
  config.semantic_logger.clear_appenders!
47
- config.semantic_logger.add_appender(io: $stdout, formatter: :color)
48
- if ENV['DD_AGENT_HOST'].present? && ENV['DD_AGENT_PORT'].present?
50
+ color_appender = config.semantic_logger.add_appender(io: $stdout, formatter: :color)
51
+ color_appender.filter = NexusSemanticLogger::AppenderFilter.filter_lambda
52
+
53
+ if ENV['DD_AGENT_HOST'].present? && ENV['DD_AGENT_LOGGING_PORT'].present?
49
54
  # Development logs can be sent to datadog via a TCP logging endpoint on a local agent.
50
55
  # Each port is assigned a particular service.
51
56
  # See https://logger.rocketjob.io/appenders.html
52
- config.semantic_logger.add_appender(appender: :tcp, server: "#{ENV['DD_AGENT_HOST']}:#{ENV['DD_AGENT_PORT']}",
53
- formatter: config.rails_semantic_logger.format)
57
+ dd_appender = config.semantic_logger.add_appender(
58
+ appender: :tcp,
59
+ server: "#{ENV['DD_AGENT_HOST']}:#{ENV['DD_AGENT_LOGGING_PORT']}",
60
+ formatter: config.rails_semantic_logger.format
61
+ )
62
+ dd_appender.filter = NexusSemanticLogger::AppenderFilter.filter_lambda
54
63
  end
55
64
 
56
65
  logger.info('SemanticLogger initialised in development.', level: config.log_level)
@@ -59,7 +68,8 @@ module NexusSemanticLogger
59
68
  def self.test(config)
60
69
  # Use human readable coloured output for logs when running tests.
61
70
  config.semantic_logger.clear_appenders!
62
- config.semantic_logger.add_appender(io: $stdout, formatter: :color)
71
+ color_appender = config.semantic_logger.add_appender(io: $stdout, formatter: :color)
72
+ color_appender.filter = NexusSemanticLogger::AppenderFilter.filter_lambda
63
73
  end
64
74
  end
65
75
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ require 'singleton'
3
+
4
+ module NexusSemanticLogger
5
+ # Application wide location to get datadog objects.
6
+ # Can be moved to its own gem in future, and there is scope to make the usage code even leaner.
7
+ class DatadogSingleton
8
+ include Singleton
9
+ attr_accessor :statsd, :tags
10
+
11
+ def flush
12
+ statsd&.flush(sync: Rails.env.development?) # Force flush sync in development, speed up checks.
13
+ end
14
+
15
+ def increment(metric_name)
16
+ statsd&.increment(metric_name, tags: tags)
17
+ flush
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+ require 'datadog/statsd'
3
+ require 'ddtrace'
4
+
5
+ module NexusSemanticLogger
6
+ class DatadogTracer
7
+ def initialize(service)
8
+ Datadog.configure do |c|
9
+ if ENV['DD_AGENT_HOST'].present?
10
+ # To enable runtime metrics collection, set `true`. Defaults to `false`
11
+ # You can also set DD_RUNTIME_METRICS_ENABLED=true to configure this.
12
+ c.runtime_metrics.enabled = true
13
+
14
+ # Configure DogStatsD instance for sending runtime metrics.
15
+ # By default, runtime metrics from the application are sent to the Datadog Agent with DogStatsD on port 8125.
16
+ datadog_singleton = DatadogSingleton.instance
17
+ datadog_singleton.statsd = Datadog::Statsd.new(ENV['DD_AGENT_HOST'], 8125)
18
+ datadog_singleton.tags = ["env:#{Rails.env}", "service:#{service}"]
19
+ c.runtime_metrics.statsd = datadog_singleton.statsd
20
+
21
+ # Tracer requires configuration to a datadog agent via DD_AGENT_HOST.
22
+ dd_force_tracer_val = ENV.fetch('DD_FORCE_TRACER', false)
23
+ dd_force_tracer = dd_force_tracer_val.present? && dd_force_tracer_val.to_s == 'true'
24
+ c.tracer(enabled: Rails.env.production? || dd_force_tracer, env: Rails.env)
25
+ end
26
+
27
+ c.use(:rails, service_name: service)
28
+
29
+ c.logger.level = Logger::WARN # ddtrace info logging is too verbose.
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  module NexusSemanticLogger
3
- # Leave this as 1.0.1 in order for CI process to replace with the tagged version.
4
- VERSION = '1.0.1'
3
+ # Leave this as 1.2.0 in order for CI process to replace with the tagged version.
4
+ VERSION = '1.2.0'
5
5
  end
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
+ require 'nexus_semantic_logger/appender_filter'
2
3
  require 'nexus_semantic_logger/application'
3
4
  require 'nexus_semantic_logger/datadog_formatter'
5
+ require 'nexus_semantic_logger/datadog_singleton'
6
+ require 'nexus_semantic_logger/datadog_tracer'
4
7
 
5
8
  module NexusSemanticLogger
6
9
  end
@@ -16,5 +16,6 @@ Gem::Specification.new do |spec|
16
16
  spec.add_dependency('amazing_print', '~> 1.4.0')
17
17
  spec.add_dependency('rails_semantic_logger', '~> 4.10.0')
18
18
  spec.add_dependency('net_tcp_client', '~> 2.2.0') # For TCP logging.
19
+ spec.add_dependency('dogstatsd-ruby', '~> 5.4.0') # For custom application metrics.
19
20
  spec.required_ruby_version = Gem::Requirement.new('>= 2.7.0')
20
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nexus_semantic_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johnathon Harris
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-05 00:00:00.000000000 Z
11
+ date: 2022-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: amazing_print
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 2.2.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: dogstatsd-ruby
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 5.4.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 5.4.0
55
69
  description:
56
70
  email: john.harris@nexusmods.com
57
71
  executables: []
@@ -63,8 +77,11 @@ files:
63
77
  - Gemfile
64
78
  - README.md
65
79
  - lib/nexus_semantic_logger.rb
80
+ - lib/nexus_semantic_logger/appender_filter.rb
66
81
  - lib/nexus_semantic_logger/application.rb
67
82
  - lib/nexus_semantic_logger/datadog_formatter.rb
83
+ - lib/nexus_semantic_logger/datadog_singleton.rb
84
+ - lib/nexus_semantic_logger/datadog_tracer.rb
68
85
  - lib/nexus_semantic_logger/version.rb
69
86
  - nexus_semantic_logger.gemspec
70
87
  homepage:
@@ -85,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
102
  - !ruby/object:Gem::Version
86
103
  version: '0'
87
104
  requirements: []
88
- rubygems_version: 3.3.17
105
+ rubygems_version: 3.3.18
89
106
  signing_key:
90
107
  specification_version: 4
91
108
  summary: semantic_logger usage for nexus