Radiator Server Documentation — v10.34.0

Prometheus and OpenMetrics scraping

Exposing operational metrics and counters in Prometheus 0.0.4 or OpenMetrics 1.0 text format

Table of Contents
  • 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:

FormatEndpointContent typeUse case
Prometheus text 0.0.4/api/v1/metrics/prometheustext/plain; version=0.0.4; charset=utf-8Existing integrations that use the old format
OpenMetrics text 1.0/api/v1/metrics/openmetricsapplication/openmetrics-text; version=1.0.0; charset=utf-8New 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 with instance_id, optional cluster_id, and process ID.

Process Statistics

  • radiator_process_memory_rss_bytes: resident set size (RSS) memory usage in bytes.
  • radiator_process_cpu_milliseconds_total in Prometheus and radiator_process_cpu_seconds_total in 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_total in Prometheus and radiator_system_cpu_active_seconds_total in OpenMetrics: total active (non-idle) CPU time across all CPUs (Linux only).
  • radiator_system_cpu_total_milliseconds_total in Prometheus and radiator_system_cpu_total_seconds_total in 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 hierarchical namespace label (components joined by ::) and a message label. The namespace follows the pattern server::<transport>::<name> for server-level events, server::<transport>::<name>::policy::<policy>::handler::<handler> for handler-level events, and backend::<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

SymptomLikely causeResolution
401 UnauthorizedMissing or incorrect credentialsConfigure HTTP Basic authentication
403 ForbiddenUser does not have monitor privilegeGrant the user monitor privilege
Scrape protocol or media errorEndpoint and scrape_protocols do not matchUse the endpoint and configuration shown above
Empty or truncated outputNetwork proxy or connection failureRetry with curl -v and inspect server logs
Counters do not incrementNo traffic reaches the handler or policySend traffic through the relevant server

Push gateway (optional)

Use prompush when Prometheus cannot scrape Radiator Server instances directly.

Navigation
  • 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