Events are exported as OTLP logs. Kernel appends
/v1/logs to your endpoint and doesn’t send traces or metrics, so set the destination up as a log source in your backend.How export works
You create a destination - an OTLP/HTTP endpoint plus the headers your backend expects - and select it when you create a browser. Destinations belong to your organization, so a browser in any project can export to them. Kernel’s relay forwards the session’s events to the destination and attaches your headers at export time. Headers are encrypted at rest and never reach the browser VM, so a session can export to your backend without ever holding your ingestion key.Create a destination
Pass the base endpoint of your collector and the headers it expects. This example exports to Honeycomb:403. Project-scoped keys can still list and retrieve destinations, and select one when creating a browser.
Header values are write-only. API, SDK, and CLI responses show each header name with an empty value, and the dashboard shows only header names: to change a stored value there, enter a replacement, or leave the field blank to keep the current value.
An organization can have up to 50 destinations. Names must match ^[a-zA-Z0-9._-]{1,255}$, must be unique within the organization, and can’t look like a Kernel ID. A destination can have up to 32 headers, with names and values totaling at most 8,192 bytes.
Endpoint rules
The endpoint is your collector’s base URL, without an OTLP signal path. Kernel appends the signal path itself, so passhttps://api.honeycomb.io, not https://api.honeycomb.io/v1/logs. An endpoint that ends in /v1/logs, /v1/traces, or /v1/metrics is rejected. For a self-hosted OpenTelemetry Collector, use the address of its OTLP/HTTP receiver, such as https://collector.example.com:4318.
The endpoint must also:
- Use
httporhttps - Resolve to a public IP address
- Have no query string or fragment
- Be 2,048 characters or fewer
destination returned a redirect, so use the final URL.
Export a session’s telemetry
Settelemetry.export.otlp.destination when you create the browser, referencing the destination by name or id:
enabled: true or a category list alongside the destination; otherwise the request fails with telemetry.export.otlp.destination requires telemetry capture to be enabled. On kernel browsers create, the CLI implies --telemetry=all when you pass a destination with --telemetry-export-otlp without --telemetry.
Provide exactly one of id or name. Setting a destination turns export on, so you don’t need to pass enabled: true under otlp, and combining a destination with enabled: false is rejected.
Every captured category is exported except screenshot and monitor, whose events stay available through streaming.
What arrives in your backend
Each event becomes one OTLP log record:- The record’s event name is the event type, such as
network_responseorconsole_error. It’s also set as thekernel.event.typeattribute, because some backends drop the event name. kernel.event.categoryholds the category, andkernel.event.seqholds the same sequence number the stream uses.- The body is the event’s payload.
- Network events also carry
http.request.method,url.full, andhttp.response.status_codewhen the payload has them, and console events carrykernel.console.level, so you can filter on them in backends that don’t index a structured body. - The resource’s
service.nameiskernel-browser.
Confirm export is working
To confirm a browser’s events reach your backend, generate an event you can recognize and search for it. Exported records don’t carry the browser’s session ID, so this example has the page log a marker that includes it:kernel-export-check followed by the session ID. It arrives as a console_log record whose body’s text field holds the marker. This relies on the browser capturing console; if it doesn’t, generate an event from a category it does capture.
If the record doesn’t arrive, check the browser and the destination. Browser responses report the session’s export state under telemetry.export.otlp. When the session is exporting, enabled is true and destination is the ID of the destination it’s bound to:
last_export_atis the time of the last successful delivery. While deliveries keep succeeding, it’s refreshed about once a minute rather than on every export.consecutive_failuresis0when the most recent recorded delivery succeeded. Read this field to tell whether the destination is failing right now.last_errorandlast_error_atdescribe the most recent failure and are kept after the destination recovers, so their presence alone doesn’t mean exports are failing.
last_error is a fixed message for the class of failure, such as destination returned a 4xx response or destination TLS handshake failed. Response bodies, endpoint URLs, and credentials are never returned.
Health only reflects deliveries Kernel attempted. If telemetry.export.otlp shows the browser is exporting, consecutive_failures is 0, and your marker still hasn’t arrived after a minute, contact support with the session ID.
Rotate credentials
Update the destination’s headers. Updates merge header by header rather than replacing the whole set, and sessions that are already exporting use the new values on their next export request, so you can rotate a key without restarting sessions:authorization replaces a stored Authorization instead of adding a second header. Set a header to null (None in Python, or --remove-header in the CLI) to delete it. Headers you don’t name keep their current values.
Managed auth connections
Managed auth logins run in a browser too, so they can export the same way. Setbrowser.telemetry with an export block when you create or update a connection, or on a single login, using the same shape as browser create:
browser.telemetry block on update or login replaces the connection’s stored telemetry config instead of merging into it, so include the categories you want captured along with the export block. On login, the block applies to that login only, and the connection keeps its stored config:
kernel auth connections updatetakes the same flags aslogin.- On connection create, passing a destination implies
--telemetry=allif you omit--telemetry. - When selecting a destination on update or login, you must pass
--telemetryin the same command, even if the connection already has capture enabled. This keeps the CLI from replacing your category selection with the default set.
Delete a destination
409 while it’s still in use:
- A browser session created with it hasn’t ended. Wait for those sessions to end or delete them, then retry.
- A managed auth connection selects it. Point the connection at another destination or turn off its export first.
- A managed auth login using it is still in progress. Wait for the login to finish.
What’s next
- Telemetry Overview - enable capture and choose what a session records.
- Categories - every category, what it captures, and its cost characteristics.
- Stream Telemetry - consume the live stream instead of, or alongside, exporting.