Skip to content

Commit ae1bb98

Browse files
authored
Add configuration for publishing cc-worker metrics (#507)
* Add configuration for publishing cc-worker metrics * Add prom scraper config to cc-worker When 'cc.publish_metrics' is enabled, a prom scraper config will be generated automatically. If another component will be used for scraping the cc-worker metrics, scraping by prom_scraper can be disabled via 'cc.prom_scraper.disabled'.
1 parent a9fe556 commit ae1bb98

File tree

7 files changed

+144
-5
lines changed

7 files changed

+144
-5
lines changed

jobs/cloud_controller_worker/spec

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ templates:
3131
mutual_tls.key.erb: config/certs/mutual_tls.key
3232
uaa_ca.crt.erb: config/certs/uaa_ca.crt
3333
db_ca.crt.erb: config/certs/db_ca.crt
34+
prom_scraper_config.yml.erb: config/prom_scraper_config.yml
3435

3536
packages:
3637
- capi_utils
@@ -425,6 +426,21 @@ properties:
425426
description: "The number of seconds to wait for each generic cloud_controller_worker worker process to finish processing jobs before forcefully shutting it down"
426427
default: 15
427428

429+
cc.publish_metrics:
430+
default: false
431+
description: "When set to true a small webserver will be started in a seperate thread within the first worker's process.
432+
This webserver will publish prometheus metrics of the workers under '/metrics'. The webserver will listen on the port
433+
defined in 'cc.prometheus_port'."
434+
cc.prometheus_port:
435+
default: 9394
436+
description: "When 'cc.publish_metrics' is set to true, the webserver, which publishes the metrics, will listen on this port."
437+
cc.prom_scraper.disabled:
438+
default: false
439+
description: "When 'cc.publish_metrics' is enabled, a prom_scraper_config will be automatically generated. If you want to use another component for scraping, you can disable scraping by prom_scraper for cc-worker metrics with this."
440+
441+
cc.directories.tmpdir:
442+
default: "/var/vcap/data/cloud_controller_worker/tmp"
443+
description: "The directory to use for temporary files"
428444

429445
uaa.clients.cc-service-dashboards.secret:
430446
description: "Used for generating SSO clients for service brokers."

jobs/cloud_controller_worker/templates/cloud_controller_ng.yml.erb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,3 +356,9 @@ cpu_weight_max_memory: <%= link("cloud_controller_internal").p("cc.cpu_weight_ma
356356
max_manifest_service_binding_poll_duration_in_seconds: <%= p("cc.max_manifest_service_binding_poll_duration_in_seconds") %>
357357

358358
app_log_revision: <%= link("cloud_controller_internal").p("cc.app_log_revision") %>
359+
360+
publish_metrics: <%= p("cc.publish_metrics") %>
361+
prometheus_port: <%= p("cc.prometheus_port") %>
362+
363+
directories:
364+
tmpdir: <%= p("cc.directories.tmpdir") %>

jobs/cloud_controller_worker/templates/post-start.sh.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ set -ex
44

55
function fix_bundler_home_permissions {
66
BUNDLER_DIR1=/tmp/bundler
7-
BUNDLER_DIR2=/var/vcap/data/cloud_controller_worker/tmp/bundler
7+
BUNDLER_DIR2="<%= p("cc.directories.tmpdir") %>/bundler"
88
chpst -u vcap:vcap mkdir -p $BUNDLER_DIR1 $BUNDLER_DIR2
99
chown vcap:vcap -R $BUNDLER_DIR1 $BUNDLER_DIR2
1010
chpst -u vcap:vcap chmod -R go-w $BUNDLER_DIR1 $BUNDLER_DIR2

jobs/cloud_controller_worker/templates/pre-start.sh.erb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ function setup_directories {
1818
mkdir -p "/var/vcap/sys/log/cloud_controller_worker"
1919
chown -R vcap:vcap "/var/vcap/sys/log/cloud_controller_worker"
2020

21-
mkdir -p "/var/vcap/data/cloud_controller_worker/tmp"
22-
chown vcap:vcap "/var/vcap/data/cloud_controller_worker/tmp"
21+
mkdir -p "<%= p("cc.directories.tmpdir") %>"
22+
chown vcap:vcap "<%= p("cc.directories.tmpdir") %>"
2323

24-
BUNDLER_DIR=/var/vcap/data/cloud_controller_worker/tmp/bundler
24+
BUNDLER_DIR="<%= p("cc.directories.tmpdir") %>/bundler"
2525
chpst -u vcap:vcap mkdir -p $BUNDLER_DIR
2626
chpst -u vcap:vcap chmod -R go-w $BUNDLER_DIR
2727
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<% if p("cc.publish_metrics") && (p("cc.prom_scraper.disabled") != true) -%>
2+
port: <%= p("cc.prometheus_port") %>
3+
source_id: "cloud_controller_worker"
4+
instance_id: <%= spec.id || spec.index.to_s %>
5+
scheme: http
6+
path: /metrics
7+
<% end -%>

spec/cloud_controller_worker/cloud_controller_worker_spec.rb

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ module Test
2727
'skip_validation' => false,
2828
'current_key_label' => 'encryption_key_0',
2929
:keys => { 'encryption_key_0' => '((cc_db_encryption_key))' }
30-
}
30+
},
31+
'directories' => {}
3132
},
3233
'ccdb' => {
3334
'db_scheme' => 'mysql',
@@ -277,6 +278,62 @@ module Test
277278
expect(template_hash['packages']['max_valid_packages_stored']).to be(5)
278279
end
279280
end
281+
282+
describe 'metrics' do
283+
context 'when cc.publish_metrics not set' do
284+
it 'is set to false' do
285+
template_hash = YAML.safe_load(template.render(manifest_properties, consumes: links))
286+
expect(template_hash['publish_metrics']).to be(false)
287+
end
288+
end
289+
290+
context 'when cc.publish_metrics set to true' do
291+
before do
292+
manifest_properties['cc']['publish_metrics'] = true
293+
end
294+
295+
it 'is set to true' do
296+
template_hash = YAML.safe_load(template.render(manifest_properties, consumes: links))
297+
expect(template_hash['publish_metrics']).to be(true)
298+
end
299+
end
300+
301+
context 'when cc.prometheus_port not set' do
302+
it 'uses default' do
303+
template_hash = YAML.safe_load(template.render(manifest_properties, consumes: links))
304+
expect(template_hash['prometheus_port']).to eq(9394)
305+
end
306+
end
307+
308+
context 'when cc.prometheus_port is set' do
309+
before do
310+
manifest_properties['cc']['prometheus_port'] = 9397
311+
end
312+
313+
it 'uses the default' do
314+
template_hash = YAML.safe_load(template.render(manifest_properties, consumes: links))
315+
expect(template_hash['prometheus_port']).to eq(9397)
316+
end
317+
end
318+
end
319+
320+
describe 'cc.directories.tmpdir' do
321+
it 'uses the default' do
322+
template_hash = YAML.safe_load(template.render(manifest_properties, consumes: links))
323+
expect(template_hash['directories']['tmpdir']).to eq('/var/vcap/data/cloud_controller_worker/tmp')
324+
end
325+
326+
context 'when set' do
327+
before do
328+
manifest_properties['cc']['directories']['tmpdir'] = '/some/tmp'
329+
end
330+
331+
it 'renders accordingly' do
332+
template_hash = YAML.safe_load(template.render(manifest_properties, consumes: links))
333+
expect(template_hash['directories']['tmpdir']).to eq('/some/tmp')
334+
end
335+
end
336+
end
280337
end
281338
end
282339
end
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# frozen_string_literal: true
2+
3+
require 'rspec'
4+
require 'bosh/template/test'
5+
6+
module Bosh
7+
module Template
8+
module Test
9+
describe 'prom_scraper config template rendering' do
10+
let(:release_path) { File.join(File.dirname(__FILE__), '../..') }
11+
let(:release) { ReleaseDir.new(release_path) }
12+
let(:job) { release.job('cloud_controller_worker') }
13+
let(:rendered_file) { template.render(manifest_properties, consumes: {}) }
14+
15+
describe 'prom_scraper_config.yml' do
16+
let(:template) { job.template('config/prom_scraper_config.yml') }
17+
let(:manifest_properties) { {} }
18+
19+
it 'renders an empty file' do
20+
expect(rendered_file).not_to include('port: 9025')
21+
end
22+
23+
context 'when cc.publish_metrics is enabled' do
24+
before do
25+
manifest_properties['cc'] = {}
26+
manifest_properties['cc']['publish_metrics'] = true
27+
end
28+
29+
it 'renders default values' do
30+
expect(rendered_file).to include('port: 9394')
31+
end
32+
33+
context 'when different port is given' do
34+
before do
35+
manifest_properties['cc']['prometheus_port'] = 9397
36+
end
37+
38+
it 'renders custom port' do
39+
expect(rendered_file).to include('port: 9397')
40+
end
41+
end
42+
43+
context 'when prom_scraper is disabled' do
44+
it 'renders an empty file' do
45+
expect(rendered_file).not_to include('port: 9025')
46+
end
47+
end
48+
end
49+
end
50+
end
51+
end
52+
end
53+
end

0 commit comments

Comments
 (0)