in cli/src/pcluster/templates/cw_dashboard_builder.py [0:0]
def _add_cw_log(self):
# Create a text widget for subtitle "Head Node Logs"
self._add_text_widget("# Head Node Logs")
dcv_enabled = self.config.is_dcv_enabled
scheduler = self.config.scheduling.scheduler
base_os = self.config.image.os
head_private_ip = self.head_node_instance.attr_private_ip
Condition = namedtuple("Condition", ["allowed_values", "param"])
SectionWidgets = namedtuple("SectionWidgets", ["section_title", "widgets"])
sections_widgets = [
SectionWidgets(
"ParallelCluster's logs",
[
self._new_cw_log_widget(
title="clustermgtd",
conditions=[Condition(["slurm"], scheduler)],
filters=[self._new_filter(pattern=f"{head_private_ip}.*clustermgtd")],
),
self._new_cw_log_widget(
title="slurm_resume",
conditions=[Condition(["slurm"], scheduler)],
filters=[self._new_filter(pattern=f"{head_private_ip}.*slurm_resume")],
),
self._new_cw_log_widget(
title="slurm_suspend",
conditions=[Condition(["slurm"], scheduler)],
filters=[self._new_filter(pattern=f"{head_private_ip}.*slurm_suspend")],
),
],
),
SectionWidgets(
"Scheduler's logs",
[
self._new_cw_log_widget(
title="slurmctld",
conditions=[Condition(["slurm"], scheduler)],
filters=[self._new_filter(pattern=f"{head_private_ip}.*slurmctld")],
),
],
),
SectionWidgets(
"Amazon DCV integration logs",
[
self._new_cw_log_widget(
title="dcv-ext-authenticator",
conditions=[Condition([True], dcv_enabled)],
filters=[self._new_filter(pattern=f"{head_private_ip}.*dcv-ext-authenticator")],
),
self._new_cw_log_widget(
title="dcv-authenticator",
conditions=[Condition([True], dcv_enabled)],
filters=[self._new_filter(pattern=f"{head_private_ip}.*dcv-authenticator")],
),
self._new_cw_log_widget(
title="dcv-agent",
conditions=[Condition([True], dcv_enabled)],
filters=[self._new_filter(pattern=f"{head_private_ip}.*dcv-agent")],
),
self._new_cw_log_widget(
title="dcv-xsession",
conditions=[Condition([True], dcv_enabled)],
filters=[self._new_filter(pattern=f"{head_private_ip}.*dcv-xsession")],
),
self._new_cw_log_widget(
title="dcv-server",
conditions=[Condition([True], dcv_enabled)],
filters=[self._new_filter(pattern=f"{head_private_ip}.*dcv-server")],
),
self._new_cw_log_widget(
title="dcv-session-launcher",
conditions=[Condition([True], dcv_enabled)],
filters=[self._new_filter(pattern=f"{head_private_ip}.*dcv-session-launcher")],
),
self._new_cw_log_widget(
title="Xdcv",
conditions=[Condition([True], dcv_enabled)],
filters=[self._new_filter(pattern=f"{head_private_ip}.*Xdcv")],
),
],
),
SectionWidgets(
"System's logs",
[
self._new_cw_log_widget(
title="system-messages",
conditions=[
Condition(["alinux2", "alinux2023", "rhel8", "rocky8", "rhel9", "rocky9"], base_os)
],
filters=[self._new_filter(pattern=f"{head_private_ip}.*system-messages")],
),
self._new_cw_log_widget(
title="syslog",
conditions=[Condition(["ubuntu2204", "ubuntu2404"], base_os)],
filters=[self._new_filter(pattern=f"{head_private_ip}.*syslog")],
),
self._new_cw_log_widget(
title="cfn-init",
filters=[self._new_filter(pattern=f"{head_private_ip}.*cfn-init")],
),
self._new_cw_log_widget(
title="chef-client",
filters=[self._new_filter(pattern=f"{head_private_ip}.*chef-client")],
),
self._new_cw_log_widget(
title="cloud-init",
filters=[self._new_filter(pattern=f"{head_private_ip}.*cloud-init$")],
),
self._new_cw_log_widget(
title="supervisord",
filters=[self._new_filter(pattern=f"{head_private_ip}.*supervisord")],
),
],
),
]
for section_widgets in sections_widgets:
self._is_logs_section_empty(section_widgets)
if not self.empty_section:
self._add_text_widget(f"## {section_widgets.section_title}")
for log_params in section_widgets.widgets:
# Check if the log need to added
passed_condition = True
if log_params.conditions:
for cond_dict in log_params.conditions:
passed_condition = cond_dict.param in cond_dict.allowed_values
# Add logs to dashboard
if passed_condition:
query_lines = ["fields {0}".format(",".join(log_params.fields))]
for filter in log_params.filters:
query_lines.append(f"filter {filter.param} like /{filter.pattern}/")
query_lines.extend([f"sort {log_params.sort}", f"limit {log_params.limit}"])
widget = cloudwatch.LogQueryWidget(
title=log_params.title,
region=self._stack_region,
width=self.logs_width,
height=self.logs_height,
log_group_names=[self.cw_log_group_name],
query_lines=query_lines,
)
widget.position(x=self.coord.x_value, y=self.coord.y_value)
self._update_coord(self.logs_width, self.logs_height)
self.cloudwatch_dashboard.add_widgets(widget)