class Dropsonde::Metrics::Modules

Public Class Methods

cleanup() click to toggle source
# File lib/dropsonde/metrics/modules.rb, line 138
def self.cleanup
  # run just after generating this metric
end
description() click to toggle source
# File lib/dropsonde/metrics/modules.rb, line 7
  def self.description
    <<~EOF
      This group of metrics exports name & version information about the public
      modules installed in all environments, ignoring private modules.
    EOF
  end
example() click to toggle source
# File lib/dropsonde/metrics/modules.rb, line 114
def self.example
  # this method is used to generate a table filled with randomized data to
  # make it easier to write data aggregation queries without access to the
  # actual private data that users have submitted.

  versions = ['1.3.2', '0.0.1', '0.1.2', '1.0.0', '3.0.2', '7.10', '6.1.0', '2.1.0', '1.4.0']
  classes = ['', '::Config', '::Service', '::Server', '::Client', '::Packages']
  [
    :modules => Dropsonde::Cache.modules
                                .sample(rand(100))
                                .map {|item| {
                                  :name    => item.split('-').last,
                                  :slug    => item,
                                  :version => versions.sample,
                                }},
    :classes => Dropsonde::Cache.modules
                                .sample(rand(500))
                                .map {|item| {
                                  :name  => item.split('-').last.capitalize + classes.sample,
                                  :count => rand(750),
                                }},
  ]
end
initialize_modules() click to toggle source
# File lib/dropsonde/metrics/modules.rb, line 2
def self.initialize_modules
  # require any libraries needed here -- no need to load puppet; it's already initialized
  # All plugins are initialized before any metrics are generated.
end
run() click to toggle source
# File lib/dropsonde/metrics/modules.rb, line 71
def self.run
  # return an array of hashes representing the data to be merged into the combined checkin
  environments = Puppet.lookup(:environments).list.map{|e|e.name}
  modules = environments.map do |env|
    Puppet.lookup(:environments).get(env).modules.map do|mod|
      next unless mod.forge_module?

      {
        :name    => mod.name,
        :slug    => mod.forge_slug,
        :version => mod.version,
      }
    end
  end.flatten.compact.uniq

  if Dropsonde.puppetDB
    # classes and how many nodes they're enforced on
    results = Dropsonde.puppetDB.request( '',
      'resources[type, title] { type = "Class" }'
    ).data

    # select only classes from public modules.
    # Use uniq to reduce the iteration over very large datasets
    classes = results.uniq.map do |klass|
      title   = klass['title']
      modname = title.split('::').first.downcase
      next unless modules.find {|mod| mod[:name] == modname }

      {
        :name  => title,
        :count => results.count {|row| row['title'] == title},
      }
    end.compact
  else
    classes = []
  end

  [
    { :modules => modules },
    { :classes => classes },
  ]
end
schema() click to toggle source
# File lib/dropsonde/metrics/modules.rb, line 14
def self.schema
  # return an array of hashes of a partial schema to be merged into the complete schema
  # See https://cloud.google.com/bigquery/docs/schemas#specifying_a_json_schema_file
  [
    {
      "fields": [
        {
          "description": "The module name",
          "mode": "NULLABLE",
          "name": "name",
          "type": "STRING"
        },
        {
          "description": "The module slug (author-name)",
          "mode": "NULLABLE",
          "name": "slug",
          "type": "STRING"
        },
        {
          "description": "The module version",
          "mode": "NULLABLE",
          "name": "version",
          "type": "STRING"
        }
      ],
      "description": "List of modules in all environments.",
      "mode": "REPEATED",
      "name": "modules",
      "type": "RECORD"
    },
    {
      "fields": [
        {
          "description": "The class name",
          "mode": "NULLABLE",
          "name": "name",
          "type": "STRING"
        },
        {
          "description": "How many nodes it is declared on",
          "mode": "NULLABLE",
          "name": "count",
          "type": "INTEGER"
        }
      ],
      "description": "List of classes and counts in all environments.",
      "mode": "REPEATED",
      "name": "classes",
      "type": "RECORD"
    }
  ]
end
setup() click to toggle source
# File lib/dropsonde/metrics/modules.rb, line 67
def self.setup
  # run just before generating this metric
end