metrics
v0.2.7
Пакет, собирающий метрики из приложения и отправляющий их в специальную очередь в RabbitMQ.
Отправка метрик происходит раз в N секунд. За это отвечает специальная процедура, бесконечно наблюдающая за батчем. Все метрики собираются в специальный батч, который при полном заполнении отправляется в RabbitMQ. После этого батч очищается и готов получать новые метрики. Также, если метрики давно не отправлялись, но при этом если батч не пуст - происходит отправка всех метрик, которые в нем есть. Помимо пользовательских метрик, пакет собирает и системные.
Поддерживаемые типы метрик
CounterMetricType
- метрика-счетчик, позволяющая рассчитывать rate
на основе ее изменений.
GaugeMetricType
- метрика-значение, позволяющая видеть ее значение в конкретный момент времени.
Конфигурация
Prometheus
Параметр |
Тип |
Описание |
Дефолтное значение |
DRY |
bool |
Режим, в котором будет запущен коллектор метрик. true - эмулирование сбора метрик; false - реальный сбор метрик. |
false |
DefaultLabels |
amqprometheus.Labels |
Лейблы, которые будут автоматически добавлены ко всем метрикам. |
amqprometheus.Labels{} |
Prefix |
string |
Префикс, добавляемый к названию всех метрик. |
"" |
Exchange |
string |
Название обменника, через которого будут отправляться сообщения в RabbitMQ. |
"amq.direct" |
Queue |
string |
Очередь, в которую будут складываться сообщения с метриками. |
"metrics.prometheus" |
MessageTTL |
int |
Длительность жизни сообщений в очереди в RabbitMQ, в секундах. |
3600 |
Period |
time.Duration |
Период мониторинга батча и отправки метрик в RabbitMQ. |
5 * time.Second |
BatchSize |
int |
Максимальное кол-во метрик в одном батче. |
10 |
BatchTTL |
time.Duration |
Длительность жизни одного батча до момент форс-отправки метрик. |
60 * time.Second |
ClickHouse
¯\_(ツ)_/¯
Пример использования
package main
import (
"time"
"os"
"syscall"
"signal"
amqp "github.com/rabbitmq/amqp091-go"
"git.debtfair.ru/external/metrics/amqprometheus"
)
func main() {
// подключение к RabbitMQ
// ...
// конфигурация сервиса для сбора метрик
prometheusService := amqprometheus.NewPrometheusService(context, channel)
prometheusService.DRY = false
prometheusService.Exchange = "metrics.direct"
prometheusService.Queue = "metrics.prometheus"
prometheusService.MessageTTL = 60
prometheusService.BatchSize = 100
prometheusService.BatchTTL = time.Duration(1) * time.Second
prometheusService.Period = time.Duration(10) * time.Second
prometheusService.DefaultLabels = amqprometheus.Labels{"label": "value", "env": "development"}
defer prometheusService.Shutdown()
done := make(chan os.Signal, 1)
signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
// фоновая горутина, отправляющая метрики в RabbitMQ
go prometheusService.Collect()
// шоткат на counter-метрику
prometheusService.Counter("counter_metric", amqprometheus.Labels{})
go func() {
// шоткат на длительность выполнения
defer prometheusService.Duration(time.Now(), "duration", amqprometheus.Labels{})
}()
// ручное добавление метрики
prometheusService.AddMetric(amqprometheus.Metric{
Name: "custom_metric",
Value: 12345.6789,
Labels: amqprometheus.Labels{},
Type: amqprometheus.GaugeMetricType,
})
<-done
}