1 <div class=
"container-fluid"
2 *
ngIf=
"healthData && enabledFeature$ | async as enabledFeature">
4 <cd-card cardTitle=
"Details"
7 [ngClass]=
"{'d-flex': flexHeight}"
8 aria-label=
"Details card">
11 <dd>{{ detailsCardData.fsid }}
</dd>
13 <dd i18n
>{{ detailsCardData.orchestrator || 'Orchestrator is not available' }}
</dd>
15 <dd>{{ detailsCardData.cephVersion }}
</dd>
19 <cd-card cardTitle=
"Status"
21 class=
"col-sm-6 px-3 d-flex"
22 aria-label=
"Status card">
23 <div class=
"d-flex ms-4 me-4 mb-5 center-content">
24 <ng-template #healthChecks
>
25 <ng-container *
ngTemplateOutlet=
"logsLink"></ng-container>
27 <li *
ngFor=
"let check of healthData.health.checks">
28 <span [ngStyle]=
"check.severity | healthColor"
29 [class.health-warn-description]=
"check.severity === 'HEALTH_WARN'">
30 {{ check.type }}
</span>: {{ check.summary.message }}
34 <i *
ngIf=
"healthData.health?.status"
35 [ngClass]=
"[healthData.health.status | healthIcon, icons.large2x]"
36 [ngStyle]=
"healthData.health.status | healthColor"
37 [title]=
"healthData.health.status"></i>
38 <a class=
"ms-2 mt-n1 lead text-primary"
39 [ngbPopover]=
"healthChecks"
40 popoverClass=
"info-card-popover-cluster-status"
41 *
ngIf=
"healthData.health?.checks?.length"
43 <span class=
"ms-2 mt-n1 lead"
44 *
ngIf=
"!healthData.health?.checks?.length"
47 <section class=
"border-top mt-5"
48 *
ngIf=
"isAlertmanagerConfigured && (prometheusAlertService.activeCriticalAlerts || prometheusAlertService.activeWarningAlerts)">
49 <div class=
"d-flex flex-wrap ms-4 me-4">
52 <!-- Potentially make widget component -->
53 <button class=
"btn btn-outline-danger rounded-pill ms-2"
54 [ngClass]=
"{'active': showAlerts && alertType === 'critical'}"
56 (click)=
"toggleAlertsWindow('danger')"
59 *
ngIf=
"prometheusAlertService?.activeCriticalAlerts > 0">
60 <i [ngClass]=
"[icons.danger]"></i>
61 <span>{{ prometheusAlertService.activeCriticalAlerts }}
</span>
64 <button class=
"btn btn-outline-warning rounded-pill ms-2"
65 [ngClass]=
"{'active': showAlerts && alertType === 'warning'}"
67 (click)=
"toggleAlertsWindow('warning')"
70 *
ngIf=
"prometheusAlertService?.activeWarningAlerts > 0">
71 <i [ngClass]=
"[icons.infoCircle]"></i>
72 <span>{{ prometheusAlertService.activeWarningAlerts }}
</span>
75 <div class=
"pt-0 position-right">
76 <button class=
"btn btn-block dropdown-toggle"
77 data-toggle=
"collapse"
78 aria-label=
"toggle alert window"
79 [attr.aria-expanded]=
"showAlerts"
80 (click)=
"toggleAlertsWindow('danger', 'true')"></button>
84 <div class=
"alerts pt-0"
87 <ngx-simplebar [options]=
"simplebar">
88 <div class=
"card-body ps-0 pe-1 pt-1">
89 <ng-container *
ngTemplateOutlet=
"alertsCard"></ng-container>
96 <cd-card cardTitle=
"Capacity"
99 [ngClass]=
"{'d-flex': flexHeight}"
100 aria-label=
"Capacity card">
101 <ng-container class=
"ms-4 me-4"
102 *
ngIf=
"capacity && osdSettings">
103 <cd-dashboard-pie [data]=
"{max: capacity.total_bytes, current: capacity.total_used_raw_bytes}"
104 [lowThreshold]=
"osdSettings.nearfull_ratio"
105 [highThreshold]=
"osdSettings.full_ratio">
111 <div class=
"row mx-0">
112 <!-- Inventory Card -->
113 <cd-card cardTitle=
"Inventory"
115 class=
"col-sm-3 px-3 d-flex"
116 aria-label=
"Inventory card">
119 <li class=
"list-group-item">
120 <cd-card-row [data]=
"healthData.hosts"
123 summaryType=
"simplified"
124 *
ngIf=
"healthData.hosts != null"></cd-card-row>
128 <li class=
"list-group-item">
129 <cd-card-row [data]=
"healthData.mon_status.monmap.mons.length"
132 summaryType=
"simplified"
133 *
ngIf=
"healthData.mon_status"></cd-card-row>
137 <li *
ngIf=
"healthData.mgr_map"
138 class=
"list-group-item">
139 <cd-card-row [data]=
"healthData.mgr_map | mgrSummary"
141 *
ngIf=
"healthData.mgr_map"></cd-card-row>
145 <li class=
"list-group-item">
146 <cd-card-row [data]=
"healthData.osd_map | osdSummary"
150 *
ngIf=
"healthData.osd_map"></cd-card-row>
154 <li *
ngIf=
"healthData.pools"
155 class=
"list-group-item">
156 <cd-card-row [data]=
"healthData.pools.length"
159 summaryType=
"simplified"
160 *
ngIf=
"healthData.pools"></cd-card-row>
164 <li class=
"list-group-item">
165 <cd-card-row [data]=
"healthData.pg_info | pgSummary"
167 *
ngIf=
"healthData.pg_info"></cd-card-row>
170 <!-- Object gateways -->
171 <li *
ngIf=
"enabledFeature.rgw && healthData.rgw != null"
172 class=
"list-group-item"
174 <cd-card-row [data]=
"healthData.rgw"
176 title=
"Object Gateway"
177 summaryType=
"simplified"
178 *
ngIf=
"healthData.rgw || healthData.rgw === 0 "></cd-card-row>
181 <!-- Metadata Servers -->
182 <li *
ngIf=
"enabledFeature.cephfs && healthData.fs_map"
183 class=
"list-group-item"
185 <cd-card-row [data]=
"healthData.fs_map | mdsSummary"
186 title=
"Metadata Server"
187 *
ngIf=
"healthData.fs_map"></cd-card-row>
190 <!-- iSCSI Gateways -->
191 <li *
ngIf=
"enabledFeature.iscsi && healthData.iscsi_daemons != null"
192 class=
"list-group-item"
194 <cd-card-row [data]=
"healthData.iscsi_daemons"
196 title=
"iSCSI Gateway"
198 *
ngIf=
"healthData.iscsi_daemons"></cd-card-row>
202 <cd-card cardTitle=
"Cluster utilization"
204 class=
"col-sm-9 px-3 d-flex"
205 aria-label=
"Cluster utilization card">
206 <div class=
"ms-4 me-4 mt-0">
207 <cd-dashboard-time-selector (selectedTime)=
"getPrometheusData($event)">
208 </cd-dashboard-time-selector>
209 <ng-container *
ngIf=
"capacity">
210 <cd-dashboard-area-chart chartTitle=
"Used Capacity"
211 [maxValue]=
"capacity.total_bytes"
213 label=
"Used Capacity"
214 [data]=
"queriesResults.USEDCAPACITY">
215 </cd-dashboard-area-chart>
217 <cd-dashboard-area-chart chartTitle=
"IOPS"
221 [data]=
"queriesResults.OPS"
222 [data2]=
"queriesResults.IPS">
223 </cd-dashboard-area-chart>
224 <cd-dashboard-area-chart chartTitle=
"Latency"
228 [data]=
"queriesResults.READLATENCY"
229 [data2]=
"queriesResults.WRITELATENCY">
230 </cd-dashboard-area-chart>
231 <cd-dashboard-area-chart chartTitle=
"Client Throughput"
235 [data]=
"queriesResults.READCLIENTTHROUGHPUT"
236 [data2]=
"queriesResults.WRITECLIENTTHROUGHPUT">
237 </cd-dashboard-area-chart>
238 <cd-dashboard-area-chart chartTitle=
"Recovery Throughput"
240 label=
"Recovery Throughput"
241 [data]=
"queriesResults.RECOVERYBYTES">
242 </cd-dashboard-area-chart>
248 <ng-template #alertsCard
>
249 <ng-container *
ngFor=
"let alert of alerts; let i = index">
250 <div [ngClass]=
"borderClass"
251 *
ngIf=
"alertType === alert.labels.severity">
252 <div class=
"card tc_alerts border-0 pt-3">
253 <div class=
"row no-gutters">
254 <div class=
"col-sm-1 text-center">
255 <span [ngClass]=
"[icons.stack, icons.large, textClass]">
256 <i [ngClass]=
"[icons.circle, icons.stack2x]"></i>
257 <i [ngClass]=
"[icons.stack1x, icons.inverse, icons.warning]"></i>
260 <div class=
"col-md-11">
261 <div class=
"card-body ps-0 pe-1 pt-1">
262 <h6 class=
"card-title bold">{{ alert.labels.alertname }}
</h6>
263 <p class=
"card-text me-3"
264 [innerHtml]=
"alert.annotations.summary"></p>
265 <p class=
"card-text text-muted me-3">
267 [title]=
"alert.startsAt | cdDate"
268 i18n
>Active since: {{ alert.startsAt | relativeDate }}
</small>
279 <ng-template #logsLink
>
280 <ng-container *
ngIf=
"permissions.log.read">
282 i18n
><i [ngClass]=
"[icons.infoCircle]"></i> See
<a routerLink=
"/logs">Logs
</a> for more details.
</p>