-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcaca_admin.xml
More file actions
552 lines (529 loc) · 24.3 KB
/
caca_admin.xml
File metadata and controls
552 lines (529 loc) · 24.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
<form version="1.1">
<label>CACA Admin Dashboard</label>
<description>Administrative control panel for dashboard management - Edit, move, delete, and change permissions</description>
<fieldset submitButton="true" autoRun="false">
<input type="text" token="name_filter">
<label>Dashboard Name Filter</label>
<default>*</default>
<initialValue>*</initialValue>
</input>
<input type="multiselect" token="app_filter">
<label>Filter by App</label>
<choice value="*">All Apps</choice>
<default>*</default>
<initialValue>*</initialValue>
<fieldForLabel>app</fieldForLabel>
<fieldForValue>app</fieldForValue>
<search>
<query>| inputlookup dashboard_registry | stats count by app | fields app</query>
<earliest>-24h@h</earliest>
<latest>now</latest>
</search>
<valuePrefix>app="</valuePrefix>
<valueSuffix>"</valueSuffix>
<delimiter> OR </delimiter>
</input>
<input type="multiselect" token="owner_filter">
<label>Filter by Owner</label>
<choice value="*">All Owners</choice>
<default>*</default>
<initialValue>*</initialValue>
<fieldForLabel>owner</fieldForLabel>
<fieldForValue>owner</fieldForValue>
<search>
<query>| inputlookup dashboard_registry | stats count by owner | fields owner</query>
<earliest>-24h@h</earliest>
<latest>now</latest>
</search>
<valuePrefix>owner="</valuePrefix>
<valueSuffix>"</valueSuffix>
<delimiter> OR </delimiter>
</input>
<input type="multiselect" token="sharing_filter">
<label>Filter by Sharing Level</label>
<choice value="*">All Sharing Levels</choice>
<choice value="global">🌐 Global</choice>
<choice value="app">📦 App</choice>
<choice value="user">🔒 Private</choice>
<default>*</default>
<initialValue>*</initialValue>
<valuePrefix>sharing="</valuePrefix>
<valueSuffix>"</valueSuffix>
<delimiter> OR </delimiter>
</input>
<input type="multiselect" token="health_filter">
<label>Filter by Health Status</label>
<choice value="*">All Status</choice>
<choice value="healthy">✓ Healthy</choice>
<choice value="warning">⚠ Warning</choice>
<choice value="critical">✗ Critical</choice>
<choice value="stale">☾ Stale</choice>
<default>*</default>
<initialValue>*</initialValue>
<valuePrefix>health_status="</valuePrefix>
<valueSuffix>"</valueSuffix>
<delimiter> OR </delimiter>
</input>
<input type="multiselect" token="perf_filter">
<label>Filter by Performance</label>
<choice value="*">All Performance</choice>
<choice value="fast">⚡ Fast (<1s)</choice>
<choice value="good">✓ Good (1-3s)</choice>
<choice value="slow">⚠ Slow (3-5s)</choice>
<choice value="very_slow">✗ Very Slow (>5s)</choice>
<default>*</default>
<initialValue>*</initialValue>
<delimiter> OR </delimiter>
</input>
<input type="dropdown" token="load_time_period">
<label>Load Time Analysis Period (affects Avg Total Load Time column)</label>
<choice value="-24h">Last 24 Hours</choice>
<choice value="-7d">Last 7 Days</choice>
<choice value="-30d">Last 30 Days</choice>
<choice value="-90d">Last 90 Days</choice>
<default>-7d</default>
<initialValue>-7d</initialValue>
</input>
<input type="time" token="time_range">
<label>Metrics Time Range</label>
<default>
<earliest>-7d@h</earliest>
<latest>now</latest>
</default>
</input>
</fieldset>
<!-- Summary KPIs -->
<row>
<panel>
<title>Filtered Dashboard Count</title>
<single>
<search>
<query>| mstats sum(_value) as metric_value WHERE index=caca_metrics AND metric_name="dashboard.*" BY pretty_name, metric_name, app span=1d
| where _time >= relative_time(now(), "-7d")
| stats sum(metric_value) as total_value by pretty_name, metric_name, app
| eval metric_type=case(
metric_name=="dashboard.views", "views_7d",
metric_name=="dashboard.edits", "edits_7d",
metric_name=="dashboard.errors", "errors_7d",
metric_name=="dashboard.load_time", "load_time_7d",
1=1, "other")
| eval {metric_type}=total_value
| stats values(app) as app sum(views_7d) as views_7d sum(edits_7d) as edits_7d sum(errors_7d) as errors_7d avg(load_time_7d) as avg_load_time_7d by pretty_name
| fillnull value=0 views_7d edits_7d errors_7d avg_load_time_7d
| eval health_status=case(
errors_7d > 10, "critical",
errors_7d > 0, "warning",
views_7d == 0, "stale",
1=1, "healthy")
| lookup dashboard_registry pretty_name OUTPUT owner sharing description dashboard_uri
| search pretty_name="$name_filter$" $app_filter$ $owner_filter$ $sharing_filter$ $health_filter$
| eval perf_category=case(
avg_load_time_7d == 0, "unknown",
avg_load_time_7d < 1000, "fast",
avg_load_time_7d < 3000, "good",
avg_load_time_7d < 5000, "slow",
1=1, "very_slow")
| search $perf_filter$
| stats dc(pretty_name) as count</query>
<earliest>$time_range.earliest$</earliest>
<latest>$time_range.latest$</latest>
</search>
<option name="drilldown">none</option>
<option name="colorMode">block</option>
<option name="rangeColors">["0x0877a6"]</option>
<option name="underLabel">Dashboards Matching Filter</option>
</single>
</panel>
<panel>
<title>Total Views (Filtered)</title>
<single>
<search>
<query>| mstats sum(_value) as metric_value WHERE index=caca_metrics AND metric_name="dashboard.*" BY pretty_name, metric_name, app span=1d
| where _time >= relative_time(now(), "-7d")
| stats sum(metric_value) as total_value by pretty_name, metric_name, app
| eval metric_type=case(
metric_name=="dashboard.views", "views_7d",
metric_name=="dashboard.edits", "edits_7d",
metric_name=="dashboard.errors", "errors_7d",
metric_name=="dashboard.load_time", "load_time_7d",
1=1, "other")
| eval {metric_type}=total_value
| stats values(app) as app sum(views_7d) as views_7d sum(edits_7d) as edits_7d sum(errors_7d) as errors_7d avg(load_time_7d) as avg_load_time_7d by pretty_name
| fillnull value=0 views_7d edits_7d errors_7d avg_load_time_7d
| eval health_status=case(
errors_7d > 10, "critical",
errors_7d > 0, "warning",
views_7d == 0, "stale",
1=1, "healthy")
| lookup dashboard_registry pretty_name OUTPUT owner sharing description dashboard_uri
| search pretty_name="$name_filter$" $app_filter$ $owner_filter$ $sharing_filter$ $health_filter$
| eval perf_category=case(
avg_load_time_7d == 0, "unknown",
avg_load_time_7d < 1000, "fast",
avg_load_time_7d < 3000, "good",
avg_load_time_7d < 5000, "slow",
1=1, "very_slow")
| search $perf_filter$
| stats sum(views_7d) as total_views
| eval total_views=round(total_views, 0)</query>
<earliest>$time_range.earliest$</earliest>
<latest>$time_range.latest$</latest>
</search>
<option name="drilldown">none</option>
<option name="colorMode">block</option>
<option name="rangeColors">["0x53a051"]</option>
<option name="underLabel">Total Views (7d)</option>
</single>
</panel>
<panel>
<title>Health Issues</title>
<single>
<search>
<query>| mstats sum(_value) as metric_value WHERE index=caca_metrics AND metric_name="dashboard.*" BY pretty_name, metric_name, app span=1d
| where _time >= relative_time(now(), "-7d")
| stats sum(metric_value) as total_value by pretty_name, metric_name, app
| eval metric_type=case(
metric_name=="dashboard.views", "views_7d",
metric_name=="dashboard.edits", "edits_7d",
metric_name=="dashboard.errors", "errors_7d",
metric_name=="dashboard.load_time", "load_time_7d",
1=1, "other")
| eval {metric_type}=total_value
| stats values(app) as app sum(views_7d) as views_7d sum(edits_7d) as edits_7d sum(errors_7d) as errors_7d avg(load_time_7d) as avg_load_time_7d by pretty_name
| fillnull value=0 views_7d edits_7d errors_7d avg_load_time_7d
| eval health_status=case(
errors_7d > 10, "critical",
errors_7d > 0, "warning",
views_7d == 0, "stale",
1=1, "healthy")
| lookup dashboard_registry pretty_name OUTPUT owner sharing description dashboard_uri
| search pretty_name="$name_filter$" $app_filter$ $owner_filter$ $sharing_filter$ $health_filter$
| eval perf_category=case(
avg_load_time_7d == 0, "unknown",
avg_load_time_7d < 1000, "fast",
avg_load_time_7d < 3000, "good",
avg_load_time_7d < 5000, "slow",
1=1, "very_slow")
| search $perf_filter$
| where health_status="critical" OR health_status="warning"
| stats dc(pretty_name) as issues</query>
<earliest>$time_range.earliest$</earliest>
<latest>$time_range.latest$</latest>
</search>
<option name="drilldown">none</option>
<option name="colorMode">block</option>
<option name="rangeColors">["0x53a051","0xf8be34","0xdc4e41"]</option>
<option name="rangeValues">[1,5]</option>
<option name="underLabel">Critical/Warning</option>
</single>
</panel>
<panel>
<title>Performance Issues</title>
<single>
<search>
<query>| mstats sum(_value) as metric_value WHERE index=caca_metrics AND metric_name="dashboard.*" BY pretty_name, metric_name, app span=1d
| where _time >= relative_time(now(), "-7d")
| stats sum(metric_value) as total_value by pretty_name, metric_name, app
| eval metric_type=case(
metric_name=="dashboard.views", "views_7d",
metric_name=="dashboard.edits", "edits_7d",
metric_name=="dashboard.errors", "errors_7d",
metric_name=="dashboard.load_time", "load_time_7d",
1=1, "other")
| eval {metric_type}=total_value
| stats values(app) as app sum(views_7d) as views_7d sum(edits_7d) as edits_7d sum(errors_7d) as errors_7d avg(load_time_7d) as avg_load_time_7d by pretty_name
| fillnull value=0 views_7d edits_7d errors_7d avg_load_time_7d
| eval health_status=case(
errors_7d > 10, "critical",
errors_7d > 0, "warning",
views_7d == 0, "stale",
1=1, "healthy")
| lookup dashboard_registry pretty_name OUTPUT owner sharing description dashboard_uri
| search pretty_name="$name_filter$" $app_filter$ $owner_filter$ $sharing_filter$ $health_filter$
| eval perf_category=case(
avg_load_time_7d == 0, "unknown",
avg_load_time_7d < 1000, "fast",
avg_load_time_7d < 3000, "good",
avg_load_time_7d < 5000, "slow",
1=1, "very_slow")
| search $perf_filter$
| where avg_load_time_7d > 5000
| stats dc(pretty_name) as slow_count</query>
<earliest>$time_range.earliest$</earliest>
<latest>$time_range.latest$</latest>
</search>
<option name="drilldown">none</option>
<option name="colorMode">block</option>
<option name="rangeColors">["0x53a051","0xf8be34","0xdc4e41"]</option>
<option name="rangeValues">[1,5]</option>
<option name="underLabel">Very Slow (>5s)</option>
</single>
</panel>
</row>
<!-- Admin Instructions -->
<row>
<panel>
<html>
<div style="padding: 15px; background-color: #f5f5f5; border-radius: 5px; margin: 10px 0;">
<h3 style="margin-top: 0; color: #0877a6;">🛠️ Administrative Actions Guide</h3>
<p><strong>How to perform administrative tasks:</strong></p>
<ul>
<li><strong>Edit Dashboard:</strong> Click the dashboard name in the table below to open it, then use Splunk's built-in "Edit" button</li>
<li><strong>View/Edit Permissions:</strong> Use the "Permissions" link in the Actions column</li>
<li><strong>Change Ownership:</strong> Access via Settings → User Interface → Views, then find the dashboard</li>
<li><strong>Move Between Apps:</strong> Access via Settings → User Interface → Views, then use "Move" action</li>
<li><strong>Delete Dashboard:</strong> Access via Settings → User Interface → Views, then use "Delete" action</li>
<li><strong>Clone Dashboard:</strong> Open the dashboard, then use "Save As" to create a copy in any app</li>
</ul>
<p style="margin-bottom: 0;"><em>💡 Tip: Use the filters above to narrow down dashboards by app, owner, health status, performance, or name before taking action.</em></p>
</div>
</html>
</panel>
</row>
<!-- Main Dashboard Table with Actions -->
<row>
<panel>
<title>Dashboard Management List</title>
<table>
<search>
<query>| mstats sum(_value) as metric_value WHERE index=caca_metrics AND metric_name="dashboard.*" BY pretty_name, metric_name, app span=1d
| where _time >= relative_time(now(), "-7d")
| stats sum(metric_value) as total_value by pretty_name, metric_name, app
| eval metric_type=case(
metric_name=="dashboard.views", "views_7d",
metric_name=="dashboard.edits", "edits_7d",
metric_name=="dashboard.errors", "errors_7d",
metric_name=="dashboard.load_time", "load_time_7d",
1=1, "other")
| eval {metric_type}=total_value
| stats values(app) as app sum(views_7d) as views_7d sum(edits_7d) as edits_7d sum(errors_7d) as errors_7d avg(load_time_7d) as avg_load_time_7d by pretty_name
| fillnull value=0 views_7d edits_7d errors_7d avg_load_time_7d
| eval health_status=case(
errors_7d > 10, "critical",
errors_7d > 0, "warning",
views_7d == 0, "stale",
1=1, "healthy")
| lookup dashboard_registry pretty_name OUTPUT owner sharing description dashboard_uri
| search pretty_name="$name_filter$" $app_filter$ $owner_filter$ $sharing_filter$ $health_filter$
| eval perf_category=case(
avg_load_time_7d == 0, "unknown",
avg_load_time_7d < 1000, "fast",
avg_load_time_7d < 3000, "good",
avg_load_time_7d < 5000, "slow",
1=1, "very_slow")
| search $perf_filter$
| eval avg_load_time_7d=round(avg_load_time_7d, 0)
| eval perf_rating=case(
avg_load_time_7d == 0, "-",
avg_load_time_7d < 1000, "⚡ Fast",
avg_load_time_7d < 3000, "✓ Good",
avg_load_time_7d < 5000, "⚠ Slow",
1=1, "✗ Very Slow")
| eval health_badge=case(
health_status=="healthy", "✓ Healthy",
health_status=="warning", "⚠ Warning",
health_status=="critical", "✗ Critical",
health_status=="stale", "☾ Stale",
1=1, health_status)
| eval sharing_display=case(
sharing=="global", "🌐 Global",
sharing=="app", "📦 App",
sharing=="user", "🔒 Private",
1=1, coalesce(sharing, "-"))
| join type=left pretty_name
[| mstats avg(_value) as avg_total_load_time WHERE index=caca_metrics AND metric_name="dashboard.load_time" BY pretty_name span=1h
| where _time >= relative_time(now(), "$load_time_period$")
| stats avg(avg_total_load_time) as avg_total_load_time by pretty_name
| eval avg_total_load_time=round(avg_total_load_time, 0)]
| fillnull value=0 avg_total_load_time
| eval dashboard_link=dashboard_uri
| eval title_from_uri=mvindex(split(dashboard_uri, "/"), -1)
| table pretty_name app owner sharing_display views_7d edits_7d errors_7d avg_load_time_7d avg_total_load_time perf_rating health_badge dashboard_link title_from_uri
| rename pretty_name as "Dashboard Name", app as "App", owner as "Owner", sharing_display as "Sharing", views_7d as "Views (7d)", edits_7d as "Edits (7d)", errors_7d as "Errors (7d)", avg_load_time_7d as "Avg Load (ms)", avg_total_load_time as "Avg Total Load Time (ms)", perf_rating as "Performance", health_badge as "Health", dashboard_link as "Dashboard URI", title_from_uri as "Title"
| sort - "Views (7d)"</query>
<earliest>$time_range.earliest$</earliest>
<latest>$time_range.latest$</latest>
</search>
<option name="drilldown">row</option>
<option name="count">50</option>
<option name="dataOverlayMode">none</option>
<option name="rowNumbers">true</option>
<option name="wrap">true</option>
<format type="color" field="Health">
<colorPalette type="map">{"✓ Healthy":#53A051,"⚠ Warning":#F8BE34,"✗ Critical":#DC4E41,"☾ Stale":#708794}</colorPalette>
</format>
<format type="color" field="Performance">
<colorPalette type="map">{"⚡ Fast":#53A051,"✓ Good":#0877a6,"⚠ Slow":#F8BE34,"✗ Very Slow":#DC4E41,"-":#708794}</colorPalette>
</format>
<format type="color" field="Sharing">
<colorPalette type="map">{"🌐 Global":#0877a6,"📦 App":#53A051,"🔒 Private":#F8BE34,"-":#708794}</colorPalette>
</format>
<format type="number" field="Views (7d)">
<option name="precision">0</option>
</format>
<format type="number" field="Edits (7d)">
<option name="precision">0</option>
</format>
<format type="number" field="Errors (7d)">
<option name="precision">0</option>
</format>
<format type="number" field="Avg Load (ms)">
<option name="precision">0</option>
</format>
<format type="number" field="Avg Total Load Time (ms)">
<option name="precision">0</option>
</format>
<drilldown>
<condition field="Dashboard Name">
<link target="_blank">$row.Dashboard URI$</link>
</condition>
<condition field="*">
<link target="_blank">/app/caca/dashboard_details?form.dashboard_name=$row.Dashboard Name$</link>
</condition>
</drilldown>
</table>
</panel>
</row>
<!-- Quick Actions Panel -->
<row>
<panel>
<title>🔧 Quick Access to Administrative Functions</title>
<html>
<div style="padding: 20px;">
<div style="display: flex; flex-wrap: wrap; gap: 15px; justify-content: center;">
<a href="/manager/search/data/ui/views" target="_blank" class="btn btn-primary" style="min-width: 200px; text-align: center; padding: 12px 20px;">
📋 Manage All Dashboards
</a>
<a href="/manager/caca/data/ui/views/_new" target="_blank" class="btn btn-primary" style="min-width: 200px; text-align: center; padding: 12px 20px;">
➕ Create New Dashboard
</a>
<a href="/manager/caca/apps/local" target="_blank" class="btn btn-secondary" style="min-width: 200px; text-align: center; padding: 12px 20px;">
⚙️ Settings
</a>
<a href="/app/caca/search" target="_blank" class="btn btn-secondary" style="min-width: 200px; text-align: center; padding: 12px 20px;">
🔍 Search
</a>
</div>
<hr style="margin: 25px 0;"/>
<div style="background-color: #f9f9f9; padding: 15px; border-radius: 5px; border-left: 4px solid #0877a6;">
<h4 style="margin-top: 0; color: #0877a6;">💡 Common Administrative Workflows</h4>
<h5 style="color: #333; margin-top: 15px;">To Change Dashboard Ownership:</h5>
<ol>
<li>Click "Manage All Dashboards" above</li>
<li>Find the dashboard you want to modify</li>
<li>Click "Edit" → "Edit Permissions"</li>
<li>Change the "Owner" field to the new owner</li>
<li>Click "Save"</li>
</ol>
<h5 style="color: #333; margin-top: 15px;">To Move Dashboard Between Apps:</h5>
<ol>
<li>Click "Manage All Dashboards" above</li>
<li>Find the dashboard you want to move</li>
<li>Click "Move" in the Actions column</li>
<li>Select the destination app</li>
<li>Click "Move"</li>
</ol>
<h5 style="color: #333; margin-top: 15px;">To Delete Dashboards (Bulk):</h5>
<ol>
<li>Use the filters above to narrow down candidates (e.g., stale dashboards)</li>
<li>Review the filtered list carefully</li>
<li>Click "Manage All Dashboards" above</li>
<li>Use the search/filter in the management page to find each dashboard</li>
<li>Select dashboards and click "Delete" for each, or use checkboxes for bulk delete</li>
</ol>
<h5 style="color: #333; margin-top: 15px;">To Change Permissions:</h5>
<ol>
<li>Click the dashboard name in the table above to open it</li>
<li>Click "Edit" → "Edit Permissions" in the dashboard</li>
<li>Modify read/write permissions for roles and users</li>
<li>Set whether it's shared in the app or globally</li>
<li>Click "Save"</li>
</ol>
</div>
</div>
</html>
</panel>
</row>
<!-- Bulk Action Recommendations -->
<row>
<panel>
<title>🎯 Recommended Bulk Actions Based on Current Data</title>
<table>
<search>
<query>| mstats sum(_value) as metric_value WHERE index=caca_metrics AND metric_name="dashboard.*" BY pretty_name, metric_name, app span=1d
| where _time >= relative_time(now(), "-7d")
| stats sum(metric_value) as total_value by pretty_name, metric_name, app
| eval metric_type=case(
metric_name=="dashboard.views", "views_7d",
metric_name=="dashboard.edits", "edits_7d",
metric_name=="dashboard.errors", "errors_7d",
metric_name=="dashboard.load_time", "load_time_7d",
1=1, "other")
| eval {metric_type}=total_value
| stats values(app) as app sum(views_7d) as views_7d sum(edits_7d) as edits_7d sum(errors_7d) as errors_7d avg(load_time_7d) as avg_load_time_7d by pretty_name
| fillnull value=0 views_7d edits_7d errors_7d avg_load_time_7d
| eval health_status=case(
errors_7d > 10, "critical",
errors_7d > 0, "warning",
views_7d == 0, "stale",
1=1, "healthy")
| lookup dashboard_registry pretty_name OUTPUT owner sharing description dashboard_uri
| eval avg_load_time_7d=round(avg_load_time_7d, 0)
| eval recommendation=case(
health_status=="critical" AND avg_load_time_7d > 5000, "URGENT: Fix errors AND optimize performance",
health_status=="critical", "HIGH: Fix critical errors",
health_status=="stale" AND views_7d == 0, "CONSIDER: Archive or delete if not needed",
avg_load_time_7d > 10000, "HIGH: Optimize performance (very slow)",
health_status=="warning", "MEDIUM: Review and fix warnings",
avg_load_time_7d > 5000, "MEDIUM: Optimize performance",
1=1, "No action needed")
| eval priority=case(
recommendation like "URGENT:%", 1,
recommendation like "HIGH:%", 2,
recommendation like "MEDIUM:%", 3,
recommendation like "CONSIDER:%", 4,
1=1, 5)
| where priority < 5
| eval action_type=case(
health_status=="critical" OR health_status=="warning", "Fix/Debug",
health_status=="stale", "Archive/Delete",
avg_load_time_7d > 5000, "Optimize",
1=1, "Review")
| table pretty_name app owner views_7d errors_7d avg_load_time_7d health_status action_type recommendation
| rename pretty_name as "Dashboard Name", app as "App", owner as "Owner", views_7d as "Views (7d)", errors_7d as "Errors (7d)", avg_load_time_7d as "Avg Load (ms)", health_status as "Health", action_type as "Action Type", recommendation as "Recommendation"
| sort priority</query>
<earliest>$time_range.earliest$</earliest>
<latest>$time_range.latest$</latest>
</search>
<option name="drilldown">row</option>
<option name="count">20</option>
<format type="color" field="Action Type">
<colorPalette type="map">{"Fix/Debug":#DC4E41,"Optimize":#F8BE34,"Archive/Delete":#708794,"Review":#0877a6}</colorPalette>
</format>
<format type="number" field="Views (7d)">
<option name="precision">0</option>
</format>
<format type="number" field="Errors (7d)">
<option name="precision">0</option>
</format>
<format type="number" field="Avg Load (ms)">
<option name="precision">0</option>
</format>
<drilldown>
<link target="_blank">/app/caca/dashboard_details?form.dashboard_name=$row.Dashboard Name$</link>
</drilldown>
</table>
</panel>
</row>
<!-- Back Navigation -->
<row>
<panel>
<html>
<div style="text-align: center; padding: 20px;">
<a href="/app/caca/dashboard_leaderboard" class="btn btn-primary" style="margin: 5px;">← Back to Dashboard Leaderboard</a>
<a href="/app/caca/poop_deck" class="btn btn-secondary" style="margin: 5px;">View Poop Deck Analysis</a>
</div>
</html>
</panel>
</row>
</form>