# prometheus alerts
install -m 644 -D monitoring/ceph-mixin/prometheus_alerts.yml %{buildroot}/etc/prometheus/ceph/ceph_default_alerts.yml
+# grafana charts
+install -m 644 -D monitoring/ceph-mixin/dashboards_out/* %{buildroot}/etc/grafana/dashboards/ceph-dashboard/
+
# SNMP MIB
install -m 644 -D -t %{buildroot}%{_datadir}/snmp/mibs monitoring/snmp/CEPH-MIB.txt
install -D -m 755 src/tools/rbd_nbd/rbd-nbd_quiesce $(DESTDIR)/usr/libexec/rbd-nbd/rbd-nbd_quiesce
install -m 644 -D monitoring/ceph-mixin/prometheus_alerts.yml $(DESTDIR)/etc/prometheus/ceph/ceph_default_alerts.yml
+ install -m 644 -D monitoring/ceph-mixin/dashboards_out/* ${DESTDIR}/etc/grafana/dashboards/ceph-dashboard
# doc/changelog is a directory, which confuses dh_installchangelogs
override_dh_installchangelogs:
makedirs(os.path.join(data_dir_root, config_dir), uid, gid, 0o755)
makedirs(os.path.join(data_dir_root, config_dir, 'certs'), uid, gid, 0o755)
makedirs(os.path.join(data_dir_root, config_dir, 'provisioning/datasources'), uid, gid, 0o755)
- makedirs(os.path.join(data_dir_root, 'data'), uid, gid, 0o755)
+ makedirs(os.path.join(data_dir_root, config_dir, 'provisioning/dashboards'), uid, gid, 0o755)
+ makedirs(os.path.join(data_dir_root, 'data'), uid, gid, 0o472)
touch(os.path.join(data_dir_root, 'data', 'grafana.db'), uid, gid)
+ recursive_chown(os.path.join(data_dir_root, 'data'), uid, gid)
elif daemon_type == 'alertmanager':
data_dir_root = ident.data_dir(ctx.data_dir)
config_dir = 'etc/alertmanager'
DEFAULT_PROMTAIL_IMAGE = 'docker.io/grafana/promtail:2.4.0'
DEFAULT_NODE_EXPORTER_IMAGE = 'quay.io/prometheus/node-exporter:v1.5.0'
DEFAULT_ALERT_MANAGER_IMAGE = 'quay.io/prometheus/alertmanager:v0.25.0'
-DEFAULT_GRAFANA_IMAGE = 'quay.io/ceph/ceph-grafana:9.4.12'
+DEFAULT_GRAFANA_IMAGE = 'quay.io/ceph/grafana:9.4.12'
DEFAULT_HAPROXY_IMAGE = 'quay.io/ceph/haproxy:2.3'
DEFAULT_KEEPALIVED_IMAGE = 'quay.io/ceph/keepalived:2.2.4'
DEFAULT_NVMEOF_IMAGE = 'quay.io/ceph/nvmeof:latest'
mounts[
os.path.join(data_dir, 'etc/grafana/provisioning/datasources')
] = '/etc/grafana/provisioning/datasources:Z'
+ mounts[
+ os.path.join(data_dir, 'etc/grafana/provisioning/dashboards')
+ ] = '/etc/grafana/provisioning/dashboards:Z'
mounts[
os.path.join(data_dir, 'etc/grafana/certs')
] = '/etc/grafana/certs:Z'
DEFAULT_LOKI_IMAGE = 'docker.io/grafana/loki:2.4.0'
DEFAULT_PROMTAIL_IMAGE = 'docker.io/grafana/promtail:2.4.0'
DEFAULT_ALERT_MANAGER_IMAGE = 'quay.io/prometheus/alertmanager:v0.25.0'
-DEFAULT_GRAFANA_IMAGE = 'quay.io/ceph/ceph-grafana:9.4.12'
+DEFAULT_GRAFANA_IMAGE = 'quay.io/ceph/grafana:9.4.12'
DEFAULT_HAPROXY_IMAGE = 'quay.io/ceph/haproxy:2.3'
DEFAULT_KEEPALIVED_IMAGE = 'quay.io/ceph/keepalived:2.2.4'
DEFAULT_SNMP_GATEWAY_IMAGE = 'docker.io/maxwo/snmp-notifier:v1.2.1'
default='/etc/prometheus/ceph/ceph_default_alerts.yml',
desc='location of alerts to include in prometheus deployments',
),
+ Option(
+ 'grafana_dashboards_path',
+ type='str',
+ default='/etc/grafana/dashboards/ceph-dashboard/',
+ desc='location of dashboards to include in grafana deployments',
+ ),
Option(
'migration_current',
type='int',
self.allow_ptrace = False
self.container_init = True
self.prometheus_alerts_path = ''
+ self.grafana_dashboards_path = ''
self.migration_current: Optional[int] = None
self.config_dashboard = True
self.manage_etc_ceph_ceph_conf = True
self.mgr.check_mon_command(
{'prefix': 'dashboard set-grafana-api-password'}, inbuf=spec.initial_admin_password)
+ # the path of the grafana dashboards are assumed from the providers.yml.j2 file by grafana
+ grafana_dashboards_path = self.mgr.grafana_dashboards_path or '/etc/grafana/dashboards/ceph-dashboard/'
+ grafana_providers = self.mgr.template.render(
+ 'services/grafana/providers.yml.j2', {
+ 'grafana_dashboards_path': grafana_dashboards_path
+ }
+ )
+
cert, pkey = self.prepare_certificates(daemon_spec)
config_file = {
'files': {
'provisioning/datasources/ceph-dashboard.yml': grafana_data_sources,
'certs/cert_file': '# generated by cephadm\n%s' % cert,
'certs/cert_key': '# generated by cephadm\n%s' % pkey,
+ 'provisioning/dashboards/default.yml': grafana_providers
}
}
+
+ # include dashboards, if present in the container
+ if os.path.exists(grafana_dashboards_path):
+ files = os.listdir(grafana_dashboards_path)
+ for file_name in files:
+ with open(os.path.join(grafana_dashboards_path, file_name), 'r', encoding='utf-8') as f:
+ dashboard = f.read()
+ config_file['files'][f'/etc/grafana/provisioning/dashboards/{file_name}'] = dashboard
+
return config_file, sorted(deps)
def prepare_certificates(self, daemon_spec: CephadmDaemonDeploySpec) -> Tuple[str, str]:
--- /dev/null
+# {{ cephadm_managed }}
+apiVersion: 1
+
+providers:
+ - name: 'Ceph Dashboard'
+ orgId: 1
+ folder: ''
+ type: file
+ disableDeletion: false
+ updateIntervalSeconds: 3
+ editable: false
+ options:
+ path: '/etc/grafana/provisioning/dashboards'