Note: The "Validate App" badge shows the current AppInspect status. Green = passing with 0 failures.
CACA (Content Activity Checking Application) is a Splunk app designed to help teams track the caca in their environment: highlighting usage, health, and lifecycle of their Splunk dashboards and content. It provides clear, metric-driven insights to help answer critical questions:
- "Is anyone using this dashboard I built?" - Track views and user engagement
- "Which dashboards are most critical to our users?" - Identify high-value content
- "Is this dashboard actually performing well?" - Monitor health and errors
- "Which dashboards are safe to archive or delete?" - Find unused or stale content
- "How do we demonstrate the value of our team's work?" - Quantify dashboard impact with real metrics
While the Splunk Monitoring Console (DMC) focuses on system-level health and performance, CACA fills a different need:
- DMC is for Admins: Tracks scheduler load, memory, and infrastructure health
- CACA is for Creators & Users: Answers "Is my content useful and working well?"
- Automated Discovery: Automatically discovers and catalogs all dashboards across your Splunk environment
- Usage Tracking: Track how many times each dashboard is viewed, by which users, and when
- Edit History: Monitor when dashboards are created or modified, and by whom
- Health Monitoring: Detect and track dashboard errors and warnings from internal logs
- Performance Monitoring: Track dashboard load times and identify slow-performing dashboards
- Stale Dashboard Detection: Identify dashboards that haven't been accessed in 30+ days
- Efficient Metrics Store: Uses Splunk's native metrics index for high-performance, low-storage-impact data collection
- Real-Time Collection: Scheduled searches run every 5-15 minutes for near real-time metrics
- Historical Trending: Track usage patterns and trends over time (up to 1 year by default)
- Aggregate Statistics: View total views, edits, and errors across all content
- Dashboard Leaderboard: Centralized view showing all monitored dashboards with sortable metrics
- Detailed Analytics: Drill down into individual dashboards for comprehensive insights
- Health Status Indicators: Color-coded status badges (Healthy, Warning, Critical, Stale)
- Top Performers: Identify most-viewed and most-edited dashboards
- User Activity Breakdown: See which users are accessing specific dashboards
- GitHub-Style Badges: Add usage and health metrics directly to your dashboards
- Customizable Templates: Pre-built XML snippets for quick badge integration
- Multiple Badge Styles: Choose from compact single-stat or detailed multi-metric badges
- Self-Service: Dashboard owners can add badges without admin intervention
- Reusable Queries: Pre-built macros for common metrics queries
- Parameterized Searches: Easily query specific dashboards or time ranges
- Consistent Results: Standardized queries across the app
The app uses a three-stage pipeline for efficiency:
- Collect: Scheduled searches analyze Splunk's internal logs (
_internal,_audit) to track views, edits, errors, and performance - Store: Metrics are written to a dedicated metrics index using
mcollectfor optimal performance - Query: Fast retrieval via
mstatscommand and reusable search macros
Note on Scheduled Searches: CACA is powered by lightweight scheduled searches that run at the following intervals:
- Dashboard views: Every 5 minutes
- Dashboard edits: Every 10 minutes
- Dashboard performance: Every 10 minutes
- Dashboard health: Every 15 minutes
- Registry updates: Daily at 2 AM
All searches are configured with low priority to ensure they do not impact regular user searches or system performance. The searches use efficient mcollect commands to write directly to a metrics index, minimizing resource consumption.
DRAFT - Work in Progress
- Splunk Enterprise 8.0 or later
- Access to
_internaland_auditindexes - Permissions to create metrics indexes and scheduled searches
- Download the latest release package (
.splor.tar.gz) - In Splunk Web, navigate to Apps β Manage Apps
- Click Install app from file
- Upload the package file
- Click Upload
- Restart Splunk if prompted
- Extract the app package to
$SPLUNK_HOME/etc/apps/ - Ensure the directory is named
splunk-content-monitoring-console - Restart Splunk:
$SPLUNK_HOME/bin/splunk restart
After installation, follow these steps to initialize CACA:
The caca_metrics index should be created automatically. Verify by running:
| eventcount summarize=false index=caca_metrics
Run the registry update search to populate the dashboard registry. Important: Make sure to run this search from within the CACA app context, or use the full app path in the outputlookup command:
Option A - Run from CACA app context: Navigate to CACA app in Splunk Web, then run:
| rest /services/data/ui/views splunk_server=local count=0 search="sharing=*"
| search isDashboard=1 OR isVisible=1
| eval dashboard_uri="/app/".eai:acl.app."/".title
| eval pretty_name=coalesce(label, title)
| eval app=eai:acl.app
| eval owner=eai:acl.owner
| eval sharing=eai:acl.sharing
| eval description=coalesce(eai:data, "")
| eval status="active"
| table dashboard_uri pretty_name app owner sharing description status
| outputlookup dashboard_registry.csv
Option B - Run from any app:
If you prefer to run the search from a different app (like Search & Reporting), you can do so, but you must include the full app path in the outputlookup command:
| rest /services/data/ui/views splunk_server=local count=0 search="sharing=*"
| search isDashboard=1 OR isVisible=1
| eval dashboard_uri="/app/".eai:acl.app."/".title
| eval pretty_name=coalesce(label, title)
| eval app=eai:acl.app
| eval owner=eai:acl.owner
| eval sharing=eai:acl.sharing
| eval description=coalesce(eai:data, "")
| eval status="active"
| table dashboard_uri pretty_name app owner sharing description status
| outputlookup caca:dashboard_registry.csv
Note: The caca: prefix ensures the lookup is saved to the correct app even when running from elsewhere.
Recommended: Just use Option A - it's simpler and less error-prone.
This will scan your Splunk environment and populate the dashboard_registry.csv lookup with all discovered dashboards, including private dashboards.
Note on Private Dashboards: The search="sharing=*" parameter ensures that dashboards with all sharing levels (global, app, and user/private) are included in the registry. To see private dashboards owned by other users, the scheduled search must run with appropriate permissions (typically as admin or with the list_storage_passwords capability).
Verify the registry (run from CACA app):
| inputlookup dashboard_registry | stats count
Or from any app, navigate to the lookup location:
Settings β Lookups β Lookup table files β Find "dashboard_registry.csv" in caca
Navigate to Settings β Searches, reports, and alerts and enable these searches:
- Dashboard Views - Metrics Collector (runs every 5 minutes)
- Dashboard Edits - Metrics Collector (runs every 10 minutes)
- Dashboard Performance - Metrics Collector (runs every 10 minutes)
- Dashboard Health - Metrics Collector (runs every 15 minutes)
- Dashboard Registry - Auto Update (runs daily at 2 AM)
Important: These searches are disabled by default to prevent errors before the registry is populated. Enable them only after completing steps 1 and 2 above.
Allow 15-30 minutes for the initial data collection to populate the metrics index.
Verify metrics are being collected:
| mstats count WHERE index=caca_metrics BY metric_name
Navigate to CACA β Dashboard Leaderboard to view:
- High-Level KPIs: Total dashboards, views, errors, average load time, and stale dashboards
- Activity Leaderboard Table: Sortable list of all dashboards with usage, health, and performance metrics
- Trending Charts: Views, errors, and load time trends over time
- Top Dashboards: Most viewed, most edited, and slowest dashboards
Navigate to CACA β CACA Admin Dashboard for centralized dashboard administration:
- Multi-Dimensional Filtering: Filter dashboards by name, app, owner, health status, and performance
- Management View: Sortable table with all key metrics (views, errors, load time, health)
- Quick Actions: Direct links to edit, change ownership, move between apps, delete, and manage permissions
- Bulk Recommendations: Prioritized list of dashboards needing attention (fix, optimize, archive)
- Workflow Guides: Step-by-step instructions for common administrative tasks
See the CACA Admin Dashboard README for detailed usage instructions and examples.
Click any dashboard in the leaderboard to view detailed metrics:
- Total views, edits, errors, and average load time
- Activity and performance trends over time
- Top users by views
- Edit history
- Error details with severity
- Load time analysis (average and maximum)
You can add usage badges to any dashboard. See the Badge Template (default/data/ui/views/BADGE_TEMPLATE.md) for instructions.
Quick Example:
Add this panel to your dashboard XML:
<row>
<panel>
<title>Dashboard Views (7d)</title>
<single>
<search>
<query>| mstats sum(_value) as total WHERE index=caca_metrics AND pretty_name="YOUR_DASHBOARD_NAME" AND metric_name="dashboard.views" span=1d
| where _time >= relative_time(now(), "-7d")
| stats sum(total) as views</query>
<earliest>-7d</earliest>
<latest>now</latest>
</search>
<option name="underLabel">Views (7d)</option>
</single>
</panel>
</row>Replace YOUR_DASHBOARD_NAME with your dashboard's pretty name from the registry.
CACA provides several search macros for easy querying. These macros help you quickly identify dashboards with issues, analyze performance, and understand usage patterns.
Note: All macros respect the app filter configuration (see "Filtering Apps for Monitoring" in Configuration section). All results include the app field showing which app each dashboard belongs to, making it easy to filter or group results by application.
`get_dashboards_with_errors`
Returns: Dashboards with errors or warnings in the last 7 days, sorted by severity Columns: pretty_name, app, errors, warnings, total_issues, health_status Use case: Find dashboards that are generating errors and need attention
`get_slow_dashboards`
Returns: Dashboards with average load time > 3 seconds in the last 7 days Columns: pretty_name, app, avg_load_time_7d, performance_status Use case: Find dashboards that need performance optimization
`get_problematic_dashboards`
Returns: Dashboards with critical/warning health status OR slow performance Columns: pretty_name, app, views_7d, errors_7d, avg_load_time_7d, health_status, issue_type Use case: Get a comprehensive list of all dashboards needing attention
Example - Filter for critical issues only:
`get_problematic_dashboards`
| where health_status="critical" OR avg_load_time_7d > 10000
`get_dashboard_stats("My Dashboard Name")`
Returns: All metrics (views, edits, errors, load time) for the specified dashboard Use case: Deep dive into a specific dashboard's activity
`get_all_dashboards_summary`
Returns: Summary of all dashboards with 7-day metrics Columns: pretty_name, app, views_7d, edits_7d, errors_7d, avg_load_time_7d, health_status Use case: Get an overview of all dashboard health and activity
`get_top_dashboards(views)`
`get_top_dashboards(edits)`
Returns: Top 10 dashboards by views or edits in the last 7 days Use case: Identify most-used or most-edited dashboards
`get_dashboard_performance("My Dashboard Name")`
Returns: Average load time and performance rating (Excellent/Good/Fair/Poor) Use case: Check if a dashboard meets performance standards
`get_dashboard_last_viewed("My Dashboard Name")`
Returns: Last viewed timestamp and days since last view Use case: Identify stale or unused dashboards
Find all dashboards needing immediate attention:
`get_problematic_dashboards`
| where health_status="critical" OR (errors_7d > 50) OR (avg_load_time_7d > 10000)
Filter results by specific app:
`get_dashboards_with_errors`
| where app="search"
| table pretty_name app errors warnings health_status
List dashboards with errors across multiple apps:
`get_dashboards_with_errors`
| where app IN ("my_app1", "my_app2", "production_app")
| sort -errors
List dashboards with errors that are actively used:
`get_dashboards_with_errors`
| where errors > 0
| join type=inner pretty_name [| mstats sum(_value) as views WHERE index=caca_metrics AND metric_name="dashboard.views" BY pretty_name span=1d | where _time >= relative_time(now(), "-7d") | stats sum(views) as views_7d by pretty_name | where views_7d > 10]
| table pretty_name app errors warnings views_7d health_status
Find slow dashboards with high usage:
`get_slow_dashboards`
| join type=inner pretty_name [| mstats sum(_value) as views WHERE index=caca_metrics AND metric_name="dashboard.views" BY pretty_name span=1d | where _time >= relative_time(now(), "-7d") | stats sum(views) as views_7d by pretty_name]
| where views_7d > 50
| table pretty_name app avg_load_time_7d performance_status views_7d
| sort -views_7d
Dashboard health report for a specific app:
`get_all_dashboards_summary`
| where app="search"
| table pretty_name views_7d edits_7d errors_7d avg_load_time_7d health_status
| sort -errors_7d
Edit default/savedsearches.conf or use Splunk Web to modify:
- View tracking frequency: Default every 5 minutes
- Edit tracking frequency: Default every 10 minutes
- Performance tracking frequency: Default every 10 minutes
- Health tracking frequency: Default every 15 minutes
- Registry update frequency: Default daily at 2 AM
Edit default/indexes.conf to adjust retention:
[caca_metrics]
frozenTimePeriodInSecs = 31536000 # 1 year (default)CACA can be configured to only monitor dashboards from specific apps, or exclude certain apps from monitoring. This is useful when you only want to track dashboards in production apps, or exclude system/admin apps.
Edit lookups/app_filter.csv to control which apps are monitored:
Include specific apps only:
app,include
search,true
my_production_app,true
another_app,true
Exclude specific apps:
app,include
splunk_monitoring_console,false
learned,false
introspection_generator_addon,false
How it works:
- If an app is not listed in app_filter.csv, it will be monitored (default behavior)
- If an app is listed with
include=true(or1oryes), it will be monitored - If an app is listed with
include=false(or0orno), it will NOT be monitored - The filter applies to:
- Dashboard registry updates (which dashboards are discovered)
- All metrics collection (views, edits, errors, performance)
- All search macros and dashboard queries
Monitor only specific production apps:
app,include
production_app1,true
production_app2,true
production_app3,true
Then add a wildcard exclusion entry to exclude everything else (optional):
app,include
production_app1,true
production_app2,true
*,false
Exclude system and admin apps:
app,include
splunk_monitoring_console,false
learned,false
introspection_generator_addon,false
splunk_instrumentation,false
Note: After updating app_filter.csv, run the "Dashboard Registry - Auto Update" search to rebuild the dashboard registry with the new filter applied.
Edit lookups/dashboard_registry.csv and set status=inactive for specific dashboards you want to exclude from collection (this is independent of app filtering).
-
Check scheduled searches are running:
index=_internal source=*scheduler.log savedsearch_name="Dashboard*Metrics*" -
Verify metrics index exists:
| eventcount summarize=false index=caca_metrics -
Check lookup is populated:
| inputlookup dashboard_registry
Run the registry update search manually from the CACA app context:
Step 1: Navigate to the CACA app in Splunk Web
Step 2: Run this search:
| rest /services/data/ui/views splunk_server=local count=0 search="sharing=*"
| search isDashboard=1 OR isVisible=1
| eval dashboard_uri="/app/".eai:acl.app."/".title
| eval pretty_name=coalesce(label, title)
| eval app=eai:acl.app
| eval owner=eai:acl.owner
| eval sharing=eai:acl.sharing
| eval status="active"
| table dashboard_uri pretty_name app owner sharing status
| outputlookup caca:dashboard_registry.csv
For Private Dashboards: If private dashboards still don't appear, ensure the search is running with appropriate permissions. Private dashboards owned by other users require admin privileges or specific capabilities to be discovered via REST API.
Or add it manually to lookups/dashboard_registry.csv in the CACA app directory.
- Ensure dashboards have been accessed since CACA was installed
- Check that scheduled searches have appropriate permissions
- Verify
_internaland_auditindexes are accessible
- The app uses metrics indexes which are highly efficient
- Scheduled searches are lightweight and use
mcollectfor optimal performance - Default retention is 1 year; adjust based on your needs
- Registry auto-updates daily; increase frequency if dashboards change often
Feel free to open a github issue or contribute with a pull request!
- Scheduled Search Tracking: Monitor execution frequency, run time, and success rates for all saved searches
- Alert Effectiveness Metrics: Track alert trigger frequency, action execution, and alert fatigue indicators
- Report Usage Analytics: Identify which scheduled reports are being used vs. those running unnecessarily
- Performance Metrics: Track search execution times, result counts, and resource consumption
- Owner Assignment: Link saved searches to owners for accountability
- Stale Search Detection: Identify searches that never trigger alerts or whose results are never viewed
- Cost Analysis: Calculate scheduler load and resource cost per saved search
- Lookup Table Monitoring: Track lookup file usage, size, and update frequency
- Data Model Tracking: Monitor data model acceleration, search usage, and performance
- Field Extraction Usage: Identify which field extractions are actually being used in searches
- Macro Utilization: Track which search macros are referenced and where
- Tag & Event Type Usage: Identify unused tags and event types for cleanup
- Predictive Analytics: Forecast future dashboard usage trends
- Anomaly Detection: Alert on unusual patterns (sudden usage drops, error spikes)
- Dependency Mapping: Visualize relationships between dashboards, searches, and data sources
- Content Lifecycle Management: Automated workflows for deprecating unused content
- ROI Metrics: Calculate value/cost ratios for content creation efforts
- Setup Wizard: Guided initial configuration and onboarding
- Custom Badge Visualization: Develop native custom visualization for badges (no XML editing required)
- Email Digests: Scheduled reports showing content health summaries
- Integration with ITSI: Surface content metrics in ITSI service monitoring
- REST API Endpoints: Programmatic access to content metrics for external tools
- Mobile-Friendly Views: Responsive dashboards for mobile devices
- Multi-Tenant Support: Track content usage across multiple business units or teams
- Compliance Reporting: Demonstrate content governance and audit trails
- A/B Testing Support: Compare usage metrics before/after dashboard changes
- Content Recommendations: Suggest related or popular dashboards to users
- Auto-Archival: Automatically disable or archive stale content with admin approval
We welcome contributions for any of these roadmap items or new feature ideas. Please:
- Open an issue to discuss the feature before starting work
- Follow the existing code patterns and architecture
- Include documentation and examples
- Add test data or validation steps
- Initial draft
MIT License