# Particle Horizon License Extension

<table><caption class="sr-only">Particle Horizon License Extension</caption><thead><tr><th scope="col">Status</th><th scope="col"></th></tr></thead><tbody><tr><td>Stability</td><td>development</td></tr></tbody></table>

The `pho_license` extension loads a signed licence file, validates it locally, and exposes per-component seat counts to proprietary OpenTelemetry Collector components through a shared provider interface.

This extension does not stop the Collector from starting. Invalid, missing, expired, fingerprint-mismatched, signature-invalid, or node-mismatched licences result in an invalid provider state that consuming components can enforce explicitly.

Only the license team’s phocol verification contract is supported. Previously generated legacy licenses that used the older repo-local signing flow will no longer validate and must be reissued.

## Configuration

The following settings are available:

-   `file`: Path to the licence file to load during Collector startup.
-   `inline`: Base64-encoded licence JSON content loaded directly from configuration.

Exactly one of `file` or `inline` must be set.

Example:

```
extensions:
  pho_license:
    file: /etc/otelcol/license.json

service:
  extensions: [pho_license]
```

Inline example:

```
extensions:
  pho_license:
    inline: ${env:PHO_LICENSE_B64}

service:
  extensions: [pho_license]
```

## License File

The extension expects a JSON licence document with the following shape:

```
{
  "customer_id": "001",
  "expires": "1999-12-31T23:59:59Z",
  "license_id": "lic-......",
  "components": {
    "dacs": 10,
    "other_component": 0
  },
  "node_id": {
    "arch": "x86_64",
    "hostname": "phoads01"
  },
  "schema_version": 1,
  "fingerprint": "sha384:license_fingerprint",
  "signature": "base64-signature"
}
```

Positive values under `components` are exposed as licensable seat counts through the provider API. `0` means the component is present in the license but cannot start.
