feat: debug-endpoints (#110)

* reorg + pprof endpoints

* fix spacing issue

* fix generation directory
This commit is contained in:
Hayden 2022-10-24 18:24:18 -08:00 committed by GitHub
parent a4b4fe3454
commit d151d42081
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 105 additions and 61 deletions

View file

@ -10,5 +10,8 @@
"package.json": "package-lock.json, yarn.lock, .eslintrc.js, tsconfig.json, .prettierrc, .editorconfig, pnpm-lock.yaml, postcss.config.js, tailwind.config.js", "package.json": "package-lock.json, yarn.lock, .eslintrc.js, tsconfig.json, .prettierrc, .editorconfig, pnpm-lock.yaml, postcss.config.js, tailwind.config.js",
"docker-compose.yml": "Dockerfile, .dockerignore, docker-compose.dev.yml, docker-compose.yml", "docker-compose.yml": "Dockerfile, .dockerignore, docker-compose.dev.yml, docker-compose.yml",
"README.md": "LICENSE, SECURITY.md" "README.md": "LICENSE, SECURITY.md"
} },
"cSpell.words": [
"debughandlers"
]
} }

View file

@ -17,13 +17,13 @@ tasks:
deps: deps:
- db:generate - db:generate
cmds: cmds:
- cd backend/app/api/ && swag fmt - cd backend/app/api/static && swag fmt --dir=../
- cd backend/app/api/ && swag init --dir=./,../../internal,../../pkgs - cd backend/app/api/static && swag init --dir=../,../../../internal,../../../pkgs
- | - |
npx swagger-typescript-api \ npx swagger-typescript-api \
--no-client \ --no-client \
--modular \ --modular \
--path ./backend/app/api/docs/swagger.json \ --path ./backend/app/api/static/docs/swagger.json \
--output ./frontend/lib/api/types --output ./frontend/lib/api/types
- python3 ./scripts/process-types.py ./frontend/lib/api/types/data-contracts.ts - python3 ./scripts/process-types.py ./frontend/lib/api/types/data-contracts.ts
sources: sources:
@ -34,8 +34,8 @@ tasks:
generates: generates:
- "./frontend/lib/api/types/data-contracts.ts" - "./frontend/lib/api/types/data-contracts.ts"
- "./backend/ent/schema" - "./backend/ent/schema"
- "./backend/app/api/docs/swagger.json" - "./backend/app/api/static/docs/swagger.json"
- "./backend/app/api/docs/swagger.yaml" - "./backend/app/api/static/docs/swagger.yaml"
api: api:
desc: Starts the backend api server (depends on generate task) desc: Starts the backend api server (depends on generate task)

View file

@ -0,0 +1,16 @@
package debughandlers
import (
"expvar"
"net/http"
"net/http/pprof"
)
func New(mux *http.ServeMux) {
mux.HandleFunc("/debug/pprof", pprof.Index)
mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
mux.HandleFunc("/debug/pprof/profile", pprof.Profile)
mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
mux.HandleFunc("/debug/pprof/trace", pprof.Trace)
mux.Handle("/debug/vars", expvar.Handler())
}

View file

@ -2,13 +2,14 @@ package main
import ( import (
"context" "context"
"net/http"
"os" "os"
"path/filepath" "path/filepath"
"time" "time"
atlas "ariga.io/atlas/sql/migrate" atlas "ariga.io/atlas/sql/migrate"
"entgo.io/ent/dialect/sql/schema" "entgo.io/ent/dialect/sql/schema"
"github.com/hay-kot/homebox/backend/app/api/docs" "github.com/hay-kot/homebox/backend/app/api/static/docs"
"github.com/hay-kot/homebox/backend/ent" "github.com/hay-kot/homebox/backend/ent"
"github.com/hay-kot/homebox/backend/internal/config" "github.com/hay-kot/homebox/backend/internal/config"
"github.com/hay-kot/homebox/backend/internal/migrations" "github.com/hay-kot/homebox/backend/internal/migrations"
@ -153,5 +154,14 @@ func run(cfg *config.Config) error {
app.SetupDemo() app.SetupDemo()
} }
if cfg.Debug.Enabled {
debugrouter := app.debugRouter()
go func() {
if err := http.ListenAndServe(":"+cfg.Debug.Port, debugrouter); err != nil {
log.Fatal().Err(err).Msg("failed to start debug server")
}
}()
}
return app.server.Start(routes) return app.server.Start(routes)
} }

View file

@ -11,8 +11,9 @@ import (
"path/filepath" "path/filepath"
"github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5"
_ "github.com/hay-kot/homebox/backend/app/api/docs" "github.com/hay-kot/homebox/backend/app/api/handlers/debughandlers"
v1 "github.com/hay-kot/homebox/backend/app/api/v1" v1 "github.com/hay-kot/homebox/backend/app/api/handlers/v1"
_ "github.com/hay-kot/homebox/backend/app/api/static/docs"
"github.com/hay-kot/homebox/backend/internal/repo" "github.com/hay-kot/homebox/backend/internal/repo"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
httpSwagger "github.com/swaggo/http-swagger" // http-swagger middleware httpSwagger "github.com/swaggo/http-swagger" // http-swagger middleware
@ -23,10 +24,17 @@ const prefix = "/api"
var ( var (
ErrDir = errors.New("path is dir") ErrDir = errors.New("path is dir")
//go:embed all:public/* //go:embed all:static/public/*
public embed.FS public embed.FS
) )
func (a *app) debugRouter() *http.ServeMux {
dbg := http.NewServeMux()
debughandlers.New(dbg)
return dbg
}
// registerRoutes registers all the routes for the API // registerRoutes registers all the routes for the API
func (a *app) newRouter(repos *repo.AllRepos) *chi.Mux { func (a *app) newRouter(repos *repo.AllRepos) *chi.Mux {
registerMimes() registerMimes()

View file

@ -24,6 +24,12 @@ type Config struct {
Swagger SwaggerConf `yaml:"swagger"` Swagger SwaggerConf `yaml:"swagger"`
Demo bool `yaml:"demo"` Demo bool `yaml:"demo"`
AllowRegistration bool `yaml:"disable_registration" conf:"default:true"` AllowRegistration bool `yaml:"disable_registration" conf:"default:true"`
Debug DebugConf `yaml:"debug"`
}
type DebugConf struct {
Enabled bool `yaml:"enabled" conf:"default:false"`
Port string `yaml:"port" conf:"default:4000"`
} }
type SwaggerConf struct { type SwaggerConf struct {

View file

@ -124,7 +124,7 @@
</script> </script>
<template> <template>
<BaseContainer> <div>
<BaseModal v-model="updateModal"> <BaseModal v-model="updateModal">
<template #title> Update Location </template> <template #title> Update Location </template>
<form v-if="location" @submit.prevent="update"> <form v-if="location" @submit.prevent="update">
@ -136,59 +136,60 @@
</div> </div>
</form> </form>
</BaseModal> </BaseModal>
<BaseContainer class="space-y-10 mb-16">
<BaseCard>
<template #title>
<BaseSectionHeader>
<Icon name="mdi-map-marker" class="mr-2 -mt-1 text-base-content" />
<span class="text-base-content">
{{ location ? location.name : "" }}
</span>
<div v-if="location && location.parent" class="text-sm breadcrumbs pb-0">
<ul class="text-base-content/70">
<li>
<NuxtLink :to="`/location/${location.parent.id}`"> {{ location.parent.name }}</NuxtLink>
</li>
<li>{{ location.name }}</li>
</ul>
</div>
</BaseSectionHeader>
</template>
<BaseCard class="mb-16"> <template #title-actions>
<template #title> <div class="flex mt-2 gap-2">
<BaseSectionHeader> <div class="form-control max-w-[160px]">
<Icon name="mdi-map-marker" class="mr-2 -mt-1 text-base-content" /> <label class="label cursor-pointer">
<span class="text-base-content"> <input v-model="preferences.showDetails" type="checkbox" class="toggle toggle-primary" />
{{ location ? location.name : "" }} <span class="label-text ml-2"> Detailed View </span>
</span> </label>
<div v-if="location && location.parent" class="text-sm breadcrumbs pb-0"> </div>
<ul class="text-base-content/70"> <BaseButton class="ml-auto" size="sm" @click="openUpdate">
<li> <Icon class="mr-1" name="mdi-pencil" />
<NuxtLink :to="`/location/${location.parent.id}`"> {{ location.parent.name }}</NuxtLink> Edit
</li> </BaseButton>
<li>{{ location.name }}</li> <BaseButton size="sm" @click="confirmDelete">
</ul> <Icon class="mr-1" name="mdi-delete" />
Delete
</BaseButton>
</div> </div>
</BaseSectionHeader> </template>
</template>
<template #title-actions> <DetailsSection :details="details" />
<div class="flex mt-2 gap-2"> </BaseCard>
<div class="form-control max-w-[160px]">
<label class="label cursor-pointer"> <section v-if="location && location.items.length > 0">
<input v-model="preferences.showDetails" type="checkbox" class="toggle toggle-primary" /> <BaseSectionHeader class="mb-5"> Items </BaseSectionHeader>
<span class="label-text ml-2"> Detailed View </span> <div class="grid gap-2 grid-cols-1 sm:grid-cols-2">
</label> <ItemCard v-for="item in location.items" :key="item.id" :item="item" />
</div>
<BaseButton class="ml-auto" size="sm" @click="openUpdate">
<Icon class="mr-1" name="mdi-pencil" />
Edit
</BaseButton>
<BaseButton size="sm" @click="confirmDelete">
<Icon class="mr-1" name="mdi-delete" />
Delete
</BaseButton>
</div> </div>
</template> </section>
<DetailsSection :details="details" /> <section v-if="location && location.children.length > 0">
</BaseCard> <BaseSectionHeader class="mb-5"> Child Locations </BaseSectionHeader>
<div class="grid gap-2 grid-cols-1 sm:grid-cols-3">
<section v-if="location && location.items.length > 0"> <LocationCard v-for="item in location.children" :key="item.id" :location="item" />
<BaseSectionHeader class="mb-5"> Items </BaseSectionHeader> </div>
<div class="grid gap-2 grid-cols-1 sm:grid-cols-2"> </section>
<ItemCard v-for="item in location.items" :key="item.id" :item="item" /> </BaseContainer>
</div> </div>
</section>
<section v-if="location && location.children.length > 0">
<BaseSectionHeader class="mb-5"> Child Locations </BaseSectionHeader>
<div class="grid gap-2 grid-cols-1 sm:grid-cols-3">
<LocationCard v-for="item in location.children" :key="item.id" :location="item" />
</div>
</section>
</BaseContainer>
</template> </template>