Understand metrics service architecture
Learn the architectural components and deployment topology of metrics service to make informed infrastructure decisions and ensure successful integration with Ansible Automation Platform.
Metrics service overview
Metrics service is a Django-based application component of Ansible Automation Platform 2.7. It collects anonymized usage and performance data from your automation controller. The service runs as containerized workloads managed by either systemd (containerized installer) or Kubernetes (operator). It maintains its own PostgreSQL database and read-only access to the controller database.
Default behavior in Ansible Automation Platform 2.7
Metrics service is enabled by default in Ansible Automation Platform 2.7 for both operator-based (OpenShift) and containerized installations that include automation controller. It is deployed automatically as a required component when you install automation controller.
- Containerized installations:
[automationmetrics]inventory group is required when installing Ansible Automation Platform if automationcontroller is present in the inventory file, unlessautomationmetrics_skip_install=trueis set in[all:vars] - Operator installations: Enabled when
metrics.disabled: falseis set in the AnsibleAutomationPlatform custom resource. Operator deployments do not supportautomationmetrics_skip_install; they usemetrics.disabled: truein the CR instead.
Key characteristics
- Django-based application: Built on Django framework with database migrations managed through /app/scripts/init.sh
- Containerized deployment: Runs as three containers (
automation-metrics-web,automation-metrics-tasks,automation-metrics-scheduler) managed by systemd (containerized installer) or Kubernetes (operator) - Optional deployment: Set
automationmetrics_skip_install=trueto opt out of metrics service installation when automation controller is present (containerized installations only) - Automatic anonymization: Customer-defined object names are replaced with "Custom" before transmission. Only built-in object names and publicly available collection names are sent in their original form
- Auto-configured ingress: Establishes secure connection to Red Hat Data Ingress without manual setup
- Read-only access: Accesses automation controller database in read-only mode to prevent operational impact
- Isolated database: Maintains its own
metrics_servicedatabase for metrics processing and storage - Health monitoring: Provides health check endpoint (returns
"status": "good"when healthy) - HTTP proxy support: Supports HTTP/HTTPS proxy configuration for environments without direct internet access
- Startup validation: Validates required production environment variables at startup. Containers exit immediately with validation errors if required variables are missing or invalid
- Deployment flexibility: Supports both RHEL-based containerized deployments and OpenShift operator-based deployments with different configuration approaches
- Date filtering: Users can only use predefined date range options (Last 7 days, Last 30 days, Last 90 days, etc.)
- Currency: All cost values display in USD. Multi-currency support not available.
Capabilities unavailable without metrics service
- Automation dashboard has no backend data source and is non-functional
- No anonymized usage data is collected or transmitted
- ROI calculations, automation savings, and executive reporting are unavailable
- Dashboard collection tasks do not run
Relationship to automation dashboard
Metrics service serves as the unified backend for automation dashboard. Metrics service collects additional dashboard-specific metrics, including:
- Cost and pricing data for ROI calculations
- Automation savings metrics
- Executive reporting data
Dashboard collection is enabled by default when metrics service is installed. Dashboard collection runs on an hourly schedule..
Architecture components
Core components
| Component | Container Name | Purpose |
|---|---|---|
| Metrics service (web) | automation-metrics-web |
Nginx reverse proxy + Gunicorn serving the Django application. Internal Gunicorn port: 8006. External via nginx: 8087 (HTTP) / 8450 (HTTPS). Health endpoint:/health/ (returns HTTP 2** for healthy, 50* for unhealthy) |
| Metrics service (tasks) | automation-metrics-tasks |
Dispatcherd async task worker for background job execution |
| Metrics service (scheduler) | automation-metrics-scheduler |
APScheduler process that triggers periodic data collection tasks |
| Init container | automation-metrics-init |
One-shot container that runs Django database migrations and system initialization via/app/scripts/init.sh. Exits on completion. |
| metrics_service database | PostgreSQL database | Stores processed metrics data and configuration. Created with usermetrics_service (ALL privileges) |
| awx/automation controller database (read-only) | PostgreSQL database | Source of automation controller usage data. Accessed via userms_awx_readonly (SELECT-only privileges on all tables in schema) |
| Red Hat Data Ingress | External endpoint | Receives anonymized data from customer environments via Segment write key. Data flows through Gateway/api/metrics/ endpoint (no direct customer-facing endpoints in 2.7 GA) |
Database architecture
| Database | User | Privileges | Purpose |
|---|---|---|---|
metrics_service |
metrics_service |
ALL | Metrics service own data storage, schema migrations, configuration |
| awx/automation controller | ms_awx_readonly |
SELECT ON ALL TABLES IN SCHEMA public | Read-only access to controller data for metrics collection |
The two-database model ensures metrics service cannot modify controller data. The ms_awx_readonly user has only SELECT privileges on the awx/automation controller database, preventing any writes to automation controller tables.
The metrics_service database includes additional tables from apps/dashboard_reports/migrations/ for dashboard-specific data. These tables are created automatically during database migration.
Database schema architecture
Collection phase
- Metrics service queries automation controller/
awxdatabase (read-only connection usingms_awx_readonlyuser) - Raw usage data extracted from the following tables: jobs, job host summaries, credentials, execution environments, controller versions, feature flags, and job events
What is NOT collected:
- Host inventory data
- Customer-defined template names, playbook names, or workflow names
Host and inventory data collection is handled separately by the metrics-utility CLI for CCSP reports only. Metrics service does not collect this data.
Complete task schedule
Metrics service uses three task groups controlled by feature flags:
METRICS_COLLECTION group
Gated by METRICS_COLLECTION feature flag (default: true). When disabled, all tasks in this group skip execution.
| Task | Schedule | Description |
|---|---|---|
collect_hourly_metrics (job_host_summary) |
Every hour at XX:05 | Collects job host summary metrics from controller database |
collect_hourly_metrics (unified_jobs) |
Every hour at XX:10 | Collects unified jobs metrics from controller database |
collect_hourly_metrics (credentials) |
Every hour at XX:15 | Collects credentials usage metrics from controller database |
collect_hourly_metrics (main_jobevent_service) |
Every hour at XX:20 | Collects collection, module, and role usage from job events in controller database |
collect_snapshot_metrics (execution_environments) |
Daily at 1:00 AM | Snapshot of execution environment configuration |
collect_snapshot_metrics (config) |
Daily at 1:30 AM | Snapshot of system configuration |
collect_snapshot_metrics (controller_version) |
Daily at 1:35 AM | Snapshot of controller version information |
collect_snapshot_metrics (table_metadata) |
Daily at 1:40 AM | Snapshot of database table metadata |
collect_snapshot_metrics (feature_flags) |
Daily at 1:45 AM | Snapshot of feature flag states |
collect_daily_metrics (task_executions) |
Daily at 1:50 AM | Pipeline health metrics (task execution observability) |
daily_metrics_rollup |
Daily at 2:00 AM | Aggregates hourly data into daily summaries |
cleanup_metrics_data |
Daily at 4:00 AM | Purges expired data based on retention policies |
ANONYMIZATION group
Gated by ANONYMIZED_DATA_COLLECTION feature flag (default: true). When disabled, anonymization and transmission skip execution.
| Task | Schedule | Description |
|---|---|---|
daily_anonymize_and_prepare |
Daily at 3:00 AM | Anonymizes collected data and transmits to Segment.com |
SYSTEM group
Always enabled regardless of feature flag state. System maintenance tasks continue even when all collection is disabled.
| Task | Schedule | Description |
|---|---|---|
cleanup_old_tasks |
Daily at 5:00 AM | Purges old task execution records from database |
hello_world |
Every hour | Health check heartbeat for monitoring |
Task dependencies
Tasks are scheduled in dependency order:
- Hourly collection (XX:05, XX:10, XX:15, XX:20) - provides raw data
- Daily snapshots (1:00 AM - 1:50 AM) - supplements hourly data
- Daily rollup (2:00 AM) - aggregates hourly data (depends on hourly collectors completing)
- Anonymization (3:00 AM) - anonymizes aggregated data (depends on rollup completing)
- Cleanup (4:00 AM, 5:00 AM) - purges old data (runs after rollup/anonymization to avoid race conditions)
If hourly collectors fail, daily rollup will have incomplete data. Always verify hourly collection completed before troubleshooting rollup issues.
To ensure the readonly user can access tables created in the future, we recommend setting the following default privileges: ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO ms_awx_readonly;
Anonymization phase
No personal data leaves the customer environment. Only publicly available collection names (for example from Galaxy) and built-in object names (such as built-in credential types and execution environments) are transmitted.
Anonymization method: Statistics and counts only
Metrics service transmits only aggregated statistics, counts, and built-in/public object names. Customer-defined object names are never transmitted. For example, if you have 3 custom credentials, metrics service sends the count "3" but does not send the credential names.
What data is sent:
- Job statistics: Aggregated job execution data grouped by job type, launch type, and version (success/failure counts, duration statistics, timestamps). Job template names are NOT included.
- Job host summary statistics: Aggregated job execution results per host (success/failure counts, execution performance metrics).
- Credential type statistics: Built-in credential type names (e.g., "Machine", "Source Control", "Vault") and count of customer-defined credentials (e.g., "3 custom credentials"). Customer-defined credential names are NOT sent.
- Execution environment statistics: Built-in EE names (e.g., "ee-minimal-rhel9", "ee-supported-rhel9") and count of customer-defined EEs (e.g., "5 custom EEs"). Customer-defined EE names are NOT sent.
- Collection statistics: Public collection names from Galaxy or Red Hat Certified Collections (e.g., "ansible.builtin", "ansible.posix") and count of customer-defined collections. Customer-defined collection names are NOT sent.
- Collection, module, and role usage statistics: Agregated counts of Ansible collection, module, and role usage extracted from job events. Data includes module execution counts, job success/failure rates, task retry and unreachable events, and collection-level host counts. Only publicly available (Certified, Community, and Validated) collection and module names are included. Custom-source entries and customer-defined role names are stripped during anonymization. Skipped tasks are excluded - only events from automation work that was actually performed are counted.
- Project SCM types: Source control management types for projects (e.g., Git, SVN).
- Organization counts: Total number of organizations configured.
- Version information: Controller version, Ansible core version, installed collection versions.
- Warnings and deprecations: Statistics on deprecation warnings encountered.
- Feature flag states: Boolean status of enabled/disabled feature flags.
What data is NOT sent:
- Job template names (not collected at all)
- Customer-defined credential names (only counts transmitted, e.g., "3 custom credentials")
- Customer-defined execution environment names (only counts transmitted, e.g., "5 custom EEs")
- Customer-defined collection names (only counts transmitted)
- Host inventory data (not queried by metrics service; handled separately by metrics-utility CLI for CCSP reports only)
- Playbook names (customer-defined content)
- Variable names and values (customer-defined content)
- Workflow template names (customer-defined content)
Customer-defined object names are never transmitted. Metrics service sends only counts (e.g., "3 custom credentials") and statistics (e.g., "50 jobs executed"). There is no way to identify which specific custom objects belong to which customer, and no individual object names can be recovered from the transmitted data.
Transmission phase
- Anonymized data packaged for transmission
- Secure HTTPS connection established to Red Hat Data Ingress endpoint using Segment (a third-party data pipeline service)
- Data transmitted through the Gateway /api/metrics/ endpoint (no direct customer-facing endpoints in 2.7 GA)
- Transmission status logged in
metrics_servicedatabase - HTTP/HTTPS proxy supported for environments without direct internet access
Segment is a third-party data pipeline service that securely routes anonymized metrics from your environment to Red Hat analytics infrastructure. The Segment write key is pre-configured during installation.
Message size handling
Metrics service splits anonymized data deterministically into separate messages. If any message exceeds 32 KB, the service splits it further. This ensures reliable transmission of large datasets without message size errors.
Deployment topology options
AIO Growth (All-in-One) topology
A single host runs all Ansible Automation Platform components, including metrics service. The [automationmetrics] inventory group points to the same host as [automationcontroller].
Characteristics:
- All components share the same host
- Simplest deployment for small to medium environments
- Metrics service, controller, and databases on one node
- Suitable for development, testing, or small production environments
To skip metrics service installation, set automationmetrics_skip_install=true in [all:vars] and omit the [automationmetrics] inventory group.
Enterprise / Multi-Node topology
Metrics service runs on a dedicated node. You define which node hosts metrics service by using the [automationmetrics] inventory group. In the growth topology (all-in-one), metrics service shares the single host with all other components. In the enterprise topology, metrics service requires its own dedicated node. Unlike controller, hub, and EDA, metrics service does not support multi-node or high-availability deployment.
Characteristics:
- Flexible topology: metrics service can run on any node
- Scaled independently from controller
- Metrics processing isolated from automation execution
- Suitable for large-scale production environments
To skip metrics service installation, set automationmetrics_skip_install=true in [all:vars] and omit the [automationmetrics] inventory group.
Deployment method comparison
Metrics service supports two deployment methods with different configuration complexity and automation levels:
| Aspect | Containerized Installer | Operator (OpenShift) |
|---|---|---|
| Deployment method | Ansible role (automationmetrics) in containerized installation program |
Kubernetes operator (automation-metrics-operator) managed by AAP gateway operator |
| Configuration complexity | Manual: requires inventory file edits, database passwords, network variables | Automatic: single CR field (metrics.disabled: false) |
| Database provisioning | Administrator provisions databases and configures credentials in inventory | Operator automatically provisions databases and manages credentials via Kubernetes secrets |
| Container management | Podman with systemd user-scope units | Kubernetes deployments managed by operator |
| Network configuration | Manual firewall rules, port configuration in inventory | Automatic Kubernetes services and Envoy routing through gateway |
| OAuth integration | Manual configuration if needed | Automatic integration with platform gateway OAuth |
| Upgrades | Re-run installer with updated inventory | Operator handles upgrades automatically via CR updates |
| Backup/restore | Manual playbook execution | Operator-managed backup/restore via AutomationMetricsBackup CR (when available) |
For OpenShift deployments, use the operator method for simplified configuration and automatic lifecycle management. For RHEL-based containerized deployments, use the containerized installer method.
Containerized installer deployment details
Metrics service is deployed through the automationmetrics Ansible role included in the Ansible Automation Platform 2.7 containerized installation program:
- Container runtime: Podman with host networking mode (rootless, user namespace)
- Service management: Three systemd user-scope units:
automation-metrics-web.service,automation-metrics-tasks.service,automation-metrics-scheduler.service - Data persistence: Host volumes mounted from
{{ aap_volumes_dir }}/automationmetricsinto container path /var/lib/ansible-automation-platform/metrics - Secrets management: Four Podman secrets:
automationmetrics_pg_password,automationmetrics_controller_read_pg_password,automationmetrics_secret_key,automationmetrics_resource_server - Firewall integration: Ports 8087/tcp (HTTP) and 8450/tcp (HTTPS) opened in configured firewall zone (default: public)
Configuration requirements:
- Hosts must be added to
[automationmetrics]inventory group (unlessautomationmetrics_skip_install=trueis set) - Database connection variables must be configured (
automationmetrics_pg_host,automationmetrics_pg_password, etc.) - Read-only controller database user must be provisioned manually or by installer
- Segment write key must be provided for data transmission
Operator-based deployment details
Metrics service is deployed through the automation-metrics-operator running on OpenShift. The AAP gateway operator manages the metrics operator lifecycle:
- Container runtime: Kubernetes pods managed by operator deployments
- Service management: Three Kubernetes deployments:
metrics-api,metrics-tasks,metrics-scheduler - Data persistence: Kubernetes persistent volumes managed by operator
- Secrets management: Kubernetes secrets automatically created and managed by operator (database credentials, OAuth tokens, Segment write key)
- Network integration: Kubernetes services and Envoy routing through platform gateway
- Database provisioning: Operator automatically creates and configures both
metrics_servicedatabase and read-only controller database user
Configuration simplicity:
- Single CR field:
spec.metrics.disabled: falsein AnsibleAutomationPlatform CR - Zero manual database configuration required
- Zero manual network configuration required
- Automatic OAuth integration with platform gateway
- Operator handles all credential rotation and secret management
Operator-managed resources:
- MetricsService CR: Created as
<aap-name>-metricsin same namespace as AnsibleAutomationPlatform CR - Database: PostgreSQL database for metrics service, automatically provisioned with credentials stored in Kubernetes secrets
- Read-only user: Automatically created in controller database with SELECT privileges
- Services: Kubernetes Service resources for metrics API, tasks, and scheduler pods
- Routes/Ingress: Traffic routing through platform gateway Envoy proxy (no direct external endpoints)
In AAP 2.7, the operator removes ownerReferences from the MetricsService CR. This means the CR is not automatically deleted when you set metrics.disabled: true. You must manually delete the CR if you want to fully remove metrics service from your cluster.
In standard operator deployments, database provisioning is fully automatic. The operator creates all required databases and users. This includes the metrics service database and the read-only user for the controller database.
Externally managed databases: If you use a fully externally managed database such as RDS or Cloud SQL, you must manually provision databases and configure credentials before deploying metrics service. See the related information for external database configuration procedures.
Network architecture
Required network connectivity
| Source | Destination | Protocol/Port | Purpose |
|---|---|---|---|
automation-metrics-tasks /automation-metrics-scheduler containers |
Automation controller database | PostgreSQL (5432) | Read-only data collection viams_awx_readonly user |
automation-metrics-tasks /automation-metrics-scheduler containers |
metrics_service database |
PostgreSQL (5432) | Read-write metrics storage viametrics_service user |
automation-metrics-tasks container |
Red Hat Data Ingress (via Segment) | HTTPS (443) | Anonymized data transmission authenticated via Segment write key |
| Monitoring systems (optional) | automation-metrics-web container |
HTTP (8087) | Health check endpoint at/health/ via nginx |
Firewall requirements
- Protocol: HTTPS (TLS 1.2 or higher); supported TLS versions: TLSv1.2, TLSv1.3
- Direction: Outbound from metrics service container to Red Hat Data Ingress
- Nginx ports: 8087/tcp (HTTP) and 8450/tcp (HTTPS) opened in firewall (default zone: public)
- Internal Gunicorn port: 8006 (localhost only, not opened in firewall)
- Proxy support: HTTP/HTTPS proxy configuration supported via standard environment variables (
HTTP_PROXY,HTTPS_PROXY,NO_PROXY)
Naming conventions
| Element | Value |
|---|---|
| Role name | automationmetrics |
| Inventory group | [automationmetrics] |
| Web container | automation-metrics-web |
| Tasks container | automation-metrics-tasks |
| Scheduler container | automation-metrics-scheduler |
| Init container | automation-metrics-init |
| Variable prefix | automationmetrics_ |
| Gunicorn port (internal) | 8006 (localhost only) |
| Nginx HTTP port | 8087 |
| Nginx HTTPS port | 8450 |
| Health endpoint | http://localhost:8087/health/ |
| Host volume path | {{ aap_volumes_dir }}/automationmetrics |
| Container data path | /var/lib/ansible-automation-platform/metrics |