Sha256: 9c371cacdd66f7f3ed7621f696aede1f75aeb514529dc2f421bffed83c604a93

Contents?: true

Size: 1.82 KB

Versions: 5

Compression:

Stored size: 1.82 KB

Contents

# frozen_string_literal: true

module PrometheusExporter::Server

  class ProcessCollector < TypeCollector
    MAX_PROCESS_METRIC_AGE = 60
    PROCESS_GAUGES = {
      heap_free_slots: "Free ruby heap slots",
      heap_live_slots: "Used ruby heap slots",
      v8_heap_size: "Total JavaScript V8 heap size (bytes)",
      v8_used_heap_size: "Total used JavaScript V8 heap size (bytes)",
      v8_physical_size: "Physical size consumed by V8 heaps",
      v8_heap_count: "Number of V8 contexts running",
      rss: "Total RSS used by process",
    }

    PROCESS_COUNTERS = {
      major_gc_count: "Major GC operations by process",
      minor_gc_count: "Minor GC operations by process",
      total_allocated_objects: "Total number of allocateds objects by process",
    }

    def initialize
      @process_metrics = []
    end

    def type
      "process"
    end

    def metrics
      return [] if @process_metrics.length == 0

      metrics = {}

      @process_metrics.map do |m|
        metric_key = { pid: m["pid"], type: m["process_type"] }

        PROCESS_GAUGES.map do |k, help|
          k = k.to_s
          if v = m[k]
            g = metrics[k] ||= PrometheusExporter::Metric::Gauge.new(k, help)
            g.observe(v, metric_key)
          end
        end

        PROCESS_COUNTERS.map do |k, help|
          k = k.to_s
          if v = m[k]
            c = metrics[k] ||= PrometheusExporter::Metric::Counter.new(k, help)
            c.observe(v, metric_key)
          end
        end
      end

      metrics.values
    end

    def collect(obj)
      now = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)

      obj["created_at"] = now

      @process_metrics.delete_if do |current|
        obj["pid"] == current["pid"] || (current["created_at"] + MAX_PROCESS_METRIC_AGE < now)
      end
      @process_metrics << obj
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
prometheus_exporter-0.1.16 lib/prometheus_exporter/server/process_collector.rb
prometheus_exporter-0.1.15 lib/prometheus_exporter/server/process_collector.rb
prometheus_exporter-0.1.14 lib/prometheus_exporter/server/process_collector.rb
prometheus_exporter-0.1.13 lib/prometheus_exporter/server/process_collector.rb
prometheus_exporter-0.1.12 lib/prometheus_exporter/server/process_collector.rb