Skip to content
Snippets Groups Projects
Commit af2fc054 authored by John Harris's avatar John Harris
Browse files

feat: add dogstatsd support

parent 55822a30
No related branches found
No related tags found
No related merge requests found
Pipeline #31683 failed
......@@ -2,6 +2,8 @@
require 'nexus_semantic_logger/appender_filter'
require 'nexus_semantic_logger/application'
require 'nexus_semantic_logger/datadog_formatter'
require 'nexus_semantic_logger/datadog_singleton'
require 'nexus_semantic_logger/datadog_tracer'
module NexusSemanticLogger
end
......@@ -36,6 +36,8 @@ module NexusSemanticLogger
dd_appender = config.semantic_logger.add_appender(io: $stdout, formatter: config.rails_semantic_logger.format)
dd_appender.filter = NexusSemanticLogger::AppenderFilter.filter_lambda
NexusSemanticLogger::DatadogTracer.new(service)
logger.info('SemanticLogger initialised.', level: config.log_level)
end
......@@ -48,13 +50,13 @@ module NexusSemanticLogger
color_appender = config.semantic_logger.add_appender(io: $stdout, formatter: :color)
color_appender.filter = NexusSemanticLogger::AppenderFilter.filter_lambda
if ENV['DD_AGENT_HOST'].present? && ENV['DD_AGENT_PORT'].present?
if ENV['DD_AGENT_HOST'].present? && ENV['DD_AGENT_LOGGING_PORT'].present?
# Development logs can be sent to datadog via a TCP logging endpoint on a local agent.
# Each port is assigned a particular service.
# See https://logger.rocketjob.io/appenders.html
dd_appender = config.semantic_logger.add_appender(
appender: :tcp,
server: "#{ENV['DD_AGENT_HOST']}:#{ENV['DD_AGENT_PORT']}",
server: "#{ENV['DD_AGENT_HOST']}:#{ENV['DD_AGENT_LOGGING_PORT']}",
formatter: config.rails_semantic_logger.format
)
dd_appender.filter = NexusSemanticLogger::AppenderFilter.filter_lambda
......
# frozen_string_literal: true
require 'singleton'
module NexusSemanticLogger
# Application wide location to get datadog objects.
# Can be moved to its own gem in future, and there is scope to make the usage code even leaner.
class DatadogSingleton
include Singleton
attr_accessor :statsd, :tags
def flush
statsd&.flush(sync: Rails.env.development?) # Force flush sync in development, speed up checks.
end
end
end
# frozen_string_literal: true
require 'datadog/statsd'
require 'ddtrace'
module NexusSemanticLogger
class DatadogTracer
def initialize(service)
Datadog.configure do |c|
if ENV['DD_AGENT_HOST'].present?
# To enable runtime metrics collection, set `true`. Defaults to `false`
# You can also set DD_RUNTIME_METRICS_ENABLED=true to configure this.
c.runtime_metrics.enabled = true
# Configure DogStatsD instance for sending runtime metrics.
# By default, runtime metrics from the application are sent to the Datadog Agent with DogStatsD over port 8125.
datadog_singleton = DatadogSingleton.instance
datadog_singleton.statsd = Datadog::Statsd.new(ENV['DD_AGENT_HOST'], 8125)
datadog_singleton.tags = ["env:#{Rails.env}", "service:#{service}"]
c.runtime_metrics.statsd = datadog_singleton.statsd
# Tracer requires configuration to a datadog agent via DD_AGENT_HOST.
dd_force_tracer_val = ENV.fetch('DD_FORCE_TRACER', false)
dd_force_tracer = dd_force_tracer_val.present? && dd_force_tracer_val.to_s == 'true'
c.tracer(enabled: Rails.env.production? || dd_force_tracer, env: Rails.env)
end
c.use(:rails, service_name: service)
c.logger.level = Logger::WARN # ddtrace info logging is too verbose.
end
end
end
end
......@@ -16,5 +16,6 @@ Gem::Specification.new do |spec|
spec.add_dependency('amazing_print', '~> 1.4.0')
spec.add_dependency('rails_semantic_logger', '~> 4.10.0')
spec.add_dependency('net_tcp_client', '~> 2.2.0') # For TCP logging.
spec.add_dependency('dogstatsd-ruby', '~> 5.4.0') # For custom application metrics.
spec.required_ruby_version = Gem::Requirement.new('>= 2.7.0')
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment