Prometheus and OpenMetrics scraping
Exposing operational metrics and counters in Prometheus 0.0.4 or OpenMetrics 1.0 text format
- Prometheus and OpenMetrics scraping
- Access control and authentication
- Example Prometheus configuration
- Prometheus 0.0.4
- OpenMetrics 1.0
- Example scrape output
- Build and Instance Information
- Process Statistics
- System Statistics
- Log Counters
- Histogram percentiles
- High availability labels
- Usage guidelines
- Troubleshooting
- Push gateway (optional)
Prometheus and OpenMetrics scraping
Radiator exposes operational counters, timing aggregations, and info gauges over authenticated HTTP management endpoints. Both endpoints expose the same in-memory samples. The samples reset when Radiator Server restarts.
Choose one format for each scrape job:
| Format | Endpoint | Content type | Use case |
|---|---|---|---|
| Prometheus text 0.0.4 | /api/v1/metrics/prometheus | text/plain; version=0.0.4; charset=utf-8 | Existing integrations that use the old format |
| OpenMetrics text 1.0 | /api/v1/metrics/openmetrics | application/openmetrics-text; version=1.0.0; charset=utf-8 | New integrations that support OpenMetrics 1.0 |
The OpenMetrics endpoint preserves labels and non-duration sample names and
values. Duration values expressed as milliseconds or microseconds in the
Prometheus format are converted to fractional seconds in OpenMetrics and use a
_seconds suffix. For example, 999 milliseconds is exported as 0.999 seconds.
OpenMetrics adds # UNIT metadata where the unit is known and ends each complete
response with # EOF. Both formats include # HELP and # TYPE metadata.
Access control and authentication
Scraping requires an HTTP management user with at least monitor privilege.
Define the user in the management.http.credentials block:
credentials {
user "monitor" {
password "monitorpassword";
privilege monitor;
}
}
Use HTTP Basic authentication when scraping the Prometheus endpoint:
curl -k -u monitor:monitorpassword --basic \
https://localhost:8443/api/v1/metrics/prometheus
Use the same credentials for the OpenMetrics endpoint:
curl -k -u monitor:monitorpassword --basic \
https://localhost:8443/api/v1/metrics/openmetrics
The -k flag is only needed with self-signed certificates.
Example Prometheus configuration
Prometheus 0.0.4
Use this prometheus.yml scrape job for the existing Prometheus endpoint:
scrape_configs:
- job_name: "radiator-server"
scheme: https
metrics_path: "/api/v1/metrics/prometheus"
basic_auth:
username: "monitor"
password: "monitorpassword"
tls_config:
insecure_skip_verify: true
static_configs:
- targets: ["127.0.0.1:8443"]
OpenMetrics 1.0
Use this scrape job to select only OpenMetrics 1.0 and use the OpenMetrics endpoint:
scrape_configs:
- job_name: "radiator-server-openmetrics"
scheme: https
metrics_path: "/api/v1/metrics/openmetrics"
scrape_protocols: [OpenMetricsText1.0.0]
basic_auth:
username: "monitor"
password: "monitorpassword"
tls_config:
insecure_skip_verify: true
static_configs:
- targets: ["127.0.0.1:8443"]
Do not configure both endpoints in the same scrape job. Keep the Prometheus 0.0.4 endpoint for integrations that require the older format.
Example scrape output
The Prometheus endpoint returns output like this excerpt. Except for duration unit conversion, the OpenMetrics endpoint uses the same samples and labels.
# TYPE radiator_build_info gauge
radiator_build_info{app="radiator",version="10.31.0",kind="development",timestamp="2025-12-12T06:00:47Z",cpu_target="aarch64-apple-darwin",branch="main",commit="abc123"} 1
# TYPE radiator_uptime_seconds gauge
radiator_uptime_seconds{service_ok="true"} 3600
# TYPE radiator_instance_info gauge
radiator_instance_info{instance_id="R01",pid="12345"} 1
# TYPE radiator_log_total counter
radiator_log_total{namespace="server::radius-udp::AUTH_UDP",message="Radius UDP packet from unknown client"} 5
radiator_log_total{namespace="server::radius-udp::AUTH_UDP::policy::BASIC_AUTH::handler::PAP",message="AAA accept"} 999
radiator_log_total{namespace="backend::USERS_FILE",message="Backend query accepted"} 999
...
OpenMetrics metadata uses the counter family name without the _total sample
suffix. The sample name remains unchanged:
# HELP radiator_process_cpu_seconds Total CPU time used by the process in seconds
# TYPE radiator_process_cpu_seconds counter
# UNIT radiator_process_cpu_seconds seconds
radiator_process_cpu_seconds_total{} 1.25
# EOF
Key metrics:
Build and Instance Information
radiator_build_info: build metadata gauge with labels for version, branch, commit, etc.radiator_uptime_seconds: time since server started.radiator_instance_info: instance identification withinstance_id, optionalcluster_id, and process ID.
Process Statistics
radiator_process_memory_rss_bytes: resident set size (RSS) memory usage in bytes.radiator_process_cpu_milliseconds_totalin Prometheus andradiator_process_cpu_seconds_totalin OpenMetrics: total CPU time used by the process.
System Statistics
radiator_system_memory_total_bytes: total system memory in bytes.radiator_system_memory_available_bytes: available system memory in bytes (Linux only).radiator_system_swap_total_bytes: total swap space in bytes (Linux only).radiator_system_swap_used_bytes: used swap space in bytes (Linux only).radiator_system_swap_pages_in_total: total pages swapped in from disk (Linux only).radiator_system_swap_pages_out_total: total pages swapped out to disk (Linux only).radiator_system_cpu_count: number of CPUs available.radiator_system_cpu_active_milliseconds_totalin Prometheus andradiator_system_cpu_active_seconds_totalin OpenMetrics: total active (non-idle) CPU time across all CPUs (Linux only).radiator_system_cpu_total_milliseconds_totalin Prometheus andradiator_system_cpu_total_seconds_totalin OpenMetrics: total CPU time across all CPUs (Linux only).radiator_system_load_1m_x100: 1-minute load average multiplied by 100.radiator_system_load_5m_x100: 5-minute load average multiplied by 100.radiator_system_load_15m_x100: 15-minute load average multiplied by 100.
Log Counters
radiator_log_total: log message counters with a hierarchicalnamespacelabel (components joined by::) and amessagelabel. The namespace follows the patternserver::<transport>::<name>for server-level events,server::<transport>::<name>::policy::<policy>::handler::<handler>for handler-level events, andbackend::<name>for backend-level events (see namespaces for details).
System statistics depend on the operating system.
Histogram percentiles
Radiator exports P50, P95, and P99 values from the last completed histogram interval. It exports these values as gauge samples in both formats. They are not OpenMetrics native histograms because Radiator does not export histogram buckets, a sum, and a count.
The Prometheus endpoint retains each histogram's configured duration unit in
the sample name. The OpenMetrics endpoint converts microsecond and millisecond
histogram values to seconds and combines all duration percentiles in the
radiator_histogram_seconds family.
High availability labels
See High availability identifiers
for instance and cluster ID semantics. The radiator_instance_info gauge
includes instance_id and the optional cluster_id.
Usage guidelines
- Most metrics are read from memory. Collecting some operating system metrics requires system calls. A one-second scrape interval is suitable for most installations.
- Do not expose metrics endpoints without authentication. Metrics reveal the operational structure of the server.
Troubleshooting
| Symptom | Likely cause | Resolution |
|---|---|---|
401 Unauthorized | Missing or incorrect credentials | Configure HTTP Basic authentication |
403 Forbidden | User does not have monitor privilege | Grant the user monitor privilege |
| Scrape protocol or media error | Endpoint and scrape_protocols do not match | Use the endpoint and configuration shown above |
| Empty or truncated output | Network proxy or connection failure | Retry with curl -v and inspect server logs |
| Counters do not increment | No traffic reaches the handler or policy | Send traffic through the relevant server |
Push gateway (optional)
Use prompush when Prometheus cannot scrape Radiator Server instances directly.
- Prometheus and OpenMetrics scraping
- Access control and authentication
- Example Prometheus configuration
- Prometheus 0.0.4
- OpenMetrics 1.0
- Example scrape output
- Build and Instance Information
- Process Statistics
- System Statistics
- Log Counters
- Histogram percentiles
- High availability labels
- Usage guidelines
- Troubleshooting
- Push gateway (optional)
Application log message index
Architecture Overview
Backend Load Balancing
Basic Installation
Built-in Environment Variables
Byte Size Units
Certificate Revocation Lists
Comparison Operators
Configuration Editor
Configuration Import and Export
Containers
Cron and interval timers
Data Types
Duration Units
Environment Variables
Execution Context
Execution Pipelines
Filters
Getting a Radiator License
Health check /live and /ready
High Availability and Load Balancing
High availability identifiers
HTTP Basic Authentication
Introduction
Linux systemd support
Local AAA Backends
Logging
Management API privilege levels
Namespaces
Password Hashing
Password Rehashing During Login
Probabilistic Sampling
Prometheus and OpenMetrics scraping
PROXY Protocol Support
Radiator server health and boot up logic
Radiator sizing
Radiator software releases
Radiator software security and dependency compliance
RadiatorDB
RadiatorDB Backup
RadiatorDB CLI
RadiatorDB Installation
RadiatorDB PostgreSQL 10k TPS example
RadiatorDB REST API
RadiatorDB sizing
Rate Limiting
Rate Limiting Algorithms
Reverse Dynamic Authorization
Service Level Objective
TACACS+ Authentication, Authorization, and Accounting
Template Rendering CLI
Timestamps
Tools radiator-client
TOTP/HOTP Authentication
What is Radiator?
YubiKey Authentication
YubiKey Context Variables
Application log message index
Architecture Overview
Backend Load Balancing
Basic Installation
Built-in Environment Variables
Byte Size Units
Certificate Revocation Lists
Comparison Operators
Configuration Editor
Configuration Import and Export
Containers
Cron and interval timers
Data Types
Duration Units
Environment Variables
Execution Context
Execution Pipelines
Filters
Getting a Radiator License
Health check /live and /ready
High Availability and Load Balancing
High availability identifiers
HTTP Basic Authentication
Introduction
Linux systemd support
Local AAA Backends
Logging
Management API privilege levels
Namespaces
Password Hashing
Password Rehashing During Login
Probabilistic Sampling
Prometheus and OpenMetrics scraping
PROXY Protocol Support
Radiator server health and boot up logic
Radiator sizing
Radiator software releases
Radiator software security and dependency compliance
RadiatorDB
RadiatorDB Backup
RadiatorDB CLI
RadiatorDB Installation
RadiatorDB PostgreSQL 10k TPS example
RadiatorDB REST API
RadiatorDB sizing
Rate Limiting
Rate Limiting Algorithms
Reverse Dynamic Authorization
Service Level Objective
TACACS+ Authentication, Authorization, and Accounting
Template Rendering CLI
Timestamps
Tools radiator-client
TOTP/HOTP Authentication
What is Radiator?
YubiKey Authentication
YubiKey Context Variables