Sha256: 12c1af1280ef63c5dbb2a852fcc42bec2ba60d6db4a462006917794f3a08ff3a

Contents?: true

Size: 1.81 KB

Versions: 5

Compression:

Stored size: 1.81 KB

Contents

# frozen_string_literal: true

require 'elastic_apm/metricset'

module ElasticAPM
  # @api private
  module Metrics
    MUTEX = Mutex.new

    def self.new(config, &block)
      Collector.new(config, &block)
    end

    def self.platform
      @platform ||= Gem::Platform.local.os.to_sym
    end

    # @api private
    class Collector
      include Logging

      TIMEOUT_INTERVAL = 5 # seconds

      def initialize(config, tags: nil, &block)
        @config = config
        @tags = tags
        @samplers = [CpuMem].map { |kls| kls.new(config) }
        @callback = block
      end

      attr_reader :config, :samplers, :callback, :tags

      # rubocop:disable Metrics/MethodLength
      def start
        return unless config.collect_metrics?

        @timer_task = Concurrent::TimerTask.execute(
          run_now: true,
          execution_interval: config.metrics_interval,
          timeout_interval: TIMEOUT_INTERVAL
        ) do
          begin
            collect_and_send
            true
          rescue StandardError => e
            error 'Error while collecting metrics: %e', e.inspect
            debug { e.backtrace.join("\n") }
            false
          end
        end

        @running = true
      end
      # rubocop:enable Metrics/MethodLength

      def stop
        @timer_task.shutdown
        @running = false
      end

      def running?
        !!@running
      end

      def collect_and_send
        metricset = Metricset.new(tags: tags, **collect)
        return if metricset.empty?

        callback.call(metricset)
      end

      def collect
        MUTEX.synchronize do
          samplers.each_with_object({}) do |sampler, samples|
            next unless (sample = sampler.collect)
            samples.merge!(sample)
          end
        end
      end
    end
  end
end

require 'elastic_apm/metrics/cpu_mem'

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
elastic-apm-2.6.0 lib/elastic_apm/metrics.rb
elastic-apm-2.5.0 lib/elastic_apm/metrics.rb
elastic-apm-2.4.0 lib/elastic_apm/metrics.rb
elastic-apm-2.3.1 lib/elastic_apm/metrics.rb
elastic-apm-2.3.0 lib/elastic_apm/metrics.rb