From b8712ab322226e618bf69f08a60d36fd87c739cb Mon Sep 17 00:00:00 2001 From: Lukas Zapletal Date: Mon, 22 Jun 2020 14:58:03 +0200 Subject: [PATCH] Fixes #30029 - telemetry label filter --- config/initializers/5_telemetry_metrics.rb | 72 +++++++++++++++++++ lib/foreman/telemetry.rb | 24 ++++++- .../telemetry_sinks/prometheus_sink.rb | 2 + 3 files changed, 97 insertions(+), 1 deletion(-) diff --git a/config/initializers/5_telemetry_metrics.rb b/config/initializers/5_telemetry_metrics.rb index 2d5f56361fd..024a6710cf6 100644 --- a/config/initializers/5_telemetry_metrics.rb +++ b/config/initializers/5_telemetry_metrics.rb @@ -29,3 +29,75 @@ telemetry.add_counter(:audit_records_created, 'Number of audit records created in the DB', [:type]) telemetry.add_counter(:audit_records_logged, 'Number of audit records sent into logger', [:type]) telemetry.add_counter(:config_report_metric_count, 'Number of config report status metrics', [:metric]) + +# To decrease amount of metrics, labels must be allowed explicitly +allowed_labels = { + controller: [ + 'api/v2/config_reports_controller', + 'api/v2/hosts_controller', + 'api/v2/puppet_hosts_controller', + 'config_reports_controller', + 'dashboard_controller', + 'fact_values_controller', + 'hostgroups_controller', + 'hosts_controller', + 'notification_recipients_controller', + ], + class: [ + 'Architecture', + 'AuthSource', + 'Bookmark', + 'CommonParameter', + 'ComputeResource', + 'ConfigReport', + 'Domain', + 'DomainParameter', + 'Environment', + 'FactName', + 'FactValue', + 'Filter', + 'Filtering', + 'GroupParameter', + 'Host::Base', + 'Host::Managed', + 'Hostgroup', + 'HostParameter', + 'Image', + 'JobTemplate', + 'Location', + 'LocationParameter', + 'LookupKey', + 'LookupValue', + 'Model', + 'Nic::Base', + 'Nic::BMC', + 'Nic::Bond', + 'Nic::Bridge', + 'Nic::Interface', + 'Nic::Managed', + 'Operatingsystem', + 'Organization', + 'OrganizationParameter', + 'OsParameter', + 'Parameter', + 'ProvisioningTemplate', + 'Ptable', + 'PuppetclassLookupKey', + 'Realm', + 'RemoteExecutionFeature', + 'Report', + 'Role', + 'SmartProxy', + 'Subnet', + 'SubnetParameter', + 'Taxonomy', + 'Template', + 'TemplateInput', + 'TemplateInvocation', + 'TemplateKind', + 'User', + 'Usergroup', + 'Widget', + ], +} +telemetry.allowed_tags(allowed_labels) diff --git a/lib/foreman/telemetry.rb b/lib/foreman/telemetry.rb index 2d80d50c817..2683903a361 100644 --- a/lib/foreman/telemetry.rb +++ b/lib/foreman/telemetry.rb @@ -7,7 +7,7 @@ class Telemetry extend Forwardable attr_accessor :prefix, :sinks - DEFAULT_BUCKETS = [1, 5, 20, 50, 100, 250, 500, 2000].freeze + DEFAULT_BUCKETS = [100, 500, 3000].freeze def initialize @sinks = [] @@ -96,6 +96,14 @@ def enabled? @sinks.count > 1 end + def allowed_tags(labels) + @allowed_tags = {} + labels.each do |k, v| + @allowed_tags[k] = Regexp.compile('^(' + v.join('|') + ')$') + end + @allowed_tags + end + def add_counter(name, description, instance_labels = []) @sinks.each { |x| x.add_counter("#{prefix}_#{name}", description, instance_labels) } end @@ -109,15 +117,29 @@ def add_histogram(name, description, instance_labels = [], buckets = DEFAULT_BUC end def increment_counter(name, value = 1, tags = {}) + return unless allowed?(tags) @sinks.each { |x| x.increment_counter("#{prefix}_#{name}", value, tags) } end def set_gauge(name, value, tags = {}) + return unless allowed?(tags) @sinks.each { |x| x.set_gauge("#{prefix}_#{name}", value, tags) } end def observe_histogram(name, value, tags = {}) + return unless allowed?(tags) @sinks.each { |x| x.observe_histogram("#{prefix}_#{name}", value, tags) } end + + private + + def allowed?(tags) + result = true + tags.each do |label, value| + regexp = @allowed_tags[label] + result &&= !!regexp.match(value) if regexp + end + result + end end end diff --git a/lib/foreman/telemetry_sinks/prometheus_sink.rb b/lib/foreman/telemetry_sinks/prometheus_sink.rb index b220c8dfd84..638a8286096 100644 --- a/lib/foreman/telemetry_sinks/prometheus_sink.rb +++ b/lib/foreman/telemetry_sinks/prometheus_sink.rb @@ -7,6 +7,8 @@ def initialize(opts = {}) require 'prometheus/client/data_stores/direct_file_store' # Set multiprocess-friendly data store FileUtils.mkdir_p(PROMETHEUS_STORE_DIR) + # but clean it during startup as files will accumulate over time + FileUtils.rm_f(Dir.glob("#{PROMETHEUS_STORE_DIR}/*.bin")) Prometheus::Client.config.data_store = Prometheus::Client::DataStores::DirectFileStore.new(dir: PROMETHEUS_STORE_DIR) @prom = ::Prometheus::Client.registry