DEFAULT_IMAGE_IS_MASTER = False
DEFAULT_IMAGE_RELEASE = 'quincy'
DEFAULT_PROMETHEUS_IMAGE = 'quay.io/prometheus/prometheus:v2.33.4'
-DEFAULT_CADVISOR_IMAGE = 'gcr.io/cadvisor/cadvisor:v0.39.3'
DEFAULT_LOKI_IMAGE = 'docker.io/grafana/loki:2.4.0'
DEFAULT_PROMTAIL_IMAGE = 'docker.io/grafana/promtail:2.4.0'
DEFAULT_NODE_EXPORTER_IMAGE = 'quay.io/prometheus/node-exporter:v1.3.1'
'node-exporter': [9100],
'grafana': [3000],
'alertmanager': [9093, 9094],
- 'cAdvisor': [8080],
- 'loki': [3100]
+ 'loki': [3100],
+ 'promtail': [9080]
}
components = {
'prometheus.yml',
],
},
- 'cAdvisor': {
- 'image': DEFAULT_CADVISOR_IMAGE,
- 'cpus': '2',
- 'memory': '1GB'
- },
'loki': {
'image': DEFAULT_LOKI_IMAGE,
'cpus': '1',
"""
:param: daemon_type Either "prometheus", "alertmanager" or "node-exporter"
"""
- assert daemon_type in ('prometheus', 'alertmanager', 'node-exporter', 'loki')
+ assert daemon_type in ('prometheus', 'alertmanager', 'node-exporter', 'loki', 'promtail')
cmd = daemon_type.replace('-', '_')
code = -1
err = ''
metadata = Monitoring.components[daemon_type]
r += metadata.get('args', list())
# set ip and port to bind to for nodeexporter,alertmanager,prometheus
- if daemon_type != 'grafana' and daemon_type != 'loki':
+ if daemon_type != 'grafana' and daemon_type != 'loki' and daemon_type != 'promtail':
ip = ''
port = Monitoring.port_map[daemon_type][0]
if 'meta_json' in ctx and ctx.meta_json:
r += ['--config.file=/etc/alertmanager/alertmanager.yml']
if daemon_type == 'loki':
r += ['--config.file=/etc/loki/loki.yml']
+ if daemon_type == 'promtail':
+ r += ['--config.file=/etc/promtail/promtail.yml']
elif daemon_type == NFSGanesha.daemon_type:
nfs_ganesha = NFSGanesha.init(ctx, fsid, daemon_id)
r += nfs_ganesha.get_daemon_args()
daemon_type, daemon_id)
config_dir = 'etc/promtail'
makedirs(os.path.join(data_dir_root, config_dir), uid, gid, 0o755)
+ makedirs(os.path.join(data_dir_root, 'data'), uid, gid, 0o755)
elif daemon_type == 'loki':
data_dir_root = get_data_dir(fsid, ctx.data_dir,
daemon_type, daemon_id)
if daemon_type in Monitoring.components and daemon_id:
data_dir = get_data_dir(fsid, ctx.data_dir, daemon_type, daemon_id)
+ log_dir = get_log_dir(fsid, ctx.log_dir)
if daemon_type == 'prometheus':
mounts[os.path.join(data_dir, 'etc/prometheus')] = '/etc/prometheus:Z'
mounts[os.path.join(data_dir, 'data')] = '/prometheus:Z'
- elif daemon_type == 'cAdvisor':
- mounts['/sys'] = '/sys:ro'
- mounts['/'] = '/rootfs:ro'
- mounts['/var/run'] = '/var/run:rw'
- mounts['/var/lib/docker'] = '/var/lib/docker:ro'
elif daemon_type == 'loki':
mounts[os.path.join(data_dir, 'etc/loki')] = '/etc/loki:Z'
mounts[os.path.join(data_dir, 'data')] = '/loki:Z'
elif daemon_type == 'promtail':
mounts[os.path.join(data_dir, 'etc/promtail')] = '/etc/promtail:Z'
+ mounts[log_dir] = '/var/log/ceph:z'
mounts[os.path.join(data_dir, 'data')] = '/promtail:Z'
elif daemon_type == 'node-exporter':
mounts['/proc'] = '/host/proc:ro'
cli(['orch', 'apply', 'crash'])
if not ctx.skip_monitoring_stack:
- for t in ['prometheus', 'grafana', 'node-exporter', 'alertmanager', 'loki']:
+ for t in ['prometheus', 'grafana', 'node-exporter', 'alertmanager', 'loki', 'promtail']:
logger.info('Deploying %s service with default placement...' % t)
cli(['orch', 'apply', t])
elif daemon_type in ['prometheus',
'alertmanager',
'node-exporter',
- 'loki']:
+ 'loki',
+ 'promtail']:
version = Monitoring.get_version(ctx, container_id, daemon_type)
seen_versions[image_id] = version
elif daemon_type == 'haproxy':
command_adopt_prometheus(ctx, daemon_id, fsid)
elif daemon_type == 'loki':
command_adopt_loki(ctx, daemon_id, fsid)
+ elif daemon_type == 'promtail':
+ command_adopt_promtail(ctx, daemon_id, fsid)
elif daemon_type == 'grafana':
command_adopt_grafana(ctx, daemon_id, fsid)
elif daemon_type == 'node-exporter':
update_firewalld(ctx, daemon_type)
+def command_adopt_promtail(ctx, daemon_id, fsid):
+ # type: (CephadmContext, str, str) -> None
+ daemon_type = 'promtail'
+ (uid, gid) = extract_uid_gid_monitoring(ctx, daemon_type)
+
+ _stop_and_disable(ctx, 'promtail')
+
+ data_dir_dst = make_data_dir(ctx, fsid, daemon_type, daemon_id,
+ uid=uid, gid=gid)
+
+ # config
+ config_src = '/etc/promtail/promtail.yml'
+ config_src = os.path.abspath(ctx.legacy_dir + config_src)
+ config_dst = os.path.join(data_dir_dst, 'etc/promtail')
+ makedirs(config_dst, uid, gid, 0o755)
+ copy_files(ctx, [config_src], config_dst, uid=uid, gid=gid)
+
+ # data
+ data_src = '/var/lib/promtail'
+ data_src = os.path.abspath(ctx.legacy_dir + data_src)
+ data_dst = os.path.join(data_dir_dst, 'data')
+ copy_tree(ctx, [data_src], data_dst, uid=uid, gid=gid)
+
+ make_var_run(ctx, fsid, uid, gid)
+ c = get_container(ctx, fsid, daemon_type, daemon_id)
+ deploy_daemon(ctx, fsid, daemon_type, daemon_id, c, uid, gid)
+ update_firewalld(ctx, daemon_type)
+
+
def command_adopt_grafana(ctx, daemon_id, fsid):
# type: (CephadmContext, str, str) -> None
parser_bootstrap.add_argument(
'--skip-monitoring-stack',
action='store_true',
- help='Do not automatically provision monitoring stack (prometheus, grafana, alertmanager, node-exporter, loki)')
+ help='Do not automatically provision monitoring stack (prometheus, grafana, alertmanager, node-exporter, loki, promtail)')
parser_bootstrap.add_argument(
'--apply-spec',
help='Apply cluster spec after bootstrap (copy ssh key, add hosts and apply services)')
from .services.nfs import NFSService
from .services.osd import OSDRemovalQueue, OSDService, OSD, NotFoundError
from .services.monitoring import GrafanaService, AlertmanagerService, PrometheusService, \
- NodeExporterService, SNMPGatewayService, LokiService
+ NodeExporterService, SNMPGatewayService, LokiService, PromtailService
from .schedule import HostAssignment
from .inventory import Inventory, SpecStore, HostCache, AgentCache, EventStore, \
ClientKeyringStore, ClientKeyringSpec
default=DEFAULT_LOKI_IMAGE,
desc='Loki container image',
),
+ Option(
+ 'container_image_promtail',
+ default=DEFAULT_PROMTAIL_IMAGE,
+ desc='Promtail container image',
+ ),
Option(
'container_image_haproxy',
default=DEFAULT_HAPROXY_IMAGE,
_service_clses: Sequence[Type[CephadmService]] = [
OSDService, NFSService, MonService, MgrService, MdsService,
RgwService, RbdMirrorService, GrafanaService, AlertmanagerService,
- PrometheusService, NodeExporterService, LokiService, CrashService, IscsiService,
+ PrometheusService, NodeExporterService, LokiService, PromtailService, CrashService, IscsiService,
IngressService, CustomContainerService, CephfsMirrorService,
CephadmAgent, SNMPGatewayService
]
suffix = daemon_type not in [
'mon', 'crash',
'prometheus', 'node-exporter', 'grafana', 'alertmanager',
- 'container', 'agent', 'snmp-gateway', 'loki'
+ 'container', 'agent', 'snmp-gateway', 'loki', 'promtail'
]
if forcename:
if len([d for d in existing if d.daemon_id == forcename]):
image = self.container_image_node_exporter
elif daemon_type == 'loki':
image = self.container_image_loki
+ elif daemon_type == 'promtail':
+ image = self.container_image_promtail
elif daemon_type == 'haproxy':
image = self.container_image_haproxy
elif daemon_type == 'keepalived':
'prometheus': PlacementSpec(count=1),
'node-exporter': PlacementSpec(host_pattern='*'),
'loki': PlacementSpec(count=1),
+ 'promtail': PlacementSpec(host_pattern='*'),
'crash': PlacementSpec(host_pattern='*'),
'container': PlacementSpec(count=1),
'snmp-gateway': PlacementSpec(count=1),
def apply_loki(self, spec: ServiceSpec) -> str:
return self._apply(spec)
+ @handle_orch_error
+ def apply_promtail(self, spec: ServiceSpec) -> str:
+ return self._apply(spec)
+
@handle_orch_error
def apply_node_exporter(self, spec: ServiceSpec) -> str:
return self._apply(spec)