]> git.openstreetmap.org Git - chef.git/blob - cookbooks/prometheus/recipes/server.rb
Add monitoring of Fastly healthcheck status
[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"
22 include_recipe "networking"
23 include_recipe "timescaledb"
24
25 passwords = data_bag_item("prometheus", "passwords")
26 tokens = data_bag_item("prometheus", "tokens")
27 admins = data_bag_item("apache", "admins")
28
29 prometheus_exporter "fastly" do
30   port 8080
31   listen_switch "listen"
32   environment "FASTLY_API_TOKEN" => tokens["fastly"]
33 end
34
35 prometheus_exporter "fastly_healthcheck" do
36   port 9696
37   environment "FASTLY_API_TOKEN" => tokens["fastly"]
38 end
39
40 prometheus_exporter "statuscake" do
41   port 9595
42   environment "STATUSCAKE_APIKEY" => tokens["statuscake"]
43 end
44
45 cache_dir = Chef::Config[:file_cache_path]
46
47 prometheus_version = "2.31.1"
48 alertmanager_version = "0.23.0"
49 karma_version = "0.93"
50
51 directory "/opt/prometheus-server" do
52   owner "root"
53   group "root"
54   mode "755"
55 end
56
57 remote_file "#{cache_dir}/prometheus.linux-amd64.tar.gz" do
58   source "https://github.com/prometheus/prometheus/releases/download/v#{prometheus_version}/prometheus-#{prometheus_version}.linux-amd64.tar.gz"
59   owner "root"
60   group "root"
61   mode "644"
62   backup false
63 end
64
65 archive_file "#{cache_dir}/prometheus.linux-amd64.tar.gz" do
66   action :nothing
67   destination "/opt/prometheus-server/prometheus"
68   overwrite true
69   strip_components 1
70   owner "root"
71   group "root"
72   subscribes :extract, "remote_file[#{cache_dir}/prometheus.linux-amd64.tar.gz]"
73 end
74
75 remote_file "#{cache_dir}/alertmanager.linux-amd64.tar.gz" do
76   source "https://github.com/prometheus/alertmanager/releases/download/v#{alertmanager_version}/alertmanager-#{alertmanager_version}.linux-amd64.tar.gz"
77   owner "root"
78   group "root"
79   mode "644"
80   backup false
81 end
82
83 archive_file "#{cache_dir}/alertmanager.linux-amd64.tar.gz" do
84   action :nothing
85   destination "/opt/prometheus-server/alertmanager"
86   overwrite true
87   strip_components 1
88   owner "root"
89   group "root"
90   subscribes :extract, "remote_file[#{cache_dir}/alertmanager.linux-amd64.tar.gz]"
91 end
92
93 remote_file "#{cache_dir}/karma-linux-amd64.tar.gz" do
94   source "https://github.com/prymitive/karma/releases/download/v#{karma_version}/karma-linux-amd64.tar.gz"
95   owner "root"
96   group "root"
97   mode "644"
98   backup false
99 end
100
101 archive_file "#{cache_dir}/karma-linux-amd64.tar.gz" do
102   action :nothing
103   destination "/opt/prometheus-server/karma"
104   overwrite true
105   owner "root"
106   group "root"
107   subscribes :extract, "remote_file[#{cache_dir}/karma-linux-amd64.tar.gz]"
108 end
109
110 promscale_version = "0.11.0"
111
112 database_version = node[:timescaledb][:database_version]
113 database_cluster = "#{database_version}/main"
114
115 package %W[
116   prometheus
117   prometheus-alertmanager
118   promscale-extension-postgresql-#{database_version}
119 ]
120
121 postgresql_user "prometheus" do
122   cluster database_cluster
123   superuser true
124 end
125
126 postgresql_database "promscale" do
127   cluster database_cluster
128   owner "prometheus"
129 end
130
131 directory "/opt/promscale" do
132   owner "root"
133   group "root"
134   mode "755"
135 end
136
137 directory "/opt/promscale/bin" do
138   owner "root"
139   group "root"
140   mode "755"
141 end
142
143 remote_file "/opt/promscale/bin/promscale" do
144   action :create
145   source "https://github.com/timescale/promscale/releases/download/#{promscale_version}/promscale_#{promscale_version}_Linux_x86_64"
146   owner "root"
147   group "root"
148   mode "755"
149 end
150
151 systemd_service "promscale" do
152   description "Promscale Connector"
153   type "simple"
154   user "prometheus"
155   exec_start "/opt/promscale/bin/promscale --db.uri postgresql:///promscale?host=/run/postgresql&port=5432 --db.connections-max 400"
156   limit_nofile 16384
157   private_tmp true
158   protect_system "strict"
159   protect_home true
160   no_new_privileges true
161 end
162
163 if node[:prometheus][:promscale]
164   service "promscale" do
165     action [:enable, :start]
166     subscribes :restart, "remote_file[/opt/promscale/bin/promscale]"
167     subscribes :restart, "systemd_service[promscale]"
168   end
169 else
170   service "promscale" do
171     action [:disable, :stop]
172   end
173 end
174
175 search(:node, "roles:gateway") do |gateway|
176   allowed_ips = gateway.interfaces(:role => :internal).map do |interface|
177     "#{interface[:network]}/#{interface[:prefix]}"
178   end
179
180   node.default[:networking][:wireguard][:peers] << {
181     :public_key => gateway[:networking][:wireguard][:public_key],
182     :allowed_ips => allowed_ips,
183     :endpoint => "#{gateway.name}:51820"
184   }
185 end
186
187 jobs = {}
188 snmp_targets = []
189
190 search(:node, "recipes:prometheus\\:\\:default").sort_by(&:name).each do |client|
191   if client[:prometheus][:mode] == "wireguard"
192     node.default[:networking][:wireguard][:peers] << {
193       :public_key => client[:networking][:wireguard][:public_key],
194       :allowed_ips => client[:networking][:wireguard][:address],
195       :endpoint => "#{client.name}:51820"
196     }
197   end
198
199   client[:prometheus][:exporters].each do |key, exporter|
200     if exporter.is_a?(Hash)
201       name = exporter[:name]
202       address = exporter[:address]
203       sni = exporter[:sni]
204       metric_relabel = exporter[:metric_relabel] || []
205     else
206       name = key
207       address = exporter
208       sni = nil
209       metric_relabel = []
210     end
211
212     jobs[name] ||= []
213     jobs[name] << {
214       :address => address,
215       :sni => sni,
216       :instance => client.name.split(".").first,
217       :metric_relabel => metric_relabel
218     }
219   end
220
221   Hash(client[:prometheus][:snmp]).each do |instance, details|
222     snmp_targets << {
223       :instance => instance,
224       :target => details[:address],
225       :modules => details[:modules],
226       :address => client[:prometheus][:addresses]["snmp"],
227       :labels => Array(details[:labels])
228     }
229   end
230 end
231
232 certificates = search(:node, "letsencrypt:certificates").each_with_object({}) do |n, c|
233   n[:letsencrypt][:certificates].each do |name, details|
234     c[name] ||= details.merge(:nodes => [])
235
236     c[name][:nodes] << {
237       :name => n[:fqdn],
238       :address => n.external_ipaddress || n.internal_ipaddress
239     }
240   end
241 end
242
243 template "/etc/prometheus/ssl.yml" do
244   source "ssl.yml.erb"
245   owner "root"
246   group "root"
247   mode "644"
248   variables :certificates => certificates
249 end
250
251 prometheus_exporter "ssl" do
252   address "127.0.0.1"
253   port 9219
254   options "--config.file=/etc/prometheus/ssl.yml"
255   register_target false
256 end
257
258 systemd_service "prometheus-executable" do
259   service "prometheus"
260   dropin "executable"
261   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=30d"
262   timeout_stop_sec 300
263   notifies :restart, "service[prometheus]"
264 end
265
266 template "/etc/prometheus/prometheus.yml" do
267   source "prometheus.yml.erb"
268   owner "root"
269   group "root"
270   mode "644"
271   variables :jobs => jobs, :snmp_targets => snmp_targets, :certificates => certificates
272 end
273
274 template "/etc/prometheus/alert_rules.yml" do
275   source "alert_rules.yml.erb"
276   owner "root"
277   group "root"
278   mode "644"
279 end
280
281 service "prometheus" do
282   action [:enable, :start]
283   subscribes :reload, "template[/etc/prometheus/prometheus.yml]"
284   subscribes :reload, "template[/etc/prometheus/alert_rules.yml]"
285   subscribes :restart, "archive_file[#{cache_dir}/prometheus.linux-amd64.tar.gz]"
286 end
287
288 systemd_service "prometheus-alertmanager-executable" do
289   service "prometheus-alertmanager"
290   dropin "executable"
291   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"
292   notifies :restart, "service[prometheus-alertmanager]"
293 end
294
295 template "/etc/prometheus/alertmanager.yml" do
296   source "alertmanager.yml.erb"
297   owner "root"
298   group "root"
299   mode "644"
300 end
301
302 service "prometheus-alertmanager" do
303   action [:enable, :start]
304   subscribes :reload, "template[/etc/prometheus/alertmanager.yml]"
305   subscribes :restart, "archive_file[#{cache_dir}/alertmanager.linux-amd64.tar.gz]"
306 end
307
308 template "/etc/prometheus/amtool.yml" do
309   source "amtool.yml.erb"
310   owner "root"
311   group "root"
312   mode "644"
313 end
314
315 template "/etc/prometheus/karma.yml" do
316   source "karma.yml.erb"
317   owner "root"
318   group "root"
319   mode "644"
320 end
321
322 systemd_service "prometheus-karma" do
323   description "Alert dashboard for Prometheus Alertmanager"
324   user "prometheus"
325   exec_start "/opt/prometheus-server/karma/karma-linux-amd64 --config.file=/etc/prometheus/karma.yml"
326   private_tmp true
327   private_devices true
328   protect_system "full"
329   protect_home true
330   no_new_privileges true
331   restart "on-failure"
332 end
333
334 service "prometheus-karma" do
335   action [:enable, :start]
336   subscribes :reload, "template[/etc/prometheus/karma.yml]"
337   subscribes :restart, "archive_file[#{cache_dir}/karma-linux-amd64.tar.gz]"
338 end
339
340 package "grafana-enterprise"
341
342 template "/etc/grafana/grafana.ini" do
343   source "grafana.ini.erb"
344   owner "root"
345   group "grafana"
346   mode "640"
347   variables :passwords => passwords
348 end
349
350 service "grafana-server" do
351   action [:enable, :start]
352   subscribes :restart, "template[/etc/grafana/grafana.ini]"
353 end
354
355 apache_module "alias"
356 apache_module "proxy_http"
357
358 ssl_certificate "prometheus.openstreetmap.org" do
359   domains ["prometheus.openstreetmap.org", "prometheus.osm.org"]
360   notifies :reload, "service[apache2]"
361 end
362
363 apache_site "prometheus.openstreetmap.org" do
364   template "apache.erb"
365   variables :admin_hosts => admins["hosts"]
366 end
367
368 template "/etc/cron.daily/prometheus-backup" do
369   source "backup.cron.erb"
370   owner "root"
371   group "root"
372   mode "750"
373 end