Module: Fluent::Plugin::Prometheus
- Included in:
- PrometheusFilter, PrometheusOutput
- Defined in:
- lib/fluent/plugin/prometheus.rb,
lib/fluent/plugin/prometheus/placeholder_expander.rb
Defined Under Namespace
Classes: AlreadyRegisteredError, Counter, ExpandBuilder, Gauge, Histogram, Metric, Summary
Class Method Summary collapse
- .parse_labels_elements(conf) ⇒ Object
- .parse_metrics_elements(conf, registry, labels = {}) ⇒ Object
- .placeholder_expander(log) ⇒ Object
Instance Method Summary collapse
- #configure(conf) ⇒ Object
- #instrument(tag, es, metrics) ⇒ Object
- #instrument_single(tag, time, record, metrics) ⇒ Object
Class Method Details
.parse_labels_elements(conf) ⇒ Object
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/fluent/plugin/prometheus.rb', line 35 def self.parse_labels_elements(conf) labels = conf.elements.select { |e| e.name == 'labels' } if labels.size > 1 raise ConfigError, "labels section must have at most 1" end base_labels = {} unless labels.empty? labels.first.each do |key, value| labels.first.has_key?(key) # use RecordAccessor only for $. and $[ syntax # otherwise use the value as is or expand the value by RecordTransformer for ${} syntax if value.start_with?('$.') || value.start_with?('$[') base_labels[key.to_sym] = PluginHelper::RecordAccessor::Accessor.new(value) else base_labels[key.to_sym] = value end end end base_labels end |
.parse_metrics_elements(conf, registry, labels = {}) ⇒ Object
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/fluent/plugin/prometheus.rb', line 59 def self.parse_metrics_elements(conf, registry, labels = {}) metrics = [] conf.elements.select { |element| element.name == 'metric' }.each { |element| if element.has_key?('key') && (element['key'].start_with?('$.') || element['key'].start_with?('$[')) value = element['key'] element['key'] = PluginHelper::RecordAccessor::Accessor.new(value) end case element['type'] when 'summary' metrics << Fluent::Plugin::Prometheus::Summary.new(element, registry, labels) when 'gauge' metrics << Fluent::Plugin::Prometheus::Gauge.new(element, registry, labels) when 'counter' metrics << Fluent::Plugin::Prometheus::Counter.new(element, registry, labels) when 'histogram' metrics << Fluent::Plugin::Prometheus::Histogram.new(element, registry, labels) else raise ConfigError, "type option must be 'counter', 'gauge', 'summary' or 'histogram'" end } metrics end |
.placeholder_expander(log) ⇒ Object
84 85 86 |
# File 'lib/fluent/plugin/prometheus.rb', line 84 def self.(log) Fluent::Plugin::Prometheus::ExpandBuilder.new(log: log) end |
Instance Method Details
#configure(conf) ⇒ Object
88 89 90 91 92 93 |
# File 'lib/fluent/plugin/prometheus.rb', line 88 def configure(conf) super @placeholder_values = {} @placeholder_expander_builder = Fluent::Plugin::Prometheus.(log) @hostname = Socket.gethostname end |
#instrument(tag, es, metrics) ⇒ Object
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/fluent/plugin/prometheus.rb', line 114 def instrument(tag, es, metrics) placeholder_values = { 'tag' => tag, 'hostname' => @hostname, 'worker_id' => fluentd_worker_id, } es.each do |time, record| placeholders = record.merge(placeholder_values) = @placeholder_expander_builder.build(placeholders) metrics.each do |metric| begin metric.instrument(record, ) rescue => e log.warn "prometheus: failed to instrument a metric.", error_class: e.class, error: e, tag: tag, name: metric.name router.emit_error_event(tag, time, record, e) end end end end |
#instrument_single(tag, time, record, metrics) ⇒ Object
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/fluent/plugin/prometheus.rb', line 95 def instrument_single(tag, time, record, metrics) @placeholder_values[tag] ||= { 'tag' => tag, 'hostname' => @hostname, 'worker_id' => fluentd_worker_id, } placeholders = record.merge(@placeholder_values[tag]) = @placeholder_expander_builder.build(placeholders) metrics.each do |metric| begin metric.instrument(record, ) rescue => e log.warn "prometheus: failed to instrument a metric.", error_class: e.class, error: e, tag: tag, name: metric.name router.emit_error_event(tag, time, record, e) end end end |