Привет! В этой статье я хочу поделиться своим опытом работы с языком Golang и рассказать о том, как я переделал код сервера Фибоначчи с метриками.Вначале, мне потребовалось установить Golang и настроить его на моем компьютере. После этого я создал новую директорию для проекта и начал писать код сервера Фибоначчи.go
package main
import (
″fmt″
″log″
″net/http»
″strconv″
″time″
″github.com/prometheus/client_golang/prometheus»
″github.com/prometheus/client_golang/prometheus/promhttp»
)
var fibonacciCounter prometheus.Counter
var fibonacciHistogram prometheus.Histogram
func fibonacci(n int) int {
if n < 0 {
return 0
} else if n 1 {
return 1
} else {
return fibonacci(n-1) fibonacci(n-2)
}
}
func fibonacciHandler(w http.ResponseWriter, r *http.Request) {
start ⁚ time.Now
query ⁚ r.URL.Query
nStr ⁚ query.Get(″n″)
n, err ⁚ strconv.Atoi(nStr)
if err ! nil {
http.Error(w, ″Invalid parameter 'n'″, http.StatusBadRequest)
return
}
result ⁚ fibonacci(n)
elapsed ⁚ time.Since(start)
fmt.Fprintf(w, ″Fibonacci(%d) %d\n″, n, result)
fibonacciCounter.Inc
fibonacciHistogram.Observe(float64(elapsed.Milliseconds))
}
func main {
fibonacciCounter prometheus.NewCounter(prometheus.CounterOpts{
Name⁚ ″fibonacci_requests_total″,
Help⁚ ″Total number of Fibonacci requests″,
})
fibonacciHistogram prometheus.NewHistogram(prometheus.HistogramOpts{
Name⁚ ″fibonacci_request_duration_milliseconds″,
Help⁚ ″Duration of Fibonacci requests in milliseconds″,
Buckets⁚ prometheus.DefBuckets,
})
prometheus.MustRegister(fibonacciCounter)
prometheus.MustRegister(fibonacciHistogram)
http.HandleFunc(″/", fibonacciHandler)
http.Handle(″/metrics", promhttp.Handler)
log.Fatal(http.ListenAndServe(″⁚8080″, nil))
}
Код сервера Фибоначчи в Golang довольно простой. Он принимает GET-параметр 'n' и вычисляет n-ое число Фибоначчи. Важным добавлением является использование пакета Prometheus для мониторинга и сбора метрик.Однако, чтобы улучшить функциональность сервера, я решил переделать увеличение метрики числа запросов в middleware Metrics. Для этого я создал новый middleware, который будет измерять время выполнения каждого запроса и увеличивать счетчик запросов.go
func Metrics(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
start ⁚ time.Now
next(w, r)
elapsed ⁚ time.Since(start)
fibonacciHistogram.Observe(float64(elapsed.Milliseconds))
fibonacciCounter.Inc
}
}
Затем я добавил этот middleware для URL '/'. Теперь этот middleware будет добавляться ко всем запросам, включая '/'. Чтобы выполнить это действие, я просто передал обработчик fibonacciHandler в middleware Metrics.go
http.HandleFunc(″/", Metrics(fibonacciHandler))
func main {
... http.HandleFunc(″/metrics», metricsHandler)
...}
Теперь, когда я запускаю сервер Фибоначчи, я могу отправить запросы на URL ‘/’, чтобы вычислить числа Фибоначчи, и запросы на URL ‘/metrics’, чтобы получить метрику времени выполнения запросов.
Вот и все! Теперь я имею сервер Фибоначчи с метриками, который позволяет измерять время выполнения каждого запроса и увеличивает счетчик запросов. Я использовал язык Golang и пакеты Prometheus для достижения этой цели. Это был интересный опыт, и я с удовольствием применю этот подход в будущих проектах.