railwatch 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/app/frontend/components/app-content.tsx +26 -0
- data/app/frontend/components/app-logo-icon.tsx +23 -0
- data/app/frontend/components/app-logo.tsx +14 -0
- data/app/frontend/components/app-shell.tsx +38 -0
- data/app/frontend/components/app-sidebar-header.tsx +54 -0
- data/app/frontend/components/app-sidebar.tsx +94 -0
- data/app/frontend/components/app-wordmark.tsx +29 -0
- data/app/frontend/components/breadcrumbs.tsx +46 -0
- data/app/frontend/components/icon.tsx +16 -0
- data/app/frontend/components/input-error.tsx +18 -0
- data/app/frontend/components/nav-footer.tsx +46 -0
- data/app/frontend/components/nav-main.tsx +41 -0
- data/app/frontend/components/nav-user.tsx +50 -0
- data/app/frontend/components/railwatch/chart-hover.tsx +34 -0
- data/app/frontend/components/railwatch/chart-panel.tsx +170 -0
- data/app/frontend/components/railwatch/code.tsx +28 -0
- data/app/frontend/components/railwatch/command-palette.tsx +132 -0
- data/app/frontend/components/railwatch/copy-block.tsx +52 -0
- data/app/frontend/components/railwatch/copy-id.tsx +49 -0
- data/app/frontend/components/railwatch/cursor-load-more.tsx +39 -0
- data/app/frontend/components/railwatch/data-table.tsx +195 -0
- data/app/frontend/components/railwatch/digit-roll.tsx +312 -0
- data/app/frontend/components/railwatch/empty-state.tsx +159 -0
- data/app/frontend/components/railwatch/env-nav.tsx +130 -0
- data/app/frontend/components/railwatch/env-switcher.tsx +145 -0
- data/app/frontend/components/railwatch/filter-bar.tsx +153 -0
- data/app/frontend/components/railwatch/flamegraph.tsx +324 -0
- data/app/frontend/components/railwatch/frames.tsx +295 -0
- data/app/frontend/components/railwatch/json-viewer.tsx +159 -0
- data/app/frontend/components/railwatch/live-dot.tsx +78 -0
- data/app/frontend/components/railwatch/live-toggle.tsx +76 -0
- data/app/frontend/components/railwatch/metric-chart.tsx +112 -0
- data/app/frontend/components/railwatch/mobile-page-switcher.tsx +89 -0
- data/app/frontend/components/railwatch/onboarding.tsx +91 -0
- data/app/frontend/components/railwatch/origin-identity.tsx +84 -0
- data/app/frontend/components/railwatch/page-header.tsx +42 -0
- data/app/frontend/components/railwatch/percentile-picker.tsx +18 -0
- data/app/frontend/components/railwatch/relative-time.tsx +18 -0
- data/app/frontend/components/railwatch/saved-views.tsx +232 -0
- data/app/frontend/components/railwatch/segmented.tsx +64 -0
- data/app/frontend/components/railwatch/series-chart.tsx +400 -0
- data/app/frontend/components/railwatch/shortcuts-dialog.tsx +89 -0
- data/app/frontend/components/railwatch/signal-toast.tsx +121 -0
- data/app/frontend/components/railwatch/sort-header.tsx +37 -0
- data/app/frontend/components/railwatch/source-link.tsx +57 -0
- data/app/frontend/components/railwatch/sparkline-cell.tsx +14 -0
- data/app/frontend/components/railwatch/sql-block.tsx +116 -0
- data/app/frontend/components/railwatch/stat.tsx +173 -0
- data/app/frontend/components/railwatch/status-badge.tsx +79 -0
- data/app/frontend/components/railwatch/step-picker.tsx +57 -0
- data/app/frontend/components/railwatch/timeline.tsx +405 -0
- data/app/frontend/components/railwatch/utilisation-bar.tsx +44 -0
- data/app/frontend/components/railwatch/window-picker.tsx +147 -0
- data/app/frontend/components/ui/avatar.tsx +51 -0
- data/app/frontend/components/ui/badge.tsx +46 -0
- data/app/frontend/components/ui/breadcrumb.tsx +109 -0
- data/app/frontend/components/ui/button.tsx +60 -0
- data/app/frontend/components/ui/card.tsx +92 -0
- data/app/frontend/components/ui/chart.tsx +374 -0
- data/app/frontend/components/ui/checkbox.tsx +32 -0
- data/app/frontend/components/ui/collapsible.tsx +31 -0
- data/app/frontend/components/ui/command.tsx +182 -0
- data/app/frontend/components/ui/dialog.tsx +158 -0
- data/app/frontend/components/ui/dropdown-menu.tsx +255 -0
- data/app/frontend/components/ui/hover-card.tsx +42 -0
- data/app/frontend/components/ui/input.tsx +21 -0
- data/app/frontend/components/ui/label.tsx +24 -0
- data/app/frontend/components/ui/popover.tsx +87 -0
- data/app/frontend/components/ui/select.tsx +185 -0
- data/app/frontend/components/ui/separator.tsx +28 -0
- data/app/frontend/components/ui/sheet.tsx +137 -0
- data/app/frontend/components/ui/sidebar.tsx +726 -0
- data/app/frontend/components/ui/skeleton.tsx +13 -0
- data/app/frontend/components/ui/sonner.tsx +41 -0
- data/app/frontend/components/ui/table.tsx +114 -0
- data/app/frontend/components/ui/tabs.tsx +91 -0
- data/app/frontend/components/ui/textarea.tsx +18 -0
- data/app/frontend/components/ui/tooltip.tsx +61 -0
- data/app/frontend/components/user-info.tsx +32 -0
- data/app/frontend/components/user-menu-content.tsx +94 -0
- data/app/frontend/entrypoints/application.css +244 -0
- data/app/frontend/entrypoints/inertia.tsx +95 -0
- data/app/frontend/fonts/CommitMono-Bold.woff2 +0 -0
- data/app/frontend/fonts/CommitMono-Regular.woff2 +0 -0
- data/app/frontend/fonts/Roboto-Black.woff2 +0 -0
- data/app/frontend/fonts/Roboto-Bold.woff2 +0 -0
- data/app/frontend/fonts/Roboto-Medium.woff2 +0 -0
- data/app/frontend/fonts/Roboto-Regular.woff2 +0 -0
- data/app/frontend/hooks/use-appearance.tsx +67 -0
- data/app/frontend/hooks/use-clipboard.ts +32 -0
- data/app/frontend/hooks/use-flash.tsx +23 -0
- data/app/frontend/hooks/use-hotkeys.ts +63 -0
- data/app/frontend/hooks/use-initials.tsx +15 -0
- data/app/frontend/hooks/use-live.ts +179 -0
- data/app/frontend/hooks/use-mobile-navigation.ts +8 -0
- data/app/frontend/hooks/use-mobile.ts +21 -0
- data/app/frontend/hooks/use-percentile.ts +24 -0
- data/app/frontend/hooks/use-reduced-motion.ts +25 -0
- data/app/frontend/hooks/use-row-nav.ts +106 -0
- data/app/frontend/hooks/use-step.ts +27 -0
- data/app/frontend/hooks/use-ticker.ts +12 -0
- data/app/frontend/hooks/use-window.ts +58 -0
- data/app/frontend/layouts/app/app-sidebar-layout.tsx +107 -0
- data/app/frontend/layouts/app-layout.tsx +21 -0
- data/app/frontend/layouts/env-layout.tsx +53 -0
- data/app/frontend/layouts/persistent-layout.tsx +18 -0
- data/app/frontend/lib/cable.ts +10 -0
- data/app/frontend/lib/env-pages.ts +236 -0
- data/app/frontend/lib/execution-path.ts +55 -0
- data/app/frontend/lib/explain.ts +50 -0
- data/app/frontend/lib/filter.ts +25 -0
- data/app/frontend/lib/flamegraph.ts +155 -0
- data/app/frontend/lib/format.ts +71 -0
- data/app/frontend/lib/keyboard.ts +18 -0
- data/app/frontend/lib/source-link.ts +217 -0
- data/app/frontend/lib/utils.ts +6 -0
- data/app/frontend/pages/alerts/index.tsx +171 -0
- data/app/frontend/pages/broadcasts/index.tsx +171 -0
- data/app/frontend/pages/cache_events/index.tsx +127 -0
- data/app/frontend/pages/commands/index.tsx +143 -0
- data/app/frontend/pages/deploys/index.tsx +94 -0
- data/app/frontend/pages/deploys/show.tsx +309 -0
- data/app/frontend/pages/deprecations/index.tsx +176 -0
- data/app/frontend/pages/exceptions/index.tsx +271 -0
- data/app/frontend/pages/executions/show.tsx +821 -0
- data/app/frontend/pages/issues/index.tsx +399 -0
- data/app/frontend/pages/issues/show.tsx +1367 -0
- data/app/frontend/pages/jobs/index.tsx +381 -0
- data/app/frontend/pages/jobs/klass.tsx +215 -0
- data/app/frontend/pages/llm_calls/index.tsx +664 -0
- data/app/frontend/pages/logs/index.tsx +303 -0
- data/app/frontend/pages/mails/index.tsx +218 -0
- data/app/frontend/pages/notifications/index.tsx +161 -0
- data/app/frontend/pages/outgoing_requests/index.tsx +309 -0
- data/app/frontend/pages/overview/show.tsx +333 -0
- data/app/frontend/pages/people/index.tsx +102 -0
- data/app/frontend/pages/people/show.tsx +149 -0
- data/app/frontend/pages/processes/index.tsx +335 -0
- data/app/frontend/pages/profiles/index.tsx +110 -0
- data/app/frontend/pages/profiles/show.tsx +105 -0
- data/app/frontend/pages/queries/index.tsx +492 -0
- data/app/frontend/pages/queries/show.tsx +276 -0
- data/app/frontend/pages/releases/index.tsx +190 -0
- data/app/frontend/pages/releases/release-health.tsx +68 -0
- data/app/frontend/pages/releases/release-path.ts +25 -0
- data/app/frontend/pages/releases/show.tsx +262 -0
- data/app/frontend/pages/requests/index.tsx +235 -0
- data/app/frontend/pages/requests/route.tsx +159 -0
- data/app/frontend/pages/scheduled_tasks/index.tsx +220 -0
- data/app/frontend/pages/spans/index.tsx +229 -0
- data/app/frontend/pages/spans/show.tsx +220 -0
- data/app/frontend/pages/storage_ops/index.tsx +150 -0
- data/app/frontend/pages/tenants/index.tsx +236 -0
- data/app/frontend/pages/tenants/show.tsx +477 -0
- data/app/frontend/pages/tenants/tenant-path.ts +26 -0
- data/app/frontend/pages/thresholds/index.tsx +414 -0
- data/app/frontend/pages/traces/show.tsx +208 -0
- data/app/frontend/pages/transactions/index.tsx +220 -0
- data/app/frontend/pages/view_renders/index.tsx +241 -0
- data/app/frontend/pages/visits/index.tsx +321 -0
- data/app/frontend/public/icon.png +0 -0
- data/app/frontend/public/icon.svg +5 -0
- data/app/frontend/routes/index.d.ts +2136 -0
- data/app/frontend/routes/index.js +2112 -0
- data/app/frontend/types/globals.d.ts +9 -0
- data/app/frontend/types/index.ts +288 -0
- data/app/frontend/types/vite-env.d.ts +9 -0
- data/lib/railwatch/version.rb +1 -1
- data/lib/railwatch.rb +8 -3
- data/public/railwatch/assets/app-layout-LvxN9xSS.js +41 -0
- data/public/railwatch/assets/application-Cc5v_Vk9.css +1 -0
- data/public/railwatch/assets/{arrow-up-CLQ-7heQ.js → arrow-up-DG01k9AL.js} +1 -1
- data/public/railwatch/assets/{braces-rSYydpLY.js → braces-C3w7pfxS.js} +1 -1
- data/public/railwatch/assets/{card-DPjFKfen.js → card-Dpwlr0uY.js} +1 -1
- data/public/railwatch/assets/{chart-DWh7l8yM.js → chart-DJHv3R7W.js} +1 -1
- data/public/railwatch/assets/{chart-hover-CfoZUY4J.js → chart-hover-CEH-DtXO.js} +1 -1
- data/public/railwatch/assets/{chart-panel-CC49WTQL.js → chart-panel-CUdIzJvk.js} +1 -1
- data/public/railwatch/assets/code-BRZprwun.js +1 -0
- data/public/railwatch/assets/copy-id-CwhGGiwF.js +1 -0
- data/public/railwatch/assets/cursor-load-more-uF1_955Q.js +1 -0
- data/public/railwatch/assets/data-table-DYi-N0hm.js +1 -0
- data/public/railwatch/assets/env-layout-HdcOaPPX.js +1 -0
- data/public/railwatch/assets/{execution-path-FAuIzOXB.js → execution-path-CElXXFO_.js} +1 -1
- data/public/railwatch/assets/filter-bar-DEv0G_34.js +1 -0
- data/public/railwatch/assets/{flamegraph-EaGkP2NT.js → flamegraph-SKD9yxW9.js} +2 -2
- data/public/railwatch/assets/frames-CUpyJQDy.js +1 -0
- data/public/railwatch/assets/index-2W-ppwap.js +1 -0
- data/public/railwatch/assets/index-74ocuU5d.js +1 -0
- data/public/railwatch/assets/{index-C8Cggnbw.js → index-B8NA62Lz.js} +2 -2
- data/public/railwatch/assets/index-BBCEkLqp.js +1 -0
- data/public/railwatch/assets/index-BDcglJzX.js +1 -0
- data/public/railwatch/assets/index-B_KFb9LS.js +1 -0
- data/public/railwatch/assets/index-BqK_VKom.js +1 -0
- data/public/railwatch/assets/index-BxCXBHP2.js +1 -0
- data/public/railwatch/assets/index-C1jc1OoH.js +1 -0
- data/public/railwatch/assets/index-C7zREldp.js +1 -0
- data/public/railwatch/assets/index-CEetm4oC.js +1 -0
- data/public/railwatch/assets/index-CIaZkokF.js +1 -0
- data/public/railwatch/assets/index-CNH85TZp.js +1 -0
- data/public/railwatch/assets/index-Ce4SB5AB.js +1 -0
- data/public/railwatch/assets/index-CiRMSYMn.js +1 -0
- data/public/railwatch/assets/index-CjxXgOs-.js +1 -0
- data/public/railwatch/assets/index-ClL-PYEV.js +1 -0
- data/public/railwatch/assets/index-CteZ6fop.js +1 -0
- data/public/railwatch/assets/index-CvqfEExO.js +1 -0
- data/public/railwatch/assets/index-CxTLT-Qh.js +1 -0
- data/public/railwatch/assets/index-DJd3OUSd.js +1 -0
- data/public/railwatch/assets/index-DPD-rLp6.js +1 -0
- data/public/railwatch/assets/index-DYK_dps4.js +1 -0
- data/public/railwatch/assets/index-DrayARrI.js +1 -0
- data/public/railwatch/assets/index-HRXGir-0.js +1 -0
- data/public/railwatch/assets/index-UJOUALr_.js +1 -0
- data/public/railwatch/assets/index-d-3J7gQ5.js +1 -0
- data/public/railwatch/assets/index-oQrvBpOm.js +1 -0
- data/public/railwatch/assets/inertia-FoqYZAk8.js +97 -0
- data/public/railwatch/assets/json-viewer-CxqMojEm.js +1 -0
- data/public/railwatch/assets/klass-DEF-Vat5.js +1 -0
- data/public/railwatch/assets/origin-identity-Y6gvfQVR.js +1 -0
- data/public/railwatch/assets/{percentile-picker-CeQgllxD.js → percentile-picker-E2aUdLxx.js} +1 -1
- data/public/railwatch/assets/relative-time-DcJbkKlN.js +1 -0
- data/public/railwatch/assets/{release-health-uP-GF3_V.js → release-health-C8WSCDKD.js} +1 -1
- data/public/railwatch/assets/route-qO5vX1p-.js +1 -0
- data/public/railwatch/assets/{segmented-BeIe4uqk.js → segmented-BWee8uc9.js} +1 -1
- data/public/railwatch/assets/select-G7rNBzv0.js +1 -0
- data/public/railwatch/assets/series-chart-C5nXIUc5.js +1 -0
- data/public/railwatch/assets/show-BEWisLQw.js +1 -0
- data/public/railwatch/assets/show-BEa9PGu1.js +2 -0
- data/public/railwatch/assets/{show-YsNpqbcI.js → show-BiT_Aloc.js} +3 -3
- data/public/railwatch/assets/show-BpCO49d3.js +1 -0
- data/public/railwatch/assets/show-CH7yxt7R.js +1 -0
- data/public/railwatch/assets/show-CTO8Lvd2.js +1 -0
- data/public/railwatch/assets/show-DnYsDMUt.js +2 -0
- data/public/railwatch/assets/show-DyzHM527.js +1 -0
- data/public/railwatch/assets/show-Nfpxs8su.js +1 -0
- data/public/railwatch/assets/show-ddjUMo9G.js +1 -0
- data/public/railwatch/assets/show-ksjbSzDH.js +1 -0
- data/public/railwatch/assets/{sort-header-mEJUM3Av.js → sort-header-uOq5VlrB.js} +1 -1
- data/public/railwatch/assets/{sparkline-cell-Dwg7awwh.js → sparkline-cell-DgGij0cu.js} +1 -1
- data/public/railwatch/assets/stat-BTzNKTm2.js +1 -0
- data/public/railwatch/assets/status-badge-BDkOXa-C.js +1 -0
- data/public/railwatch/assets/{tenant-path-CQoP-BeF.js → tenant-path-DU0ezKSU.js} +1 -1
- data/public/railwatch/assets/{use-clipboard-DNefo-ky.js → use-clipboard-DoENmlWY.js} +1 -1
- data/public/railwatch/assets/{use-live-DMTuhKfB.js → use-live-CE_fN5_6.js} +1 -1
- data/public/railwatch/manifest.json +612 -1591
- metadata +242 -117
- data/public/railwatch/assets/app-layout-Zc0v-hYh.js +0 -1
- data/public/railwatch/assets/app-wordmark-BA_60AVb.js +0 -1
- data/public/railwatch/assets/appearance-CcfP9tZ7.js +0 -1
- data/public/railwatch/assets/application-BrN3Sz94.css +0 -1
- data/public/railwatch/assets/auth-layout-C05gEBIQ.js +0 -1
- data/public/railwatch/assets/badge-DRae8XwK.js +0 -1
- data/public/railwatch/assets/checkbox-DPkLUiwM.js +0 -1
- data/public/railwatch/assets/code-CLmYS6FU.js +0 -1
- data/public/railwatch/assets/copy-DaQMJWoT.js +0 -1
- data/public/railwatch/assets/copy-block-CGcXxp8J.js +0 -1
- data/public/railwatch/assets/copy-id-vBYHQwxg.js +0 -1
- data/public/railwatch/assets/cursor-load-more-Ddwxe5dZ.js +0 -1
- data/public/railwatch/assets/data-table-CzKTEE-O.js +0 -1
- data/public/railwatch/assets/edit-B1kmWkzd.js +0 -8
- data/public/railwatch/assets/edit-D9cx4pbG.js +0 -1
- data/public/railwatch/assets/edit-yv6j9p-V.js +0 -1
- data/public/railwatch/assets/empty-state-CW4wclK_.js +0 -1
- data/public/railwatch/assets/env-layout-Kz7wks1x.js +0 -1
- data/public/railwatch/assets/filter-bar-CJDjWFib.js +0 -1
- data/public/railwatch/assets/frames-zZuIaNH9.js +0 -1
- data/public/railwatch/assets/google-sign-in-button-2_zgbgVy.js +0 -1
- data/public/railwatch/assets/index-B49SWz7K.js +0 -1
- data/public/railwatch/assets/index-BHlY4wKe.js +0 -1
- data/public/railwatch/assets/index-BZpPtyFY.js +0 -1
- data/public/railwatch/assets/index-BeVK6jCL.js +0 -1
- data/public/railwatch/assets/index-BfbSo01U.js +0 -1
- data/public/railwatch/assets/index-BfgncAv6.js +0 -1
- data/public/railwatch/assets/index-BhNszK1k.js +0 -1
- data/public/railwatch/assets/index-Bu01uWvw.js +0 -1
- data/public/railwatch/assets/index-C1s_hK3p.js +0 -1
- data/public/railwatch/assets/index-CBip6V4z.js +0 -1
- data/public/railwatch/assets/index-CMJGss5R.js +0 -1
- data/public/railwatch/assets/index-CRo3yK20.js +0 -1
- data/public/railwatch/assets/index-CWB_p2J8.js +0 -1
- data/public/railwatch/assets/index-CWHpndGc.js +0 -1
- data/public/railwatch/assets/index-Ca_S4Sc3.js +0 -1
- data/public/railwatch/assets/index-CanPDDOa.js +0 -1
- data/public/railwatch/assets/index-Cie90Yat.js +0 -1
- data/public/railwatch/assets/index-CiepQ_pR.js +0 -1
- data/public/railwatch/assets/index-Cm1uCIGN.js +0 -1
- data/public/railwatch/assets/index-CzitnnSC.js +0 -1
- data/public/railwatch/assets/index-DEUfClv3.js +0 -1
- data/public/railwatch/assets/index-DJKwo-mI.js +0 -1
- data/public/railwatch/assets/index-DK6y0YHp.js +0 -1
- data/public/railwatch/assets/index-DMNPpLH9.js +0 -1
- data/public/railwatch/assets/index-DZO1mSfX.js +0 -1
- data/public/railwatch/assets/index-Db5wj3M5.js +0 -1
- data/public/railwatch/assets/index-Dcy5WktB.js +0 -1
- data/public/railwatch/assets/index-DvG0-7Lx.js +0 -1
- data/public/railwatch/assets/index-Dvj1wuka.js +0 -1
- data/public/railwatch/assets/index-KyZX46qX.js +0 -1
- data/public/railwatch/assets/index-Ze-KP-sl.js +0 -1
- data/public/railwatch/assets/index-mhRbWLBM.js +0 -1
- data/public/railwatch/assets/index-x099JL5f.js +0 -1
- data/public/railwatch/assets/index-x28zb_nf.js +0 -1
- data/public/railwatch/assets/inertia-Cuyz2ZHO.js +0 -97
- data/public/railwatch/assets/input-error-hog6gGxg.js +0 -1
- data/public/railwatch/assets/json-viewer-DH2W9HXf.js +0 -1
- data/public/railwatch/assets/klass-DHbDelLk.js +0 -1
- data/public/railwatch/assets/label-DdCBgiUn.js +0 -1
- data/public/railwatch/assets/layout-Cueyl7c5.js +0 -1
- data/public/railwatch/assets/live-dot-BZgYTYdt.js +0 -41
- data/public/railwatch/assets/nav-BSSGObDZ.js +0 -1
- data/public/railwatch/assets/new-B8FSb8Bl.js +0 -1
- data/public/railwatch/assets/new-C39_v2Ll.js +0 -1
- data/public/railwatch/assets/new-DVOPwaC5.js +0 -1
- data/public/railwatch/assets/new-Dd40nvJR.js +0 -1
- data/public/railwatch/assets/new-SxnYe1SE.js +0 -1
- data/public/railwatch/assets/new-eP5vKD3Y.js +0 -1
- data/public/railwatch/assets/onboarding-CUpZl5KB.js +0 -1
- data/public/railwatch/assets/origin-identity-BYt2uiuo.js +0 -1
- data/public/railwatch/assets/relative-time-D5UbF4oO.js +0 -1
- data/public/railwatch/assets/route-DQAY8JEr.js +0 -1
- data/public/railwatch/assets/select-2R16457Z.js +0 -1
- data/public/railwatch/assets/separator-D5I0UCB5.js +0 -1
- data/public/railwatch/assets/series-chart-gnrzhmM6.js +0 -1
- data/public/railwatch/assets/show-2BkeNRUC.js +0 -2
- data/public/railwatch/assets/show-B0X1hRQH.js +0 -1
- data/public/railwatch/assets/show-BKUV5l5q.js +0 -1
- data/public/railwatch/assets/show-BQJD_CsF.js +0 -6
- data/public/railwatch/assets/show-BhmD6Sxp.js +0 -1
- data/public/railwatch/assets/show-C3KcnVo2.js +0 -1
- data/public/railwatch/assets/show-C95cHd06.js +0 -2
- data/public/railwatch/assets/show-CdB4uVQS.js +0 -1
- data/public/railwatch/assets/show-CoCqcVIp.js +0 -1
- data/public/railwatch/assets/show-D2LqjEsU.js +0 -1
- data/public/railwatch/assets/show-DNpnKyTh.js +0 -1
- data/public/railwatch/assets/show-DOlTxbig.js +0 -1
- data/public/railwatch/assets/show-DQCkttL8.js +0 -1
- data/public/railwatch/assets/show-DcxesipC.js +0 -1
- data/public/railwatch/assets/show-IGJoc_X0.js +0 -1
- data/public/railwatch/assets/show-qNV6H8SH.js +0 -2
- data/public/railwatch/assets/stat-ZtxGU8lE.js +0 -1
- data/public/railwatch/assets/status-badge-CH5P-Xkj.js +0 -1
- data/public/railwatch/assets/text-link-DHJ8BXx5.js +0 -1
- data/public/railwatch/assets/textarea-BeQtQyl5.js +0 -1
- data/public/railwatch/assets/timeline-CaKQVu48.js +0 -1
- data/public/railwatch/assets/transition-ksDpqhKJ.js +0 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as B,u as C,j as n,al as D,d as R,L as H,i as K}from"./inertia-FoqYZAk8.js";import{D as T}from"./data-table-DYi-N0hm.js";import{E as W,aq as q,B as A}from"./app-layout-LvxN9xSS.js";import{O as I}from"./origin-identity-Y6gvfQVR.js";import{P as F,E as J}from"./env-layout-HdcOaPPX.js";import{R as Q}from"./relative-time-DcJbkKlN.js";import{S as $}from"./status-badge-BDkOXa-C.js";import{m as P,a as z,w as G}from"./format-B9SDkrWj.js";import"./chart-hover-CEH-DtXO.js";import"./tenant-path-DU0ezKSU.js";import"./use-live-CE_fN5_6.js";import"./segmented-BWee8uc9.js";function be(t){const e=B.c(42),{environment:M,range:a,window:l}=C().props,i=M.application_id,r=M.id;let k;e[0]!==i||e[1]!==r?(k=s=>D(i,r,s.execution_id),e[0]=i,e[1]=r,e[2]=k):k=e[2];const x=k;let _;e[3]===Symbol.for("react.memo_cache_sentinel")?(_=n.jsx(F,{title:"Scheduled tasks",description:"Solid Queue recurring tasks from config/recurring.yml: runs, failures, and missed schedules."}),e[3]=_):_=e[3];let o;e[4]!==t.missed?(o=t.missed.length>0&&n.jsx("div",{className:"flex flex-wrap gap-2",children:t.missed.map(de)}),e[4]=t.missed,e[5]=o):o=e[5];let y,g;e[6]===Symbol.for("react.memo_cache_sentinel")?(y=n.jsx(W,{icon:q,title:"No scheduled task has run in this window",description:"Recurring and scheduled job runs appear here as they execute."}),g=[{key:"k",header:"Task",cell:oe},{key:"s",header:"Schedule",cell:le},{key:"next",hideOnMobile:!0,header:"Next run",cell:ae},{key:"n",header:"Runs",align:"right",cell:re},{key:"f",hideOnMobile:!0,header:"Failed",align:"right",cell:ie},{key:"avg",hideOnMobile:!0,header:"Avg",align:"right",cell:se},{key:"last",header:"Last run",align:"right",cell:ne}],e[6]=y,e[7]=g):(y=e[6],g=e[7]);let c;e[8]!==t.tasks?(c=n.jsx(T,{rows:t.tasks,rowKey:ce,empty:y,columns:g}),e[8]=t.tasks,e[9]=c):c=e[9];let j;e[10]===Symbol.for("react.memo_cache_sentinel")?(j=n.jsx("h2",{className:"text-sm font-semibold",children:"Recent runs"}),e[10]=j):j=e[10];let d,u;e[11]!==x?(d=s=>R.visit(x(s)),u={onOpen:(s,L)=>L?.newTab?window.open(x(s),"_blank"):R.visit(x(s))},e[11]=x,e[12]=d,e[13]=u):(d=e[12],u=e[13]);let w,b,v,O;e[14]===Symbol.for("react.memo_cache_sentinel")?(O={key:"when",header:"When",cell:ee},w={key:"k",header:"Task",cell:Z},b={key:"job",hideOnMobile:!0,header:"Job",cell:Y},v={key:"o",header:"Outcome",cell:X},e[14]=w,e[15]=b,e[16]=v,e[17]=O):(w=e[14],b=e[15],v=e[16],O=e[17]);let m;e[18]!==i||e[19]!==r||e[20]!==a||e[21]!==l?(m={key:"user",hideOnMobile:!0,header:"Origin user",cell:s=>n.jsx(I,{...s,applicationId:i,environmentId:r,kind:"user",range:a,window:l})},e[18]=i,e[19]=r,e[20]=a,e[21]=l,e[22]=m):m=e[22];let h;e[23]!==i||e[24]!==r||e[25]!==a||e[26]!==l?(h={key:"tenant",hideOnMobile:!0,header:"Origin tenant",cell:s=>n.jsx(I,{...s,applicationId:i,environmentId:r,kind:"tenant",range:a,window:l})},e[23]=i,e[24]=r,e[25]=a,e[26]=l,e[27]=h):h=e[27];let S,N;e[28]===Symbol.for("react.memo_cache_sentinel")?(S={key:"d",hideOnMobile:!0,header:"Duration",align:"right",cell:V},N={key:"ex",hideOnMobile:!0,header:"Exception",cell:U},e[28]=S,e[29]=N):(S=e[28],N=e[29]);let f;e[30]!==m||e[31]!==h?(f=[O,w,b,v,m,h,S,N],e[30]=m,e[31]=h,e[32]=f):f=e[32];let p;e[33]!==t.runs||e[34]!==f||e[35]!==d||e[36]!==u?(p=n.jsx(T,{rows:t.runs,rowKey:te,onRowClick:d,keyboardNav:u,columns:f}),e[33]=t.runs,e[34]=f,e[35]=d,e[36]=u,e[37]=p):p=e[37];let E;return e[38]!==p||e[39]!==o||e[40]!==c?(E=n.jsxs(J,{title:"Scheduled tasks",children:[_,o,c,j,p]}),e[38]=p,e[39]=o,e[40]=c,e[41]=E):E=e[41],E}function U(t){return n.jsx("span",{className:"text-destructive line-clamp-1 text-xs",children:t.exception_preview??""})}function V(t){return P(t.duration)}function X(t){return n.jsx($,{outcome:t.outcome})}function Y(t){return n.jsx("span",{className:"font-mono text-xs",children:t.name})}function Z(t){return n.jsx("span",{className:"font-mono text-xs",children:t.task_key})}function ee(t){return n.jsx("span",{className:"text-xs",children:G(t.occurred_at)})}function te(t){return t.execution_id}function ne(t){return z(t.last_run_at)}function se(t){return P(t.avg)}function ie(t){return n.jsx("span",{className:t.failed?"text-destructive":"",children:t.failed})}function re(t){return t.runs}function ae(t){return n.jsx("span",{className:"text-muted-foreground text-xs",children:t.next_run_at?n.jsx(Q,{iso:t.next_run_at}):"–"})}function le(t){return n.jsx("span",{className:"text-muted-foreground font-mono text-xs",children:t.schedule??"–"})}function oe(t){return n.jsx("span",{className:"font-mono text-xs",children:t.task_key})}function ce(t){return t.task_key}function de(t){return n.jsx(H,{href:K(t.id),children:n.jsxs(A,{variant:"destructive",children:[t.key," · ",t.title]})},t.id)}export{be as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as L,j as s,o as R,T as Y}from"./inertia-FoqYZAk8.js";import{C as S}from"./chart-panel-CUdIzJvk.js";import{D}from"./data-table-DYi-N0hm.js";import{E as T,a5 as P}from"./app-layout-LvxN9xSS.js";import{C as G,X as I,Y as W,a as X,b as J,c as V}from"./chart-DJHv3R7W.js";import{A as Z,a as ee}from"./series-chart-C5nXIUc5.js";import{E as te,P as se}from"./env-layout-HdcOaPPX.js";import{a as re,S as k}from"./stat-BTzNKTm2.js";import{C as $,b as B,c as F,a as E}from"./card-Dpwlr0uY.js";import{c as j,m as O,b as ae,a as z,w as H}from"./format-B9SDkrWj.js";import"./chart-hover-CEH-DtXO.js";import"./use-live-CE_fN5_6.js";import"./segmented-BWee8uc9.js";import"./arrow-up-DG01k9AL.js";const K={fontSize:10,fontFamily:"var(--font-mono)"},ne=1440*60*1e3;function le(t){return(t.length>1?new Date(t[t.length-1].t).getTime()-new Date(t[0].t).getTime():0)>2*ne?a=>new Date(a).toLocaleDateString(void 0,{month:"short",day:"numeric"}):a=>new Date(a).toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit"})}function A(t){return new Date(t).toLocaleString(void 0,{day:"2-digit",month:"short",hour:"2-digit",minute:"2-digit"})}function C(t){const e=L.c(28),{label:a,data:r,format:l,color:p,className:n}=t,i=p===void 0?"var(--primary)":p,b=n===void 0?"h-32":n;let c;e[0]!==i||e[1]!==a?(c={value:{label:a,color:i}},e[0]=i,e[1]=a,e[2]=c):c=e[2];const g=c;let m;e[3]!==r?(m=le(r),e[3]=r,e[4]=m):m=e[4];const o=m,d=`${b} w-full`;let h;e[5]===Symbol.for("react.memo_cache_sentinel")?(h=s.jsx(G,{vertical:!1,strokeDasharray:"2 4"}),e[5]=h):h=e[5];let u;e[6]!==o?(u=s.jsx(I,{dataKey:"t",tickFormatter:o,tickLine:!1,axisLine:!1,minTickGap:40,tick:K}),e[6]=o,e[7]=u):u=e[7];let f;e[8]!==l?(f=s.jsx(W,{width:44,tickLine:!1,axisLine:!1,tick:K,tickFormatter:q=>l(Number(q))}),e[8]=l,e[9]=f):f=e[9];let x;e[10]!==l||e[11]!==a?(x=s.jsx(X,{content:s.jsx(J,{labelFormatter:oe,formatter:q=>[l(Number(q)),a]})}),e[10]=l,e[11]=a,e[12]=x):x=e[12];let w;e[13]===Symbol.for("react.memo_cache_sentinel")?(w=s.jsx(Z,{dataKey:"value",stroke:"var(--color-value)",fill:"var(--color-value)",fillOpacity:.15,strokeWidth:1.75,isAnimationActive:!1}),e[13]=w):w=e[13];let v;e[14]!==r||e[15]!==u||e[16]!==f||e[17]!==x?(v=s.jsxs(ee,{data:r,children:[h,u,f,x,w]}),e[14]=r,e[15]=u,e[16]=f,e[17]=x,e[18]=v):v=e[18];let y;e[19]!==g||e[20]!==v||e[21]!==d?(y=s.jsx(V,{config:g,className:d,children:v}),e[19]=g,e[20]=v,e[21]=d,e[22]=y):y=e[22];let _;e[23]!==r?(_=r.length>0&&s.jsxs("div",{className:"text-muted-foreground mt-1 flex justify-between font-mono text-[10px]",children:[s.jsx("span",{children:A(r[0].t)}),s.jsx("span",{children:A(r[r.length-1].t)})]}),e[23]=r,e[24]=_):_=e[24];let N;return e[25]!==y||e[26]!==_?(N=s.jsxs("div",{children:[y,_]}),e[25]=y,e[26]=_,e[27]=N):N=e[27],N}function oe(t){return A(String(t))}function U(t){const e=L.c(21),{busy:a,max:r,className:l}=t;if(!r){let x;return e[0]===Symbol.for("react.memo_cache_sentinel")?(x=s.jsx("span",{className:"text-muted-foreground",children:"–"}),e[0]=x):x=e[0],x}const p=Math.min(1,(a??0)/r);let n;e[1]!==l?(n=R("flex items-center gap-1.5",l),e[1]=l,e[2]=n):n=e[2];const i=a??0,b=p>=.9?"bg-danger":p>=.7?"bg-warning":"bg-live";let c;e[3]!==b?(c=R("absolute inset-y-0 left-0 rounded-full",b),e[3]=b,e[4]=c):c=e[4];const g=`${Math.max(4,p*100)}%`;let m;e[5]!==g?(m={width:g},e[5]=g,e[6]=m):m=e[6];let o;e[7]!==c||e[8]!==m?(o=s.jsx("span",{className:c,style:m}),e[7]=c,e[8]=m,e[9]=o):o=e[9];let d;e[10]!==r||e[11]!==i||e[12]!==o?(d=s.jsx("span",{role:"meter","aria-label":"Utilisation","aria-valuenow":i,"aria-valuemin":0,"aria-valuemax":r,className:"bg-muted-foreground/25 relative h-1.5 w-10 shrink-0 overflow-hidden rounded-full",children:o}),e[10]=r,e[11]=i,e[12]=o,e[13]=d):d=e[13];const h=a??0;let u;e[14]!==r||e[15]!==h?(u=s.jsxs("span",{className:"font-mono tabular-nums",children:[h,"/",r]}),e[14]=r,e[15]=h,e[16]=u):u=e[16];let f;return e[17]!==n||e[18]!==u||e[19]!==d?(f=s.jsxs("span",{className:n,children:[d,u]}),e[17]=n,e[18]=u,e[19]=d,e[20]=f):f=e[20],f}const M=t=>`${t.toFixed(0)}%`;function ie(t){return t.reduce((e,a)=>e+(a??0),0)}function Q(t){return t.reduce((e,a)=>Math.max(e,a??0),0)}function et(t){const e=L.c(27);let a;if(e[0]!==t.samples){const h=t.samples.flatMap(Fe);a=h.length?h.reduce(Be,0)/h.length:0,e[0]=t.samples,e[1]=a}else a=e[1];const r=a;let l,p,n,i,b;if(e[2]!==t.queues||e[3]!==t.samples||e[4]!==t.series||e[5]!==t.silent_servers||e[6]!==r){const h=ie(t.samples.map($e)),u=Q(t.samples.map(Pe)),f=Q(t.samples.map(Re)),x=t.samples.length>0||t.series.length>0;l=te,p="Processes",e[12]===Symbol.for("react.memo_cache_sentinel")?(n=s.jsx(se,{title:"Processes",description:"What every web and worker process is doing right now: thread pools, socket backlog, queue depth, and the boots behind them."}),e[12]=n):n=e[12],e[13]!==t.silent_servers?(i=t.silent_servers.length>0&&s.jsxs($,{className:"border-warning/40",children:[s.jsx(B,{children:s.jsxs(F,{className:"flex items-center gap-2",children:[s.jsx(Y,{className:"text-warning size-4"}),t.silent_servers.length===1?"1 expected host is silent":`${t.silent_servers.length} expected hosts are silent`]})}),s.jsxs(E,{className:"space-y-2",children:[s.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.silent_servers.map(Le)}),s.jsx("p",{className:"text-muted-foreground text-xs",children:"No health sample or execution from these hosts in the last 10 minutes. Expected hosts come from your Kamal post-deploy hook, or from the environment settings if you set them by hand."})]})]}),e[13]=t.silent_servers,e[14]=i):i=e[14],b=x?s.jsxs(s.Fragment,{children:[s.jsxs(re,{children:[s.jsx(k,{label:"Live processes",value:t.samples.length}),s.jsx(k,{label:"Thread utilisation",value:M(r),tone:r>=90?"destructive":r>=70?"warning":void 0,hint:"averaged across live processes"}),s.jsx(k,{label:"Backlog",value:j(h)}),s.jsx(k,{label:"Queue depth",value:j(u)}),s.jsx(k,{label:"Oldest job",value:O(f)})]}),s.jsx(D,{rows:t.samples,rowKey:Ae,empty:s.jsx(T,{title:"No process reported in the last 10 minutes",description:"Health samples are older than the live window."}),columns:[{key:"server",header:"Server",cell:Oe},{key:"role",header:"Role",cell:Me},{key:"pid",hideOnMobile:!0,header:"PID",align:"right",cell:Te},{key:"threads",header:"Threads",cell:De},{key:"pool",hideOnMobile:!0,header:"DB pool",cell:qe},{key:"mem",hideOnMobile:!0,header:"Memory",align:"right",cell:Ce},{key:"seen",header:"Last sample",align:"right",cell:Se}]}),t.queues.length>0&&s.jsxs($,{children:[s.jsx(B,{children:s.jsx(F,{children:"Queue depth"})}),s.jsx(E,{children:s.jsx(D,{rows:t.queues,rowKey:Ne,columns:[{key:"q",header:"Queue",cell:we},{key:"d",header:"Ready jobs",align:"right",cell:ke}]})})]}),s.jsxs("div",{className:"grid gap-4 lg:grid-cols-2",children:[s.jsx(S,{label:"Thread utilisation",value:M(r),children:s.jsx(C,{label:"Utilisation",format:M,data:t.series.map(_e)})}),s.jsx(S,{label:"Backlog",value:j(h),children:s.jsx(C,{label:"Backlog",color:"var(--warning)",format:j,data:t.series.map(ye)})}),s.jsx(S,{label:"Queue depth",value:j(u),children:s.jsx(C,{label:"Ready jobs",format:j,data:t.series.map(ve)})}),s.jsx(S,{label:"Oldest job",value:O(f),children:s.jsx(C,{label:"Oldest job",color:"var(--danger)",format:je,data:t.series.map(ge)})})]})]}):s.jsx(T,{icon:P,title:"No health samples yet",description:"The gem reports thread pool, backlog and queue health every 15s from each web and worker process."}),e[2]=t.queues,e[3]=t.samples,e[4]=t.series,e[5]=t.silent_servers,e[6]=r,e[7]=l,e[8]=p,e[9]=n,e[10]=i,e[11]=b}else l=e[7],p=e[8],n=e[9],i=e[10],b=e[11];let c;e[15]===Symbol.for("react.memo_cache_sentinel")?(c=s.jsx("h2",{className:"text-sm font-semibold",children:"Process boots"}),e[15]=c):c=e[15];let g,m;e[16]===Symbol.for("react.memo_cache_sentinel")?(g=s.jsx(T,{icon:P,title:"No process has booted with Railwatch yet",description:"Server processes report here once they boot with the gem installed."}),m=[{key:"b",header:"Booted",cell:xe},{key:"s",header:"Server",cell:pe},{key:"r",header:"Role",cell:fe},{key:"pid",hideOnMobile:!0,header:"PID",align:"right",cell:he},{key:"d",header:"Deploy",cell:de},{key:"v",hideOnMobile:!0,header:"Ruby / Rails / Railwatch",cell:ue},{key:"ad",hideOnMobile:!0,header:"DB / queue / cache",cell:me},{key:"boot",hideOnMobile:!0,header:"Boot",align:"right",cell:ce}],e[16]=g,e[17]=m):(g=e[16],m=e[17]);let o;e[18]!==t.processes?(o=s.jsx(D,{rows:t.processes,rowKey:be,empty:g,columns:m}),e[18]=t.processes,e[19]=o):o=e[19];let d;return e[20]!==l||e[21]!==p||e[22]!==n||e[23]!==i||e[24]!==b||e[25]!==o?(d=s.jsxs(l,{title:p,children:[n,i,b,c,o]}),e[20]=l,e[21]=p,e[22]=n,e[23]=i,e[24]=b,e[25]=o,e[26]=d):d=e[26],d}function ce(t){return t.boot_seconds?`${t.boot_seconds.toFixed(1)}s`:"–"}function me(t){return s.jsxs("span",{className:"font-mono text-xs",children:[t.detail.database_adapter," / ",t.detail.queue_adapter," /"," ",t.detail.cache_store?.replace("ActiveSupport::Cache::","")]})}function ue(t){return s.jsxs("span",{className:"font-mono text-xs",children:[t.ruby_version," / ",t.rails_version," / ",t.railwatch_version]})}function de(t){return s.jsx("span",{className:"font-mono text-xs",children:t.deploy?.slice(0,12)})}function he(t){return t.pid}function fe(t){return t.role}function pe(t){return s.jsx("span",{className:"font-mono text-xs",children:t.server})}function xe(t){return s.jsx("span",{className:"text-xs",title:H(t.booted_at),children:z(t.booted_at)})}function be(t){return t.id}function ge(t){return{t:t.t,value:t.queue_latency}}function je(t){return O(t)}function ve(t){return{t:t.t,value:t.queue_depth}}function ye(t){return{t:t.t,value:t.backlog}}function _e(t){return{t:t.t,value:t.utilisation}}function ke(t){return j(t.depth)}function we(t){return t.queue}function Ne(t){return t.queue}function Se(t){return s.jsx("span",{title:H(t.sampled_at),children:z(t.sampled_at)})}function Ce(t){return ae(t.memory)}function qe(t){return s.jsx(U,{busy:t.pool_busy,max:t.pool_size})}function De(t){return s.jsx(U,{busy:t.threads_busy,max:t.threads_max})}function Te(t){return t.pid}function Me(t){return t.role}function Oe(t){return s.jsx("span",{className:"font-mono text-xs",children:t.server})}function Ae(t){return t.id}function Le(t){return s.jsx("span",{className:"border-warning/40 bg-warning/10 text-warning rounded-sm border px-1.5 font-mono text-[11px]",children:t},t)}function Re(t){return t.queue_latency}function Pe(t){return t.queue_depth}function $e(t){return t.backlog}function Be(t,e){return t+e}function Fe(t){return t.threads_max?[(t.threads_busy??0)/t.threads_max*100]:[]}export{et as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as M,u as T,j as i,L as N,p as O}from"./inertia-FoqYZAk8.js";import{D as $}from"./data-table-DYi-N0hm.js";import{E as D,a7 as F}from"./app-layout-LvxN9xSS.js";import{P as H,E as I}from"./env-layout-HdcOaPPX.js";import{R as C}from"./relative-time-DcJbkKlN.js";import{S as R,a as K}from"./stat-BTzNKTm2.js";import{c as d,p as W,m as q}from"./format-B9SDkrWj.js";import"./chart-hover-CEH-DtXO.js";import"./use-live-CE_fN5_6.js";import"./segmented-BWee8uc9.js";import"./arrow-up-DG01k9AL.js";function re(l){const e=M.c(40),{environment:A,window:b}=T().props,S=A.application_id,k=A.id,t=l.summary;let h;e[0]===Symbol.for("react.memo_cache_sentinel")?(h=i.jsx(H,{title:"Profiles",description:"Sampled stack profiles, grouped by the execution they profiled."}),e[0]=h):h=e[0];let s;e[1]!==t.profiles?(s=d(t.profiles),e[1]=t.profiles,e[2]=s):s=e[2];let o;e[3]!==s?(o=i.jsx(R,{label:"Profiles",value:s}),e[3]=s,e[4]=o):o=e[4];let r;e[5]!==t.executions||e[6]!==t.profiled?(r=W(t.profiled,t.executions),e[5]=t.executions,e[6]=t.profiled,e[7]=r):r=e[7];let x;e[8]!==t.profiled?(x=d(t.profiled),e[8]=t.profiled,e[9]=x):x=e[9];let _;e[10]!==t.executions?(_=d(t.executions),e[10]=t.executions,e[11]=_):_=e[11];const w=`${x} of ${_}`;let a;e[12]!==r||e[13]!==w?(a=i.jsx(R,{label:"Executions profiled",value:r,hint:w}),e[12]=r,e[13]=w,e[14]=a):a=e[14];let n;e[15]!==t.avg_samples?(n=d(t.avg_samples),e[15]=t.avg_samples,e[16]=n):n=e[16];let p;e[17]!==n?(p=i.jsx(R,{label:"Avg samples",value:n}),e[17]=n,e[18]=p):p=e[18];let f;e[19]!==o||e[20]!==a||e[21]!==p?(f=i.jsxs(K,{children:[o,a,p]}),e[19]=o,e[20]=a,e[21]=p,e[22]=f):f=e[22];let g;e[23]===Symbol.for("react.memo_cache_sentinel")?(g=i.jsx(D,{icon:F,title:"No profiles in this window",description:"Set RAILWATCH_PROFILE_SAMPLE_RATE in the app to profile slow executions."}),e[23]=g):g=e[23];let m;e[24]!==S||e[25]!==k||e[26]!==b?(m={key:"name",header:"Execution",className:"max-w-0",cell:L=>i.jsx(N,{href:O(S,k,L.profile_id,{window:b}),className:"block truncate font-mono text-xs hover:underline",children:L.name??L.group_hash})},e[24]=S,e[25]=k,e[26]=b,e[27]=m):m=e[27];let v,y,j,E;e[28]===Symbol.for("react.memo_cache_sentinel")?(v={key:"n",header:"Profiles",align:"right",cell:J},y={key:"avg",header:"Avg duration",align:"right",cell:G},j={key:"samples",hideOnMobile:!0,header:"Max samples",align:"right",cell:B},E={key:"last",hideOnMobile:!0,header:"Last seen",align:"right",cell:z},e[28]=v,e[29]=y,e[30]=j,e[31]=E):(v=e[28],y=e[29],j=e[30],E=e[31]);let c;e[32]!==m?(c=[m,v,y,j,E],e[32]=m,e[33]=c):c=e[33];let u;e[34]!==l.profiles||e[35]!==c?(u=i.jsx($,{rows:l.profiles,rowKey:Q,empty:g,columns:c}),e[34]=l.profiles,e[35]=c,e[36]=u):u=e[36];let P;return e[37]!==f||e[38]!==u?(P=i.jsxs(I,{title:"Profiles",children:[h,f,u]}),e[37]=f,e[38]=u,e[39]=P):P=e[39],P}function z(l){return i.jsx(C,{iso:l.last_seen_at})}function B(l){return d(l.max_samples)}function G(l){return q(l.avg_duration)}function J(l){return d(l.count)}function Q(l){return l.group_hash}export{re as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Q as te,c as ae,u as le,j as r,d as re,L as ie}from"./inertia-FoqYZAk8.js";import{C as oe}from"./chart-panel-CUdIzJvk.js";import{D as ne}from"./data-table-DYi-N0hm.js";import{E as me,aa as ue}from"./app-layout-LvxN9xSS.js";import{E as ce,P as fe}from"./env-layout-HdcOaPPX.js";import{b as he}from"./series-chart-C5nXIUc5.js";import{S as Y,a as de}from"./stat-BTzNKTm2.js";import{c as a,w as ye,m as _e}from"./format-B9SDkrWj.js";import{rate as Z,crashFreeTone as se}from"./release-health-C8WSCDKD.js";import"./chart-hover-CEH-DtXO.js";import"./use-live-CE_fN5_6.js";import"./segmented-BWee8uc9.js";import"./chart-DJHv3R7W.js";import"./arrow-up-DG01k9AL.js";function xe(s,e,K,q){const F=String(te(s,e,K,q)),[H,u]=F.split("?");return`${H.replace(/\./g,"%2E")}${u?`?${u}`:""}`}function Ke(s){const e=ae.c(98),{environment:K,window:q}=le().props,F=K.application_id,H=K.id;let u;e[0]!==F||e[1]!==H||e[2]!==q?(u=t=>xe(F,H,t.deploy,{window:q}),e[0]=F,e[1]=H,e[2]=q,e[3]=u):u=e[3];const l=u;let c,f,h,i,d,y,_,x,k,o,v,n;if(e[4]!==s.series||e[5]!==s.summary.crash_free_sessions||e[6]!==s.summary.crash_free_users||e[7]!==s.summary.releases||e[8]!==s.summary.sessions||e[9]!==s.summary.users){const t=s.series.reduce(Ce,{ok:0,errored:0,crashed:0});f=ce,v="Releases",e[22]===Symbol.for("react.memo_cache_sentinel")?(n=r.jsx(fe,{title:"Releases",description:"Sessions per deploy, and how many of them ended without a crash. A release is the deploy stamped on every record the gem ships."}),e[22]=n):n=e[22];let m;e[23]!==s.summary.crash_free_sessions?(m=Z(s.summary.crash_free_sessions),e[23]=s.summary.crash_free_sessions,e[24]=m):m=e[24];let N;e[25]!==s.summary.crash_free_sessions?(N=se(s.summary.crash_free_sessions),e[25]=s.summary.crash_free_sessions,e[26]=N):N=e[26];let P;e[27]!==m||e[28]!==N?(P=r.jsx(Y,{label:"Crash-free sessions",value:m,tone:N}),e[27]=m,e[28]=N,e[29]=P):P=e[29];let T;e[30]!==s.summary.crash_free_users?(T=Z(s.summary.crash_free_users),e[30]=s.summary.crash_free_users,e[31]=T):T=e[31];let $;e[32]!==s.summary.crash_free_users?($=se(s.summary.crash_free_users),e[32]=s.summary.crash_free_users,e[33]=$):$=e[33];let A;e[34]!==T||e[35]!==$?(A=r.jsx(Y,{label:"Crash-free users",value:T,tone:$}),e[34]=T,e[35]=$,e[36]=A):A=e[36];let D;e[37]!==s.summary.sessions?(D=a(s.summary.sessions),e[37]=s.summary.sessions,e[38]=D):D=e[38];let X;e[39]!==s.summary.users?(X=a(s.summary.users),e[39]=s.summary.users,e[40]=X):X=e[40];const ee=`${X} users`;let O;e[41]!==D||e[42]!==ee?(O=r.jsx(Y,{label:"Sessions",value:D,hint:ee}),e[41]=D,e[42]=ee,e[43]=O):O=e[43];let L;e[44]!==s.summary.releases?(L=a(s.summary.releases),e[44]=s.summary.releases,e[45]=L):L=e[45];let M;e[46]!==L?(M=r.jsx(Y,{label:"Active releases",value:L}),e[46]=L,e[47]=M):M=e[47],e[48]!==P||e[49]!==A||e[50]!==O||e[51]!==M?(i=r.jsxs(de,{children:[P,A,O,M]}),e[48]=P,e[49]=A,e[50]=O,e[51]=M,e[52]=i):i=e[52],c=oe,k="Sessions by status",e[53]!==s.summary.sessions?(o=a(s.summary.sessions),e[53]=s.summary.sessions,e[54]=o):o=e[54],_={key:"ok",label:"ok",value:a(t.ok),color:"var(--ok)"},x={key:"errored",label:"errored",value:a(t.errored),color:"var(--warning)"},h="crashed",d="crashed",y=a(t.crashed),e[4]=s.series,e[5]=s.summary.crash_free_sessions,e[6]=s.summary.crash_free_users,e[7]=s.summary.releases,e[8]=s.summary.sessions,e[9]=s.summary.users,e[10]=c,e[11]=f,e[12]=h,e[13]=i,e[14]=d,e[15]=y,e[16]=_,e[17]=x,e[18]=k,e[19]=o,e[20]=v,e[21]=n}else c=e[10],f=e[11],h=e[12],i=e[13],d=e[14],y=e[15],_=e[16],x=e[17],k=e[18],o=e[19],v=e[20],n=e[21];let b;e[55]!==h||e[56]!==d||e[57]!==y?(b={key:h,label:d,value:y,color:"var(--danger)"},e[55]=h,e[56]=d,e[57]=y,e[58]=b):b=e[58];let g;e[59]!==b||e[60]!==_||e[61]!==x?(g=[_,x,b],e[59]=b,e[60]=_,e[61]=x,e[62]=g):g=e[62];let w;e[63]!==s.series?(w=r.jsx(he,{data:s.series}),e[63]=s.series,e[64]=w):w=e[64];let p;e[65]!==c||e[66]!==g||e[67]!==w||e[68]!==k||e[69]!==o?(p=r.jsx(c,{label:k,value:o,legend:g,children:w}),e[65]=c,e[66]=g,e[67]=w,e[68]=k,e[69]=o,e[70]=p):p=e[70];let Q;e[71]===Symbol.for("react.memo_cache_sentinel")?(Q=r.jsx(me,{icon:ue,title:"No releases in this window",description:"A release appears once a deploy is recorded and the app reports sessions for it."}),e[71]=Q):Q=e[71];let j,S;e[72]!==l?(j=t=>re.visit(l(t)),S={onOpen:(t,m)=>m?.newTab?globalThis.window.open(l(t),"_blank"):re.visit(l(t))},e[72]=l,e[73]=j,e[74]=S):(j=e[73],S=e[74]);let C;e[75]!==l?(C={key:"ref",header:"Release",cell:t=>r.jsx(ie,{className:"font-mono text-xs hover:underline",href:l(t),children:t.ref})},e[75]=l,e[76]=C):C=e[76];let z,B,G,I,J,U,V;e[77]===Symbol.for("react.memo_cache_sentinel")?(z={key:"at",header:"Deployed",cell:je},B={key:"adoption",header:"Adoption",align:"right",cell:pe},G={key:"sessions",header:"Sessions",align:"right",cell:we},I={key:"cfs",header:"Crash-free sessions",align:"right",cell:ge},J={key:"cfu",hideOnMobile:!0,header:"Crash-free users",align:"right",cell:be},U={key:"issues",hideOnMobile:!0,header:"New issues",align:"right",cell:ve},V={key:"duration",hideOnMobile:!0,header:"Duration",align:"right",cell:ke},e[77]=z,e[78]=B,e[79]=G,e[80]=I,e[81]=J,e[82]=U,e[83]=V):(z=e[77],B=e[78],G=e[79],I=e[80],J=e[81],U=e[82],V=e[83]);let E;e[84]!==C?(E=[C,z,B,G,I,J,U,V],e[84]=C,e[85]=E):E=e[85];let R;e[86]!==s.releases||e[87]!==j||e[88]!==S||e[89]!==E?(R=r.jsx(ne,{rows:s.releases,rowKey:Se,empty:Q,onRowClick:j,keyboardNav:S,columns:E}),e[86]=s.releases,e[87]=j,e[88]=S,e[89]=E,e[90]=R):R=e[90];let W;return e[91]!==f||e[92]!==i||e[93]!==p||e[94]!==R||e[95]!==v||e[96]!==n?(W=r.jsxs(f,{title:v,children:[n,i,p,R]}),e[91]=f,e[92]=i,e[93]=p,e[94]=R,e[95]=v,e[96]=n,e[97]=W):W=e[97],W}function ke(s){return _e(s.avg_duration_ms)}function ve(s){return r.jsx("span",{className:s.new_issues?"text-destructive":"",children:a(s.new_issues)})}function be(s){return Z(s.crash_free_users)}function ge(s){return r.jsx("span",{className:se(s.crash_free_sessions)==="destructive"?"text-destructive font-semibold":"font-semibold",children:Z(s.crash_free_sessions)})}function we(s){return a(s.sessions)}function pe(s){return`${s.adoption}%`}function je(s){return r.jsx("span",{className:"text-xs",children:ye(s.deployed_at)})}function Se(s){return s.deploy}function Ce(s,e){return{ok:s.ok+e.ok,errored:s.errored+e.errored,crashed:s.crashed+e.crashed}}export{Ke as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as _,u as x,j as r,d as k,g as b}from"./inertia-FoqYZAk8.js";import{V as v}from"./chart-panel-CUdIzJvk.js";import{D as j}from"./data-table-DYi-N0hm.js";import{E as S,L as C}from"./app-layout-LvxN9xSS.js";import{F as E}from"./filter-bar-DEv0G_34.js";import{P as w,E as M}from"./env-layout-HdcOaPPX.js";import{S as O}from"./sparkline-cell-DgGij0cu.js";import{c as f,m as P}from"./format-B9SDkrWj.js";import"./series-chart-C5nXIUc5.js";import"./chart-hover-CEH-DtXO.js";import"./chart-DJHv3R7W.js";import"./use-live-CE_fN5_6.js";import"./segmented-BWee8uc9.js";function Y(t){const e=_.c(19),{environment:y,window:p}=x().props,d=y.application_id,u=y.id;let o;e[0]===Symbol.for("react.memo_cache_sentinel")?(o=r.jsx(w,{title:"Cache",description:"Rails.cache reads, writes, and hit rates by key shape (ids collapsed)."}),e[0]=o):o=e[0];let i;e[1]!==t.series?(i=r.jsx(v,{legend:"cache",label:"Cache ops",seriesLabel:"Cache ops",data:t.series}),e[1]=t.series,e[2]=i):i=e[2];let l;e[3]===Symbol.for("react.memo_cache_sentinel")?(l=[{key:"store",label:"Store"}],e[3]=l):l=e[3];let s;e[4]!==d||e[5]!==u||e[6]!==p?(s=g=>k.visit(b(d,u,{window:p,q:g||void 0}),{preserveState:!0}),e[4]=d,e[5]=u,e[6]=p,e[7]=s):s=e[7];let a;e[8]!==t.q||e[9]!==s?(a=r.jsx(E,{value:t.q,fields:l,onChange:s,placeholder:"store:MemoryStore"}),e[8]=t.q,e[9]=s,e[10]=a):a=e[10];let c,m;e[11]===Symbol.for("react.memo_cache_sentinel")?(c=r.jsx(S,{icon:C,title:"No cache activity in this window",description:"Cache reads and writes instrumented by the gem appear here."}),m=[{key:"k",header:"Store · key",cell:F},{key:"trend",hideOnMobile:!0,header:"Trend",cell:D},{key:"n",header:"Ops",align:"right",cell:R},{key:"h",header:"Hits",align:"right",cell:N},{key:"m",hideOnMobile:!0,header:"Misses",align:"right",cell:H},{key:"r",hideOnMobile:!0,header:"Hit rate",align:"right",cell:L},{key:"avg",hideOnMobile:!0,header:"Avg",align:"right",cell:q}],e[11]=c,e[12]=m):(c=e[11],m=e[12]);let n;e[13]!==t.keys?(n=r.jsx(j,{rows:t.keys,rowKey:T,empty:c,columns:m}),e[13]=t.keys,e[14]=n):n=e[14];let h;return e[15]!==i||e[16]!==a||e[17]!==n?(h=r.jsxs(M,{title:"Cache",children:[o,i,a,n]}),e[15]=i,e[16]=a,e[17]=n,e[18]=h):h=e[18],h}function q(t){return P(t.avg,3)}function L(t){return t.hit_rate==null?"–":r.jsxs("span",{className:t.hit_rate<50?"text-amber-600":"",children:[t.hit_rate,"%"]})}function H(t){return f(t.misses)}function N(t){return f(t.hits)}function R(t){return f(t.count)}function D(t){return r.jsx(O,{data:t.sparkline})}function F(t){return r.jsx("span",{className:"font-mono text-xs",children:t.key})}function T(t){return t.group_hash}export{Y as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as te,u as se,j as s,d as X,a8 as Y}from"./inertia-FoqYZAk8.js";import{V as re,D as ie}from"./chart-panel-CUdIzJvk.js";import{D as Z}from"./data-table-DYi-N0hm.js";import{E as le,ab as ne}from"./app-layout-LvxN9xSS.js";import{F as oe}from"./filter-bar-DEv0G_34.js";import{E as ae,P as ce}from"./env-layout-HdcOaPPX.js";import{u as me,P as de}from"./percentile-picker-E2aUdLxx.js";import{S as J}from"./sort-header-uOq5VlrB.js";import{S as ue}from"./sparkline-cell-DgGij0cu.js";import{a as pe,S as fe}from"./stat-BTzNKTm2.js";import{S as he}from"./status-badge-BDkOXa-C.js";import{c as ee,m as o,p as xe,w as ge,b as be}from"./format-B9SDkrWj.js";import"./series-chart-C5nXIUc5.js";import"./chart-hover-CEH-DtXO.js";import"./chart-DJHv3R7W.js";import"./use-live-CE_fN5_6.js";import"./segmented-BWee8uc9.js";import"./arrow-up-DG01k9AL.js";const ye=["lcp","cls","inp","ttfb"],je={lcp:"LCP",cls:"CLS",inp:"INP",ttfb:"TTFB"},ve={good:"success","needs-improvement":"warning",poor:"destructive"},_e=(t,e)=>t==="cls"?e.toFixed(2):o(e),Se=t=>[t.lcp===null?null:`LCP ${o(t.lcp)}`,t.inp===null?null:`INP ${o(t.inp)}`,t.cls===null?null:`CLS ${t.cls.toFixed(2)}`].filter(e=>e!==null).join(" · ");function it(t){const e=te.c(80),{environment:Q,window:a}=se().props,{percentile:r}=me(),c=Q.application_id,m=Q.id;let M;e[0]!==c||e[1]!==m||e[2]!==t.dir||e[3]!==t.sort||e[4]!==a?(M=l=>X.visit(Y(c,m,{window:a,sort:l,dir:t.sort===l&&t.dir==="desc"?"asc":"desc"}),{preserveState:!0}),e[0]=c,e[1]=m,e[2]=t.dir,e[3]=t.sort,e[4]=a,e[5]=M):M=e[5];const i=M;let d,u,n,p;if(e[6]!==t.vitals){const l=ye.filter(L=>t.vitals[L]);d=ae,u="Visits",e[11]===Symbol.for("react.memo_cache_sentinel")?(n=s.jsx(ce,{title:"Inertia visits",description:"Page-load timing measured in the browser: from router start to finish, per component, with prop payload size.",actions:s.jsx(de,{})}),e[11]=n):n=e[11],p=l.length>0?s.jsx(pe,{children:l.map(L=>{const K=t.vitals[L];return s.jsx(fe,{label:je[L],value:_e(L,K.value),tone:ve[K.rating],hint:`${K.rating} · p75 of ${ee(K.samples)}`},L)})}):s.jsxs("p",{className:"text-muted-foreground text-xs",children:["Web vitals are reported by the browser client from the initial page load; update app/frontend/lib/railwatch.ts from"," ",s.jsx("span",{className:"font-mono",children:"bin/rails generate railwatch:install"}),"."]}),e[6]=t.vitals,e[7]=d,e[8]=u,e[9]=n,e[10]=p}else d=e[7],u=e[8],n=e[9],p=e[10];let f;e[12]!==t.series?(f=s.jsx(re,{legend:"outcome",label:"Visits",seriesLabel:"Visits",data:t.series}),e[12]=t.series,e[13]=f):f=e[13];let h;e[14]!==t.series||e[15]!==r?(h=s.jsx(ie,{label:"Duration",data:t.series,percentile:r}),e[14]=t.series,e[15]=r,e[16]=h):h=e[16];let x;e[17]!==f||e[18]!==h?(x=s.jsxs("div",{className:"grid gap-4 lg:grid-cols-2",children:[f,h]}),e[17]=f,e[18]=h,e[19]=x):x=e[19];let E,O,D;e[20]===Symbol.for("react.memo_cache_sentinel")?(E=s.jsx(le,{icon:ne,title:"No visits yet",description:"Call startRailwatch() from your Inertia entrypoint to track page visits."}),O={key:"c",header:"Component",cell:Ie},D={key:"trend",hideOnMobile:!0,header:"Trend",cell:Fe},e[20]=E,e[21]=O,e[22]=D):(E=e[20],O=e[21],D=e[22]);const W=t.sort==="count",H=t.dir==="asc"?"asc":"desc";let g;e[23]!==i?(g=()=>i("count"),e[23]=i,e[24]=g):g=e[24];let b;e[25]!==W||e[26]!==H||e[27]!==g?(b={key:"n",header:s.jsx(J,{label:"Visits",active:W,dir:H,onClick:g}),align:"right",cell:$e},e[25]=W,e[26]=H,e[27]=g,e[28]=b):b=e[28];let T;e[29]===Symbol.for("react.memo_cache_sentinel")?(T={key:"e",hideOnMobile:!0,header:"Errors",align:"right",cell:Te},e[29]=T):T=e[29];const U=t.sort==="avg",z=t.dir==="asc"?"asc":"desc";let y;e[30]!==i?(y=()=>i("avg"),e[30]=i,e[31]=y):y=e[31];let j;e[32]!==U||e[33]!==z||e[34]!==y?(j={key:"avg",hideOnMobile:!0,header:s.jsx(J,{label:"Avg",active:U,dir:z,onClick:y}),align:"right",cell:De},e[32]=U,e[33]=z,e[34]=y,e[35]=j):j=e[35];let $,F;e[36]===Symbol.for("react.memo_cache_sentinel")?($={key:"lcp",hideOnMobile:!0,header:"LCP",align:"right",cell:Oe},F={key:"inp",hideOnMobile:!0,header:"INP",align:"right",cell:Ee},e[36]=$,e[37]=F):($=e[36],F=e[37]);const A=t.sort===r,G=t.dir==="asc"?"asc":"desc";let v;e[38]!==r||e[39]!==i?(v=()=>i(r),e[38]=r,e[39]=i,e[40]=v):v=e[40];let _;e[41]!==r||e[42]!==A||e[43]!==G||e[44]!==v?(_=s.jsx(J,{label:r,active:A,dir:G,onClick:v}),e[41]=r,e[42]=A,e[43]=G,e[44]=v,e[45]=_):_=e[45];let S;e[46]!==r?(S=l=>s.jsx("span",{className:"font-semibold",children:o(l[r])}),e[46]=r,e[47]=S):S=e[47];let k;e[48]!==r||e[49]!==_||e[50]!==S?(k={key:r,header:_,align:"right",cell:S},e[48]=r,e[49]=_,e[50]=S,e[51]=k):k=e[51];let P;e[52]!==b||e[53]!==j||e[54]!==k?(P=[O,D,b,T,j,$,F,k],e[52]=b,e[53]=j,e[54]=k,e[55]=P):P=e[55];let w;e[56]!==t.components||e[57]!==P?(w=s.jsx(Z,{rows:t.components,rowKey:Re,empty:E,columns:P}),e[56]=t.components,e[57]=P,e[58]=w):w=e[58];let I;e[59]===Symbol.for("react.memo_cache_sentinel")?(I=s.jsx("h2",{className:"text-sm font-semibold",children:"Recent"}),e[59]=I):I=e[59];let R;e[60]===Symbol.for("react.memo_cache_sentinel")?(R=[{key:"component",label:"Component"}],e[60]=R):R=e[60];let C;e[61]!==c||e[62]!==m||e[63]!==a?(C=l=>X.visit(Y(c,m,{window:a,q:l||void 0}),{preserveState:!0}),e[61]=c,e[62]=m,e[63]=a,e[64]=C):C=e[64];let N;e[65]!==t.q||e[66]!==C?(N=s.jsx(oe,{value:t.q,fields:R,onChange:C,placeholder:"component:Widgets/Show"}),e[65]=t.q,e[66]=C,e[67]=N):N=e[67];let q;e[68]===Symbol.for("react.memo_cache_sentinel")?(q=[{key:"when",header:"When",cell:Le},{key:"st",header:"",cell:Ve},{key:"c",header:"Component",cell:Ne},{key:"u",hideOnMobile:!0,header:"URL",cell:Ce},{key:"v",hideOnMobile:!0,header:"Vitals",cell:we},{key:"b",hideOnMobile:!0,header:"Props",align:"right",cell:Pe},{key:"d",header:"Duration",align:"right",cell:ke}],e[68]=q):q=e[68];let V;e[69]!==t.recent?(V=s.jsx(Z,{rows:t.recent,rowKey:Me,columns:q}),e[69]=t.recent,e[70]=V):V=e[70];let B;return e[71]!==d||e[72]!==u||e[73]!==n||e[74]!==w||e[75]!==p||e[76]!==N||e[77]!==V||e[78]!==x?(B=s.jsxs(d,{title:u,children:[n,p,x,w,I,N,V]}),e[71]=d,e[72]=u,e[73]=n,e[74]=w,e[75]=p,e[76]=N,e[77]=V,e[78]=x,e[79]=B):B=e[79],B}function ke(t){return o(t.duration)}function Pe(t){return be(t.props_bytes)}function we(t){return s.jsx("span",{className:"text-muted-foreground font-mono text-[11px] tabular-nums",children:Se(t)})}function Ce(t){return s.jsxs("span",{className:"font-mono text-xs",children:[t.method.toUpperCase()," ",t.url]})}function Ne(t){return s.jsxs("span",{className:"font-mono text-xs",children:[t.component,t.partial&&s.jsxs("span",{className:"text-muted-foreground",children:[" ","(partial: ",t.only.join(", "),")"]})]})}function Ve(t){return s.jsx(he,{label:t.status,outcome:t.status==="error"?"failed":t.status==="success"?"processed":void 0})}function Le(t){return s.jsx("span",{className:"text-xs",children:ge(t.occurred_at)})}function Me(t){return t.id}function Ee(t){return o(t.inp)}function Oe(t){return o(t.lcp)}function De(t){return o(t.avg)}function Te(t){return xe(t.errors,t.count)}function $e(t){return ee(t.count)}function Fe(t){return s.jsx(ue,{data:t.sparkline})}function Ie(t){return s.jsx("span",{className:"font-mono text-xs",children:t.name})}function Re(t){return t.group_hash}export{it as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as B,u as F,j as t,d as I,m as R,r as $,L as A}from"./inertia-FoqYZAk8.js";import{E as G,B as L}from"./app-layout-LvxN9xSS.js";import{F as H}from"./filter-bar-DEv0G_34.js";import{P as O,E as T}from"./env-layout-HdcOaPPX.js";import{S as J}from"./series-chart-C5nXIUc5.js";import{S as q}from"./stat-BTzNKTm2.js";import{C as K,a as M}from"./card-Dpwlr0uY.js";import{e as Q}from"./execution-path-CElXXFO_.js";import{c as P,w as z}from"./format-B9SDkrWj.js";import"./use-live-CE_fN5_6.js";import"./segmented-BWee8uc9.js";import"./chart-hover-CEH-DtXO.js";import"./chart-DJHv3R7W.js";import"./arrow-up-DG01k9AL.js";function U(i){const e=B.c(51),{d:s,a:g,e:j}=i,[_,w]=$.useState(!1);let f;e[0]===Symbol.for("react.memo_cache_sentinel")?(f=()=>w(V),e[0]=f):f=e[0];let l;e[1]!==s.gem_name?(l=s.gem_name&&t.jsx(L,{variant:"secondary",className:"font-mono",children:s.gem_name}),e[1]=s.gem_name,e[2]=l):l=e[2];let a;e[3]!==s.horizon?(a=s.horizon&&t.jsxs(L,{variant:"outline",className:"font-mono",children:["removed in ",s.horizon]}),e[3]=s.horizon,e[4]=a):a=e[4];let n;e[5]!==l||e[6]!==a?(n=t.jsxs("div",{className:"flex items-center gap-2",children:[l,a]}),e[5]=l,e[6]=a,e[7]=n):n=e[7];let r;e[8]!==s.message?(r=t.jsx("p",{className:"mt-1 font-mono text-xs whitespace-pre-wrap",children:s.message}),e[8]=s.message,e[9]=r):r=e[9];let o;e[10]!==s.source?(o=s.source&&t.jsx("p",{className:"text-muted-foreground mt-1 font-mono text-xs",children:s.source}),e[10]=s.source,e[11]=o):o=e[11];let c;e[12]!==n||e[13]!==r||e[14]!==o?(c=t.jsxs("div",{className:"min-w-0 flex-1",children:[n,r,o]}),e[12]=n,e[13]=r,e[14]=o,e[15]=c):c=e[15];let x;e[16]!==s.sparkline?(x=t.jsx(J,{data:s.sparkline,className:"h-10 w-32"}),e[16]=s.sparkline,e[17]=x):x=e[17];let m;e[18]!==s.count?(m=P(s.count),e[18]=s.count,e[19]=m):m=e[19];let d;e[20]!==m?(d=t.jsx("div",{className:"text-lg font-semibold tabular-nums",children:m}),e[20]=m,e[21]=d):d=e[21];let u;e[22]===Symbol.for("react.memo_cache_sentinel")?(u=t.jsx("div",{className:"text-muted-foreground text-xs",children:"occurrences"}),e[22]=u):u=e[22];let p;e[23]!==d?(p=t.jsxs("div",{className:"text-right",children:[d,u]}),e[23]=d,e[24]=p):p=e[24];let h;e[25]!==p||e[26]!==x?(h=t.jsxs("div",{className:"flex shrink-0 items-center gap-4",children:[x,p]}),e[25]=p,e[26]=x,e[27]=h):h=e[27];let v;e[28]!==h||e[29]!==c?(v=t.jsxs("button",{type:"button",onClick:f,className:"flex flex-wrap items-start justify-between gap-4 text-left",children:[c,h]}),e[28]=h,e[29]=c,e[30]=v):v=e[30];let N;e[31]!==s.first_seen_at?(N=z(s.first_seen_at),e[31]=s.first_seen_at,e[32]=N):N=e[32];let b;e[33]!==N?(b=t.jsxs("span",{children:["First seen ",N]}),e[33]=N,e[34]=b):b=e[34];let y;e[35]!==s.last_seen_at?(y=z(s.last_seen_at),e[35]=s.last_seen_at,e[36]=y):y=e[36];let S;e[37]!==y?(S=t.jsxs("span",{children:["Last seen ",y]}),e[37]=y,e[38]=S):S=e[38];let k;e[39]!==b||e[40]!==S?(k=t.jsxs("div",{className:"text-muted-foreground flex gap-4 text-xs",children:[b,S]}),e[39]=b,e[40]=S,e[41]=k):k=e[41];let E;e[42]!==g||e[43]!==s.occurrences||e[44]!==j||e[45]!==_?(E=_&&t.jsx("div",{className:"mt-2 overflow-hidden rounded-lg border",children:t.jsx("table",{className:"w-full text-xs",children:t.jsx("tbody",{children:s.occurrences.map(D=>t.jsxs("tr",{className:"border-t first:border-t-0",children:[t.jsx("td",{className:"px-3 py-1.5 tabular-nums",children:z(D.occurred_at)}),t.jsx("td",{className:"px-3 py-1.5",children:D.execution_id?t.jsx(A,{className:"font-mono hover:underline",href:Q({applicationId:g,environmentId:j,source:D.execution_source,executionId:D.execution_id}),children:D.execution_preview}):t.jsx("span",{className:"text-muted-foreground",children:"–"})})]},D.id))})})}),e[42]=g,e[43]=s.occurrences,e[44]=j,e[45]=_,e[46]=E):E=e[46];let C;return e[47]!==v||e[48]!==k||e[49]!==E?(C=t.jsx(K,{children:t.jsxs(M,{className:"flex flex-col gap-2 pt-4",children:[v,k,E]})}),e[47]=v,e[48]=k,e[49]=E,e[50]=C):C=e[50],C}function V(i){return!i}function me(i){const e=B.c(33),{environment:s,window:g}=F().props,j=s.application_id,_=s.id;let w;e[0]===Symbol.for("react.memo_cache_sentinel")?(w=t.jsx(O,{title:"Deprecations",description:"ActiveSupport::Deprecation warnings, grouped by gem and message."}),e[0]=w):w=e[0];let f;e[1]!==i.distinct?(f=P(i.distinct),e[1]=i.distinct,e[2]=f):f=e[2];let l;e[3]!==f?(l=t.jsx(q,{label:"Distinct deprecations",value:f}),e[3]=f,e[4]=l):l=e[4];let a;e[5]!==i.total_occurrences?(a=P(i.total_occurrences),e[5]=i.total_occurrences,e[6]=a):a=e[6];let n;e[7]!==a?(n=t.jsx(q,{label:"Total occurrences",value:a}),e[7]=a,e[8]=n):n=e[8];let r;e[9]!==i.new_this_window?(r=P(i.new_this_window),e[9]=i.new_this_window,e[10]=r):r=e[10];let o;e[11]!==r?(o=t.jsx(q,{label:"New this window",value:r}),e[11]=r,e[12]=o):o=e[12];let c;e[13]!==l||e[14]!==n||e[15]!==o?(c=t.jsxs("div",{className:"grid grid-cols-3 gap-3",children:[l,n,o]}),e[13]=l,e[14]=n,e[15]=o,e[16]=c):c=e[16];let x;e[17]===Symbol.for("react.memo_cache_sentinel")?(x=[{key:"gem",label:"Gem"}],e[17]=x):x=e[17];let m;e[18]!==j||e[19]!==_||e[20]!==g?(m=h=>I.visit(R(j,_,{window:g,q:h||void 0}),{preserveState:!0}),e[18]=j,e[19]=_,e[20]=g,e[21]=m):m=e[21];let d;e[22]!==i.q||e[23]!==m?(d=t.jsx(H,{value:i.q,fields:x,onChange:m,placeholder:"gem:rails deprecated method"}),e[22]=i.q,e[23]=m,e[24]=d):d=e[24];let u;e[25]!==j||e[26]!==_||e[27]!==i.deprecations?(u=i.deprecations.length===0?t.jsx(G,{title:"No deprecations in this window."}):t.jsx("div",{className:"flex flex-col gap-3",children:i.deprecations.map(h=>t.jsx(U,{d:h,a:j,e:_},h.group_hash))}),e[25]=j,e[26]=_,e[27]=i.deprecations,e[28]=u):u=e[28];let p;return e[29]!==d||e[30]!==u||e[31]!==c?(p=t.jsxs(T,{title:"Deprecations",children:[w,c,d,u]}),e[29]=d,e[30]=u,e[31]=c,e[32]=p):p=e[32],p}export{me as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as ae,j as t,o as ie,u as re,r as W,ab as le,ao as oe,F as G,d as O,ap as de,aq as J}from"./inertia-FoqYZAk8.js";import{D as Q}from"./data-table-DYi-N0hm.js";import{ar as i,a8 as h,b as F,E as X,au as Y}from"./app-layout-LvxN9xSS.js";import{P as me,E as ce}from"./env-layout-HdcOaPPX.js";import{R as ue}from"./relative-time-DcJbkKlN.js";import{b as Z,c as ee,C as te,a as se}from"./card-Dpwlr0uY.js";import"./chart-hover-CEH-DtXO.js";import"./use-live-CE_fN5_6.js";import"./format-B9SDkrWj.js";import"./segmented-BWee8uc9.js";function S(s){const e=ae.c(8);let l,r,c;e[0]!==s?({messages:l,className:c,...r}=s,e[0]=s,e[1]=l,e[2]=r,e[3]=c):(l=e[1],r=e[2],c=e[3]);const d=c===void 0?"":c;let u;return e[4]!==d||e[5]!==l||e[6]!==r?(u=l?t.jsx("p",{...r,className:ie("text-sm text-red-600 dark:text-red-400",d),children:l.join(", ")}):null,e[4]=d,e[5]=l,e[6]=r,e[7]=u):u=e[7],u}function Ke(s){const e=ae.c(56),{environment:l}=re().props,[r,c]=W.useState(s.kinds[0]),[d,u]=W.useState(s.metrics[0]),[C,ne]=W.useState(s.anomaly_target_kinds[0]),[E,U]=W.useState(s.anomaly_metrics[0]),$=s.anomaly_metrics_for_kind[C]??s.anomaly_metrics,z=s.metrics_for_kind[r]??s.metrics,B=s.units[d]??"ms",H=B==="$"?"Limit (US$)":B==="%"?"Limit (%)":B===""?"Limit (count)":"Limit (ms)",a=l.application_id,n=l.id;let A;e[0]===Symbol.for("react.memo_cache_sentinel")?(A=t.jsx(me,{withWindow:!1,title:"Thresholds",description:"Performance rules. When a route, job, or query crosses one, Railwatch opens a performance issue and alerts the rules subscribed to thresholds."}),e[0]=A):A=e[0];let R;e[1]===Symbol.for("react.memo_cache_sentinel")?(R=t.jsx(Z,{children:t.jsx(ee,{children:"Add a threshold"})}),e[1]=R):R=e[1];let x;e[2]!==a||e[3]!==n?(x=le(a,n),e[2]=a,e[3]=n,e[4]=x):x=e[4];let g;e[5]!==z||e[6]!==r||e[7]!==H||e[8]!==d||e[9]!==s.jobs||e[10]!==s.kinds||e[11]!==s.llm_models||e[12]!==s.metrics||e[13]!==s.metrics_for_kind||e[14]!==s.routes?(g=o=>{const{errors:k,processing:I}=o;return t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"grid gap-1",children:[t.jsx(i,{htmlFor:"target_kind",children:"Kind"}),t.jsx("select",{id:"target_kind",name:"target_kind",value:r,onChange:m=>{c(m.target.value);const w=s.metrics_for_kind[m.target.value]??s.metrics;w.includes(d)||u(w[0])},className:"border-input h-9 rounded-md border bg-transparent px-2 text-sm",children:s.kinds.map(ke)})]}),t.jsxs("div",{className:"grid gap-1 md:col-span-2",children:[t.jsx(i,{htmlFor:"target",children:"Target"}),t.jsx(h,{id:"target",name:"target",defaultValue:"*",list:"targets",placeholder:"* for all, or a route / job name"}),t.jsxs("datalist",{id:"targets",children:[t.jsx("option",{value:"*"}),t.jsx("option",{value:"unmatched"}),s.routes.map(Ne),s.jobs.map(ve),s.llm_models.map(be)]}),t.jsx(S,{messages:k.target})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(i,{htmlFor:"metric",children:"Metric"}),t.jsx("select",{id:"metric",name:"metric",className:"border-input h-9 rounded-md border bg-transparent px-2 text-sm",value:d,onChange:m=>u(m.target.value),children:z.map(ye)})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(i,{htmlFor:"limit",children:H}),t.jsx(h,{id:"limit",name:"limit",type:"number",step:"any",defaultValue:2e3}),t.jsx(S,{messages:k.limit})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(i,{htmlFor:"window_minutes",children:"Window (min)"}),t.jsx(h,{id:"window_minutes",name:"window_minutes",type:"number",defaultValue:5})]}),t.jsx("div",{className:"md:col-span-6",children:t.jsx(F,{disabled:I,children:"Add threshold"})})]})},e[5]=z,e[6]=r,e[7]=H,e[8]=d,e[9]=s.jobs,e[10]=s.kinds,e[11]=s.llm_models,e[12]=s.metrics,e[13]=s.metrics_for_kind,e[14]=s.routes,e[15]=g):g=e[15];let j;e[16]!==x||e[17]!==g?(j=t.jsxs(te,{children:[R,t.jsx(se,{children:t.jsx(G,{method:"post",action:x,className:"grid gap-3 md:grid-cols-6",children:g})})]}),e[16]=x,e[17]=g,e[18]=j):j=e[18];let T,L;e[19]===Symbol.for("react.memo_cache_sentinel")?(T=t.jsx(X,{icon:Y,title:"No thresholds yet",description:"Start with requests * p95 2000ms to get alerted on regressions."}),L={key:"d",header:"Rule",cell:fe},e[19]=T,e[20]=L):(T=e[19],L=e[20]);let p;e[21]!==a||e[22]!==n?(p=[L,{key:"x",header:"",align:"right",cell:o=>t.jsx(F,{size:"sm",variant:"ghost",onClick:()=>O.delete(de(a,n,o.id)),children:"Remove"})}],e[21]=a,e[22]=n,e[23]=p):p=e[23];let f;e[24]!==s.thresholds||e[25]!==p?(f=t.jsx(Q,{rows:s.thresholds,rowKey:_e,empty:T,columns:p}),e[24]=s.thresholds,e[25]=p,e[26]=f):f=e[26];let P;e[27]===Symbol.for("react.memo_cache_sentinel")?(P=t.jsxs("div",{children:[t.jsx("h2",{className:"text-base font-semibold",children:"Anomaly rules"}),t.jsx("p",{className:"text-muted-foreground text-sm",children:"A threshold needs a number you already know. An anomaly rule learns one: it compares the last few minutes against the same clock window on each of the previous days and opens an issue when today sits more than the given number of standard deviations above that baseline."})]}),e[27]=P):P=e[27];let K;e[28]===Symbol.for("react.memo_cache_sentinel")?(K=t.jsx(Z,{children:t.jsx(ee,{children:"Add an anomaly rule"})}),e[28]=K):K=e[28];let _;e[29]!==a||e[30]!==n?(_=oe(a,n),e[29]=a,e[30]=n,e[31]=_):_=e[31];let y;e[32]!==$||e[33]!==C||e[34]!==E||e[35]!==s.anomaly_metrics||e[36]!==s.anomaly_metrics_for_kind||e[37]!==s.anomaly_target_kinds?(y=o=>{const{errors:k,processing:I}=o;return t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:"grid gap-1",children:[t.jsx(i,{htmlFor:"anomaly_target_kind",children:"Kind"}),t.jsx("select",{id:"anomaly_target_kind",name:"target_kind",className:"border-input h-9 rounded-md border bg-transparent px-2 text-sm",value:C,onChange:m=>{ne(m.target.value);const w=s.anomaly_metrics_for_kind[m.target.value]??s.anomaly_metrics;w.includes(E)||U(w[0])},children:s.anomaly_target_kinds.map(pe)})]}),t.jsxs("div",{className:"grid gap-1 md:col-span-2",children:[t.jsx(i,{htmlFor:"anomaly_target",children:"Target"}),t.jsx(h,{id:"anomaly_target",name:"target",defaultValue:"*",list:"targets",placeholder:"* for all, or a route / job name"}),t.jsx(S,{messages:k.target})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(i,{htmlFor:"anomaly_metric",children:"Metric"}),t.jsx("select",{id:"anomaly_metric",name:"metric",className:"border-input h-9 rounded-md border bg-transparent px-2 text-sm",value:E,onChange:m=>U(m.target.value),children:$.map(je)})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(i,{htmlFor:"deviation",children:"Deviation (σ)"}),t.jsx(h,{id:"deviation",name:"deviation",type:"number",step:"0.5",min:"0.5",defaultValue:3}),t.jsx(S,{messages:k.deviation})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(i,{htmlFor:"anomaly_window_minutes",children:"Window (min)"}),t.jsx(h,{id:"anomaly_window_minutes",name:"window_minutes",type:"number",defaultValue:15})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(i,{htmlFor:"baseline_days",children:"Baseline (days)"}),t.jsx(h,{id:"baseline_days",name:"baseline_days",type:"number",defaultValue:7}),t.jsx(S,{messages:k.baseline_days})]}),t.jsxs("div",{className:"grid gap-1",children:[t.jsx(i,{htmlFor:"enabled",children:"Status"}),t.jsxs("select",{id:"enabled",name:"enabled",className:"border-input h-9 rounded-md border bg-transparent px-2 text-sm",children:[t.jsx("option",{value:"true",children:"enabled"}),t.jsx("option",{value:"false",children:"disabled"})]})]}),t.jsx("div",{className:"md:col-span-6",children:t.jsx(F,{disabled:I,children:"Add anomaly rule"})})]})},e[32]=$,e[33]=C,e[34]=E,e[35]=s.anomaly_metrics,e[36]=s.anomaly_metrics_for_kind,e[37]=s.anomaly_target_kinds,e[38]=y):y=e[38];let b;e[39]!==_||e[40]!==y?(b=t.jsxs(te,{children:[K,t.jsx(se,{children:t.jsx(G,{method:"post",action:_,className:"grid gap-3 md:grid-cols-6",children:y})})]}),e[39]=_,e[40]=y,e[41]=b):b=e[41];let V,M,q;e[42]===Symbol.for("react.memo_cache_sentinel")?(V=t.jsx(X,{icon:Y,title:"No anomaly rules yet",description:"Start with requests * p95 at 3σ over a 7-day baseline."}),M={key:"d",header:"Rule",cell:xe},q={key:"f",header:"Last fired",hideOnMobile:!0,cell:he},e[42]=V,e[43]=M,e[44]=q):(V=e[42],M=e[43],q=e[44]);let v;e[45]!==a||e[46]!==n?(v=[M,q,{key:"x",header:"",align:"right",cell:o=>t.jsxs("span",{className:"flex justify-end gap-1",children:[t.jsx(F,{size:"sm",variant:"ghost",onClick:()=>O.patch(J(a,n,o.id),{enabled:!o.enabled}),children:o.enabled?"Disable":"Enable"}),t.jsx(F,{size:"sm",variant:"ghost",className:"text-destructive",onClick:()=>O.delete(J(a,n,o.id)),children:"Remove"})]})}],e[45]=a,e[46]=n,e[47]=v):v=e[47];let N;e[48]!==s.anomaly_rules||e[49]!==v?(N=t.jsx(Q,{rows:s.anomaly_rules,rowKey:ge,empty:V,columns:v}),e[48]=s.anomaly_rules,e[49]=v,e[50]=N):N=e[50];let D;return e[51]!==b||e[52]!==N||e[53]!==j||e[54]!==f?(D=t.jsxs(ce,{title:"Thresholds",children:[A,j,f,P,b,N]}),e[51]=b,e[52]=N,e[53]=j,e[54]=f,e[55]=D):D=e[55],D}function he(s){return t.jsx(ue,{iso:s.last_fired_at,className:"text-muted-foreground font-mono text-xs"})}function xe(s){return t.jsxs("span",{className:"text-sm",children:[s.description,s.enabled?null:t.jsx("span",{className:"text-muted-foreground label-caps ml-2",children:"disabled"})]})}function ge(s){return s.id}function je(s){return t.jsx("option",{value:s,children:s},s)}function pe(s){return t.jsx("option",{value:s,children:s},s)}function fe(s){return t.jsx("span",{className:"text-sm",children:s.description})}function _e(s){return s.id}function ye(s){return t.jsx("option",{value:s,children:s},s)}function be(s){return t.jsx("option",{value:s},s)}function ve(s){return t.jsx("option",{value:s},s)}function Ne(s){return t.jsx("option",{value:s},s)}function ke(s){return t.jsx("option",{value:s,children:s},s)}export{Ke as default};
|