lib/fluent/plugin/monitoring.rb in fluent-plugin-google-cloud-0.7.23 vs lib/fluent/plugin/monitoring.rb in fluent-plugin-google-cloud-0.7.24

- old
+ new

@@ -31,17 +31,19 @@ end end # OpenCensus implementation of counters. class OpenCensusCounter < BaseCounter - def initialize(recorder, measure) + def initialize(recorder, measure, translator) raise ArgumentError, 'measure must not be nil' if measure.nil? @recorder = recorder @measure = measure + @translator = translator end def increment(by: 1, labels: {}) + labels = @translator.translate_labels(labels) tag_map = OpenCensus::Tags::TagMap.new( labels.map { |k, v| [k.to_s, v.to_s] }.to_h) @recorder.record(@measure.create_measurement(value: by, tags: tag_map)) end end @@ -72,12 +74,16 @@ require 'prometheus/client' @registry = Prometheus::Client.registry end # Exception-driven behavior to avoid synchronization errors. - def counter(name, labels, docstring) - return PrometheusCounter.new(@registry.counter(name, docstring, labels)) + def counter(name, _labels, docstring) + # When we upgrade to Prometheus client 0.10.0 or higher, pass the + # labels in the metric constructor. The 'labels' field in + # Prometheus client 0.9.0 has a different function and will not + # work as intended. + return PrometheusCounter.new(@registry.counter(name, docstring)) rescue Prometheus::Client::Registry::AlreadyRegisteredError return PrometheusCounter.new(@registry.get(name)) end end @@ -103,52 +109,32 @@ end @log.debug "OpenCensus config=#{OpenCensus.config}" end def counter(name, labels, docstring) - name = OpenCensusMonitoringRegistry.translate_metric_name(name) - measure = OpenCensus::Stats::MeasureRegistry.get(name) + translator = MetricTranslator.new(name, labels) + measure = OpenCensus::Stats::MeasureRegistry.get(translator.name) if measure.nil? measure = OpenCensus::Stats.create_measure_int( - name: name, + name: translator.name, unit: OpenCensus::Stats::Measure::UNIT_NONE, description: docstring ) end OpenCensus::Stats.create_and_register_view( - name: name, + name: translator.name, measure: measure, aggregation: OpenCensus::Stats.create_sum_aggregation, description: docstring, - columns: labels.map(&:to_s) + columns: translator.view_labels.map(&:to_s) ) - OpenCensusCounter.new(@recorder, measure) + OpenCensusCounter.new(@recorder, measure, translator) end def export @exporter.export @recorder.views_data end - - class << self - # Translate the internal metrics to the curated metrics in Stackdriver. - # The Prometheus metrics are collected by Google Kubernetes Engine's - # monitoring, so we can't redefine them. - def translate_metric_name(name) - case name - when :stackdriver_successful_requests_count, - :stackdriver_failed_requests_count - :request_count - when :stackdriver_ingested_entries_count, - :stackdriver_dropped_entries_count - :log_entry_count - when :stackdriver_retried_entries_count - :log_entry_retry_count - else - name - end - end - end end # Factory that is used to create a monitoring registry based on # the monitoring solution name. class MonitoringRegistryFactory @@ -164,8 +150,43 @@ end def self.create(name, project_id, monitored_resource) registry = @known_registry_types[name] || BaseMonitoringRegistry registry.new(project_id, monitored_resource) + end + end + + # Translate the internal metrics to the curated metrics in Stackdriver. The + # Prometheus metrics are collected by Google Kubernetes Engine's monitoring, + # so we can't redefine them. + # Avoid this mechanism for new metrics by defining them in their final form, + # so they don't need translation. + class MetricTranslator + attr_reader :name + attr_reader :view_labels + + def initialize(name, metric_labels) + @legacy = true + case name + when :stackdriver_successful_requests_count, + :stackdriver_failed_requests_count + @name = :request_count + when :stackdriver_ingested_entries_count, + :stackdriver_dropped_entries_count + @name = :log_entry_count + when :stackdriver_retried_entries_count + @name = :log_entry_retry_count + else + @name = name + @legacy = false + end + # Collapsed from [:response_code, :grpc] + @view_labels = @legacy ? [:response_code] : metric_labels + end + + def translate_labels(labels) + return labels unless @legacy + translation = { code: :response_code, grpc: :grpc } + labels.map { |k, v| [translation[k], v] }.to_h end end end