---
description: Configuration precedence is defaults, YAML, then PL2O environment variables.
  Nested YAML dots become double underscores in environment variables.
---

<!-- Code generated by internal/configdoc; DO NOT EDIT. Run `make regen`. -->

# Configuration and environment reference

Configuration precedence is defaults, YAML, then `PL2O_` environment variables. Nested YAML dots become double underscores in environment variables. Secrets are environment-only: placing a secret key in YAML is rejected before the exporter starts.

| Key | Type | Default | Environment | Secret | Required | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `cardinality.max_devices` | `int` | `500` | `PL2O_CARDINALITY__MAX_DEVICES` | No | Optional | Maximum devices represented by the exporter; must be positive. |
| `collectors.lens_active_calls` | `duration` | `1m0s` | `PL2O_COLLECTORS__LENS_ACTIVE_CALLS` | No | Optional | Polling interval for Lens active calls. |
| `collectors.lens_cdr` | `duration` | `1h0m0s` | `PL2O_COLLECTORS__LENS_CDR` | No | Optional | Polling interval for Lens CDR logs. |
| `collectors.lens_devices` | `duration` | `1m0s` | `PL2O_COLLECTORS__LENS_DEVICES` | No | Optional | Polling interval for Lens device inventory. |
| `collectors.lens_firmware` | `duration` | `24h0m0s` | `PL2O_COLLECTORS__LENS_FIRMWARE` | No | Optional | Polling interval for Lens firmware inventory. |
| `collectors.phone_config` | `duration` | `5m0s` | `PL2O_COLLECTORS__PHONE_CONFIG` | No | Optional | Polling interval for phone configuration. |
| `collectors.phone_lines` | `duration` | `1m0s` | `PL2O_COLLECTORS__PHONE_LINES` | No | Optional | Polling interval for phone lines. |
| `collectors.phone_status` | `duration` | `1m0s` | `PL2O_COLLECTORS__PHONE_STATUS` | No | Optional | Polling interval for phone status. |
| `collectors.selfobs_internal` | `duration` | `1m0s` | `PL2O_COLLECTORS__SELFOBS_INTERNAL` | No | Optional | Emission interval for exporter self-observability. |
| `lens.client_id` | `string` | `` | `PL2O_LENS__CLIENT_ID` | No | Required | OAuth client identifier. |
| `lens.client_secret` | `string` | `` | `PL2O_LENS__CLIENT_SECRET` | Yes (environment only) | Required | OAuth client secret; supply only through the environment. |
| `lens.graphql_url` | `string` | `https://api.silica-prod01.io.lens.poly.com/graphql` | `PL2O_LENS__GRAPHQL_URL` | No | Optional | Poly Lens GraphQL endpoint. |
| `lens.page_size` | `int` | `10` | `PL2O_LENS__PAGE_SIZE` | No | Optional | Lens page size; validation permits 1 through 5000. Keep the value stable across follow-up pages. |
| `lens.request_timeout` | `duration` | `30s` | `PL2O_LENS__REQUEST_TIMEOUT` | No | Optional | Timeout for an individual Lens request. |
| `lens.retry.max_attempts` | `int` | `4` | `PL2O_LENS__RETRY__MAX_ATTEMPTS` | No | Optional | Maximum Lens request attempts, including the first attempt. |
| `lens.retry.max_backoff` | `duration` | `30s` | `PL2O_LENS__RETRY__MAX_BACKOFF` | No | Optional | Maximum Lens retry backoff. |
| `lens.retry.min_backoff` | `duration` | `1s` | `PL2O_LENS__RETRY__MIN_BACKOFF` | No | Optional | Initial Lens retry backoff. |
| `lens.stream.ack_timeout` | `duration` | `10s` | `PL2O_LENS__STREAM__ACK_TIMEOUT` | No | Optional | Time allowed for a deviceStream acknowledgement. |
| `lens.stream.enabled` | `bool` | `true` | `PL2O_LENS__STREAM__ENABLED` | No | Optional | Enable the named deviceStream GraphQL subscription as an edge-triggered supplement to polling. |
| `lens.stream.max_backoff` | `duration` | `1m0s` | `PL2O_LENS__STREAM__MAX_BACKOFF` | No | Optional | Maximum deviceStream reconnect backoff. |
| `lens.stream.min_backoff` | `duration` | `1s` | `PL2O_LENS__STREAM__MIN_BACKOFF` | No | Optional | Initial deviceStream reconnect backoff. |
| `lens.tenants` | `[]string` | `[]` | `PL2O_LENS__TENANTS` | No | Optional | Lens tenant IDs to collect. An empty list discovers tenants through the read-only tenants query. |
| `lens.token_url` | `string` | `https://login.lens.poly.com/oauth/token` | `PL2O_LENS__TOKEN_URL` | No | Optional | OAuth token endpoint for Poly Lens. |
| `lens.websocket_url` | `string` | `wss://api.silica-prod01.io.lens.poly.com/graphql` | `PL2O_LENS__WEBSOCKET_URL` | No | Optional | Poly Lens GraphQL WebSocket endpoint for deviceStream. |
| `log.format` | `string` | `json` | `PL2O_LOG__FORMAT` | No | Optional | Application log encoding. |
| `log.level` | `string` | `info` | `PL2O_LOG__LEVEL` | No | Optional | Application log level. |
| `otlp.endpoint` | `string` | `` | `PL2O_OTLP__ENDPOINT` | No | Required | OTLP collector endpoint. |
| `otlp.export_interval` | `duration` | `15s` | `PL2O_OTLP__EXPORT_INTERVAL` | No | Optional | OTLP metric export interval. |
| `otlp.grafana_cloud.instance_id` | `string` | `` | `PL2O_OTLP__GRAFANA_CLOUD__INSTANCE_ID` | No | Required | Grafana Cloud instance ID. |
| `otlp.grafana_cloud.token` | `string` | `` | `PL2O_OTLP__GRAFANA_CLOUD__TOKEN` | Yes (environment only) | Required | Grafana Cloud access token; supply only through the environment. |
| `otlp.insecure` | `bool` | `false` | `PL2O_OTLP__INSECURE` | No | Optional | Allow an insecure OTLP transport. |
| `otlp.protocol` | `string` | `http` | `PL2O_OTLP__PROTOCOL` | No | Optional | OTLP transport protocol; validation permits http or grpc. |
| `phone.auth.from_lens_policy` | `bool` | `false` | `PL2O_PHONE__AUTH__FROM_LENS_POLICY` | No | Optional | Use phone credentials from Lens policy where supported. |
| `phone.auth.password` | `string` | `` | `PL2O_PHONE__AUTH__PASSWORD` | Yes (environment only) | Required when phone.enabled is true | Digest authentication password; supply only through the environment when phone collection is enabled. |
| `phone.auth.username` | `string` | `Polycom` | `PL2O_PHONE__AUTH__USERNAME` | No | Optional | Digest authentication username; Polycom is the default. |
| `phone.config_params` | `[]string` | `[reg.1.address, reg.2.address, reg.1.label, device.syslog.serverName, tcpIpApp.sntp.address, softkey.1.enable]` | `PL2O_PHONE__CONFIG_PARAMS` | No | Optional | Read-only phone configuration parameters requested by the phone config collector. |
| `phone.enabled` | `bool` | `true` | `PL2O_PHONE__ENABLED` | No | Optional | Enable phone REST collectors. When enabled, phone.auth.password is required. |
| `phone.request_timeout` | `duration` | `15s` | `PL2O_PHONE__REQUEST_TIMEOUT` | No | Optional | Timeout for an individual phone REST request. |
| `phone.targets` | `map[string]string` | `{}` | `PL2O_PHONE__TARGETS` | No | Optional | Static per-device targets. Each <device-id> overrides that device's Lens internalIp; discovery never scans. |
| `phone.tls.ca_file` | `string` | `` | `PL2O_PHONE__TLS__CA_FILE` | No | Optional | Optional CA certificate file for phone TLS verification. The certificate CN must match the Lens MAC before credentials are sent. |
| `phone.tls.verify_chain` | `bool` | `false` | `PL2O_PHONE__TLS__VERIFY_CHAIN` | No | Optional | Verify the phone TLS certificate chain. |
| `profiling.pyroscope.application` | `string` | `polylens2otel` | `PL2O_PROFILING__PYROSCOPE__APPLICATION` | No | Optional | Pyroscope application name. |
| `profiling.pyroscope.basic_auth_password` | `string` | `` | `PL2O_PROFILING__PYROSCOPE__BASIC_AUTH_PASSWORD` | Yes (environment only) | Optional | Pyroscope basic-auth password; supply only through the environment. |
| `profiling.pyroscope.basic_auth_user` | `string` | `` | `PL2O_PROFILING__PYROSCOPE__BASIC_AUTH_USER` | No | Optional | Pyroscope basic-auth username. |
| `profiling.pyroscope.endpoint` | `string` | `` | `PL2O_PROFILING__PYROSCOPE__ENDPOINT` | No | Optional | Pyroscope endpoint. Empty leaves profiling endpoint unset. |
| `state.dir` | `string` | `/var/lib/polylens2otel` | `PL2O_STATE__DIR` | No | Required | Directory for durable collector state; required and must be writable by the exporter. |

## Static phone targets

`phone.targets` is a YAML map of device IDs to DNS names or addresses. It is an explicit override for Lens `internalIp`; no LAN discovery or scanning occurs. Use a device ID that identifies the Lens device, and ensure the phone certificate CN matches that device's Lens MAC before credentials are sent.

```yaml
phone:
  targets:
    <device-id>: phone.example.invalid
```

## Secret environment variables

Set required secrets through the process environment, never in YAML: `PL2O_LENS__CLIENT_SECRET`, `PL2O_PHONE__AUTH__PASSWORD` (when phones are enabled), `PL2O_OTLP__GRAFANA_CLOUD__TOKEN`, and `PL2O_PROFILING__PYROSCOPE__BASIC_AUTH_PASSWORD` when Pyroscope authentication is used.
