From vmkteam-developer
Reference for vmkteam/appkit Go toolkit: Prometheus metrics for HTTP requests/responses/client, service metadata/dependencies, pprof endpoints, traced HTTP client, X-Request-ID middleware. For instrumenting Go services.
npx claudepluginhub vmkteam/claude-plugins --plugin vmkteam-developerThis skill uses the workspace's default tool permissions.
vmkteam/appkit (https://github.com/vmkteam/appkit) — набор middleware и утилит для Go-сервисов.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
vmkteam/appkit (https://github.com/vmkteam/appkit) — набор middleware и утилит для Go-сервисов.
Связанные скиллы: /embedlog (логирование), /cron (cron-задачи), /prometheus (PromQL запросы к метрикам appkit).
Appkit автоматически регистрирует метрики app_*:
import "github.com/vmkteam/appkit/metrics"
func (a *App) registerMetrics() {
metrics.Register(a.echo) // /metrics endpoint
}
Server-метрики:
app_http_requests_total — HTTP запросы (labels: job, code, method, uri, server)app_http_responses_duration_seconds_* — HTTP latencyClient-метрики (исходящие запросы):
app_http_client_requests_total — исходящие HTTP запросыapp_http_client_requests_inflight — текущие исходящиеapp_http_client_responses_duration_seconds_* — latency исходящихMetadata-метрики:
app_metadata_service — информация о сервисе (version, зависимости)app_metadata_services — связи между сервисами (sync/async/external)app_metadata_db_connections_total — подключения к БДapp_log_events_total — log events (info/error)Декларация зависимостей сервиса для auto-discovery (используется в /onboard и /investigate):
import "github.com/vmkteam/appkit/metadata"
func (a *App) registerMetadata() {
md := metadata.New(a.appName, version)
// БД
md.AddDatabase("postgres", a.db.PoolStats)
// Зависимые сервисы (sync)
md.AddService("{dep_service}", metadata.Sync)
// Async (NATS, RabbitMQ)
md.AddService("{async_service}", metadata.Async)
// Внешние сервисы
md.AddService("{ext_service}", metadata.External)
md.Register() // регистрирует Prometheus метрики
}
Исходящие HTTP-запросы к другим сервисам с автоматическими метриками и internal headers:
import "github.com/vmkteam/appkit/httpclient"
// Создание клиента с метриками и internal headers
client := httpclient.New(
httpclient.WithMetrics("caller-service"),
httpclient.WithInternalHeaders(appName, version),
)
// Использование
resp, err := client.Do(req)
Метрики клиента: app_http_client_requests_total, app_http_client_requests_inflight, app_http_client_responses_duration_seconds_* по caller/origin.
import "github.com/vmkteam/appkit/pprof"
func (a *App) registerDebugHandlers() {
pprof.Register(a.echo) // /debug/pprof/*
}
Endpoints: /debug/pprof/, /debug/pprof/heap, /debug/pprof/goroutine, /debug/pprof/profile?seconds=30.
import "github.com/vmkteam/appkit/xrid"
// Middleware: генерирует/валидирует/пропускает X-Request-ID
a.echo.Any("/v1/rpc/", echo.WrapHandler(appkit.XRequestID(a.srv)))
// Получить из контекста
requestID := xrid.FromContext(ctx)
Автоматическое извлечение версии из Git (go build -ldflags или VCS info):
import "github.com/vmkteam/appkit/vcs"
version := vcs.Version() // git commit hash
Определение реального IP клиента с поддержкой trust CIDR ranges:
import "github.com/vmkteam/appkit/realip"
// Настройка trusted proxies
a.echo.IPExtractor = realip.Extractor(trustedCIDRs)
Автоматический HTML-список всех маршрутов (полезно в dev-режиме):
// GET / — список всех зарегистрированных маршрутов
appkit.RegisterRouteList(a.echo)
import "github.com/vmkteam/appkit/appctx"
// Хранение и получение метаданных запроса из контекста
ip := appctx.IP(ctx)
ua := appctx.UserAgent(ctx)
platform := appctx.Platform(ctx)
version := appctx.Version(ctx)
country := appctx.Country(ctx)
// pkg/app/handlers.go
func (a *App) registerHandlers() {
a.echo.Use(middleware.CORSWithConfig(middleware.CORSConfig{
AllowOrigins: []string{"*"},
}))
a.echo.GET("/status", a.statusHandler)
}
func (a *App) registerAPIHandlers() {
a.srv = rpc.New(a.db, a.Logger, a.cfg.Server.IsDevel)
a.echo.Any("/v1/rpc/*", echo.WrapHandler(appkit.XRequestID(a.srv)))
a.echo.GET("/v1/rpc/doc/*", echo.WrapHandler(smdbox.NewHandler(a.srv)))
}