Support per-signal OTLP exporter endpoints for Hyperdx internal telemetry#2098
Support per-signal OTLP exporter endpoints for Hyperdx internal telemetry#2098vinzee wants to merge 1 commit intohyperdxio:mainfrom
Conversation
|
@vinzee is attempting to deploy a commit to the HyperDX Team on Vercel. A member of the Team first needs to authorize it. |
🦋 Changeset detectedLatest commit: 6904bd7 The changes in this PR will be included in the next version bump. This PR includes changesets to release 3 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
PR ReviewPR #2098 — Support per-signal OTLP exporter endpoints for HyperDX internal telemetry
✅ The core logic is correct: the fallback chain ( |
a7c35a8 to
e965f04
Compare
e965f04 to
6a2a41c
Compare
|
Hi @vinzee - thanks for the PR! This is a good idea. I think it would be better to update hyperdx-js directly to support this feature rather than re-implementing it here. |
🟡 Tier 3 — StandardIntroduces new logic, modifies core functionality, or touches areas with non-trivial risk. Why this tier:
Review process: Full human review — logic, architecture, edge cases. Stats
|
Add optional `tracesUrl` and `logsUrl` config options to allow
independent configuration of trace and log export endpoints. When
omitted, the existing `${url}/v1/traces` and `${url}/v1/logs`
fallback behavior is preserved.
Refs: hyperdxio/hyperdx#2076, hyperdxio/hyperdx#2098
Made-with: Cursor
|
@karl-power created a PR for hyperdx-js. Will update this PR once the other one gets merged. |
Add optional `tracesUrl` and `logsUrl` config options to allow
independent configuration of trace and log export endpoints. When
omitted, the existing `${url}/v1/traces` and `${url}/v1/logs`
fallback behavior is preserved.
Refs: hyperdxio/hyperdx#2076, hyperdxio/hyperdx#2098
Made-with: Cursor
|
@karl-power I dont see a new release for @hyperdx/browser having the changes from hyperdxio/hyperdx-js#234. would it possible to trigger a release manually? Not sure if that is automated. Thanks |
Hi @vinzee Our release workflow was broken. I merged a PR to fix. Will get a release out ASAP. |
|
@vinzee The release it out! Thanks for your patience 🙏🏻 |
|
@karl-power seems like I was able to test it locally by changing |
6a2a41c to
a3171b2
Compare
0929059 to
e69b147
Compare
|
@karl-power rebased with master and clean up the diff. Please review whenever you get a chance. thanks! |
karl-power
left a comment
There was a problem hiding this comment.
Thanks @vinzee - looks good! Can you run yarn up @hyperdx/browser to bump it to 0.22.1
…ered options (hyperdxio#2015) Merges the separate "section" and "group" container types into a single **DashboardContainer** concept with configurable options: - **Collapsible** (optional, default true) — chevron toggle with URL-based collapse state - **Bordered** (optional, default true) — visual border around the container - **Tabbed** (optional) — add tabs to any container; tab bar appears with 2+ tabs. Active tab is per-viewer via URL state. - **Alert indicators** — red dot on tabs (multi-tab groups) and on the group header (plain/collapsed) when a tile is in `AlertState.ALERT`, so an alerting group is visible at a glance even when the alerting tile is below the fold This addresses the UX concern from hyperdxio#1972 that "section" and "group" are near-synonyms that force users to choose between two similar concepts. **Dashboard with groups and tabs (expanded):**  **Overflow menu (Add Tab, Collapse, Border, Delete):**  **Collapsed with pipe-separated tab names (Overview | Latency | Errors):**  | Area | What to review | |------|----------------| | **Schema** — `types.ts` | new optional fields (`tabs`, `collapsible`, `bordered`, `activeTabId`, `tabId`); `type` discriminator removed | | **DnD infrastructure** | `DashboardDndContext.tsx`, `DashboardDndComponents.tsx`: sortable wrappers, drag handle | | **`DashboardContainer`** | `DashboardContainer.tsx` + `GroupTabBar.tsx`: unified component with tabs, collapse, borders, alerts, a11y | | **Hooks** | `useDashboardContainers.tsx`: container/tab CRUD. `useTileSelection.ts`: multi-select + Cmd+G (auto-deletes emptied source containers) | | **Dashboard page** | `DBDashboardPage.tsx`: wiring, alert computation, DnD, tile positioning, URL-based active-tab + collapse state | | **Tests** | `DashboardContainer.test.tsx`, `useDashboardContainers.test.tsx`, `useTileSelection.test.tsx`, `dashboardSections.test.tsx` | - **No `type` discriminator** — containers are defined by properties. Extensible via additional fields later (e.g., planned variable-repeat feature could add `repeat: { filterId; as: 'tabs' \| 'sections' }` cleanly onto the same container). - **Collapsed label** — pipe-separated tab names (max 4 + "…"), not dot-separated, no duplicate header. - **Alert indicators** — red dot on tabs with `AlertState.ALERT` tiles. Also shown at the group-header level when no tab bar is rendered (plain/collapsed), so a single alerting tile in a large dashboard isn't hidden. - **Accessibility** — chevron has role/tabIndex/aria-expanded/onKeyDown. Hidden controls removed from tab order. - **Per-viewer UI state via URL** — collapse/expand and active-tab are per-viewer (URL), falling back to DB defaults. Switching tabs in your browser doesn't affect another viewer's session. - **Tab delete confirmation** — deleting a tab with tiles opens a 3-button modal: Cancel / Move Tiles to [first remaining tab] / Delete Tab & Tiles. Destructive option is the red primary. - **Group delete confirmation** — deleting a group with tiles opens a 3-button modal: Cancel / Ungroup Tiles / Delete Group & Tiles. Ungroup preserves tiles as top-level; Delete removes them. Works consistently for plain groups, legacy sections, and multi-tab groups (all tiles across all tabs are handled). - Dashboards without containers render as before - Old `type: 'section'` containers parse successfully (Zod strips extra field) - New optional fields (`collapsible`, `bordered`, `tabs`, `activeTabId`, `tabId`) — `undefined` treated as defaults - No Mongoose migration needed: the `containers` field is a schemaless `Schema.Types.Array`; all validation happens at the Zod layer - Covered by tests: `useDashboardContainers.test.tsx` "legacy dashboard upgrade path" and `dashboardSections.test.tsx:273` "old dashboards with type field still parse" - ✅ Semantic tokens everywhere (replaced raw Mantine color tokens) - ✅ Mantine components over raw HTML / `style` props - ✅ Component decomposition — `GroupTabBar` extracted from the main component; `DashboardContainerRow` extracted from inline render in `DBDashboardPage` - ✅ Accessibility — chevron a11y, hidden controls removed from tab order - ✅ URL state for per-viewer UI (`activeTabId` + collapse/expand) — the only non-structural `setDashboard` call migrated off the server - ✅ Renamed `GroupContainer` → `DashboardContainer` to match the schema type - ✅ Auto-delete emptied source containers after Cmd+G regrouping - ✅ 3-option prompt for group delete (Cancel / Ungroup Tiles / Delete Group & Tiles) - ✅ Alert dot now appears on expanded plain/single-tab group headers (previously only on collapsed) - ✅ Fix: spurious `setDashboard` on every tile drag in multi-tab containers (layout handler was built with all-tab tiles but RGL only renders visible-tab tiles) - ✅ Take viewer to newly-created tab after Add Tab (clears stale URL override) - ✅ Removed redundant WHAT-style comments; kept WHY / invariant comments - ✅ Removed dead API surface (unused `handleToggleCollapsed` export from the hook) - ✅ Documented the `:` separator invariant in the `activeTabs` URL param - [x] 1515 app unit tests pass - [x] 745 common-utils unit tests pass - [x] ESLint clean across all packages (`make ci-lint`) - [x] TypeScript clean (app, common-utils, api) - [x] Changeset included - [x] Verified on Vercel preview Builds on hyperdxio#1972
e69b147 to
6904bd7
Compare
|
@karl-power bumped it to 0.22.1 ✅ |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Summary
This change allows for more granular control over OpenTelemetry data routing by enabling independent configuration of traces, metrics, and logs endpoints. This is particularly useful for complex networking environments or when using different backends for different telemetry types.
Additionally, the browser instrumentation has been updated to a local wrapper to better manage these signal-specific configurations and improve internal consistency.
How to test locally or on Vercel
1. Verify default behavior (no per-signal env vars set)
curl http://localhost:8080/api/config | jq .-- verifycollectorUrlis present andcollectorTracesUrl/collectorMetricsUrl/collectorLogsUrlare absent (undefined values are omitted from JSON).2. Verify per-signal env vars are exposed via the config API
curl http://localhost:8080/api/config | jq .-- confirmcollectorTracesUrlandcollectorLogsUrlnow appear with the values set above.3. Verify browser telemetry routes to separate endpoints
v1/tracesandv1/logs. Confirm trace exports hit:4318and session replay log exports hit:4319.4. Verify server-side Node.js telemetry (API + Next.js server)
@hyperdx/node-opentelemetrynatively reads per-signal env vars. Set them and start:References