nuxt-observe 0.0.2
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.
- package/README.md +92 -0
- package/dist/module.d.mts +7 -0
- package/dist/module.json +9 -0
- package/dist/module.mjs +393 -0
- package/dist/runtime/app/assets/css/main.css +1 -0
- package/dist/runtime/app/components/ObserveActivityFeed.d.vue.ts +13 -0
- package/dist/runtime/app/components/ObserveActivityFeed.vue +77 -0
- package/dist/runtime/app/components/ObserveActivityFeed.vue.d.ts +13 -0
- package/dist/runtime/app/components/ObserveActivityTable.d.vue.ts +30 -0
- package/dist/runtime/app/components/ObserveActivityTable.vue +187 -0
- package/dist/runtime/app/components/ObserveActivityTable.vue.d.ts +30 -0
- package/dist/runtime/app/components/ObserveCan.d.vue.ts +27 -0
- package/dist/runtime/app/components/ObserveCan.vue +16 -0
- package/dist/runtime/app/components/ObserveCan.vue.d.ts +27 -0
- package/dist/runtime/app/components/ObserveErrorsTable.d.vue.ts +19 -0
- package/dist/runtime/app/components/ObserveErrorsTable.vue +105 -0
- package/dist/runtime/app/components/ObserveErrorsTable.vue.d.ts +19 -0
- package/dist/runtime/app/components/ObserveHealthHero.d.vue.ts +16 -0
- package/dist/runtime/app/components/ObserveHealthHero.vue +114 -0
- package/dist/runtime/app/components/ObserveHealthHero.vue.d.ts +16 -0
- package/dist/runtime/app/components/ObserveJourneySearch.d.vue.ts +13 -0
- package/dist/runtime/app/components/ObserveJourneySearch.vue +55 -0
- package/dist/runtime/app/components/ObserveJourneySearch.vue.d.ts +13 -0
- package/dist/runtime/app/components/ObserveJourneyTimeline.d.vue.ts +14 -0
- package/dist/runtime/app/components/ObserveJourneyTimeline.vue +119 -0
- package/dist/runtime/app/components/ObserveJourneyTimeline.vue.d.ts +14 -0
- package/dist/runtime/app/components/ObserveLogDetail.d.vue.ts +12 -0
- package/dist/runtime/app/components/ObserveLogDetail.vue +187 -0
- package/dist/runtime/app/components/ObserveLogDetail.vue.d.ts +12 -0
- package/dist/runtime/app/components/ObserveLogLevelBadge.d.vue.ts +10 -0
- package/dist/runtime/app/components/ObserveLogLevelBadge.vue +29 -0
- package/dist/runtime/app/components/ObserveLogLevelBadge.vue.d.ts +10 -0
- package/dist/runtime/app/components/ObserveLogsFilterBar.d.vue.ts +20 -0
- package/dist/runtime/app/components/ObserveLogsFilterBar.vue +134 -0
- package/dist/runtime/app/components/ObserveLogsFilterBar.vue.d.ts +20 -0
- package/dist/runtime/app/components/ObserveLogsTable.d.vue.ts +20 -0
- package/dist/runtime/app/components/ObserveLogsTable.vue +92 -0
- package/dist/runtime/app/components/ObserveLogsTable.vue.d.ts +20 -0
- package/dist/runtime/app/components/ObservePeriodSelector.d.vue.ts +3 -0
- package/dist/runtime/app/components/ObservePeriodSelector.vue +22 -0
- package/dist/runtime/app/components/ObservePeriodSelector.vue.d.ts +3 -0
- package/dist/runtime/app/components/ObserveRegressionAlert.d.vue.ts +12 -0
- package/dist/runtime/app/components/ObserveRegressionAlert.vue +27 -0
- package/dist/runtime/app/components/ObserveRegressionAlert.vue.d.ts +12 -0
- package/dist/runtime/app/components/ObserveServiceSwitcher.d.vue.ts +3 -0
- package/dist/runtime/app/components/ObserveServiceSwitcher.vue +49 -0
- package/dist/runtime/app/components/ObserveServiceSwitcher.vue.d.ts +3 -0
- package/dist/runtime/app/components/ObserveServicesTable.d.vue.ts +15 -0
- package/dist/runtime/app/components/ObserveServicesTable.vue +109 -0
- package/dist/runtime/app/components/ObserveServicesTable.vue.d.ts +15 -0
- package/dist/runtime/app/components/ObserveStatCard.d.vue.ts +14 -0
- package/dist/runtime/app/components/ObserveStatCard.vue +34 -0
- package/dist/runtime/app/components/ObserveStatCard.vue.d.ts +14 -0
- package/dist/runtime/app/components/charts/ObserveErrorRateChart.client.d.vue.ts +15 -0
- package/dist/runtime/app/components/charts/ObserveErrorRateChart.client.vue +170 -0
- package/dist/runtime/app/components/charts/ObserveErrorRateChart.client.vue.d.ts +15 -0
- package/dist/runtime/app/components/charts/ObserveServiceBreakdownChart.client.d.vue.ts +17 -0
- package/dist/runtime/app/components/charts/ObserveServiceBreakdownChart.client.vue +208 -0
- package/dist/runtime/app/components/charts/ObserveServiceBreakdownChart.client.vue.d.ts +17 -0
- package/dist/runtime/app/components/charts/ObserveVersionAdoptionChart.client.d.vue.ts +14 -0
- package/dist/runtime/app/components/charts/ObserveVersionAdoptionChart.client.vue +208 -0
- package/dist/runtime/app/components/charts/ObserveVersionAdoptionChart.client.vue.d.ts +14 -0
- package/dist/runtime/app/components/charts/ObserveVersionCompareChart.client.d.vue.ts +14 -0
- package/dist/runtime/app/components/charts/ObserveVersionCompareChart.client.vue +190 -0
- package/dist/runtime/app/components/charts/ObserveVersionCompareChart.client.vue.d.ts +14 -0
- package/dist/runtime/app/components/charts/ObserveVolumeChart.client.d.vue.ts +16 -0
- package/dist/runtime/app/components/charts/ObserveVolumeChart.client.vue +199 -0
- package/dist/runtime/app/components/charts/ObserveVolumeChart.client.vue.d.ts +16 -0
- package/dist/runtime/app/components/charts/chart-core.d.ts +64 -0
- package/dist/runtime/app/components/charts/chart-core.js +136 -0
- package/dist/runtime/app/components/settings/ObserveApiKeyPanel.d.vue.ts +8 -0
- package/dist/runtime/app/components/settings/ObserveApiKeyPanel.vue +145 -0
- package/dist/runtime/app/components/settings/ObserveApiKeyPanel.vue.d.ts +8 -0
- package/dist/runtime/app/components/settings/ObserveApiKeyRevealModal.d.vue.ts +19 -0
- package/dist/runtime/app/components/settings/ObserveApiKeyRevealModal.vue +106 -0
- package/dist/runtime/app/components/settings/ObserveApiKeyRevealModal.vue.d.ts +19 -0
- package/dist/runtime/app/components/settings/ObserveAssignmentEditor.d.vue.ts +12 -0
- package/dist/runtime/app/components/settings/ObserveAssignmentEditor.vue +67 -0
- package/dist/runtime/app/components/settings/ObserveAssignmentEditor.vue.d.ts +12 -0
- package/dist/runtime/app/components/settings/ObserveGroupFormModal.d.vue.ts +18 -0
- package/dist/runtime/app/components/settings/ObserveGroupFormModal.vue +60 -0
- package/dist/runtime/app/components/settings/ObserveGroupFormModal.vue.d.ts +18 -0
- package/dist/runtime/app/components/settings/ObserveGroupMembershipEditor.d.vue.ts +20 -0
- package/dist/runtime/app/components/settings/ObserveGroupMembershipEditor.vue +21 -0
- package/dist/runtime/app/components/settings/ObserveGroupMembershipEditor.vue.d.ts +20 -0
- package/dist/runtime/app/components/settings/ObserveOriginAllowlistEditor.d.vue.ts +15 -0
- package/dist/runtime/app/components/settings/ObserveOriginAllowlistEditor.vue +63 -0
- package/dist/runtime/app/components/settings/ObserveOriginAllowlistEditor.vue.d.ts +15 -0
- package/dist/runtime/app/components/settings/ObserveServiceEditForm.d.vue.ts +38 -0
- package/dist/runtime/app/components/settings/ObserveServiceEditForm.vue +216 -0
- package/dist/runtime/app/components/settings/ObserveServiceEditForm.vue.d.ts +38 -0
- package/dist/runtime/app/components/settings/ObserveServiceFormModal.d.vue.ts +37 -0
- package/dist/runtime/app/components/settings/ObserveServiceFormModal.vue +192 -0
- package/dist/runtime/app/components/settings/ObserveServiceFormModal.vue.d.ts +37 -0
- package/dist/runtime/app/components/settings/ObserveServiceTypeBadge.d.vue.ts +11 -0
- package/dist/runtime/app/components/settings/ObserveServiceTypeBadge.vue +18 -0
- package/dist/runtime/app/components/settings/ObserveServiceTypeBadge.vue.d.ts +11 -0
- package/dist/runtime/app/components/settings/ObserveSettingsServicesTable.d.vue.ts +19 -0
- package/dist/runtime/app/components/settings/ObserveSettingsServicesTable.vue +132 -0
- package/dist/runtime/app/components/settings/ObserveSettingsServicesTable.vue.d.ts +19 -0
- package/dist/runtime/app/components/settings/ObserveUserFormModal.d.vue.ts +27 -0
- package/dist/runtime/app/components/settings/ObserveUserFormModal.vue +108 -0
- package/dist/runtime/app/components/settings/ObserveUserFormModal.vue.d.ts +27 -0
- package/dist/runtime/app/components/settings/ObserveVersionTrackingField.d.vue.ts +17 -0
- package/dist/runtime/app/components/settings/ObserveVersionTrackingField.vue +20 -0
- package/dist/runtime/app/components/settings/ObserveVersionTrackingField.vue.d.ts +17 -0
- package/dist/runtime/app/composables/useObserveAbility.d.ts +15 -0
- package/dist/runtime/app/composables/useObserveAbility.js +20 -0
- package/dist/runtime/app/composables/useObserveActivity.d.ts +22 -0
- package/dist/runtime/app/composables/useObserveActivity.js +44 -0
- package/dist/runtime/app/composables/useObserveApiKeys.d.ts +15 -0
- package/dist/runtime/app/composables/useObserveApiKeys.js +19 -0
- package/dist/runtime/app/composables/useObserveAssignments.d.ts +19 -0
- package/dist/runtime/app/composables/useObserveAssignments.js +16 -0
- package/dist/runtime/app/composables/useObserveErrors.d.ts +33 -0
- package/dist/runtime/app/composables/useObserveErrors.js +85 -0
- package/dist/runtime/app/composables/useObserveGroups.d.ts +27 -0
- package/dist/runtime/app/composables/useObserveGroups.js +33 -0
- package/dist/runtime/app/composables/useObserveJourney.d.ts +19 -0
- package/dist/runtime/app/composables/useObserveJourney.js +19 -0
- package/dist/runtime/app/composables/useObserveLogFacets.d.ts +11 -0
- package/dist/runtime/app/composables/useObserveLogFacets.js +21 -0
- package/dist/runtime/app/composables/useObserveLogs.d.ts +28 -0
- package/dist/runtime/app/composables/useObserveLogs.js +100 -0
- package/dist/runtime/app/composables/useObserveMigrations.d.ts +17 -0
- package/dist/runtime/app/composables/useObserveMigrations.js +49 -0
- package/dist/runtime/app/composables/useObserveOverview.d.ts +14 -0
- package/dist/runtime/app/composables/useObserveOverview.js +23 -0
- package/dist/runtime/app/composables/useObservePeriod.d.ts +11 -0
- package/dist/runtime/app/composables/useObservePeriod.js +18 -0
- package/dist/runtime/app/composables/useObserveRollout.d.ts +20 -0
- package/dist/runtime/app/composables/useObserveRollout.js +55 -0
- package/dist/runtime/app/composables/useObserveScope.d.ts +13 -0
- package/dist/runtime/app/composables/useObserveScope.js +17 -0
- package/dist/runtime/app/composables/useObserveServices.d.ts +26 -0
- package/dist/runtime/app/composables/useObserveServices.js +33 -0
- package/dist/runtime/app/composables/useObserveStats.d.ts +14 -0
- package/dist/runtime/app/composables/useObserveStats.js +23 -0
- package/dist/runtime/app/composables/useObserveUsers.d.ts +29 -0
- package/dist/runtime/app/composables/useObserveUsers.js +33 -0
- package/dist/runtime/app/layouts/observe.d.vue.ts +13 -0
- package/dist/runtime/app/layouts/observe.vue +138 -0
- package/dist/runtime/app/layouts/observe.vue.d.ts +13 -0
- package/dist/runtime/app/middleware/observe-auth.global.d.ts +9 -0
- package/dist/runtime/app/middleware/observe-auth.global.js +8 -0
- package/dist/runtime/app/pages/activity.d.vue.ts +3 -0
- package/dist/runtime/app/pages/activity.vue +54 -0
- package/dist/runtime/app/pages/activity.vue.d.ts +3 -0
- package/dist/runtime/app/pages/error-detail.d.vue.ts +3 -0
- package/dist/runtime/app/pages/error-detail.vue +190 -0
- package/dist/runtime/app/pages/error-detail.vue.d.ts +3 -0
- package/dist/runtime/app/pages/errors.d.vue.ts +3 -0
- package/dist/runtime/app/pages/errors.vue +47 -0
- package/dist/runtime/app/pages/errors.vue.d.ts +3 -0
- package/dist/runtime/app/pages/journey.d.vue.ts +3 -0
- package/dist/runtime/app/pages/journey.vue +96 -0
- package/dist/runtime/app/pages/journey.vue.d.ts +3 -0
- package/dist/runtime/app/pages/log-detail.d.vue.ts +3 -0
- package/dist/runtime/app/pages/log-detail.vue +35 -0
- package/dist/runtime/app/pages/log-detail.vue.d.ts +3 -0
- package/dist/runtime/app/pages/login.d.vue.ts +3 -0
- package/dist/runtime/app/pages/login.vue +69 -0
- package/dist/runtime/app/pages/login.vue.d.ts +3 -0
- package/dist/runtime/app/pages/logs.d.vue.ts +3 -0
- package/dist/runtime/app/pages/logs.vue +36 -0
- package/dist/runtime/app/pages/logs.vue.d.ts +3 -0
- package/dist/runtime/app/pages/metrics.d.vue.ts +3 -0
- package/dist/runtime/app/pages/metrics.vue +68 -0
- package/dist/runtime/app/pages/metrics.vue.d.ts +3 -0
- package/dist/runtime/app/pages/overview.d.vue.ts +3 -0
- package/dist/runtime/app/pages/overview.vue +65 -0
- package/dist/runtime/app/pages/overview.vue.d.ts +3 -0
- package/dist/runtime/app/pages/rollout.d.vue.ts +3 -0
- package/dist/runtime/app/pages/rollout.vue +188 -0
- package/dist/runtime/app/pages/rollout.vue.d.ts +3 -0
- package/dist/runtime/app/pages/settings/group-detail.d.vue.ts +3 -0
- package/dist/runtime/app/pages/settings/group-detail.vue +149 -0
- package/dist/runtime/app/pages/settings/group-detail.vue.d.ts +3 -0
- package/dist/runtime/app/pages/settings/groups.d.vue.ts +3 -0
- package/dist/runtime/app/pages/settings/groups.vue +107 -0
- package/dist/runtime/app/pages/settings/groups.vue.d.ts +3 -0
- package/dist/runtime/app/pages/settings/index.d.vue.ts +3 -0
- package/dist/runtime/app/pages/settings/index.vue +47 -0
- package/dist/runtime/app/pages/settings/index.vue.d.ts +3 -0
- package/dist/runtime/app/pages/settings/migrations.d.vue.ts +3 -0
- package/dist/runtime/app/pages/settings/migrations.vue +275 -0
- package/dist/runtime/app/pages/settings/migrations.vue.d.ts +3 -0
- package/dist/runtime/app/pages/settings/service-detail.d.vue.ts +3 -0
- package/dist/runtime/app/pages/settings/service-detail.vue +133 -0
- package/dist/runtime/app/pages/settings/service-detail.vue.d.ts +3 -0
- package/dist/runtime/app/pages/settings/services.d.vue.ts +3 -0
- package/dist/runtime/app/pages/settings/services.vue +66 -0
- package/dist/runtime/app/pages/settings/services.vue.d.ts +3 -0
- package/dist/runtime/app/pages/settings/users/[id].d.vue.ts +3 -0
- package/dist/runtime/app/pages/settings/users/[id].vue +243 -0
- package/dist/runtime/app/pages/settings/users/[id].vue.d.ts +3 -0
- package/dist/runtime/app/pages/settings/users/index.d.vue.ts +3 -0
- package/dist/runtime/app/pages/settings/users/index.vue +129 -0
- package/dist/runtime/app/pages/settings/users/index.vue.d.ts +3 -0
- package/dist/runtime/options.d.ts +1 -0
- package/dist/runtime/options.js +1 -0
- package/dist/runtime/server/api/observe/activity.get.d.ts +3 -0
- package/dist/runtime/server/api/observe/activity.get.js +30 -0
- package/dist/runtime/server/api/observe/auth/login.post.d.ts +4 -0
- package/dist/runtime/server/api/observe/auth/login.post.js +13 -0
- package/dist/runtime/server/api/observe/auth/logout.post.d.ts +4 -0
- package/dist/runtime/server/api/observe/auth/logout.post.js +6 -0
- package/dist/runtime/server/api/observe/auth/me.get.d.ts +2 -0
- package/dist/runtime/server/api/observe/auth/me.get.js +3 -0
- package/dist/runtime/server/api/observe/errors/[fingerprint].get.d.ts +3 -0
- package/dist/runtime/server/api/observe/errors/[fingerprint].get.js +56 -0
- package/dist/runtime/server/api/observe/errors/index.get.d.ts +3 -0
- package/dist/runtime/server/api/observe/errors/index.get.js +41 -0
- package/dist/runtime/server/api/observe/facets.get.d.ts +8 -0
- package/dist/runtime/server/api/observe/facets.get.js +12 -0
- package/dist/runtime/server/api/observe/groups/[id]/assignments.put.d.ts +3 -0
- package/dist/runtime/server/api/observe/groups/[id]/assignments.put.js +12 -0
- package/dist/runtime/server/api/observe/groups/[id]/services.put.d.ts +5 -0
- package/dist/runtime/server/api/observe/groups/[id]/services.put.js +13 -0
- package/dist/runtime/server/api/observe/groups/[id].delete.d.ts +5 -0
- package/dist/runtime/server/api/observe/groups/[id].delete.js +11 -0
- package/dist/runtime/server/api/observe/groups/[id].get.d.ts +6 -0
- package/dist/runtime/server/api/observe/groups/[id].get.js +14 -0
- package/dist/runtime/server/api/observe/groups/[id].patch.d.ts +3 -0
- package/dist/runtime/server/api/observe/groups/[id].patch.js +12 -0
- package/dist/runtime/server/api/observe/groups/index.get.d.ts +3 -0
- package/dist/runtime/server/api/observe/groups/index.get.js +7 -0
- package/dist/runtime/server/api/observe/groups/index.post.d.ts +3 -0
- package/dist/runtime/server/api/observe/groups/index.post.js +11 -0
- package/dist/runtime/server/api/observe/health.get.d.ts +6 -0
- package/dist/runtime/server/api/observe/health.get.js +10 -0
- package/dist/runtime/server/api/observe/ingest/frogger.d.ts +5 -0
- package/dist/runtime/server/api/observe/ingest/frogger.js +42 -0
- package/dist/runtime/server/api/observe/ingest.d.ts +5 -0
- package/dist/runtime/server/api/observe/ingest.js +38 -0
- package/dist/runtime/server/api/observe/journey.get.d.ts +9 -0
- package/dist/runtime/server/api/observe/journey.get.js +31 -0
- package/dist/runtime/server/api/observe/logs/[id].get.d.ts +3 -0
- package/dist/runtime/server/api/observe/logs/[id].get.js +19 -0
- package/dist/runtime/server/api/observe/logs.get.d.ts +3 -0
- package/dist/runtime/server/api/observe/logs.get.js +54 -0
- package/dist/runtime/server/api/observe/migrations/index.get.d.ts +9 -0
- package/dist/runtime/server/api/observe/migrations/index.get.js +14 -0
- package/dist/runtime/server/api/observe/migrations/run.post.d.ts +13 -0
- package/dist/runtime/server/api/observe/migrations/run.post.js +35 -0
- package/dist/runtime/server/api/observe/overview.get.d.ts +3 -0
- package/dist/runtime/server/api/observe/overview.get.js +19 -0
- package/dist/runtime/server/api/observe/rollout/compare.get.d.ts +3 -0
- package/dist/runtime/server/api/observe/rollout/compare.get.js +24 -0
- package/dist/runtime/server/api/observe/rollout/regressions.get.d.ts +3 -0
- package/dist/runtime/server/api/observe/rollout/regressions.get.js +31 -0
- package/dist/runtime/server/api/observe/rollout/versions.get.d.ts +3 -0
- package/dist/runtime/server/api/observe/rollout/versions.get.js +20 -0
- package/dist/runtime/server/api/observe/services/[id]/assignments.put.d.ts +7 -0
- package/dist/runtime/server/api/observe/services/[id]/assignments.put.js +12 -0
- package/dist/runtime/server/api/observe/services/[id]/keys/[keyId]/rotate.post.d.ts +4 -0
- package/dist/runtime/server/api/observe/services/[id]/keys/[keyId]/rotate.post.js +14 -0
- package/dist/runtime/server/api/observe/services/[id]/keys/[keyId].delete.d.ts +4 -0
- package/dist/runtime/server/api/observe/services/[id]/keys/[keyId].delete.js +14 -0
- package/dist/runtime/server/api/observe/services/[id]/keys/index.get.d.ts +3 -0
- package/dist/runtime/server/api/observe/services/[id]/keys/index.get.js +10 -0
- package/dist/runtime/server/api/observe/services/[id]/keys/index.post.d.ts +3 -0
- package/dist/runtime/server/api/observe/services/[id]/keys/index.post.js +11 -0
- package/dist/runtime/server/api/observe/services/[id]/restore.post.d.ts +4 -0
- package/dist/runtime/server/api/observe/services/[id]/restore.post.js +11 -0
- package/dist/runtime/server/api/observe/services/[id].delete.d.ts +11 -0
- package/dist/runtime/server/api/observe/services/[id].delete.js +11 -0
- package/dist/runtime/server/api/observe/services/[id].get.d.ts +3 -0
- package/dist/runtime/server/api/observe/services/[id].get.js +12 -0
- package/dist/runtime/server/api/observe/services/[id].patch.d.ts +3 -0
- package/dist/runtime/server/api/observe/services/[id].patch.js +13 -0
- package/dist/runtime/server/api/observe/services/index.get.d.ts +3 -0
- package/dist/runtime/server/api/observe/services/index.get.js +7 -0
- package/dist/runtime/server/api/observe/services/index.post.d.ts +3 -0
- package/dist/runtime/server/api/observe/services/index.post.js +16 -0
- package/dist/runtime/server/api/observe/stats.get.d.ts +3 -0
- package/dist/runtime/server/api/observe/stats.get.js +28 -0
- package/dist/runtime/server/api/observe/users/[id]/assignments.put.d.ts +3 -0
- package/dist/runtime/server/api/observe/users/[id]/assignments.put.js +14 -0
- package/dist/runtime/server/api/observe/users/[id].delete.d.ts +4 -0
- package/dist/runtime/server/api/observe/users/[id].delete.js +15 -0
- package/dist/runtime/server/api/observe/users/[id].get.d.ts +3 -0
- package/dist/runtime/server/api/observe/users/[id].get.js +11 -0
- package/dist/runtime/server/api/observe/users/[id].patch.d.ts +3 -0
- package/dist/runtime/server/api/observe/users/[id].patch.js +25 -0
- package/dist/runtime/server/api/observe/users/index.get.d.ts +8 -0
- package/dist/runtime/server/api/observe/users/index.get.js +7 -0
- package/dist/runtime/server/api/observe/users/index.post.d.ts +3 -0
- package/dist/runtime/server/api/observe/users/index.post.js +29 -0
- package/dist/runtime/server/auth/authorization.d.ts +7 -0
- package/dist/runtime/server/auth/authorization.js +5 -0
- package/dist/runtime/server/auth/provider.d.ts +17 -0
- package/dist/runtime/server/auth/provider.js +44 -0
- package/dist/runtime/server/auth/providers/config-provider.d.ts +18 -0
- package/dist/runtime/server/auth/providers/config-provider.js +54 -0
- package/dist/runtime/server/auth/providers/db-provider.d.ts +16 -0
- package/dist/runtime/server/auth/providers/db-provider.js +42 -0
- package/dist/runtime/server/auth/providers/jwt-provider.d.ts +24 -0
- package/dist/runtime/server/auth/providers/jwt-provider.js +72 -0
- package/dist/runtime/server/migrations/0001-services-kind.d.ts +8 -0
- package/dist/runtime/server/migrations/0001-services-kind.js +14 -0
- package/dist/runtime/server/migrations/0002-services-type.d.ts +7 -0
- package/dist/runtime/server/migrations/0002-services-type.js +14 -0
- package/dist/runtime/server/migrations/0003-services-deleted-at.d.ts +6 -0
- package/dist/runtime/server/migrations/0003-services-deleted-at.js +14 -0
- package/dist/runtime/server/migrations/0004-logs-error-fingerprint.d.ts +11 -0
- package/dist/runtime/server/migrations/0004-logs-error-fingerprint.js +15 -0
- package/dist/runtime/server/migrations/0005-users-columns.d.ts +9 -0
- package/dist/runtime/server/migrations/0005-users-columns.js +25 -0
- package/dist/runtime/server/migrations/index.d.ts +13 -0
- package/dist/runtime/server/migrations/index.js +13 -0
- package/dist/runtime/server/migrations/types.d.ts +15 -0
- package/dist/runtime/server/migrations/types.js +0 -0
- package/dist/runtime/server/plugins/observe-migrate.server.d.ts +2 -0
- package/dist/runtime/server/plugins/observe-migrate.server.js +18 -0
- package/dist/runtime/server/tasks/backfill-fingerprints.d.ts +11 -0
- package/dist/runtime/server/tasks/backfill-fingerprints.js +41 -0
- package/dist/runtime/server/tasks/purge.d.ts +5 -0
- package/dist/runtime/server/tasks/purge.js +12 -0
- package/dist/runtime/server/tsconfig.json +3 -0
- package/dist/runtime/server/utils/activity-query.d.ts +28 -0
- package/dist/runtime/server/utils/activity-query.js +70 -0
- package/dist/runtime/server/utils/api-keys.d.ts +48 -0
- package/dist/runtime/server/utils/api-keys.js +67 -0
- package/dist/runtime/server/utils/authz.d.ts +50 -0
- package/dist/runtime/server/utils/authz.js +60 -0
- package/dist/runtime/server/utils/db/users.d.ts +91 -0
- package/dist/runtime/server/utils/db/users.js +128 -0
- package/dist/runtime/server/utils/db.d.ts +10 -0
- package/dist/runtime/server/utils/db.js +5 -0
- package/dist/runtime/server/utils/frogger-adapter.d.ts +40 -0
- package/dist/runtime/server/utils/frogger-adapter.js +97 -0
- package/dist/runtime/server/utils/groups.d.ts +35 -0
- package/dist/runtime/server/utils/groups.js +59 -0
- package/dist/runtime/server/utils/ingest-cors.d.ts +23 -0
- package/dist/runtime/server/utils/ingest-cors.js +27 -0
- package/dist/runtime/server/utils/journey.d.ts +20 -0
- package/dist/runtime/server/utils/journey.js +44 -0
- package/dist/runtime/server/utils/logs.d.ts +50 -0
- package/dist/runtime/server/utils/logs.js +154 -0
- package/dist/runtime/server/utils/loop-guard.d.ts +11 -0
- package/dist/runtime/server/utils/loop-guard.js +11 -0
- package/dist/runtime/server/utils/migrate.d.ts +21 -0
- package/dist/runtime/server/utils/migrate.js +144 -0
- package/dist/runtime/server/utils/migration-runner.d.ts +42 -0
- package/dist/runtime/server/utils/migration-runner.js +129 -0
- package/dist/runtime/server/utils/observe-errors.d.ts +58 -0
- package/dist/runtime/server/utils/observe-errors.js +206 -0
- package/dist/runtime/server/utils/overview.d.ts +20 -0
- package/dist/runtime/server/utils/overview.js +119 -0
- package/dist/runtime/server/utils/provisioning.d.ts +62 -0
- package/dist/runtime/server/utils/provisioning.js +299 -0
- package/dist/runtime/server/utils/rate-limit.d.ts +11 -0
- package/dist/runtime/server/utils/rate-limit.js +22 -0
- package/dist/runtime/server/utils/require-observe-session.d.ts +15 -0
- package/dist/runtime/server/utils/require-observe-session.js +25 -0
- package/dist/runtime/server/utils/rollout.d.ts +19 -0
- package/dist/runtime/server/utils/rollout.js +56 -0
- package/dist/runtime/server/utils/scope.d.ts +14 -0
- package/dist/runtime/server/utils/scope.js +28 -0
- package/dist/runtime/server/utils/seed.d.ts +18 -0
- package/dist/runtime/server/utils/seed.js +70 -0
- package/dist/runtime/server/utils/services.d.ts +91 -0
- package/dist/runtime/server/utils/services.js +142 -0
- package/dist/runtime/server/utils/stats-query.d.ts +40 -0
- package/dist/runtime/server/utils/stats-query.js +104 -0
- package/dist/runtime/shared/auth/roles.d.ts +34 -0
- package/dist/runtime/shared/auth/roles.js +6 -0
- package/dist/runtime/shared/auth/schema.d.ts +85 -0
- package/dist/runtime/shared/auth/schema.js +41 -0
- package/dist/runtime/shared/auth/types.d.ts +68 -0
- package/dist/runtime/shared/auth/types.js +0 -0
- package/dist/runtime/shared/rbac/capabilities.d.ts +46 -0
- package/dist/runtime/shared/rbac/capabilities.js +48 -0
- package/dist/runtime/shared/schema/activity.d.ts +77 -0
- package/dist/runtime/shared/schema/activity.js +22 -0
- package/dist/runtime/shared/schema/adapters/frogger.d.ts +52 -0
- package/dist/runtime/shared/schema/adapters/frogger.js +17 -0
- package/dist/runtime/shared/schema/batch.d.ts +33 -0
- package/dist/runtime/shared/schema/batch.js +9 -0
- package/dist/runtime/shared/schema/error-fingerprint.d.ts +53 -0
- package/dist/runtime/shared/schema/error-fingerprint.js +47 -0
- package/dist/runtime/shared/schema/errors-query.d.ts +136 -0
- package/dist/runtime/shared/schema/errors-query.js +47 -0
- package/dist/runtime/shared/schema/event.d.ts +48 -0
- package/dist/runtime/shared/schema/event.js +41 -0
- package/dist/runtime/shared/schema/frogger-map.d.ts +62 -0
- package/dist/runtime/shared/schema/frogger-map.js +30 -0
- package/dist/runtime/shared/schema/index.d.ts +17 -0
- package/dist/runtime/shared/schema/index.js +17 -0
- package/dist/runtime/shared/schema/journey.d.ts +99 -0
- package/dist/runtime/shared/schema/journey.js +96 -0
- package/dist/runtime/shared/schema/levels.d.ts +37 -0
- package/dist/runtime/shared/schema/levels.js +72 -0
- package/dist/runtime/shared/schema/log-row.d.ts +31 -0
- package/dist/runtime/shared/schema/log-row.js +0 -0
- package/dist/runtime/shared/schema/logs-query.d.ts +91 -0
- package/dist/runtime/shared/schema/logs-query.js +72 -0
- package/dist/runtime/shared/schema/migrations.d.ts +34 -0
- package/dist/runtime/shared/schema/migrations.js +0 -0
- package/dist/runtime/shared/schema/overview.d.ts +78 -0
- package/dist/runtime/shared/schema/overview.js +9 -0
- package/dist/runtime/shared/schema/provisioning.d.ts +230 -0
- package/dist/runtime/shared/schema/provisioning.js +52 -0
- package/dist/runtime/shared/schema/registry.d.ts +115 -0
- package/dist/runtime/shared/schema/registry.js +27 -0
- package/dist/runtime/shared/schema/rollout.d.ts +103 -0
- package/dist/runtime/shared/schema/rollout.js +66 -0
- package/dist/runtime/shared/schema/stats.d.ts +64 -0
- package/dist/runtime/shared/schema/stats.js +15 -0
- package/dist/runtime/shared/schema/tiers.d.ts +5 -0
- package/dist/runtime/shared/schema/tiers.js +9 -0
- package/dist/runtime/shared/types/module-options.d.ts +119 -0
- package/dist/runtime/shared/types/module-options.js +13 -0
- package/dist/runtime/shared/types/storage.d.ts +31 -0
- package/dist/runtime/shared/types/storage.js +0 -0
- package/dist/runtime/shared/utils/format-relative.d.ts +7 -0
- package/dist/runtime/shared/utils/format-relative.js +11 -0
- package/dist/runtime/shared/utils/frogger-snippet.d.ts +19 -0
- package/dist/runtime/shared/utils/frogger-snippet.js +33 -0
- package/dist/runtime/shared/utils/observe-config.d.ts +9 -0
- package/dist/runtime/shared/utils/observe-config.js +17 -0
- package/dist/runtime/shared/utils/period.d.ts +13 -0
- package/dist/runtime/shared/utils/period.js +15 -0
- package/dist/runtime/shared/utils/slug.d.ts +1 -0
- package/dist/runtime/shared/utils/slug.js +5 -0
- package/dist/runtime/shared/utils/uuid.d.ts +187 -0
- package/dist/runtime/shared/utils/uuid.js +345 -0
- package/dist/runtime/types/nuxt-auth-utils-imports.d.ts +25 -0
- package/dist/runtime/types/observe-app-imports.d.ts +20 -0
- package/dist/runtime/types/session.d.ts +17 -0
- package/dist/schema.d.mts +1318 -0
- package/dist/schema.mjs +629 -0
- package/dist/types.d.mts +3 -0
- package/package.json +93 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { defineEventHandler, getValidatedQuery, getValidatedRouterParams, createError, H3Error } from "h3";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { useRuntimeConfig } from "#imports";
|
|
4
|
+
import {
|
|
5
|
+
errorDetailQuerySchema,
|
|
6
|
+
DEFAULT_REGRESSION_THRESHOLDS
|
|
7
|
+
} from "../../../../shared/schema/errors-query.js";
|
|
8
|
+
import { periodToRange } from "../../../../shared/utils/period.js";
|
|
9
|
+
import { DEFAULT_BUCKET_MS, MAX_BUCKETS } from "../../../utils/stats-query.js";
|
|
10
|
+
import { requireCapability, getAllowedServiceIds } from "../../../utils/authz.js";
|
|
11
|
+
import { resolveEffectiveScope } from "../../../utils/scope.js";
|
|
12
|
+
import { getErrorGroup } from "../../../utils/observe-errors.js";
|
|
13
|
+
const paramsSchema = z.object({ fingerprint: z.string().regex(/^v\d+:[0-9a-f]{16}$/) });
|
|
14
|
+
export default defineEventHandler(async (event) => {
|
|
15
|
+
const { principal } = await requireCapability(event, "logs.read");
|
|
16
|
+
const { fingerprint } = await getValidatedRouterParams(event, paramsSchema.parse);
|
|
17
|
+
const query = await getValidatedQuery(event, errorDetailQuerySchema.parse);
|
|
18
|
+
const allowed = await getAllowedServiceIds(event, principal);
|
|
19
|
+
const effective = await resolveEffectiveScope(event, principal, allowed, {
|
|
20
|
+
service: query.service,
|
|
21
|
+
group: query.group
|
|
22
|
+
});
|
|
23
|
+
const { from, to, label } = periodToRange(query.period);
|
|
24
|
+
const bucketMs = query.bucketMs ?? DEFAULT_BUCKET_MS[query.period];
|
|
25
|
+
if ((to - from) / bucketMs > MAX_BUCKETS) {
|
|
26
|
+
throw createError({ statusCode: 400, statusMessage: "bucketMs too small for window" });
|
|
27
|
+
}
|
|
28
|
+
if (effective !== "*" && effective.length === 0) {
|
|
29
|
+
throw createError({ statusCode: 404, statusMessage: "Not Found", data: { error: "UNKNOWN_ERROR", fingerprint } });
|
|
30
|
+
}
|
|
31
|
+
const thresholds = useRuntimeConfig(event).observe.errors ?? DEFAULT_REGRESSION_THRESHOLDS;
|
|
32
|
+
let detail;
|
|
33
|
+
try {
|
|
34
|
+
detail = await getErrorGroup(fingerprint, {
|
|
35
|
+
from,
|
|
36
|
+
to,
|
|
37
|
+
bucketMs,
|
|
38
|
+
limit: query.limit,
|
|
39
|
+
offset: query.offset,
|
|
40
|
+
thresholds,
|
|
41
|
+
now: Date.now()
|
|
42
|
+
}, effective);
|
|
43
|
+
} catch (e) {
|
|
44
|
+
if (e instanceof H3Error) throw e;
|
|
45
|
+
throw createError({ statusCode: 500, statusMessage: "Error group query failed" });
|
|
46
|
+
}
|
|
47
|
+
if (!detail) {
|
|
48
|
+
throw createError({ statusCode: 404, statusMessage: "Not Found", data: { error: "UNKNOWN_ERROR", fingerprint } });
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
period: { from, to, label },
|
|
52
|
+
...detail,
|
|
53
|
+
limit: query.limit,
|
|
54
|
+
offset: query.offset
|
|
55
|
+
};
|
|
56
|
+
});
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { defineEventHandler, getValidatedQuery, createError, H3Error } from "h3";
|
|
2
|
+
import { useRuntimeConfig } from "#imports";
|
|
3
|
+
import {
|
|
4
|
+
errorsQuerySchema,
|
|
5
|
+
DEFAULT_REGRESSION_THRESHOLDS
|
|
6
|
+
} from "../../../../shared/schema/errors-query.js";
|
|
7
|
+
import { periodToRange } from "../../../../shared/utils/period.js";
|
|
8
|
+
import { requireCapability, getAllowedServiceIds } from "../../../utils/authz.js";
|
|
9
|
+
import { resolveEffectiveScope } from "../../../utils/scope.js";
|
|
10
|
+
import { listErrorGroups } from "../../../utils/observe-errors.js";
|
|
11
|
+
export default defineEventHandler(async (event) => {
|
|
12
|
+
const { principal } = await requireCapability(event, "logs.read");
|
|
13
|
+
const query = await getValidatedQuery(event, errorsQuerySchema.parse);
|
|
14
|
+
const allowed = await getAllowedServiceIds(event, principal);
|
|
15
|
+
const effective = await resolveEffectiveScope(event, principal, allowed, {
|
|
16
|
+
service: query.service,
|
|
17
|
+
group: query.group
|
|
18
|
+
});
|
|
19
|
+
const { from, to, label } = periodToRange(query.period);
|
|
20
|
+
const period = { from, to, label };
|
|
21
|
+
if (effective !== "*" && effective.length === 0) {
|
|
22
|
+
return { period, groups: [], total: 0, limit: query.limit, offset: query.offset };
|
|
23
|
+
}
|
|
24
|
+
const thresholds = useRuntimeConfig(event).observe.errors ?? DEFAULT_REGRESSION_THRESHOLDS;
|
|
25
|
+
try {
|
|
26
|
+
const { groups, total } = await listErrorGroups({
|
|
27
|
+
from,
|
|
28
|
+
to,
|
|
29
|
+
limit: query.limit,
|
|
30
|
+
offset: query.offset,
|
|
31
|
+
sort: query.sort,
|
|
32
|
+
filters: { app: query.app, version: query.version, env: query.env, level: query.level, q: query.q },
|
|
33
|
+
thresholds,
|
|
34
|
+
now: Date.now()
|
|
35
|
+
}, effective);
|
|
36
|
+
return { period, groups, total, limit: query.limit, offset: query.offset };
|
|
37
|
+
} catch (e) {
|
|
38
|
+
if (e instanceof H3Error) throw e;
|
|
39
|
+
throw createError({ statusCode: 500, statusMessage: "Errors query failed" });
|
|
40
|
+
}
|
|
41
|
+
});
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type LogsFacetsResponse } from '../../../shared/schema/logs-query.js';
|
|
2
|
+
/**
|
|
3
|
+
* Distinct versions for the filter bar's version dropdown, scoped to the caller and
|
|
4
|
+
* narrowed by ?service/?group so it tracks the navbar switcher. Services/groups facets
|
|
5
|
+
* are deliberately NOT returned - the switcher already owns that surface (Fact 4).
|
|
6
|
+
*/
|
|
7
|
+
declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<LogsFacetsResponse>>;
|
|
8
|
+
export default _default;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { defineEventHandler, getValidatedQuery } from "h3";
|
|
2
|
+
import { logsFacetsQuerySchema } from "../../../shared/schema/logs-query.js";
|
|
3
|
+
import { requireCapability, getAllowedServiceIds } from "../../utils/authz.js";
|
|
4
|
+
import { resolveEffectiveScope } from "../../utils/scope.js";
|
|
5
|
+
import { queryDistinctVersions } from "../../utils/logs.js";
|
|
6
|
+
export default defineEventHandler(async (event) => {
|
|
7
|
+
const { principal } = await requireCapability(event, "logs.read");
|
|
8
|
+
const { service, group } = await getValidatedQuery(event, logsFacetsQuerySchema.parse);
|
|
9
|
+
const allowed = await getAllowedServiceIds(event, principal);
|
|
10
|
+
const effective = await resolveEffectiveScope(event, principal, allowed, { service, group });
|
|
11
|
+
return { versions: await queryDistinctVersions(effective) };
|
|
12
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { defineEventHandler, getValidatedRouterParams, createError } from "h3";
|
|
2
|
+
import { groupIdParams } from "../../../../../shared/schema/provisioning.js";
|
|
3
|
+
import { requireCapability } from "../../../../utils/authz.js";
|
|
4
|
+
export default defineEventHandler(async (event) => {
|
|
5
|
+
await requireCapability(event, "users.manage");
|
|
6
|
+
await getValidatedRouterParams(event, groupIdParams.parse);
|
|
7
|
+
throw createError({
|
|
8
|
+
statusCode: 501,
|
|
9
|
+
statusMessage: "Not Implemented",
|
|
10
|
+
data: { error: "ASSIGNMENTS_MANAGED_IN_CONFIG", hint: "Edit observe.auth.users; runtime assignment lands in CP16." }
|
|
11
|
+
});
|
|
12
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defineEventHandler, getValidatedRouterParams, readValidatedBody, createError } from "h3";
|
|
2
|
+
import { groupIdParams, groupMembershipSchema } from "../../../../../shared/schema/provisioning.js";
|
|
3
|
+
import { requireCapability } from "../../../../utils/authz.js";
|
|
4
|
+
import { getGroupDetail, setGroupMembership } from "../../../../utils/provisioning.js";
|
|
5
|
+
export default defineEventHandler(async (event) => {
|
|
6
|
+
await requireCapability(event, "groups.manage");
|
|
7
|
+
const { id } = await getValidatedRouterParams(event, groupIdParams.parse);
|
|
8
|
+
const existing = await getGroupDetail(id);
|
|
9
|
+
if (!existing) throw createError({ statusCode: 404, statusMessage: "Group not found" });
|
|
10
|
+
const { serviceIds } = await readValidatedBody(event, groupMembershipSchema.parse);
|
|
11
|
+
await setGroupMembership(id, serviceIds);
|
|
12
|
+
return { ok: true };
|
|
13
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { defineEventHandler, getValidatedRouterParams, createError } from "h3";
|
|
2
|
+
import { groupIdParams } from "../../../../shared/schema/provisioning.js";
|
|
3
|
+
import { requireCapability } from "../../../utils/authz.js";
|
|
4
|
+
import { deleteGroupById } from "../../../utils/provisioning.js";
|
|
5
|
+
export default defineEventHandler(async (event) => {
|
|
6
|
+
await requireCapability(event, "groups.manage");
|
|
7
|
+
const { id } = await getValidatedRouterParams(event, groupIdParams.parse);
|
|
8
|
+
const ok = await deleteGroupById(id);
|
|
9
|
+
if (!ok) throw createError({ statusCode: 404, statusMessage: "Group not found" });
|
|
10
|
+
return { ok: true };
|
|
11
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { GroupListItem, ServiceListItem } from '../../../../shared/schema/provisioning.js';
|
|
2
|
+
declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<{
|
|
3
|
+
group: GroupListItem;
|
|
4
|
+
services: ServiceListItem[];
|
|
5
|
+
}>>;
|
|
6
|
+
export default _default;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defineEventHandler, getValidatedRouterParams, createError } from "h3";
|
|
2
|
+
import { groupIdParams } from "../../../../shared/schema/provisioning.js";
|
|
3
|
+
import { requireCapability } from "../../../utils/authz.js";
|
|
4
|
+
import { getGroupDetail } from "../../../utils/provisioning.js";
|
|
5
|
+
export default defineEventHandler(async (event) => {
|
|
6
|
+
await requireCapability(event, "services.read");
|
|
7
|
+
const { id } = await getValidatedRouterParams(event, groupIdParams.parse);
|
|
8
|
+
const detail = await getGroupDetail(id);
|
|
9
|
+
if (!detail) throw createError({ statusCode: 404, statusMessage: "Group not found" });
|
|
10
|
+
return {
|
|
11
|
+
group: { id: detail.group.id, slug: detail.group.slug, name: detail.group.name, serviceCount: detail.services.length },
|
|
12
|
+
services: detail.services
|
|
13
|
+
};
|
|
14
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { defineEventHandler, getValidatedRouterParams, readValidatedBody, createError } from "h3";
|
|
2
|
+
import { groupIdParams, groupUpdateSchema } from "../../../../shared/schema/provisioning.js";
|
|
3
|
+
import { requireCapability } from "../../../utils/authz.js";
|
|
4
|
+
import { updateGroupById } from "../../../utils/provisioning.js";
|
|
5
|
+
export default defineEventHandler(async (event) => {
|
|
6
|
+
await requireCapability(event, "groups.manage");
|
|
7
|
+
const { id } = await getValidatedRouterParams(event, groupIdParams.parse);
|
|
8
|
+
const { name } = await readValidatedBody(event, groupUpdateSchema.parse);
|
|
9
|
+
const group = await updateGroupById(id, name);
|
|
10
|
+
if (!group) throw createError({ statusCode: 404, statusMessage: "Group not found" });
|
|
11
|
+
return { id: group.id, slug: group.slug, name: group.name, serviceCount: 0 };
|
|
12
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { defineEventHandler } from "h3";
|
|
2
|
+
import { requireCapability } from "../../../utils/authz.js";
|
|
3
|
+
import { listGroupsForPrincipal } from "../../../utils/provisioning.js";
|
|
4
|
+
export default defineEventHandler(async (event) => {
|
|
5
|
+
const { principal } = await requireCapability(event, "services.read");
|
|
6
|
+
return await listGroupsForPrincipal(event, principal);
|
|
7
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { defineEventHandler, readValidatedBody, createError } from "h3";
|
|
2
|
+
import { groupCreateSchema } from "../../../../shared/schema/provisioning.js";
|
|
3
|
+
import { requireCapability } from "../../../utils/authz.js";
|
|
4
|
+
import { createGroupFromInput } from "../../../utils/provisioning.js";
|
|
5
|
+
export default defineEventHandler(async (event) => {
|
|
6
|
+
await requireCapability(event, "groups.manage");
|
|
7
|
+
const { name } = await readValidatedBody(event, groupCreateSchema.parse);
|
|
8
|
+
const result = await createGroupFromInput(name);
|
|
9
|
+
if (!result.ok) throw createError({ statusCode: 409, statusMessage: "Group slug already exists" });
|
|
10
|
+
return { id: result.group.id, slug: result.group.slug, name: result.group.name, serviceCount: 0 };
|
|
11
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { defineEventHandler } from "h3";
|
|
2
|
+
import { useRuntimeConfig } from "#imports";
|
|
3
|
+
export default defineEventHandler((event) => {
|
|
4
|
+
const { observe } = useRuntimeConfig(event);
|
|
5
|
+
return {
|
|
6
|
+
ok: true,
|
|
7
|
+
module: "nuxt-observe",
|
|
8
|
+
version: observe.version
|
|
9
|
+
};
|
|
10
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { defineEventHandler, getMethod, getHeader, getQuery, readValidatedBody, createError, setResponseStatus, H3Error } from "h3";
|
|
2
|
+
import { useRuntimeConfig } from "nitropack/runtime";
|
|
3
|
+
import { zFroggerBatch } from "../../../../shared/schema/adapters/frogger.js";
|
|
4
|
+
import { MAX_BATCH_EVENTS } from "../../../../shared/schema/batch.js";
|
|
5
|
+
import { getApiKeyFromEvent, resolveServiceIdByKey } from "../../../utils/api-keys.js";
|
|
6
|
+
import { resolveServiceCorsMeta } from "../../../utils/services.js";
|
|
7
|
+
import { froggerBatchToEvents } from "../../../utils/frogger-adapter.js";
|
|
8
|
+
import { insertEvents } from "../../../utils/logs.js";
|
|
9
|
+
import { handleCorsForIngest } from "../../../utils/ingest-cors.js";
|
|
10
|
+
import { checkIngestRateLimit } from "../../../utils/rate-limit.js";
|
|
11
|
+
import { checkIngestLoop } from "../../../utils/loop-guard.js";
|
|
12
|
+
const DEFAULT_MAX_BYTES = 1048576;
|
|
13
|
+
export default defineEventHandler(async (event) => {
|
|
14
|
+
const corsMeta = await resolveServiceCorsMeta(getQuery(event).key);
|
|
15
|
+
if (handleCorsForIngest(event, corsMeta)) return;
|
|
16
|
+
if (getMethod(event) !== "POST") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
|
|
17
|
+
const maxBytes = useRuntimeConfig().observe?.ingest?.maxBytes ?? DEFAULT_MAX_BYTES;
|
|
18
|
+
const len = getHeader(event, "content-length");
|
|
19
|
+
if (len && Number.parseInt(len) > maxBytes) throw createError({ statusCode: 413, statusMessage: "Request Too Large" });
|
|
20
|
+
const key = getApiKeyFromEvent(event);
|
|
21
|
+
if (!key) throw createError({ statusCode: 401, statusMessage: "Missing ingest key" });
|
|
22
|
+
const serviceId = await resolveServiceIdByKey(key);
|
|
23
|
+
if (!serviceId) throw createError({ statusCode: 401, statusMessage: "Invalid ingest key" });
|
|
24
|
+
if (!checkIngestRateLimit(serviceId)) throw createError({ statusCode: 429, statusMessage: "Rate limited" });
|
|
25
|
+
const batch = await readValidatedBody(event, zFroggerBatch.parse);
|
|
26
|
+
const loop = checkIngestLoop(event, batch.meta);
|
|
27
|
+
if (loop.reject) throw createError({ statusCode: 400, statusMessage: loop.reason });
|
|
28
|
+
const events = froggerBatchToEvents(batch);
|
|
29
|
+
if (events.length > MAX_BATCH_EVENTS) throw createError({ statusCode: 413, statusMessage: "Batch too large" });
|
|
30
|
+
if (!events.length) {
|
|
31
|
+
setResponseStatus(event, 202);
|
|
32
|
+
return { ok: true, inserted: 0 };
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
const { inserted } = await insertEvents(events, { serviceId });
|
|
36
|
+
setResponseStatus(event, 202);
|
|
37
|
+
return { ok: true, inserted };
|
|
38
|
+
} catch (e) {
|
|
39
|
+
if (e instanceof H3Error) throw e;
|
|
40
|
+
throw createError({ statusCode: 500, statusMessage: "Insert failed" });
|
|
41
|
+
}
|
|
42
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { defineEventHandler, getMethod, getHeader, getQuery, readValidatedBody, createError, setResponseStatus, H3Error } from "h3";
|
|
2
|
+
import { useRuntimeConfig } from "nitropack/runtime";
|
|
3
|
+
import { zCanonicalBatch } from "../../../shared/schema/batch.js";
|
|
4
|
+
import { getApiKeyFromEvent, resolveServiceIdByKey } from "../../utils/api-keys.js";
|
|
5
|
+
import { resolveServiceCorsMeta } from "../../utils/services.js";
|
|
6
|
+
import { insertEvents } from "../../utils/logs.js";
|
|
7
|
+
import { handleCorsForIngest } from "../../utils/ingest-cors.js";
|
|
8
|
+
import { checkIngestRateLimit } from "../../utils/rate-limit.js";
|
|
9
|
+
import { checkIngestLoop } from "../../utils/loop-guard.js";
|
|
10
|
+
const DEFAULT_MAX_BYTES = 1048576;
|
|
11
|
+
export default defineEventHandler(async (event) => {
|
|
12
|
+
const corsMeta = await resolveServiceCorsMeta(getQuery(event).key);
|
|
13
|
+
if (handleCorsForIngest(event, corsMeta)) return;
|
|
14
|
+
if (getMethod(event) !== "POST") throw createError({ statusCode: 405, statusMessage: "Method Not Allowed" });
|
|
15
|
+
const maxBytes = useRuntimeConfig().observe?.ingest?.maxBytes ?? DEFAULT_MAX_BYTES;
|
|
16
|
+
const len = getHeader(event, "content-length");
|
|
17
|
+
if (len && Number.parseInt(len) > maxBytes) throw createError({ statusCode: 413, statusMessage: "Request Too Large" });
|
|
18
|
+
const key = getApiKeyFromEvent(event);
|
|
19
|
+
if (!key) throw createError({ statusCode: 401, statusMessage: "Missing ingest key" });
|
|
20
|
+
const serviceId = await resolveServiceIdByKey(key);
|
|
21
|
+
if (!serviceId) throw createError({ statusCode: 401, statusMessage: "Invalid ingest key" });
|
|
22
|
+
if (!checkIngestRateLimit(serviceId)) throw createError({ statusCode: 429, statusMessage: "Rate limited" });
|
|
23
|
+
const batch = await readValidatedBody(event, zCanonicalBatch.parse);
|
|
24
|
+
const loop = checkIngestLoop(event, batch.meta);
|
|
25
|
+
if (loop.reject) throw createError({ statusCode: 400, statusMessage: loop.reason });
|
|
26
|
+
if (!batch.events.length) {
|
|
27
|
+
setResponseStatus(event, 202);
|
|
28
|
+
return { ok: true, inserted: 0 };
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const { inserted } = await insertEvents(batch.events, { serviceId });
|
|
32
|
+
setResponseStatus(event, 202);
|
|
33
|
+
return { ok: true, inserted };
|
|
34
|
+
} catch (e) {
|
|
35
|
+
if (e instanceof H3Error) throw e;
|
|
36
|
+
throw createError({ statusCode: 500, statusMessage: "Insert failed" });
|
|
37
|
+
}
|
|
38
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type JourneyResponse } from '../../../shared/schema/journey.js';
|
|
2
|
+
/**
|
|
3
|
+
* GET /api/observe/journey (CP12): a read-only, cross-service correlation timeline
|
|
4
|
+
* keyed by exactly one of traceId | session | user. Reuses the logs.read capability
|
|
5
|
+
* and CP6 service scoping. Empty match is a 200 with a partial reason, never a 404 -
|
|
6
|
+
* 4xx is for malformed input, not empty results.
|
|
7
|
+
*/
|
|
8
|
+
declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<JourneyResponse>>;
|
|
9
|
+
export default _default;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { defineEventHandler, getValidatedQuery, createError, H3Error } from "h3";
|
|
2
|
+
import {
|
|
3
|
+
journeyQuerySchema,
|
|
4
|
+
journeyMode,
|
|
5
|
+
detectPartial,
|
|
6
|
+
computeJourneyStats
|
|
7
|
+
} from "../../../shared/schema/journey.js";
|
|
8
|
+
import { requireCapability, getAllowedServiceIds } from "../../utils/authz.js";
|
|
9
|
+
import { getJourney } from "../../utils/journey.js";
|
|
10
|
+
export default defineEventHandler(async (event) => {
|
|
11
|
+
const { principal } = await requireCapability(event, "logs.read");
|
|
12
|
+
const query = await getValidatedQuery(event, journeyQuerySchema.parse);
|
|
13
|
+
const { mode, key } = journeyMode(query);
|
|
14
|
+
const allowed = await getAllowedServiceIds(event, principal);
|
|
15
|
+
if (allowed !== "*" && allowed.length === 0) {
|
|
16
|
+
return { mode, key, partial: true, reasons: ["empty"], stats: computeJourneyStats([]), events: [] };
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const events = await getJourney(mode, key, {
|
|
20
|
+
from: query.from,
|
|
21
|
+
to: query.to,
|
|
22
|
+
limit: query.limit,
|
|
23
|
+
serviceIds: allowed
|
|
24
|
+
});
|
|
25
|
+
const { partial, reasons } = detectPartial(events, events.length === query.limit);
|
|
26
|
+
return { mode, key, partial, reasons, stats: computeJourneyStats(events), events };
|
|
27
|
+
} catch (e) {
|
|
28
|
+
if (e instanceof H3Error) throw e;
|
|
29
|
+
throw createError({ statusCode: 500, statusMessage: "Journey query failed" });
|
|
30
|
+
}
|
|
31
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { defineEventHandler, getValidatedRouterParams, createError } from "h3";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { rowToDetail } from "../../../../shared/schema/logs-query.js";
|
|
4
|
+
import { requireCapability, getAllowedServiceIds } from "../../../utils/authz.js";
|
|
5
|
+
import { getLogById } from "../../../utils/logs.js";
|
|
6
|
+
const paramsSchema = z.object({ id: z.string().min(1).max(64) });
|
|
7
|
+
export default defineEventHandler(async (event) => {
|
|
8
|
+
const { principal } = await requireCapability(event, "logs.read");
|
|
9
|
+
const { id } = await getValidatedRouterParams(event, paramsSchema.parse);
|
|
10
|
+
const row = await getLogById(id);
|
|
11
|
+
if (!row) {
|
|
12
|
+
throw createError({ statusCode: 404, statusMessage: "Not Found", data: { error: "UNKNOWN_LOG", id } });
|
|
13
|
+
}
|
|
14
|
+
const allowed = await getAllowedServiceIds(event, principal);
|
|
15
|
+
if (allowed !== "*" && (!row.service_id || !allowed.includes(row.service_id))) {
|
|
16
|
+
throw createError({ statusCode: 403, statusMessage: "Forbidden", data: { error: "OUT_OF_SCOPE", id } });
|
|
17
|
+
}
|
|
18
|
+
return rowToDetail(row);
|
|
19
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { defineEventHandler, getValidatedQuery, createError, H3Error } from "h3";
|
|
2
|
+
import { logsQuerySchema } from "../../../shared/schema/logs-query.js";
|
|
3
|
+
import { periodToRange } from "../../../shared/utils/period.js";
|
|
4
|
+
import { requireCapability, getAllowedServiceIds } from "../../utils/authz.js";
|
|
5
|
+
import { resolveEffectiveScope } from "../../utils/scope.js";
|
|
6
|
+
import { queryLogs, countLogs } from "../../utils/logs.js";
|
|
7
|
+
function toListItem(row) {
|
|
8
|
+
return {
|
|
9
|
+
id: row.id,
|
|
10
|
+
time: row.time,
|
|
11
|
+
level: row.level,
|
|
12
|
+
message: row.message,
|
|
13
|
+
app: row.app,
|
|
14
|
+
version: row.version ?? null,
|
|
15
|
+
env: row.env ?? null,
|
|
16
|
+
service_id: row.service_id ?? null,
|
|
17
|
+
route: row.route ?? null,
|
|
18
|
+
feature: row.feature ?? null,
|
|
19
|
+
error_name: row.error_name ?? null,
|
|
20
|
+
trace_id: row.trace_id ?? null
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export default defineEventHandler(async (event) => {
|
|
24
|
+
const { principal } = await requireCapability(event, "logs.read");
|
|
25
|
+
const query = await getValidatedQuery(event, logsQuerySchema.parse);
|
|
26
|
+
const allowed = await getAllowedServiceIds(event, principal);
|
|
27
|
+
const effective = await resolveEffectiveScope(event, principal, allowed, {
|
|
28
|
+
service: query.service,
|
|
29
|
+
group: query.group
|
|
30
|
+
});
|
|
31
|
+
const { from, to, label } = periodToRange(query.period);
|
|
32
|
+
const period = { from, to, label };
|
|
33
|
+
if (effective !== "*" && effective.length === 0) {
|
|
34
|
+
return { period, rows: [], total: 0, limit: query.limit, offset: query.offset };
|
|
35
|
+
}
|
|
36
|
+
const filter = {
|
|
37
|
+
...query.traceId ? { traceId: query.traceId } : { from, to },
|
|
38
|
+
levels: query.levels,
|
|
39
|
+
versions: query.versions,
|
|
40
|
+
...query.route ? { route: query.route } : {},
|
|
41
|
+
...query.feature ? { feature: query.feature } : {},
|
|
42
|
+
q: query.q,
|
|
43
|
+
serviceIds: effective,
|
|
44
|
+
limit: query.limit,
|
|
45
|
+
offset: query.offset
|
|
46
|
+
};
|
|
47
|
+
try {
|
|
48
|
+
const [rows, total] = await Promise.all([queryLogs(filter), countLogs(filter)]);
|
|
49
|
+
return { period, rows: rows.map(toListItem), total, limit: query.limit, offset: query.offset };
|
|
50
|
+
} catch (e) {
|
|
51
|
+
if (e instanceof H3Error) throw e;
|
|
52
|
+
throw createError({ statusCode: 500, statusMessage: "Logs query failed" });
|
|
53
|
+
}
|
|
54
|
+
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MigrationStatusResponse } from '../../../../shared/schema/migrations.js';
|
|
2
|
+
/**
|
|
3
|
+
* Migration status for the admin console + the dashboard banner. Admin-only
|
|
4
|
+
* (migrations.manage). Global action, not service-scoped, so no serviceScopeFilter.
|
|
5
|
+
* `pendingDestructive` drives the banner; a blocked destructive still needs attention,
|
|
6
|
+
* so it counts too.
|
|
7
|
+
*/
|
|
8
|
+
declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<MigrationStatusResponse>>;
|
|
9
|
+
export default _default;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defineEventHandler } from "h3";
|
|
2
|
+
import { requireCapability } from "../../../utils/authz.js";
|
|
3
|
+
import { useObserveDb } from "../../../utils/db.js";
|
|
4
|
+
import { getMigrationStatus } from "../../../utils/migration-runner.js";
|
|
5
|
+
export default defineEventHandler(async (event) => {
|
|
6
|
+
await requireCapability(event, "migrations.manage");
|
|
7
|
+
const db = useObserveDb();
|
|
8
|
+
const statuses = await getMigrationStatus(db);
|
|
9
|
+
const pendingDestructive = statuses.filter(
|
|
10
|
+
(s) => s.class === "destructive" && s.state !== "applied"
|
|
11
|
+
).length;
|
|
12
|
+
const driftWarnings = statuses.filter((s) => s.driftWarning).map((s) => s.id);
|
|
13
|
+
return { statuses, pendingDestructive, driftWarnings };
|
|
14
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs pending migrations and streams progress as SSE frames. Deliberately POST + an h3
|
|
3
|
+
* event stream (NOT a GET EventSource): EventSource auto-reconnects, and a reconnect on a
|
|
4
|
+
* one-shot mutation could re-trigger the run. The client reads `response.body` as a stream
|
|
5
|
+
* (fetch + TextDecoder), so the wire format is SSE (`data: {json}\n\n`) without EventSource.
|
|
6
|
+
*
|
|
7
|
+
* Body: `{ ids?: string[] }` — omit to run all pending, one id for "run next". Frames:
|
|
8
|
+
* { type: 'log', line } per runner output line (start/ok/fail/backup)
|
|
9
|
+
* { type: 'complete', applied, failedAt? } terminal success/summary
|
|
10
|
+
* { type: 'error', message } terminal failure (unexpected throw)
|
|
11
|
+
*/
|
|
12
|
+
declare const _default: import("h3").EventHandler<import("h3").EventHandlerRequest, Promise<void>>;
|
|
13
|
+
export default _default;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { defineEventHandler, readBody, createEventStream } from "h3";
|
|
2
|
+
import { useRuntimeConfig } from "#imports";
|
|
3
|
+
import { requireCapability } from "../../../utils/authz.js";
|
|
4
|
+
import { useObserveDb } from "../../../utils/db.js";
|
|
5
|
+
import { runPendingMigrations } from "../../../utils/migration-runner.js";
|
|
6
|
+
export default defineEventHandler(async (event) => {
|
|
7
|
+
await requireCapability(event, "migrations.manage");
|
|
8
|
+
const body = await readBody(event).catch(() => ({}));
|
|
9
|
+
const ids = Array.isArray(body?.ids) ? body.ids : void 0;
|
|
10
|
+
const db = useObserveDb();
|
|
11
|
+
const dbPath = useRuntimeConfig(event).observe.database.path;
|
|
12
|
+
const stream = createEventStream(event);
|
|
13
|
+
let chain = Promise.resolve();
|
|
14
|
+
const send = (payload) => {
|
|
15
|
+
chain = chain.then(() => stream.push({ data: JSON.stringify(payload) }));
|
|
16
|
+
return chain;
|
|
17
|
+
};
|
|
18
|
+
void (async () => {
|
|
19
|
+
try {
|
|
20
|
+
const result = await runPendingMigrations(db, {
|
|
21
|
+
mode: "admin",
|
|
22
|
+
ids,
|
|
23
|
+
dbPath,
|
|
24
|
+
log: (line) => void send({ type: "log", line })
|
|
25
|
+
});
|
|
26
|
+
await send({ type: "complete", applied: result.applied, failedAt: result.failedAt });
|
|
27
|
+
} catch (e) {
|
|
28
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
29
|
+
await send({ type: "error", message });
|
|
30
|
+
} finally {
|
|
31
|
+
await stream.close();
|
|
32
|
+
}
|
|
33
|
+
})();
|
|
34
|
+
return stream.send();
|
|
35
|
+
});
|