Понимание Прометея - PullRequest
       17

Понимание Прометея

0 голосов
/ 06 сентября 2018

Я хотел бы попробовать простой пример использования Прометей .

  1. Я скачал двоичные файлы сервера
  2. Я начал простой код , но с небольшими изменениями

    var addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.")
    func main() {
        flag.Parse()
        http.Handle("/metrics", promhttp.Handler())
        http.Handle("/test/{id}", myHandler(promhttp.Handler()))
    
        log.Fatal(http.ListenAndServe(*addr, nil))
    }
    
    func myHandler(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            fmt.Fprintf(w, "hello, you've hit %s\n", r.URL.Path)
            next.ServeHTTP(w, r)
        })
    }
    

    Вопросы:

    1. Я предполагаю, что Prometheus является инструментом мониторинга, и я хотел бы контролировать конечные точки metrics и /test/{id} отдельно. Правильно ли я понял идею, создав несколько обработчиков и используя promhttp.Handler() в качестве промежуточного программного обеспечения?
    2. Что еще, кроме количества и задержки запросов, можно отслеживать, например, простое веб-приложение с базой данных?

1 Ответ

0 голосов
/ 06 сентября 2018

Чтобы ответить на ответ @David Maze, обработчик по умолчанию promhttp.Handler предназначен для представления метрик. (собирает из всех зарегистрированных обработчиков и сообщает о них по запросу).

К сожалению, это не универсальное промежуточное ПО http, которое дает вам какие-либо метрики из коробки.

Я видел, что многие из веб-фреймворков Go имеют какое-то промежуточное программное обеспечение Prometheus сообщества ( gin's ), которое выдает метрики «из коробки» (задержка, код ответа, количество запросов и т. Д.).

В клиентской библиотеке go prometheus есть примеры того, как добавить метрики в ваше приложение.

var (

    httpRequests = prometheus.NewCounter(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Number of http requests.",
        },
    )
)

func init() {
    // Metrics have to be registered to be exposed:
    prometheus.MustRegister(httpRequests)
}

func myHandler(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        httpRequests.Inc()
        fmt.Fprintf(w, "hello, you've hit %s\n", r.URL.Path)
        next.ServeHTTP(w, r)
    })
}

Что касается вашего второго вопроса лотов :) Google поддерживает мониторинг 4 золотых сигналов:

https://landing.google.com/sre/book/chapters/monitoring-distributed-systems.html#xref_monitoring_golden-signals

Это

  • Трафик - Пропускная способность - Счетчик / Время
  • Латентность - распределение / гистограмма
  • Ошибки - HTTP-коды ответов / явное количество ошибок
  • Насыщенность - очереди ресурсов, т. Е. При наличии пула подпрограмм, сколько подпрограмм активно в данный момент времени

В моем опыте также было полезно иметь представление обо всех взаимодействиях между вашей прикладной программой и вашей базой данных (т.е. 4 золотых сигнала, примененных к вашей базе данных):

  • количество звонков в дБ из приложения
  • задержки звонков
  • Результаты (ошибка / успех) ваших звонков для определения доступности (успех / итог)
  • насыщенность доступна от вашего драйвера БД (https://golang.org/pkg/database/sql/#DBStats)
...