Let's Go Further معیارها › نمایش معیارها با expvar
قبلی · فهرست مطالب · بعدی
فصل ۱۸.۱.

نمایش معیارها با expvar

مشاهده معیارهای برنامه ما به لطف این واقعیت آسان است که پکیج expvar یک تابع expvar.Handler() ارائه می‌دهد که یک handler HTTP برای نمایش معیارهای برنامه شما برمی‌گرداند.

به طور پیش‌فرض این handler اطلاعاتی درباره مصرف حافظه و همچنین یادآوری پرچم‌های خط فرمانی که هنگام شروع برنامه استفاده کردید را نمایش می‌دهد، که همه در قالب JSON خروجی داده می‌شوند.

پس اولین کاری که می‌خواهیم انجام دهیم این است که این handler را در یک endpoint جدید GET /debug/vars نصب کنیم، به این صورت:

متد الگوی URL Handler عملیات
GET /debug/vars expvar.Handler() نمایش معیارهای برنامه
فایل: cmd/api/routes.go
package main

import (
    "expvar" // New import
    "net/http"

    "github.com/julienschmidt/httprouter"
)

func (app *application) routes() http.Handler {
    router := httprouter.New()

    router.NotFound = http.HandlerFunc(app.notFoundResponse)
    router.MethodNotAllowed = http.HandlerFunc(app.methodNotAllowedResponse)

    router.HandlerFunc(http.MethodGet, "/v1/healthcheck", app.healthcheckHandler)

    router.HandlerFunc(http.MethodGet, "/v1/movies", app.requirePermission("movies:read", app.listMoviesHandler))
    router.HandlerFunc(http.MethodPost, "/v1/movies", app.requirePermission("movies:write", app.createMovieHandler))
    router.HandlerFunc(http.MethodGet, "/v1/movies/:id", app.requirePermission("movies:read", app.showMovieHandler))
    router.HandlerFunc(http.MethodPatch, "/v1/movies/:id", app.requirePermission("movies:write", app.updateMovieHandler))
    router.HandlerFunc(http.MethodDelete, "/v1/movies/:id", app.requirePermission("movies:write", app.deleteMovieHandler))

    router.HandlerFunc(http.MethodPost, "/v1/users", app.registerUserHandler)
    router.HandlerFunc(http.MethodPut, "/v1/users/activated", app.activateUserHandler)

    router.HandlerFunc(http.MethodPost, "/v1/tokens/authentication", app.createAuthenticationTokenHandler)

    // Register a new GET /debug/vars endpoint pointing to the expvar handler.
    router.Handler(http.MethodGet, "/debug/vars", expvar.Handler())

    return app.recoverPanic(app.enableCORS(app.rateLimit(app.authenticate(router))))
}

خوب، بیایید آن را امتحان کنیم.

API را مجدداً راه‌اندازی کنید و چند پرچم خط فرمان برای نشان دادن آن پاس دهید. به این صورت:

$ go run ./cmd/api -limiter-enabled=false -port=4000
time=2023-09-10T10:59:13.722+02:00 level=INFO msg="database connection pool established"
time=2023-09-10T10:59:13.722+02:00 level=INFO msg="starting server" addr=:4000 env=development

و اگر در مرورگر خود به http://localhost:4000/debug/vars مراجعه کنید، باید یک پاسخ JSON حاوی اطلاعاتی درباره برنامه در حال اجرای خود ببینید.

در مورد من، پاسخ به این صورت است:

18.01-01.png

می‌توانیم ببینیم که JSON اینجا در حال حاضر حاوی دو آیتم سطح بالا است: "cmdline" و "memstats". بیایید سریعاً بررسی کنیم که این‌ها چه چیزی را نشان می‌دهند.

آیتم "cmdline" حاوی آرایه‌ای از آرگومان‌های خط فرمان استفاده شده برای اجرای برنامه است، که با نام برنامه شروع می‌شود. این در واقع یک نمایش JSON از متغیر os.Args است و اگر بخواهید دقیقاً ببینید چه تنظیمات غیرپیش‌فرضی هنگام شروع برنامه استفاده شده، مفید است.

آیتم "memstats" حاوی یک اسکن «لحظه‌ای» از مصرف حافظه است، همان‌طور که توسط تابع runtime.MemStats() برگردانده می‌شود. مستندات و توضیحات برای تمام مقادیر اینجا قابل مشاهده است، اما مهم‌ترین‌ها عبارتند از: