Служба недавно отслеживалась, и в настоящее время самая популярная отслеживаемая база данных — этоPrometheus
,в то же времяgo-zero
Доступ по умолчанию также является этой базой данных. прямо сегодняgo-zero
как получить доступPrometheus
и как разработчики определяют свои собственные показатели мониторинга.
Мониторинг доступа
go-zero
Фреймворк объединяетprometheus
мониторинг сервисных метрик. Однако он явно не открывается, и разработчик долженconfig.yaml
Средняя конфигурация:
Prometheus:
Host: 127.0.0.1
Port: 9091
Path: /metrics
Если разработчик строит локальноPrometheus
, должен быть вPrometheus
файл конфигурацииprometheus.yaml
Напишите конфигурацию, которая должна собирать информацию о мониторинге службы, в:
- job_name: 'file_ds'
static_configs:
- targets: ['your-local-ip:9091']
labels:
job: activeuser
app: activeuser-api
env: dev
instance: your-local-ip:service-port
потому что местныйdocker
В ходе выполнения. будетprometheus.yaml
Установить вdocker-prometheus
Под содержанием:
docker run \
-p 9090:9090 \
-v dockeryml/docker-prometheus:/etc/prometheus \
prom/prometheus
Открытьlocalhost:9090
Ты можешь видеть:
нажмитеhttp://service-ip:9091/metrics
Вы можете увидеть информацию мониторинга сервиса:
На рисунке выше мы видим, что есть дваbucket
,так же какcount/sum
показатель.
Этоgo-zero
Как интегрировать индикаторы мониторинга? Какие показатели вы отслеживаете? Как мы определяем наши собственные показатели? Эти вопросы объясняются ниже
Для вышеуказанного базового доступа вы можете обратиться к нашей другой статье:ноль micro.GitHub.IO/go-zero/Sail…
Как интегрировать
Метод запроса в приведенном выше примереHTTP
, то есть при запросе сервера данные индикатора мониторинга постоянно собираются. Легко думать, чтопромежуточное ПОФункция, конкретный код:GitHub.com/them-specialty/go…
var (
metricServerReqDur = metric.NewHistogramVec(&metric.HistogramVecOpts{
...
// 监控指标
Labels: []string{"path"},
// 直方图分布中,统计的桶
Buckets: []float64{5, 10, 25, 50, 100, 250, 500, 1000},
})
metricServerReqCodeTotal = metric.NewCounterVec(&metric.CounterVecOpts{
...
// 监控指标:直接在记录指标 incr() 即可
Labels: []string{"path", "code"},
})
)
func PromethousHandler(path string) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// 请求进入的时间
startTime := timex.Now()
cw := &security.WithCodeResponseWriter{Writer: w}
defer func() {
// 请求返回的时间
metricServerReqDur.Observe(int64(timex.Since(startTime)/time.Millisecond), path)
metricServerReqCodeTotal.Inc(path, strconv.Itoa(cw.Code))
}()
// 中间件放行,执行完后续中间件和业务逻辑。重新回到这,做一个完整请求的指标上报
// [🧅:洋葱模型]
next.ServeHTTP(cw, r)
})
}
}
Это на самом деле довольно просто:
-
HistogramVec
Ответственный за запрос отнимающей много времени коллекции:-
bucket
хранитсяoption
Заданная трудоемкая метрика. Время выполнения запроса будет агрегировано в соответствующем сегменте и подсчитано. - Окончательное отображение представляет собой распределение маршрута по разным временным затратам, которое интуитивно предоставляется разработчику для оптимизации участка.
-
-
CounterVec
Ответственный за указаниеlabels
Коллекция тегов:Labels: []string{"path", "code"}
-
labels
довольноtuple
.go-zero
да(path, code)
В целом запишите время возврата разных кодов состояния для разных маршрутов. если4xx,5xx
Когда слишком много, стоит ли вам смотреть на здоровье вашего сервиса?
Как настроить
go-zero
также предусмотрено вprometheus metric
Базовый пакет для разработчиков для самостоятельной разработкиprometheus
промежуточное ПО.
имя | использовать | функция сбора |
---|---|---|
CounterVec | единый счет. Используется для: статистики запросов в секунду. |
CounterVec.Inc() Индикатор +1 |
GuageVec | Простые индикаторные записи. Применимо к емкости диска, использованию ЦП/памяти (может быть увеличено или уменьшено) |
GuageVec.Inc()/GuageVec.Add() Индекс + 1 / Индекс плюс N, также может быть отрицательным |
HistogramVec | Распределение значений ответа. Применимо к: длительному запросу, размеру ответа |
HistogramVec.Observe(val, labels) Запишите текущее соответствующее значение индикатора и найдите ведро, в котором находится значение, +1 |
В дополнение к
HistogramVec.Observe()
Проведите базовый анализ:На самом деле, мы можем видеть, что каждый из вышеперечисленных
HistogramVec
В статистике будет 3 последовательности:
_count
: количество данных_sum
: Сумма всех данных_bucket{le=a1}
: в[-inf, a1]
количество данныхИтак, мы также предполагаем, что в статистическом процессе есть 3 вида данных для статистики:
// 基本上在prometheus的统计都是使用 atomic CAS 方式进行计数的 // 性能要比使用 Mutex 要高 func (h *histogram) observe(v float64, bucket int) { n := atomic.AddUint64(&h.countAndHotIdx, 1) hotCounts := h.counts[n>>63] if bucket < len(h.upperBounds) { // val 对应数据桶 +1 atomic.AddUint64(&hotCounts.buckets[bucket], 1) } for { oldBits := atomic.LoadUint64(&hotCounts.sumBits) newBits := math.Float64bits(math.Float64frombits(oldBits) + v) // sum指标数值 +v(毕竟是总数sum) if atomic.CompareAndSwapUint64(&hotCounts.sumBits, oldBits, newBits) { break } } // count 统计 +1 atomic.AddUint64(&hotCounts.count, 1) }
Поэтому разработчики хотят определить свои собственные показатели мониторинга:
- В использовании
goctl
Генерировать код API указывает на созданиепромежуточное ПО:ноль micro.GitHub.IO/go-zero/m… - Напишите логику индикатора, которую вам нужно считать, в файл промежуточного программного обеспечения.
- Конечно, разработчики также могут написать логику статистических индикаторов в бизнес-логике. То же.
Вышеупомянутое предназначено дляHTTP
Частичный логический анализ,RPC
Часть логики похожа, можноперехватчикДеталь см. дизайн.
Суммировать
В этой статье анализируетсяgo-zero
Логика индикаторов мониторинга сервиса, конечно, для мониторинга какой-то инфраструктуры,prometheus
путем введения соответствующихexporter
Что нужно сделать.
адрес проекта
Добро пожаловать в Go-Zero иstarПоддерживать нас!