]> git.openstreetmap.org Git - chef.git/blob - cookbooks/prometheus/recipes/server.rb
Match number of apache workers on tile servers to the CPU count
[chef.git] / cookbooks / prometheus / recipes / server.rb
1 #
2 # Cookbook:: prometheus
3 # Recipe:: server
4 #
5 # Copyright:: 2020, OpenStreetMap Foundation
6 #
7 # Licensed under the Apache License, Version 2.0 (the "License");
8 # you may not use this file except in compliance with the License.
9 # You may obtain a copy of the License at
10 #
11 #     https://www.apache.org/licenses/LICENSE-2.0
12 #
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS,
15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 # See the License for the specific language governing permissions and
17 # limitations under the License.
18 #
19
20 include_recipe "apache"
21 include_recipe "apt::grafana"
22 include_recipe "networking"
23
24 passwords = data_bag_item("prometheus", "passwords")
25 tokens = data_bag_item("prometheus", "tokens")
26 admins = data_bag_item("apache", "admins")
27
28 prometheus_exporter "fastly" do
29   port 8080
30   listen_switch "listen"
31   environment "FASTLY_API_TOKEN" => tokens["fastly"]
32 end
33
34 prometheus_exporter "fastly_healthcheck" do
35   port 9696
36   scrape_interval "1m"
37   environment "FASTLY_API_TOKEN" => tokens["fastly"]
38 end
39
40 prometheus_exporter "statuscake" do
41   port 9595
42   scrape_interval "5m"
43   scrape_timeout "2m"
44   environment "STATUSCAKE_APIKEY" => tokens["statuscake"]
45 end
46
47 cache_dir = Chef::Config[:file_cache_path]
48
49 prometheus_version = "2.45.0"
50 alertmanager_version = "0.25.0"
51 karma_version = "0.114"
52
53 directory "/opt/prometheus-server" do
54   owner "root"
55   group "root"
56   mode "755"
57 end
58
59 prometheus_arch = if arm?
60                     "arm64"
61                   else
62                     "amd64"
63                   end
64
65 remote_file "#{cache_dir}/prometheus.linux.tar.gz" do
66   source "https://github.com/prometheus/prometheus/releases/download/v#{prometheus_version}/prometheus-#{prometheus_version}.linux-#{prometheus_arch}.tar.gz"
67   owner "root"
68   group "root"
69   mode "644"
70   backup false
71 end
72
73 archive_file "#{cache_dir}/prometheus.linux.tar.gz" do
74   action :nothing
75   destination "/opt/prometheus-server/prometheus"
76   overwrite true
77   strip_components 1
78   owner "root"
79   group "root"
80   subscribes :extract, "remote_file[#{cache_dir}/prometheus.linux.tar.gz]", :immediately
81 end
82
83 remote_file "#{cache_dir}/alertmanager.linux.tar.gz" do
84   source "https://github.com/prometheus/alertmanager/releases/download/v#{alertmanager_version}/alertmanager-#{alertmanager_version}.linux-#{prometheus_arch}.tar.gz"
85   owner "root"
86   group "root"
87   mode "644"
88   backup false
89 end
90
91 archive_file "#{cache_dir}/alertmanager.linux.tar.gz" do
92   action :nothing
93   destination "/opt/prometheus-server/alertmanager"
94   overwrite true
95   strip_components 1
96   owner "root"
97   group "root"
98   subscribes :extract, "remote_file[#{cache_dir}/alertmanager.linux.tar.gz]", :immediately
99 end
100
101 remote_file "#{cache_dir}/karma-linux.tar.gz" do
102   source "https://github.com/prymitive/karma/releases/download/v#{karma_version}/karma-linux-#{prometheus_arch}.tar.gz"
103   owner "root"
104   group "root"
105   mode "644"
106   backup false
107 end
108
109 archive_file "#{cache_dir}/karma-linux.tar.gz" do
110   action :nothing
111   destination "/opt/prometheus-server/karma"
112   overwrite true
113   owner "root"
114   group "root"
115   subscribes :extract, "remote_file[#{cache_dir}/karma-linux.tar.gz]", :immediately
116 end
117
118 search(:node, "roles:gateway") do |gateway|
119   allowed_ips = gateway.ipaddresses(:role => :internal).map(&:subnet)
120
121   node.default[:networking][:wireguard][:peers] << {
122     :public_key => gateway[:networking][:wireguard][:public_key],
123     :allowed_ips => allowed_ips,
124     :endpoint => "#{gateway.name}:51820"
125   }
126 end
127
128 jobs = {}
129 junos_targets = []
130 snmp_targets = []
131
132 search(:node, "recipes:prometheus\\:\\:default").sort_by(&:name).each do |client|
133   if client[:prometheus][:mode] == "wireguard"
134     node.default[:networking][:wireguard][:peers] << {
135       :public_key => client[:networking][:wireguard][:public_key],
136       :allowed_ips => client[:networking][:wireguard][:address],
137       :endpoint => "#{client.name}:51820"
138     }
139   end
140
141   client[:prometheus][:exporters].each do |key, exporter|
142     if exporter.is_a?(Hash)
143       name = exporter[:name]
144       address = exporter[:address]
145       sni = exporter[:sni]
146       labels = Array(exporter[:labels])
147       scrape_interval = exporter[:scrape_interval]
148       scrape_timeout = exporter[:scrape_timeout]
149       metric_relabel = exporter[:metric_relabel] || []
150     else
151       name = key
152       address = exporter
153       sni = nil
154       labels = []
155       scrape_interval = nil
156       scrape_timeout = nil
157       metric_relabel = []
158     end
159
160     jobs[name] ||= []
161     jobs[name] << {
162       :address => address,
163       :sni => sni,
164       :instance => client.name.split(".").first,
165       :labels => labels,
166       :scrape_interval => scrape_interval,
167       :scrape_timeout => scrape_timeout,
168       :metric_relabel => metric_relabel
169     }
170   end
171
172   Hash(client[:prometheus][:junos]).each do |instance, details|
173     junos_targets << {
174       :instance => instance,
175       :target => details[:address],
176       :address => client[:prometheus][:addresses]["junos"],
177       :labels => Array(details[:labels])
178     }
179   end
180
181   Hash(client[:prometheus][:snmp]).each do |instance, details|
182     snmp_targets << {
183       :instance => instance,
184       :target => details[:address],
185       :modules => details[:modules],
186       :address => client[:prometheus][:addresses]["snmp"],
187       :labels => Array(details[:labels])
188     }
189   end
190 end
191
192 certificates = search(:node, "letsencrypt:certificates").each_with_object({}) do |n, c|
193   n[:letsencrypt][:certificates].each do |name, details|
194     c[name] ||= details.merge(:nodes => [])
195
196     c[name][:nodes] << {
197       :name => n[:fqdn],
198       :address => n.external_ipaddress || n.internal_ipaddress
199     }
200   end
201 end
202
203 template "/etc/prometheus/ssl.yml" do
204   source "ssl.yml.erb"
205   owner "root"
206   group "root"
207   mode "644"
208   variables :certificates => certificates
209 end
210
211 prometheus_exporter "ssl" do
212   address "127.0.0.1"
213   port 9219
214   options "--config.file=/etc/prometheus/ssl.yml"
215   register_target false
216 end
217
218 package "prometheus"
219
220 systemd_service "prometheus-executable" do
221   service "prometheus"
222   dropin "executable"
223   exec_start "/opt/prometheus-server/prometheus/prometheus --config.file=/etc/prometheus/prometheus.yml --web.external-url=https://prometheus.openstreetmap.org/prometheus --storage.tsdb.path=/var/lib/prometheus/metrics2 --storage.tsdb.retention.time=540d"
224   timeout_stop_sec 300
225   notifies :restart, "service[prometheus]"
226 end
227
228 template "/etc/prometheus/prometheus.yml" do
229   source "prometheus.yml.erb"
230   owner "root"
231   group "root"
232   mode "644"
233   variables :jobs => jobs, :junos_targets => junos_targets, :snmp_targets => snmp_targets, :certificates => certificates
234 end
235
236 template "/etc/prometheus/alert_rules.yml" do
237   source "alert_rules.yml.erb"
238   owner "root"
239   group "root"
240   mode "644"
241 end
242
243 service "prometheus" do
244   action [:enable, :start]
245   subscribes :reload, "template[/etc/prometheus/prometheus.yml]"
246   subscribes :reload, "template[/etc/prometheus/alert_rules.yml]"
247   subscribes :restart, "archive_file[#{cache_dir}/prometheus.linux.tar.gz]"
248 end
249
250 systemd_service "prometheus-alertmanager" do
251   description "Prometheus alert manager"
252   type "simple"
253   user "prometheus"
254   exec_start "/opt/prometheus-server/alertmanager/alertmanager --config.file=/etc/prometheus/alertmanager.yml --storage.path=/var/lib/prometheus/alertmanager --web.external-url=https://prometheus.openstreetmap.org/alertmanager"
255   exec_reload "/bin/kill -HUP $MAINPID"
256   timeout_stop_sec 20
257   restart "on-failure"
258   notifies :restart, "service[prometheus-alertmanager]"
259 end
260
261 link "/usr/local/bin/promtool" do
262   to "/opt/prometheus-server/prometheus/promtool"
263 end
264
265 template "/etc/prometheus/alertmanager.yml" do
266   source "alertmanager.yml.erb"
267   owner "root"
268   group "root"
269   mode "644"
270 end
271
272 directory "/var/lib/prometheus/alertmanager" do
273   owner "prometheus"
274   group "prometheus"
275   mode "755"
276 end
277
278 service "prometheus-alertmanager" do
279   action [:enable, :start]
280   subscribes :reload, "template[/etc/prometheus/alertmanager.yml]"
281   subscribes :restart, "systemd_service[prometheus-alertmanager]"
282   subscribes :restart, "archive_file[#{cache_dir}/alertmanager.linux.tar.gz]"
283 end
284
285 directory "/etc/amtool" do
286   owner "root"
287   group "root"
288   mode "755"
289 end
290
291 template "/etc/amtool/config.yml" do
292   source "amtool.yml.erb"
293   owner "root"
294   group "root"
295   mode "644"
296 end
297
298 link "/usr/local/bin/amtool" do
299   to "/opt/prometheus-server/alertmanager/amtool"
300 end
301
302 template "/etc/prometheus/karma.yml" do
303   source "karma.yml.erb"
304   owner "root"
305   group "root"
306   mode "644"
307 end
308
309 systemd_service "prometheus-karma" do
310   description "Alert dashboard for Prometheus Alertmanager"
311   user "prometheus"
312   exec_start "/opt/prometheus-server/karma/karma-linux-#{prometheus_arch} --config.file=/etc/prometheus/karma.yml"
313   sandbox :enable_network => true
314   restart "on-failure"
315 end
316
317 service "prometheus-karma" do
318   action [:enable, :start]
319   subscribes :restart, "template[/etc/prometheus/karma.yml]"
320   subscribes :restart, "archive_file[#{cache_dir}/karma-linux.tar.gz]"
321   subscribes :restart, "systemd_service[prometheus-karma]"
322 end
323
324 package "grafana-enterprise"
325
326 template "/etc/grafana/grafana.ini" do
327   source "grafana.ini.erb"
328   owner "root"
329   group "grafana"
330   mode "640"
331   variables :passwords => passwords
332 end
333
334 service "grafana-server" do
335   action [:enable, :start]
336   subscribes :restart, "template[/etc/grafana/grafana.ini]"
337 end
338
339 apache_module "alias"
340 apache_module "proxy_http"
341 apache_module "proxy_wstunnel"
342
343 ssl_certificate "prometheus.openstreetmap.org" do
344   domains ["prometheus.openstreetmap.org", "prometheus.osm.org"]
345   notifies :reload, "service[apache2]"
346 end
347
348 apache_site "prometheus.openstreetmap.org" do
349   template "apache.erb"
350   variables :admin_hosts => admins["hosts"]
351 end
352
353 template "/etc/cron.daily/prometheus-backup" do
354   source "backup.cron.erb"
355   owner "root"
356   group "root"
357   mode "750"
358 end