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