lib/zuora_connect.rb



require 'zuora_connect/configuration'
require "zuora_connect/engine"
require 'zuora_connect/exceptions'
require 'zuora_connect/controllers/helpers'
require 'zuora_connect/views/helpers'
require 'zuora_connect/railtie'
require 'resque/additions'
require 'resque/dynamic_queues'
require 'resque/silence_done'
require 'resque/self_lookup'
require 'resque/plugins/custom_logger'
require 'logging/connect_formatter'
require 'metrics/influx/point_value'
require 'metrics/net'

module ZuoraConnect
  class << self
    attr_accessor :configuration
    attr_writer :logger

    def logger
      case Rails.env.to_s
      when 'development'
        Rails.logger
      else
        @logger ||= custom_logger(name: "Connect", level: Rails.logger.level)
      end
    end    

    def custom_logger(name: "", level: Rails.logger.present? ? Rails.logger.level : MonoLogger::INFO, type: :ougai)
      #puts name + ' - ' + {Logger::WARN => 'Logger::WARN', Logger::ERROR => 'Logger::ERROR', Logger::DEBUG => 'Logger::DEBUG', Logger::INFO => 'Logger::INFO' }[level] + ' - '
      if type == :ougai
        require 'ougai'
        #logger = Ougai::Logger.new(MonoLogger.new(STDOUT))
        logger = Ougai::Logger.new(STDOUT) 
        logger.formatter = Ougai::Formatters::ConnectFormatter.new(name)
        logger.level = level
        logger.before_log = lambda do |data|
          data[:trace_id] = ZuoraConnect::RequestIdMiddleware.request_id if ZuoraConnect::RequestIdMiddleware.request_id.present?
          data[:zuora_trace_id] = ZuoraConnect::RequestIdMiddleware.zuora_request_id if ZuoraConnect::RequestIdMiddleware.zuora_request_id.present?
          #data[:traces] = {amazon_id: data[:trace_id], zuora_id: data[:zuora_trace_id]}
          if !['ElasticAPM', 'ResqueScheduler', 'ResquePool', 'Resque', 'Makara'].include?(name) 
            if Thread.current[:appinstance].present?
              data[:app_instance_id] = Thread.current[:appinstance].id
              logitems = Thread.current[:appinstance].logitems
              if logitems.present? && logitems.class == Hash
                data[:tenant_ids] = logitems[:tenant_ids] if logitems[:tenant_ids].present?
                data[:organization] = logitems[:organization] if logitems[:organization].present?
              end
            end
          end
        end
      else
        logger = MonoLogger.new(STDOUT)
        logger.level = level
        logger.formatter =  proc do |serverity, datetime, progname, msg|
          begin
            msg = JSON.parse(msg)
          rescue JSON::ParserError => ex
          end

          require 'json'
          store = {
            name: name,
            level: serverity,
            timestamp: datetime.strftime('%FT%T.%6NZ'),
            pid: Process.pid,
            message: name == "ActionMailer" ? msg.strip : msg
          }
          if !['ElasticAPM', 'ResqueScheduler', 'ResquePool','Resque', 'Makara'].include?(name) 
            if Thread.current[:appinstance].present? 
              store[:app_instance_id] = Thread.current[:appinstance].id
              logitems = Thread.current[:appinstance].logitems
              if logitems.present? && logitems.class == Hash
                store[:tenant_ids] = logitems[:tenant_ids] if logitems[:tenant_ids].present?
                store[:organization] = logitems[:organization] if logitems[:organization].present?
              end
            end
          end
          JSON.dump(store) + "\n"
        end
      end
      return logger
    end      
  end

  module Controllers
    autoload :Helpers,        'zuora_connect/controllers/helpers'
  end

  module Views
    ActionView::Base.send(:include, Helpers)
  end

  def self.configuration
    @configuration ||= Configuration.new
  end

  def self.reset
    @configuration = Configuration.new
  end

  def self.configure
    yield(configuration)
    ::Apartment.excluded_models << "Delayed::Job" if configuration.delayed_job
    ::Apartment.excluded_models.concat(configuration.additional_apartment_models) if configuration.additional_apartment_models.class == Array

    return configuration
  end

  def self.elastic_apm_defaults
    defaults = {}
    case Rails.env.to_s
    when 'production'
      defaults = {
        server_url: "http://apm-server.logging:8200",
        transaction_sample_rate: 0.20,
        capture_body: 'errors'
      }
    when 'staging'
      defaults = {
        server_url: "http://apm-server.logging:8200",
        transaction_sample_rate: 1.0
      }
    when 'development'
      defaults = {
        server_url: "http://logging.0.ecc.auw2.zuora:8200",
        transaction_sample_rate: 1.0
      }
    when 'test'
      defaults = {
        active: false, 
        disable_send: true
      }
    end

    defaults.merge!({
      disable_start_message: true,
      pool_size: 1, 
      transaction_max_spans: 500, 
      ignore_url_patterns: ['^\/admin\/resque.*', '^\/admin\/redis.*', '^\/admin\/peek.*', '^\/peek.*'], 
      verify_server_cert: false,
      log_level: Logger::INFO,
      service_name: ENV['DEIS_APP'].present? ? ENV['DEIS_APP'] : Rails.application.class.parent_name,
      logger: ZuoraConnect.custom_logger(name: "ElasticAPM", level: MonoLogger::WARN)
    })
    defaults.merge!({disable_send: true}) if defined?(Rails::Console)
    
    return defaults
  end
end