]> git.openstreetmap.org Git - chef.git/blob - cookbooks/prometheus/recipes/server.rb
3014cbf9964dbd6f95bfa2657549f04cdaf15d47
[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 template "/etc/prometheus/cloudwatch.yml" do
48   source "cloudwatch.yml.erb"
49   owner "root"
50   group "root"
51   mode "644"
52 end
53
54 prometheus_exporter "cloudwatch" do
55   address "127.0.0.1"
56   port 5000
57   listen_switch "listen-address"
58   options %w[
59     --config.file=/etc/prometheus/cloudwatch.yml
60     --enable-feature=aws-sdk-v2
61     --enable-feature=always-return-info-metrics
62   ]
63   environment "AWS_ACCESS_KEY_ID" => "AKIASQUXHPE7JHG37EA6",
64               "AWS_SECRET_ACCESS_KEY" => tokens["cloudwatch"]
65   subscribes :restart, "template[/etc/prometheus/cloudwatch.yml]"
66 end
67
68 cache_dir = Chef::Config[:file_cache_path]
69
70 prometheus_version = "2.45.0"
71 alertmanager_version = "0.25.0"
72 karma_version = "0.114"
73
74 directory "/opt/prometheus-server" do
75   owner "root"
76   group "root"
77   mode "755"
78 end
79
80 prometheus_arch = if arm?
81                     "arm64"
82                   else
83                     "amd64"
84                   end
85
86 remote_file "#{cache_dir}/prometheus.linux.tar.gz" do
87   source "https://github.com/prometheus/prometheus/releases/download/v#{prometheus_version}/prometheus-#{prometheus_version}.linux-#{prometheus_arch}.tar.gz"
88   owner "root"
89   group "root"
90   mode "644"
91   backup false
92 end
93
94 archive_file "#{cache_dir}/prometheus.linux.tar.gz" do
95   action :nothing
96   destination "/opt/prometheus-server/prometheus"
97   overwrite true
98   strip_components 1
99   owner "root"
100   group "root"
101   subscribes :extract, "remote_file[#{cache_dir}/prometheus.linux.tar.gz]", :immediately
102 end
103
104 remote_file "#{cache_dir}/alertmanager.linux.tar.gz" do
105   source "https://github.com/prometheus/alertmanager/releases/download/v#{alertmanager_version}/alertmanager-#{alertmanager_version}.linux-#{prometheus_arch}.tar.gz"
106   owner "root"
107   group "root"
108   mode "644"
109   backup false
110 end
111
112 archive_file "#{cache_dir}/alertmanager.linux.tar.gz" do
113   action :nothing
114   destination "/opt/prometheus-server/alertmanager"
115   overwrite true
116   strip_components 1
117   owner "root"
118   group "root"
119   subscribes :extract, "remote_file[#{cache_dir}/alertmanager.linux.tar.gz]", :immediately
120 end
121
122 remote_file "#{cache_dir}/karma-linux.tar.gz" do
123   source "https://github.com/prymitive/karma/releases/download/v#{karma_version}/karma-linux-#{prometheus_arch}.tar.gz"
124   owner "root"
125   group "root"
126   mode "644"
127   backup false
128 end
129
130 archive_file "#{cache_dir}/karma-linux.tar.gz" do
131   action :nothing
132   destination "/opt/prometheus-server/karma"
133   overwrite true
134   owner "root"
135   group "root"
136   subscribes :extract, "remote_file[#{cache_dir}/karma-linux.tar.gz]", :immediately
137 end
138
139 search(:node, "roles:gateway") do |gateway|
140   allowed_ips = gateway.ipaddresses(:role => :internal).map(&:subnet)
141
142   node.default[:networking][:wireguard][:peers] << {
143     :public_key => gateway[:networking][:wireguard][:public_key],
144     :allowed_ips => allowed_ips,
145     :endpoint => "#{gateway.name}:51820"
146   }
147 end
148
149 jobs = {}
150 junos_targets = []
151 snmp_targets = []
152
153 search(:node, "recipes:prometheus\\:\\:default").sort_by(&:name).each do |client|
154   if client[:prometheus][:mode] == "wireguard"
155     node.default[:networking][:wireguard][:peers] << {
156       :public_key => client[:networking][:wireguard][:public_key],
157       :allowed_ips => client[:networking][:wireguard][:address],
158       :endpoint => "#{client.name}:51820"
159     }
160   end
161
162   client[:prometheus][:exporters].each do |key, exporter|
163     if exporter.is_a?(Hash)
164       name = exporter[:name]
165       address = exporter[:address]
166       sni = exporter[:sni]
167       labels = Array(exporter[:labels])
168       scrape_interval = exporter[:scrape_interval]
169       scrape_timeout = exporter[:scrape_timeout]
170       metric_relabel = exporter[:metric_relabel] || []
171     else
172       name = key
173       address = exporter
174       sni = nil
175       labels = []
176       scrape_interval = nil
177       scrape_timeout = nil
178       metric_relabel = []
179     end
180
181     jobs[name] ||= []
182     jobs[name] << {
183       :address => address,
184       :sni => sni,
185       :instance => client.name.split(".").first,
186       :labels => labels,
187       :scrape_interval => scrape_interval,
188       :scrape_timeout => scrape_timeout,
189       :metric_relabel => metric_relabel
190     }
191   end
192
193   Hash(client[:prometheus][:junos]).each do |instance, details|
194     junos_targets << {
195       :instance => instance,
196       :target => details[:address],
197       :address => client[:prometheus][:addresses]["junos"],
198       :labels => Array(details[:labels])
199     }
200   end
201
202   Hash(client[:prometheus][:snmp]).each do |instance, details|
203     snmp_targets << {
204       :instance => instance,
205       :target => details[:address],
206       :modules => details[:modules],
207       :address => client[:prometheus][:addresses]["snmp"],
208       :labels => Array(details[:labels])
209     }
210   end
211 end
212
213 certificates = search(:node, "letsencrypt:certificates").each_with_object({}) do |n, c|
214   n[:letsencrypt][:certificates].each do |name, details|
215     c[name] ||= details.merge(:nodes => [])
216
217     c[name][:nodes] << {
218       :name => n[:fqdn],
219       :address => n.external_ipaddress || n.internal_ipaddress
220     }
221   end
222 end
223
224 template "/etc/prometheus/ssl.yml" do
225   source "ssl.yml.erb"
226   owner "root"
227   group "root"
228   mode "644"
229   variables :certificates => certificates
230 end
231
232 prometheus_exporter "ssl" do
233   address "127.0.0.1"
234   port 9219
235   options "--config.file=/etc/prometheus/ssl.yml"
236   register_target false
237 end
238
239 package "prometheus"
240
241 systemd_service "prometheus-executable" do
242   service "prometheus"
243   dropin "executable"
244   exec_start "/opt/prometheus-server/prometheus/prometheus --config.file=/etc/prometheus/prometheus.yml --web.enable-admin-api --web.external-url=https://prometheus.openstreetmap.org/prometheus --storage.tsdb.path=/var/lib/prometheus/metrics2 --storage.tsdb.retention.time=540d"
245   timeout_stop_sec 300
246   notifies :restart, "service[prometheus]"
247 end
248
249 template "/etc/prometheus/prometheus.yml" do
250   source "prometheus.yml.erb"
251   owner "root"
252   group "root"
253   mode "644"
254   variables :jobs => jobs, :junos_targets => junos_targets, :snmp_targets => snmp_targets, :certificates => certificates
255 end
256
257 template "/etc/prometheus/alert_rules.yml" do
258   source "alert_rules.yml.erb"
259   owner "root"
260   group "root"
261   mode "644"
262 end
263
264 service "prometheus" do
265   action [:enable, :start]
266   subscribes :reload, "template[/etc/prometheus/prometheus.yml]"
267   subscribes :reload, "template[/etc/prometheus/alert_rules.yml]"
268   subscribes :restart, "archive_file[#{cache_dir}/prometheus.linux.tar.gz]"
269 end
270
271 systemd_service "prometheus-alertmanager" do
272   description "Prometheus alert manager"
273   type "simple"
274   user "prometheus"
275   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"
276   exec_reload "/bin/kill -HUP $MAINPID"
277   timeout_stop_sec 20
278   restart "on-failure"
279   notifies :restart, "service[prometheus-alertmanager]"
280 end
281
282 link "/usr/local/bin/promtool" do
283   to "/opt/prometheus-server/prometheus/promtool"
284 end
285
286 template "/etc/prometheus/alertmanager.yml" do
287   source "alertmanager.yml.erb"
288   owner "root"
289   group "root"
290   mode "644"
291 end
292
293 directory "/var/lib/prometheus/alertmanager" do
294   owner "prometheus"
295   group "prometheus"
296   mode "755"
297 end
298
299 service "prometheus-alertmanager" do
300   action [:enable, :start]
301   subscribes :reload, "template[/etc/prometheus/alertmanager.yml]"
302   subscribes :restart, "systemd_service[prometheus-alertmanager]"
303   subscribes :restart, "archive_file[#{cache_dir}/alertmanager.linux.tar.gz]"
304 end
305
306 directory "/etc/amtool" do
307   owner "root"
308   group "root"
309   mode "755"
310 end
311
312 template "/etc/amtool/config.yml" do
313   source "amtool.yml.erb"
314   owner "root"
315   group "root"
316   mode "644"
317 end
318
319 link "/usr/local/bin/amtool" do
320   to "/opt/prometheus-server/alertmanager/amtool"
321 end
322
323 template "/etc/prometheus/karma.yml" do
324   source "karma.yml.erb"
325   owner "root"
326   group "root"
327   mode "644"
328 end
329
330 systemd_service "prometheus-karma" do
331   description "Alert dashboard for Prometheus Alertmanager"
332   user "prometheus"
333   exec_start "/opt/prometheus-server/karma/karma-linux-#{prometheus_arch} --config.file=/etc/prometheus/karma.yml"
334   sandbox :enable_network => true
335   restart "on-failure"
336 end
337
338 service "prometheus-karma" do
339   action [:enable, :start]
340   subscribes :restart, "template[/etc/prometheus/karma.yml]"
341   subscribes :restart, "archive_file[#{cache_dir}/karma-linux.tar.gz]"
342   subscribes :restart, "systemd_service[prometheus-karma]"
343 end
344
345 package "grafana-enterprise"
346
347 template "/etc/grafana/grafana.ini" do
348   source "grafana.ini.erb"
349   owner "root"
350   group "grafana"
351   mode "640"
352   variables :passwords => passwords
353 end
354
355 service "grafana-server" do
356   action [:enable, :start]
357   subscribes :restart, "template[/etc/grafana/grafana.ini]"
358 end
359
360 apache_module "alias"
361 apache_module "proxy_http"
362 apache_module "proxy_wstunnel"
363
364 ssl_certificate "prometheus.openstreetmap.org" do
365   domains ["prometheus.openstreetmap.org", "prometheus.osm.org"]
366   notifies :reload, "service[apache2]"
367 end
368
369 apache_site "prometheus.openstreetmap.org" do
370   template "apache.erb"
371   variables :admin_hosts => admins["hosts"]
372 end
373
374 template "/etc/cron.daily/prometheus-backup" do
375   source "backup.cron.erb"
376   owner "root"
377   group "root"
378   mode "750"
379 end