Мониторинг микросервисов с Prometheus

Go

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

Это на самом деле довольно просто:

  1. HistogramVecОтветственный за запрос отнимающей много времени коллекции:
    • bucketхранитсяoptionЗаданная трудоемкая метрика. Время выполнения запроса будет агрегировано в соответствующем сегменте и подсчитано.
    • Окончательное отображение представляет собой распределение маршрута по разным временным затратам, которое интуитивно предоставляется разработчику для оптимизации участка.
  2. CounterVecОтветственный за указаниеlabelsКоллекция тегов:
    • Labels: []string{"path", "code"}
    • labelsдовольноtuple.go-zeroда(path, code)В целом запишите время возврата разных кодов состояния для разных маршрутов. если4xx,5xxКогда слишком много, стоит ли вам смотреть на здоровье вашего сервиса?

Как настроить

go-zeroтакже предусмотрено вprometheus metricБазовый пакет для разработчиков для самостоятельной разработкиprometheusпромежуточное ПО.

Код:GitHub.com/them-specialty/go…

имя использовать функция сбора
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)
}

Поэтому разработчики хотят определить свои собственные показатели мониторинга:

  1. В использованииgoctlГенерировать код API указывает на созданиепромежуточное ПО:ноль micro.GitHub.IO/go-zero/m…
  2. Напишите логику индикатора, которую вам нужно считать, в файл промежуточного программного обеспечения.
  3. Конечно, разработчики также могут написать логику статистических индикаторов в бизнес-логике. То же.

Вышеупомянутое предназначено дляHTTPЧастичный логический анализ,RPCЧасть логики похожа, можноперехватчикДеталь см. дизайн.

Суммировать

В этой статье анализируетсяgo-zeroЛогика индикаторов мониторинга сервиса, конечно, для мониторинга какой-то инфраструктуры,prometheusпутем введения соответствующихexporterЧто нужно сделать.

адрес проекта

GitHub.com/them-specialty/go…

Добро пожаловать в Go-Zero иstarПоддерживать нас!