Operations & contracts
IoT telemetry contract
Device inventory in Owlpane is matched to telemetry by stable ids on logs (and optionally metrics). There is no separate IoT wire protocol — use OTLP with project ingest keys, same as any other service.
Required attributes
| Attribute | Description |
|---|---|
owlpane.device.id | Stable device id (must match registered inventory) |
owlpane.device_fleet.id | Fleet slug or id from Observability → Device fleets |
Recommended attributes
| Attribute | Description |
|---|---|
owlpane.device.gateway_id | Edge gateway grouping |
owlpane.device.firmware_version | Firmware cohort analysis |
owlpane.device.class | Device class (stale thresholds) |
Ingest aliases (normalized at gateway)
On POST /v1/logs, the ingest gateway maps compatible keys before storage:
| Incoming | Stored as |
|---|---|
device.id | owlpane.device.id |
fleet.id or device.fleet.id | owlpane.device_fleet.id |
device.class | owlpane.device.class |
firmware.version | owlpane.device.firmware_version |
gateway.id | owlpane.device.gateway_id |
Requires ingest 0.1.1+.
Node.js SDK
import { owlpane, setDeviceContext, emitDeviceLog } from "@owlpane/node";
owlpane.start({ service: "my-device", ingestKey: process.env.OWLPANE_INGEST_KEY });
setDeviceContext({ deviceId: "d-1", fleetId: "lab-fleet" });
await emitDeviceLog("heartbeat");Install @owlpane/node@0.1.8 (or 0.1.7+ for Node setDeviceContext) from npm. Python/Go context helpers need 0.1.8+ from their public packages.
Scorecard
From the console device detail or POST /v1/orgs/:orgId/device-fleets/:fleetId/devices/:deviceRowId/scorecard/run. Checks connectivity, required attributes in ClickHouse, and freshness vs expected_report_interval_seconds.
Last updated