nexus_semantic_logger 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b4d34bf88bf2a928a063405a76a758fb9c456b98ef95648e566ac3a41020f6a1
4
+ data.tar.gz: b371208a349846331dc45b38cd64b8da000e6df7b6e05bb03de4c7820c0be504
5
+ SHA512:
6
+ metadata.gz: 194c8b3e44165a6c4006a1c972ed1b4c89b52828c960a73c2873ac05a155cf4a6f0939ceace374376fb87c99348906bf1a7103ca981b4db4caafcb2e1737b959
7
+ data.tar.gz: 8d85828bf271757d7cdf8409ec9707aabeef7fcb5fd4503835ce2b41650a2b797228a187bb3637deca84c14029e57989dfa204385495cedf8da236c11f5deb9a
data/.gitlab-ci.yml ADDED
@@ -0,0 +1,36 @@
1
+ image: "ruby:2.7"
2
+
3
+ stages:
4
+ - release
5
+ - test
6
+
7
+ before_script:
8
+ - gem install bundler --no-document
9
+ - bundle install --jobs $(nproc) "${FLAGS[@]}"
10
+
11
+ rspec:
12
+ script:
13
+ - bundle exec rspec
14
+
15
+ rubocop:
16
+ script:
17
+ - bundle exec rubocop
18
+
19
+ release:
20
+ stage: release
21
+ rules:
22
+ - if: '$CI_COMMIT_TAG'
23
+ script:
24
+ - mkdir -p ~/.gem
25
+ - cp $RUBYGEMS_CREDENTIALS ~/.gem/credentials
26
+ - chmod 0600 ~/.gem/credentials
27
+ - gem update --system
28
+ - ruby --version
29
+ - gem env version
30
+ - sed -i "s/0.0.0/$CI_COMMIT_TAG/g" lib/nexus_semantic_logger/version.rb
31
+ - gem build nexus_semantic_logger.gemspec
32
+ - gem push nexus_semantic_logger*.gem
33
+ artifacts:
34
+ paths:
35
+ - nexus_semantic_logger*.gem
36
+ expire_in: 30 days
data/.rubocop.yml ADDED
@@ -0,0 +1,7 @@
1
+ inherit_gem:
2
+ rubocop-shopify: rubocop.yml
3
+
4
+ Style/GlobalVars:
5
+ Enabled: false
6
+ Style/FrozenStringLiteralComment:
7
+ Enabled: false
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ source 'https://rubygems.org'
3
+
4
+ gemspec
5
+
6
+ gem 'rubocop'
7
+ gem 'rubocop-shopify', "~> 1.0.4", require: false
8
+
9
+ gem 'rspec'
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # nexus_semantic_logger
2
+
3
+ Configures a [semantic_logger](https://rubygems.org/gems/rails_semantic_logger) as required for NexusMods components.
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+ require 'semantic_logger'
3
+
4
+ module NexusSemanticLogger
5
+ class Application
6
+ include SemanticLogger::Loggable
7
+
8
+ def self.common(config, service)
9
+ # Set a safe logging level which individual environments can make more verbose if needed.
10
+ config.log_level = ENV.fetch('LOG_LEVEL', 'INFO')
11
+
12
+ # semanticlogger ddtrace correlation.
13
+ # From https://github.com/DataDog/dd-trace-rb/issues/1450
14
+ # Also https://docs.datadoghq.com/tracing/connect_logs_and_traces/ruby/
15
+ config.log_tags = {
16
+ request_id: :request_id,
17
+ dd: -> (_) {
18
+ correlation = Datadog.tracer.active_correlation
19
+ {
20
+ trace_id: correlation.trace_id.to_s,
21
+ span_id: correlation.span_id.to_s,
22
+ env: correlation.env.to_s,
23
+ service: correlation.service.to_s,
24
+ version: correlation.version.to_s,
25
+ }
26
+ },
27
+ ddsource: ["ruby"],
28
+ }
29
+
30
+ # Synchronous mode is vital when puma is in single thread mode. Must add appender AFTER setting sync.
31
+ SemanticLogger.sync!
32
+
33
+ # Default logging is stdout in datadog compatible JSON.
34
+ config.rails_semantic_logger.format = NexusSemanticLogger::DatadogFormatter.new(service)
35
+ config.rails_semantic_logger.add_file_appender = false
36
+ config.semantic_logger.add_appender(io: $stdout, formatter: config.rails_semantic_logger.format)
37
+
38
+ logger.info('SemanticLogger initialised.', level: config.log_level)
39
+ end
40
+
41
+ def self.development(config)
42
+ # Enable debug globally.
43
+ config.log_level = ENV.fetch('LOG_LEVEL', 'DEBUG')
44
+
45
+ # Change default logging to coloured logging on stdout.
46
+ 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?
49
+ # Development logs can be sent to datadog via a TCP logging endpoint on a local agent.
50
+ # Each port is assigned a particular service.
51
+ # 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)
54
+ end
55
+
56
+ logger.info('SemanticLogger initialised in development.', level: config.log_level)
57
+ end
58
+
59
+ def self.test(config)
60
+ # Use human readable coloured output for logs when running tests.
61
+ config.semantic_logger.clear_appenders!
62
+ config.semantic_logger.add_appender(io: $stdout, formatter: :color)
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+ require 'semantic_logger'
3
+
4
+ module NexusSemanticLogger
5
+ # Some attributes are reserved for use by Datadog.
6
+ # https://docs.datadoghq.com/logs/log_configuration/attributes_naming_convention/#reserved-attributes
7
+ # host Supported by super.
8
+ # source Overridden by this class.
9
+ # status Supported by super as level, this class moves to status.
10
+ # date Supported by super as time, this class configures as date.
11
+ # message Supported by super.
12
+ # env Added by this class.
13
+ # service Added by this class.
14
+ class DatadogFormatter < SemanticLogger::Formatters::Raw
15
+ def initialize(service)
16
+ super(time_format: :iso_8601, time_key: :date)
17
+ @service = service
18
+ end
19
+
20
+ def call(log, logger)
21
+ hash = super(log, logger).clone
22
+ hash[:source] = :rails
23
+ level = hash.delete(:level)
24
+ hash[:status] = level
25
+ hash[:env] = Rails.env
26
+ hash[:service] = @service
27
+ hash.delete(:application)
28
+ hash.delete(:environment)
29
+ hash.delete('')
30
+ # ddtrace correlation inserted via log_tags, but datadog expects them in the root hash.
31
+ named_tags = hash.delete(:named_tags)
32
+ if named_tags.is_a?(Hash)
33
+ hash.deep_merge!(named_tags)
34
+ end
35
+ hash.to_json
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ module NexusSemanticLogger
3
+ # Leave this as 1.0.0 in order for CI process to replace with the tagged version.
4
+ VERSION = '1.0.0'
5
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+ require 'nexus_semantic_logger/application'
3
+ require 'nexus_semantic_logger/datadog_formatter'
4
+
5
+ module NexusSemanticLogger
6
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'lib/nexus_semantic_logger/version'
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "nexus_semantic_logger"
6
+ spec.version = NexusSemanticLogger::VERSION
7
+ spec.summary = "semantic_logger usage for nexus"
8
+ spec.authors = ["Johnathon Harris"]
9
+ spec.email = "john.harris@nexusmods.com"
10
+ # Specify which files should be added to the gem when it is released.
11
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
12
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
13
+ %x(git ls-files -z).split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
14
+ end
15
+ spec.require_paths = ['lib']
16
+ spec.add_dependency('amazing_print')
17
+ spec.add_dependency('rails_semantic_logger')
18
+ spec.add_dependency('net_tcp_client') # For TCP logging.
19
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nexus_semantic_logger
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Johnathon Harris
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-07-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: amazing_print
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rails_semantic_logger
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: net_tcp_client
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description:
56
+ email: john.harris@nexusmods.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - ".gitlab-ci.yml"
62
+ - ".rubocop.yml"
63
+ - Gemfile
64
+ - README.md
65
+ - lib/nexus_semantic_logger.rb
66
+ - lib/nexus_semantic_logger/application.rb
67
+ - lib/nexus_semantic_logger/datadog_formatter.rb
68
+ - lib/nexus_semantic_logger/version.rb
69
+ - nexus_semantic_logger.gemspec
70
+ homepage:
71
+ licenses: []
72
+ metadata: {}
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubygems_version: 3.3.17
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: semantic_logger usage for nexus
92
+ test_files: []