RbdMirrorService
from .services.nfs import NFSService
from .services.osd import RemoveUtil, OSDRemoval, OSDService
-from .services.monitoring import GrafanaService
+from .services.monitoring import GrafanaService, AlertmanagerService
from .inventory import Inventory, SpecStore, HostCache
try:
self.rgw_service = RgwService(self)
self.rbd_mirror_service = RbdMirrorService(self)
self.grafana_service = GrafanaService(self)
+ self.alertmanager_service = AlertmanagerService(self)
def shutdown(self):
self.log.debug('shutdown')
self.nfs_service._generate_nfs_config(daemon_type, daemon_id, host)
extra_args.extend(['--config-json', '-'])
elif daemon_type == 'alertmanager':
- cephadm_config, deps = self._generate_alertmanager_config()
+ cephadm_config, deps = self.alertmanager_service.generate_config()
extra_args.extend(['--config-json', '-'])
else:
# Ceph.daemons (mon, mgr, mds, osd, etc)
'rbd-mirror': self.rbd_mirror_service.create,
'nfs': self.nfs_service.create,
'grafana': self.grafana_service.create,
- 'alertmanager': self._create_alertmanager,
+ 'alertmanager': self.alertmanager_service.create,
'prometheus': self._create_prometheus,
'node-exporter': self._create_node_exporter,
'crash': self._create_crash,
# type: () -> str
return self.get('mgr_map').get('services', {}).get('dashboard', '')
- def _generate_alertmanager_config(self):
- # type: () -> Tuple[Dict[str, Any], List[str]]
- deps = [] # type: List[str]
-
- # dashboard(s)
- dashboard_urls = []
- mgr_map = self.get('mgr_map')
- port = None
- proto = None # http: or https:
- url = mgr_map.get('services', {}).get('dashboard', None)
- if url:
- dashboard_urls.append(url)
- proto = url.split('/')[0]
- port = url.split('/')[2].split(':')[1]
- # scan all mgrs to generate deps and to get standbys too.
- # assume that they are all on the same port as the active mgr.
- for dd in self.cache.get_daemons_by_service('mgr'):
- # we consider mgr a dep even if the dashboard is disabled
- # in order to be consistent with _calc_daemon_deps().
- deps.append(dd.name())
- if not port:
- continue
- if dd.daemon_id == self.get_mgr_id():
- continue
- addr = self.inventory.get_addr(dd.hostname)
- dashboard_urls.append('%s//%s:%s/' % (proto, addr.split(':')[0],
- port))
-
- yml = """# generated by cephadm
-# See https://prometheus.io/docs/alerting/configuration/ for documentation.
-
-global:
- resolve_timeout: 5m
-
-route:
- group_by: ['alertname']
- group_wait: 10s
- group_interval: 10s
- repeat_interval: 1h
- receiver: 'ceph-dashboard'
-receivers:
-- name: 'ceph-dashboard'
- webhook_configs:
-{urls}
-""".format(
- urls='\n'.join(
- [" - url: '{}api/prometheus_receiver'".format(u)
- for u in dashboard_urls]
- ))
- peers = []
- port = '9094'
- for dd in self.cache.get_daemons_by_service('alertmanager'):
- deps.append(dd.name())
- addr = self.inventory.get_addr(dd.hostname)
- peers.append(addr.split(':')[0] + ':' + port)
- return {
- "files": {
- "alertmanager.yml": yml
- },
- "peers": peers
- }, sorted(deps)
-
def add_prometheus(self, spec):
return self._add_daemon('prometheus', spec, self._create_prometheus)
def add_alertmanager(self, spec):
# type: (ServiceSpec) -> AsyncCompletion
- return self._add_daemon('alertmanager', spec, self._create_alertmanager)
+ return self._add_daemon('alertmanager', spec, self.alertmanager_service.create)
@trivial_completion
def apply_alertmanager(self, spec: ServiceSpec):
return self._apply(spec)
- def _create_alertmanager(self, daemon_id, host):
- return self._create_daemon('alertmanager', daemon_id, host)
-
-
def _get_container_image_id(self, image_name):
# pick a random host...
host = None
}
}
return config_file, sorted(deps)
+
+
+class AlertmanagerService(CephadmService):
+ def create(self, daemon_id, host) -> str:
+ return self.mgr._create_daemon('alertmanager', daemon_id, host)
+
+ def generate_config(self):
+ # type: () -> Tuple[Dict[str, Any], List[str]]
+ deps = [] # type: List[str]
+
+ # dashboard(s)
+ dashboard_urls = []
+ mgr_map = self.mgr.get('mgr_map')
+ port = None
+ proto = None # http: or https:
+ url = mgr_map.get('services', {}).get('dashboard', None)
+ if url:
+ dashboard_urls.append(url)
+ proto = url.split('/')[0]
+ port = url.split('/')[2].split(':')[1]
+ # scan all mgrs to generate deps and to get standbys too.
+ # assume that they are all on the same port as the active mgr.
+ for dd in self.mgr.cache.get_daemons_by_service('mgr'):
+ # we consider mgr a dep even if the dashboard is disabled
+ # in order to be consistent with _calc_daemon_deps().
+ deps.append(dd.name())
+ if not port:
+ continue
+ if dd.daemon_id == self.mgr.get_mgr_id():
+ continue
+ addr = self.mgr.inventory.get_addr(dd.hostname)
+ dashboard_urls.append('%s//%s:%s/' % (proto, addr.split(':')[0],
+ port))
+
+ yml = """# generated by cephadm
+# See https://prometheus.io/docs/alerting/configuration/ for documentation.
+
+global:
+ resolve_timeout: 5m
+
+route:
+ group_by: ['alertname']
+ group_wait: 10s
+ group_interval: 10s
+ repeat_interval: 1h
+ receiver: 'ceph-dashboard'
+receivers:
+- name: 'ceph-dashboard'
+ webhook_configs:
+{urls}
+""".format(
+ urls='\n'.join(
+ [" - url: '{}api/prometheus_receiver'".format(u)
+ for u in dashboard_urls]
+ ))
+ peers = []
+ port = '9094'
+ for dd in self.mgr.cache.get_daemons_by_service('alertmanager'):
+ deps.append(dd.name())
+ addr = self.mgr.inventory.get_addr(dd.hostname)
+ peers.append(addr.split(':')[0] + ':' + port)
+ return {
+ "files": {
+ "alertmanager.yml": yml
+ },
+ "peers": peers
+ }, sorted(deps)