dropsonde 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +5 -3
- data/bin/dropsonde +5 -2
- data/lib/dropsonde/metrics.rb +15 -6
- data/lib/dropsonde/metrics/environments.rb +50 -0
- data/lib/dropsonde/metrics/platforms.rb +123 -0
- data/lib/dropsonde/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 643def01638761803e04cf758bbf627ac821bb091fc7dad50c5b161251534728
|
4
|
+
data.tar.gz: f0c8a36548214da7beeecee9dc583dcd8d81eceb640b967078fadf5b2978f987
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c260e1617666fb83d7b0be1a3d73ad13aaee5c33844d5eb4117b186c6eec23a9aad6dc03ff3df393168b6a3715bf492ce677624fdbe536e4961d956d1e9cdcb
|
7
|
+
data.tar.gz: cffbe7901afe08afa593ee73fa749358257efcd03d612564b3aac507684897d2d0db3e504a599d1eab7251508c3f455e236985501ea9f6722f108bb02cf80e2e
|
data/README.md
CHANGED
@@ -43,10 +43,10 @@ schema so the system cannot gather any data that's not described in the schema.
|
|
43
43
|
See the full schema of all enabled plugins by running the command:
|
44
44
|
|
45
45
|
```
|
46
|
-
$ dropsonde schema
|
46
|
+
$ dropsonde dev schema
|
47
47
|
```
|
48
48
|
|
49
|
-
All information in the report is keyed off a non-reversible SHA512
|
49
|
+
All information in the report is keyed off a non-reversible SHA512 hashed site-id
|
50
50
|
to make it unidentifiable; this report cannot be linked back to you or to your
|
51
51
|
infrastructure. Now that said, we know that the more bits of data shared about a
|
52
52
|
specific site, the easier it is to fingerprint that site. See
|
@@ -63,6 +63,8 @@ For example, this aggregated data might include records that show a count of how
|
|
63
63
|
many sites are using various combinations of modules together, but it will never
|
64
64
|
include a record showing the full list of modules that any single site is using.
|
65
65
|
|
66
|
+

|
67
|
+
|
66
68
|
With your own Google Cloud account, you can use that [dataset](https://console.cloud.google.com/bigquery?p=dataops-puppet-public-data&d=community&t=forge_modules&page=table)
|
67
69
|
in your own tooling and you can see/contribute to the aggregation queries in its
|
68
70
|
own [repository](https://github.com/puppetlabs/dropsonde-aggregation).
|
@@ -100,7 +102,7 @@ will not report the `:puppetfiles` metrics.
|
|
100
102
|
``` yaml
|
101
103
|
---
|
102
104
|
:update: false
|
103
|
-
:
|
105
|
+
:disable:
|
104
106
|
- puppetfiles
|
105
107
|
```
|
106
108
|
|
data/bin/dropsonde
CHANGED
@@ -22,7 +22,10 @@ class Dropsonde
|
|
22
22
|
flag [:ttl], :default_value => 7, :type => Integer
|
23
23
|
|
24
24
|
desc 'List of metrics to omit'
|
25
|
-
flag [:
|
25
|
+
flag [:disable, :d], :type => Array
|
26
|
+
|
27
|
+
desc 'Only load these metrics'
|
28
|
+
flag [:enable, :e], :type => Array
|
26
29
|
|
27
30
|
desc 'Any number or string used to generate the randomized site ID.'
|
28
31
|
flag [:seed]
|
@@ -102,7 +105,7 @@ class Dropsonde
|
|
102
105
|
This is in jsonl format for direct upload to BigQuery."
|
103
106
|
t.command :example do |c|
|
104
107
|
c.desc 'How many rows to generate'
|
105
|
-
c.flag [:size], :default_value => 100
|
108
|
+
c.flag [:size], :default_value => 100, :type => Integer
|
106
109
|
|
107
110
|
c.desc 'Filename for the output (in jsonl format).'
|
108
111
|
c.flag [:filename], :default_value => 'example.jsonl'
|
data/lib/dropsonde/metrics.rb
CHANGED
@@ -4,7 +4,13 @@ class Dropsonde::Metrics
|
|
4
4
|
extend LittlePlugger( :path => 'dropsonde/metrics', :module => Dropsonde::Metrics)
|
5
5
|
|
6
6
|
def initialize
|
7
|
-
Dropsonde
|
7
|
+
if Dropsonde.settings[:enable]
|
8
|
+
Dropsonde.settings[:disable] ||= []
|
9
|
+
disable = Dropsonde::Metrics.plugins.keys - Dropsonde.settings[:enable].map(&:to_sym)
|
10
|
+
Dropsonde.settings[:disable].concat disable
|
11
|
+
end
|
12
|
+
|
13
|
+
Dropsonde::Metrics.disregard_plugins(*Dropsonde.settings[:disable])
|
8
14
|
Dropsonde::Metrics.initialize_plugins
|
9
15
|
end
|
10
16
|
|
@@ -28,9 +34,9 @@ class Dropsonde::Metrics
|
|
28
34
|
str << plugin.description.strip
|
29
35
|
str << "\n\n"
|
30
36
|
end
|
31
|
-
if Dropsonde.settings[:
|
37
|
+
if Dropsonde.settings[:disable]
|
32
38
|
str << "Disabled plugins:\n"
|
33
|
-
str << " #{Dropsonde.settings[:
|
39
|
+
str << " #{Dropsonde.settings[:disable].join(', ')}"
|
34
40
|
end
|
35
41
|
str
|
36
42
|
end
|
@@ -50,16 +56,16 @@ class Dropsonde::Metrics
|
|
50
56
|
Dropsonde::Metrics.plugins.each do |name, plugin|
|
51
57
|
schema = plugin.schema
|
52
58
|
|
53
|
-
plugin.setup
|
59
|
+
plugin.setup if plugin.respond_to? :setup
|
54
60
|
data = sanity_check_data(plugin, plugin.run)
|
55
|
-
plugin.cleanup
|
61
|
+
plugin.cleanup if plugin.respond_to? :cleanup
|
56
62
|
|
57
63
|
str << plugin.name+"\n"
|
58
64
|
str << "-------------------------------\n"
|
59
65
|
str << plugin.description
|
60
66
|
data.each do |row|
|
61
67
|
key = row.keys.first
|
62
|
-
values = row.values.
|
68
|
+
values = row.values.flatten
|
63
69
|
|
64
70
|
desc = schema.find {|item| item[:name].to_sym == key.to_sym}[:description]
|
65
71
|
str << "- #{key}: #{desc}\n"
|
@@ -112,6 +118,9 @@ class Dropsonde::Metrics
|
|
112
118
|
# We accept both the plugin and data gathered from the plugin so that
|
113
119
|
# we can sanitize both data and example data
|
114
120
|
def sanity_check_data(plugin, data)
|
121
|
+
# This allows plugin authors to easily skip metrics with no results
|
122
|
+
return [] if data.nil?
|
123
|
+
|
115
124
|
keys_data = data.map {|item| item.keys }.flatten.map(&:to_s)
|
116
125
|
keys_schema = plugin.schema.map {|item| item[:name] }
|
117
126
|
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class Dropsonde::Metrics::Environments
|
2
|
+
def self.initialize_environments
|
3
|
+
# Require any libraries needed here -- no need to load puppet or puppetdb;
|
4
|
+
# they're already loaded. This hook is named after the class name.
|
5
|
+
# All plugins are initialized at startup before any metrics are generated.
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.description
|
9
|
+
# This is a Ruby squiggle heredoc; just a multi-line string with indentation removed
|
10
|
+
<<~EOF
|
11
|
+
This group of metrics gathers information about environments.
|
12
|
+
EOF
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.schema
|
16
|
+
# return an array of hashes of a partial schema to be merged into the complete schema
|
17
|
+
[
|
18
|
+
{
|
19
|
+
"description": "The number of environments",
|
20
|
+
"mode": "NULLABLE",
|
21
|
+
"name": "environment_count",
|
22
|
+
"type": "INTEGER"
|
23
|
+
}
|
24
|
+
]
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.setup
|
28
|
+
# run just before generating this metric
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.run
|
32
|
+
# return an array of hashes representing the data to be merged into the combined checkin
|
33
|
+
[
|
34
|
+
:environment_count => Puppet.lookup(:environments).list.count,
|
35
|
+
]
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.example
|
39
|
+
# this method is used to generate a table filled with randomized data to
|
40
|
+
# make it easier to write data aggregation queries without access to the
|
41
|
+
# actual private data that users have submitted.
|
42
|
+
[
|
43
|
+
:environment_count => rand(1..100),
|
44
|
+
]
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.cleanup
|
48
|
+
# run just after generating this metric
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
class Dropsonde::Metrics::Platforms
|
2
|
+
def self.initialize_platforms
|
3
|
+
# require any libraries needed here -- no need to load puppet; it's already initialized
|
4
|
+
# All plugins are initialized before any metrics are generated.
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.description
|
8
|
+
<<~EOF
|
9
|
+
This group of metrics generates usage patterns by platform.
|
10
|
+
Currently implemented is a list of classes, the platforms
|
11
|
+
they are declared on, and a count of each combination.
|
12
|
+
EOF
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.schema
|
16
|
+
# return an array of hashes of a partial schema to be merged into the complete schema
|
17
|
+
# See https://cloud.google.com/bigquery/docs/schemas#specifying_a_json_schema_file
|
18
|
+
[
|
19
|
+
{
|
20
|
+
"fields": [
|
21
|
+
{
|
22
|
+
"description": "The class name name",
|
23
|
+
"mode": "NULLABLE",
|
24
|
+
"name": "name",
|
25
|
+
"type": "STRING"
|
26
|
+
},
|
27
|
+
{
|
28
|
+
"description": "The osfamily of the node the class is declared on",
|
29
|
+
"mode": "NULLABLE",
|
30
|
+
"name": "platform",
|
31
|
+
"type": "STRING"
|
32
|
+
},
|
33
|
+
{
|
34
|
+
"description": "The number of time this combination is declared",
|
35
|
+
"mode": "NULLABLE",
|
36
|
+
"name": "count",
|
37
|
+
"type": "INTEGER"
|
38
|
+
},
|
39
|
+
],
|
40
|
+
"description": "List of all classes in the infrastructure and platforms they're declared on.",
|
41
|
+
"mode": "REPEATED",
|
42
|
+
"name": "class_platforms",
|
43
|
+
"type": "RECORD"
|
44
|
+
}
|
45
|
+
]
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.setup
|
49
|
+
# run just before generating this metric
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.run
|
53
|
+
# skip this metric if we don't have an active PuppetDB connection
|
54
|
+
return unless Dropsonde.puppetDB
|
55
|
+
|
56
|
+
classes = Dropsonde.puppetDB.request( '', 'resources[certname, title] { type = "Class" }').data
|
57
|
+
facts = Dropsonde.puppetDB.request( '', 'facts[certname, value] { name = "osfamily" }').data
|
58
|
+
|
59
|
+
# All public Forge modules that are installed.
|
60
|
+
modules = Puppet.lookup(:environments).list.map {|env|
|
61
|
+
env.modules.select {|mod|
|
62
|
+
mod.forge_module?
|
63
|
+
}.map {|fmod|
|
64
|
+
fmod.name
|
65
|
+
}}.flatten.uniq
|
66
|
+
|
67
|
+
data = classes.map {|item|
|
68
|
+
# filter out any that don't come from public Forge modules
|
69
|
+
mod = item['title'].split('::').first.downcase
|
70
|
+
next unless modules.include? mod
|
71
|
+
|
72
|
+
item['platform'] = facts.find {|fact|
|
73
|
+
fact['certname'] == item['certname']
|
74
|
+
}['value']
|
75
|
+
|
76
|
+
{
|
77
|
+
:name => item['title'],
|
78
|
+
:platform => item['platform'],
|
79
|
+
}
|
80
|
+
}.compact
|
81
|
+
|
82
|
+
data.each {|item|
|
83
|
+
item['count'] = data.select {|i|
|
84
|
+
i[:name] == item[:name] and i[:platform] == item[:platform]
|
85
|
+
}.count
|
86
|
+
}
|
87
|
+
|
88
|
+
[
|
89
|
+
:class_platforms => data,
|
90
|
+
]
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.example
|
94
|
+
# this method is used to generate a table filled with randomized data to
|
95
|
+
# make it easier to write data aggregation queries without access to the
|
96
|
+
# actual private data that users have submitted.
|
97
|
+
|
98
|
+
platforms = ['RedHat', 'Debian', 'Windows', 'Suse', 'FreeBSD', 'Darwin', 'Archlinux', 'AIX']
|
99
|
+
classes = ['', '::Config', '::Service', '::Server', '::Client', '::Packages']
|
100
|
+
|
101
|
+
data = Dropsonde::Cache.modules
|
102
|
+
.sample(rand(35))
|
103
|
+
.map do |item|
|
104
|
+
name = item.split('-').last.capitalize + classes.sample
|
105
|
+
|
106
|
+
rand(5).times.map do
|
107
|
+
{
|
108
|
+
:name => name,
|
109
|
+
:platform => platforms.sample,
|
110
|
+
:count => rand(1000),
|
111
|
+
}
|
112
|
+
end
|
113
|
+
end.flatten
|
114
|
+
|
115
|
+
[
|
116
|
+
:class_platforms => data.uniq,
|
117
|
+
]
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.cleanup
|
121
|
+
# run just after generating this metric
|
122
|
+
end
|
123
|
+
end
|
data/lib/dropsonde/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dropsonde
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Ford
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -153,7 +153,9 @@ files:
|
|
153
153
|
- lib/dropsonde/cache.rb
|
154
154
|
- lib/dropsonde/metrics.rb
|
155
155
|
- lib/dropsonde/metrics/dependencies.rb
|
156
|
+
- lib/dropsonde/metrics/environments.rb
|
156
157
|
- lib/dropsonde/metrics/modules.rb
|
158
|
+
- lib/dropsonde/metrics/platforms.rb
|
157
159
|
- lib/dropsonde/metrics/puppetfiles.rb
|
158
160
|
- lib/dropsonde/monkeypatches.rb
|
159
161
|
- lib/dropsonde/version.rb
|