fluent-plugin-prometheus 1.4.0 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 80f51eb873f6e3a90a0e68b0afbeb92c1efefbf5a5336dda94aea65e78227adb
4
- data.tar.gz: 5182614c1617d843d584e749c8402e6c70f17cf09376ea1f9adcc8dd6901074a
3
+ metadata.gz: 32e8a803f1394e445d273b41ec9bde5f238f4193956c431a0866c93b2a2a0426
4
+ data.tar.gz: 281024e977c3aee02030691ffb7cd86361b759dae259bb8103934db7e195f751
5
5
  SHA512:
6
- metadata.gz: 62fe2b113f75baef5bb2e5e452d64b8f1d5734edacbf7989c164b959666fb2515a26d7800299c46a0121acd71a2a091d436d45baa3d53b105dc436839a8fb635
7
- data.tar.gz: 5296bfc10750933363b2d08b79d55617d4edc65a4a7a55be4a4cd9fefb3515b1f44175b61f5f4e1ae49a8048cb2856bbbab54377be8272eb2029a2d891ebf91e
6
+ metadata.gz: 6e784fec1bca9a2ea8f725b5970ed5f08069b6d457ae11b23e1c22017d188046cab4718573c67a94b230acff1583ac12d6378a372a3713f311470c2b9a5818e3
7
+ data.tar.gz: 805673a26e562f4607cefbbf256c12e3557317e115a88096357ddde30f6d5f8dea67835e580100c6bfb5aa9abfb542d0f5b0bff9374b6d4b48046034fea5527a
@@ -1,9 +1,9 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - "2.3.6"
5
- - "2.4.3"
6
- - "2.5.0"
4
+ - "2.4.7"
5
+ - "2.5"
6
+ - "2.6"
7
7
 
8
8
  gemfile:
9
9
  - Gemfile
data/README.md CHANGED
@@ -58,18 +58,25 @@ More configuration parameters:
58
58
  - `bind`: binding interface (default: '0.0.0.0')
59
59
  - `port`: listen port (default: 24231)
60
60
  - `metrics_path`: metrics HTTP endpoint (default: /metrics)
61
+ - `aggregated_metrics_path`: metrics HTTP endpoint (default: /aggregated_metrics)
61
62
 
62
63
  When using multiple workers, each worker binds to port + `fluent_worker_id`.
64
+ To scrape metrics from all workers at once, you can access http://localhost:24231/aggregated_metrics.
63
65
 
64
66
  ### prometheus_monitor input plugin
65
67
 
66
- This plugin collects internal metrics in Fluentd. The metrics are similar to/part of [monitor_agent](http://docs.fluentd.org/articles/monitoring#monitoring-agent).
68
+ This plugin collects internal metrics in Fluentd. The metrics are similar to/part of [monitor_agent](https://docs.fluentd.org/input/monitor_agent).
67
69
 
68
- Current exposed metrics:
69
70
 
70
- - `buffere_queue_length` of each BufferedOutput plugins
71
- - `buffer_total_queued_size` of each BufferedOutput plugins
72
- - `retry_count` of each BufferedOutput plugins
71
+ #### Exposed metrics
72
+
73
+ - `fluentd_status_buffer_queue_length`
74
+ - `fluentd_status_buffer_total_queued_size`
75
+ - `fluentd_status_retry_count`
76
+ - `fluentd_status_buffer_newest_timekey` from fluentd v1.4.2
77
+ - `fluentd_status_buffer_oldest_timekey` from fluentd v1.4.2
78
+
79
+ #### Configuration
73
80
 
74
81
  With following configuration, those metrics are collected.
75
82
 
@@ -86,26 +93,35 @@ More configuration parameters:
86
93
 
87
94
  ### prometheus_output_monitor input plugin
88
95
 
89
- **experimental**
90
-
91
96
  This plugin collects internal metrics for output plugin in Fluentd. This is similar to `prometheus_monitor` plugin, but specialized for output plugin. There are Many metrics `prometheus_monitor` does not include, such as `num_errors`, `retry_wait` and so on.
92
97
 
93
- Current exposed metrics:
98
+ #### Exposed metrics
99
+
100
+ Metrics for output
94
101
 
95
- - `fluentd_output_status_buffer_queue_length`
96
- - `fluentd_output_status_buffer_total_bytes`
97
102
  - `fluentd_output_status_retry_count`
98
103
  - `fluentd_output_status_num_errors`
99
104
  - `fluentd_output_status_emit_count`
100
105
  - `fluentd_output_status_retry_wait`
101
106
  - current retry_wait computed from last retry time and next retry time
102
107
  - `fluentd_output_status_emit_records`
103
- - only for v0.14
104
108
  - `fluentd_output_status_write_count`
105
- - only for v0.14
106
109
  - `fluentd_output_status_rollback_count`
107
- - only for v0.14
110
+ - `fluentd_output_status_flush_time_count` from fluentd v1.6.0
111
+ - `fluentd_output_status_slow_flush_count` from fluentd v1.6.0
112
+
113
+ Metrics for buffer
114
+
115
+ - `fluentd_output_status_buffer_total_bytes`
116
+ - `fluentd_output_status_buffer_stage_length` from fluentd v1.6.0
117
+ - `fluentd_output_status_buffer_stage_byte_size` from fluentd v1.6.0
118
+ - `fluentd_output_status_buffer_queue_length`
119
+ - `fluentd_output_status_buffer_queue_byte_size` from fluentd v1.6.0
120
+ - `fluentd_output_status_buffer_newest_timekey` from fluentd v1.6.0
121
+ - `fluentd_output_status_buffer_oldest_timekey` from fluentd v1.6.0
122
+ - `fluentd_output_status_buffer_available_space_ratio` from fluentd v1.6.0
108
123
 
124
+ #### Configuration
109
125
 
110
126
  With following configuration, those metrics are collected.
111
127
 
@@ -122,13 +138,11 @@ More configuration parameters:
122
138
 
123
139
  ### prometheus_tail_monitor input plugin
124
140
 
125
- **experimental**
126
-
127
141
  This plugin collects internal metrics for in_tail plugin in Fluentd. in_tail plugin holds internal state for files that the plugin is watching. The state is sometimes important to monitor plugins work correctly.
128
142
 
129
143
  This plugin uses internal class of Fluentd, so it's easy to break.
130
144
 
131
- Current exposed metrics:
145
+ #### Exposed metrics
132
146
 
133
147
  - `fluentd_tail_file_position`
134
148
  - Current bytes which plugin reads from the file
@@ -141,6 +155,8 @@ Default labels:
141
155
  - `type`: plugin name. `in_tail` only for now.
142
156
  - `path`: file path
143
157
 
158
+ #### Configuration
159
+
144
160
  With following configuration, those metrics are collected.
145
161
 
146
162
  ```
@@ -224,7 +240,7 @@ In output plugin style:
224
240
 
225
241
  With above configuration, the plugin collects a metric named `message_foo_counter` from key `foo` of each records.
226
242
 
227
- You can access nested keys in records via dot or bracket notation (https://docs.fluentd.org/v1.0/articles/api-plugin-helper-record_accessor#syntax), for example: `$.kubernetes.namespace`, `$['key1'][0]['key2']`. The record accessor is enable only if the value starts with `$.` or `$[`.
243
+ You can access nested keys in records via dot or bracket notation (https://docs.fluentd.org/plugin-helper-overview/api-plugin-helper-record_accessor#syntax), for example: `$.kubernetes.namespace`, `$['key1'][0]['key2']`. The record accessor is enable only if the value starts with `$.` or `$[`.
228
244
 
229
245
  See Supported Metric Type and Labels for more configuration parameters.
230
246
 
@@ -341,7 +357,7 @@ You can add labels with static value or dynamic value from records. In `promethe
341
357
 
342
358
  All labels sections has same format. Each lines have key/value for label.
343
359
 
344
- You can access nested fields in records via dot or bracket notation (https://docs.fluentd.org/v1.0/articles/api-plugin-helper-record_accessor#syntax), for example: `$.kubernetes.namespace`, `$['key1'][0]['key2']`. The record accessor is enable only if the value starts with `$.` or `$[`. Other values are handled as raw string as is and may be expanded by placeholder described later.
360
+ You can access nested fields in records via dot or bracket notation (https://docs.fluentd.org/plugin-helper-overview/api-plugin-helper-record_accessor#syntax), for example: `$.kubernetes.namespace`, `$['key1'][0]['key2']`. The record accessor is enable only if the value starts with `$.` or `$[`. Other values are handled as raw string as is and may be expanded by placeholder described later.
345
361
 
346
362
  You can use placeholder for label values. The placeholders will be expanded from reserved values and records.
347
363
  If you specify `${hostname}`, it will be expanded by value of a hostname where fluentd runs.
@@ -353,7 +369,13 @@ Reserved placeholders are:
353
369
  - `${worker_id}`: fluent worker id
354
370
  - `${tag}`: tag name
355
371
  - only available in Prometheus output/filter plugin
356
-
372
+ - `${tag_parts[N]}` refers to the Nth part of the tag.
373
+ - only available in Prometheus output/filter plugin
374
+ - `${tag_prefix[N]}` refers to the [0..N] part of the tag.
375
+ - only available in Prometheus output/filter plugin
376
+ - `${tag_suffix[N]}` refers to the [`tagsize`-1-N..] part of the tag.
377
+ - where `tagsize` is the size of tag which is splitted with `.` (when tag is `1.2.3`, then `tagsize` is 3)
378
+ - only available in Prometheus output/filter plugin
357
379
 
358
380
  ### top-level labels and labels inside metric
359
381
 
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "fluent-plugin-prometheus"
3
- spec.version = "1.4.0"
3
+ spec.version = "1.7.1"
4
4
  spec.authors = ["Masahiro Sano"]
5
5
  spec.email = ["sabottenda@gmail.com"]
6
6
  spec.summary = %q{A fluent plugin that collects metrics and exposes for Prometheus.}
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
14
14
  spec.require_paths = ["lib"]
15
15
 
16
16
  spec.add_dependency "fluentd", ">= 0.14.20", "< 2"
17
- spec.add_dependency "prometheus-client"
17
+ spec.add_dependency "prometheus-client", "< 0.10"
18
18
  spec.add_development_dependency "bundler"
19
19
  spec.add_development_dependency "rake"
20
20
  spec.add_development_dependency "rspec"
@@ -4,6 +4,7 @@ require 'fluent/plugin/filter'
4
4
  module Fluent::Plugin
5
5
  class PrometheusFilter < Fluent::Plugin::Filter
6
6
  Fluent::Plugin.register_filter('prometheus', self)
7
+ include Fluent::Plugin::PrometheusLabelParser
7
8
  include Fluent::Plugin::Prometheus
8
9
 
9
10
  def initialize
@@ -17,13 +18,13 @@ module Fluent::Plugin
17
18
 
18
19
  def configure(conf)
19
20
  super
20
- labels = Fluent::Plugin::Prometheus.parse_labels_elements(conf)
21
+ labels = parse_labels_elements(conf)
21
22
  @metrics = Fluent::Plugin::Prometheus.parse_metrics_elements(conf, @registry, labels)
22
23
  end
23
24
 
24
- def filter_stream(tag, es)
25
- instrument(tag, es, @metrics)
26
- es
25
+ def filter(tag, time, record)
26
+ instrument_single(tag, time, record, @metrics)
27
+ record
27
28
  end
28
29
  end
29
30
  end
@@ -1,5 +1,7 @@
1
1
  require 'fluent/plugin/input'
2
2
  require 'fluent/plugin/prometheus'
3
+ require 'fluent/plugin/prometheus_metrics'
4
+ require 'net/http'
3
5
  require 'webrick'
4
6
 
5
7
  module Fluent::Plugin
@@ -11,6 +13,7 @@ module Fluent::Plugin
11
13
  config_param :bind, :string, default: '0.0.0.0'
12
14
  config_param :port, :integer, default: 24231
13
15
  config_param :metrics_path, :string, default: '/metrics'
16
+ config_param :aggregated_metrics_path, :string, default: '/aggregated_metrics'
14
17
 
15
18
  desc 'Enable ssl configuration for the server'
16
19
  config_section :ssl, required: false, multi: false do
@@ -31,6 +34,10 @@ module Fluent::Plugin
31
34
 
32
35
  attr_reader :registry
33
36
 
37
+ attr_reader :num_workers
38
+ attr_reader :base_port
39
+ attr_reader :metrics_path
40
+
34
41
  def initialize
35
42
  super
36
43
  @registry = ::Prometheus::Client.registry
@@ -38,6 +45,18 @@ module Fluent::Plugin
38
45
 
39
46
  def configure(conf)
40
47
  super
48
+
49
+ # Get how many workers we have
50
+ sysconf = if self.respond_to?(:owner) && owner.respond_to?(:system_config)
51
+ owner.system_config
52
+ elsif self.respond_to?(:system_config)
53
+ self.system_config
54
+ else
55
+ nil
56
+ end
57
+ @num_workers = sysconf && sysconf.workers ? sysconf.workers : 1
58
+
59
+ @base_port = @port
41
60
  @port += fluentd_worker_id
42
61
  end
43
62
 
@@ -82,6 +101,7 @@ module Fluent::Plugin
82
101
 
83
102
  @server = WEBrick::HTTPServer.new(config)
84
103
  @server.mount(@metrics_path, MonitorServlet, self)
104
+ @server.mount(@aggregated_metrics_path, MonitorServletAll, self)
85
105
  thread_create(:in_prometheus) do
86
106
  @server.start
87
107
  end
@@ -110,5 +130,35 @@ module Fluent::Plugin
110
130
  res.body = $!.to_s
111
131
  end
112
132
  end
133
+
134
+ class MonitorServletAll < WEBrick::HTTPServlet::AbstractServlet
135
+ def initialize(server, prometheus)
136
+ @prometheus = prometheus
137
+ end
138
+
139
+ def do_GET(req, res)
140
+ res.status = 200
141
+ res['Content-Type'] = ::Prometheus::Client::Formats::Text::CONTENT_TYPE
142
+
143
+ full_result = PromMetricsAggregator.new
144
+ fluent_server_ip = @prometheus.bind == '0.0.0.0' ? '127.0.0.1' : @prometheus.bind
145
+ current_worker = 0
146
+ while current_worker < @prometheus.num_workers
147
+ Net::HTTP.start(fluent_server_ip, @prometheus.base_port + current_worker) do |http|
148
+ req = Net::HTTP::Get.new(@prometheus.metrics_path)
149
+ result = http.request(req)
150
+ if result.is_a?(Net::HTTPSuccess)
151
+ full_result.add_metrics(result.body)
152
+ end
153
+ end
154
+ current_worker += 1
155
+ end
156
+ res.body = full_result.get_metrics
157
+ rescue
158
+ res.status = 500
159
+ res['Content-Type'] = 'text/plain'
160
+ res.body = $!.to_s
161
+ end
162
+ end
113
163
  end
114
164
  end
@@ -5,6 +5,7 @@ require 'fluent/plugin/prometheus'
5
5
  module Fluent::Plugin
6
6
  class PrometheusMonitorInput < Fluent::Plugin::Input
7
7
  Fluent::Plugin.register_input('prometheus_monitor', self)
8
+ include Fluent::Plugin::PrometheusLabelParser
8
9
 
9
10
  helpers :timer
10
11
 
@@ -23,14 +24,14 @@ module Fluent::Plugin
23
24
  def configure(conf)
24
25
  super
25
26
  hostname = Socket.gethostname
26
- expander = Fluent::Plugin::Prometheus.placeholder_expander(log)
27
- placeholders = expander.prepare_placeholders({'hostname' => hostname, 'worker_id' => fluentd_worker_id})
28
- @base_labels = Fluent::Plugin::Prometheus.parse_labels_elements(conf)
27
+ expander_builder = Fluent::Plugin::Prometheus.placeholder_expander(log)
28
+ expander = expander_builder.build({ 'hostname' => hostname, 'worker_id' => fluentd_worker_id })
29
+ @base_labels = parse_labels_elements(conf)
29
30
  @base_labels.each do |key, value|
30
31
  unless value.is_a?(String)
31
32
  raise Fluent::ConfigError, "record accessor syntax is not available in prometheus_monitor"
32
33
  end
33
- @base_labels[key] = expander.expand(value, placeholders)
34
+ @base_labels[key] = expander.expand(value)
34
35
  end
35
36
 
36
37
  if defined?(Fluent::Plugin) && defined?(Fluent::Plugin::MonitorAgentInput)
@@ -45,6 +46,12 @@ module Fluent::Plugin
45
46
  def start
46
47
  super
47
48
 
49
+ @buffer_newest_timekey = @registry.gauge(
50
+ :fluentd_status_buffer_newest_timekey,
51
+ 'Newest timekey in buffer.')
52
+ @buffer_oldest_timekey = @registry.gauge(
53
+ :fluentd_status_buffer_oldest_timekey,
54
+ 'Oldest timekey in buffer.')
48
55
  buffer_queue_length = @registry.gauge(
49
56
  :fluentd_status_buffer_queue_length,
50
57
  'Current buffer queue length.')
@@ -65,11 +72,19 @@ module Fluent::Plugin
65
72
 
66
73
  def update_monitor_info
67
74
  @monitor_agent.plugins_info_all.each do |info|
75
+ label = labels(info)
76
+
68
77
  @monitor_info.each do |name, metric|
69
78
  if info[name]
70
- metric.set(labels(info), info[name])
79
+ metric.set(label, info[name])
71
80
  end
72
81
  end
82
+
83
+ timekeys = info["buffer_timekeys"]
84
+ if timekeys && !timekeys.empty?
85
+ @buffer_newest_timekey.set(label, timekeys.max)
86
+ @buffer_oldest_timekey.set(label, timekeys.min)
87
+ end
73
88
  end
74
89
  end
75
90
 
@@ -5,6 +5,7 @@ require 'fluent/plugin/prometheus'
5
5
  module Fluent::Plugin
6
6
  class PrometheusOutputMonitorInput < Fluent::Input
7
7
  Fluent::Plugin.register_input('prometheus_output_monitor', self)
8
+ include Fluent::Plugin::PrometheusLabelParser
8
9
 
9
10
  helpers :timer
10
11
 
@@ -24,6 +25,10 @@ module Fluent::Plugin
24
25
  :emit_records,
25
26
  :write_count,
26
27
  :rollback_count,
28
+
29
+ # from v1.6.0
30
+ :flush_time_count,
31
+ :slow_flush_count,
27
32
  ]
28
33
 
29
34
  def initialize
@@ -38,14 +43,14 @@ module Fluent::Plugin
38
43
  def configure(conf)
39
44
  super
40
45
  hostname = Socket.gethostname
41
- expander = Fluent::Plugin::Prometheus.placeholder_expander(log)
42
- placeholders = expander.prepare_placeholders({'hostname' => hostname, 'worker_id' => fluentd_worker_id})
43
- @base_labels = Fluent::Plugin::Prometheus.parse_labels_elements(conf)
46
+ expander_builder = Fluent::Plugin::Prometheus.placeholder_expander(log)
47
+ expander = expander_builder.buidl({ 'hostname' => hostname, 'worker_id' => fluentd_worker_id })
48
+ @base_labels = parse_labels_elements(conf)
44
49
  @base_labels.each do |key, value|
45
50
  unless value.is_a?(String)
46
51
  raise Fluent::ConfigError, "record accessor syntax is not available in prometheus_output_monitor"
47
52
  end
48
- @base_labels[key] = expander.expand(value, placeholders)
53
+ @base_labels[key] = expander.expand(value)
49
54
  end
50
55
 
51
56
  if defined?(Fluent::Plugin) && defined?(Fluent::Plugin::MonitorAgentInput)
@@ -60,12 +65,33 @@ module Fluent::Plugin
60
65
  super
61
66
 
62
67
  @metrics = {
63
- buffer_queue_length: @registry.gauge(
64
- :fluentd_output_status_buffer_queue_length,
65
- 'Current buffer queue length.'),
68
+ # Buffer metrics
66
69
  buffer_total_queued_size: @registry.gauge(
67
70
  :fluentd_output_status_buffer_total_bytes,
68
- 'Current total size of queued buffers.'),
71
+ 'Current total size of stage and queue buffers.'),
72
+ buffer_stage_length: @registry.gauge(
73
+ :fluentd_output_status_buffer_stage_length,
74
+ 'Current length of stage buffers.'),
75
+ buffer_stage_byte_size: @registry.gauge(
76
+ :fluentd_output_status_buffer_stage_byte_size,
77
+ 'Current total size of stage buffers.'),
78
+ buffer_queue_length: @registry.gauge(
79
+ :fluentd_output_status_buffer_queue_length,
80
+ 'Current length of queue buffers.'),
81
+ buffer_queue_byte_size: @registry.gauge(
82
+ :fluentd_output_status_queue_byte_size,
83
+ 'Current total size of queue buffers.'),
84
+ buffer_available_buffer_space_ratios: @registry.gauge(
85
+ :fluentd_output_status_buffer_available_space_ratio,
86
+ 'Ratio of available space in buffer.'),
87
+ buffer_newest_timekey: @registry.gauge(
88
+ :fluentd_output_status_buffer_newest_timekey,
89
+ 'Newest timekey in buffer.'),
90
+ buffer_oldest_timekey: @registry.gauge(
91
+ :fluentd_output_status_buffer_oldest_timekey,
92
+ 'Oldest timekey in buffer.'),
93
+
94
+ # Output metrics
69
95
  retry_counts: @registry.gauge(
70
96
  :fluentd_output_status_retry_count,
71
97
  'Current retry counts.'),
@@ -84,6 +110,12 @@ module Fluent::Plugin
84
110
  rollback_count: @registry.gauge(
85
111
  :fluentd_output_status_rollback_count,
86
112
  'Current rollback counts.'),
113
+ flush_time_count: @registry.gauge(
114
+ :fluentd_output_status_flush_time_count,
115
+ 'Total flush time.'),
116
+ slow_flush_count: @registry.gauge(
117
+ :fluentd_output_status_slow_flush_count,
118
+ 'Current slow flush counts.'),
87
119
  retry_wait: @registry.gauge(
88
120
  :fluentd_output_status_retry_wait,
89
121
  'Current retry wait'),
@@ -102,8 +134,17 @@ module Fluent::Plugin
102
134
  }
103
135
 
104
136
  monitor_info = {
105
- 'buffer_queue_length' => @metrics[:buffer_queue_length],
137
+ # buffer metrics
106
138
  'buffer_total_queued_size' => @metrics[:buffer_total_queued_size],
139
+ 'buffer_stage_length' => @metrics[:buffer_stage_length],
140
+ 'buffer_stage_byte_size' => @metrics[:buffer_stage_byte_size],
141
+ 'buffer_queue_length' => @metrics[:buffer_queue_length],
142
+ 'buffer_queue_byte_size' => @metrics[:buffer_queue_byte_size],
143
+ 'buffer_available_buffer_space_ratios' => @metrics[:buffer_available_buffer_space_ratios],
144
+ 'buffer_newest_timekey' => @metrics[:buffer_newest_timekey],
145
+ 'buffer_oldest_timekey' => @metrics[:buffer_oldest_timekey],
146
+
147
+ # output metrics
107
148
  'retry_count' => @metrics[:retry_counts],
108
149
  }
109
150
  instance_vars_info = {
@@ -112,6 +153,8 @@ module Fluent::Plugin
112
153
  emit_count: @metrics[:emit_count],
113
154
  emit_records: @metrics[:emit_records],
114
155
  rollback_count: @metrics[:rollback_count],
156
+ flush_time_count: @metrics[:flush_time_count],
157
+ slow_flush_count: @metrics[:slow_flush_count],
115
158
  }
116
159
 
117
160
  agent_info.each do |info|