Служба недавно отслеживалась, и в настоящее время самая популярная отслеживаемая база данных — это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Поддерживать нас!