Перейти к содержанию

Метрики

Справочник метрик, собираемых go-activerecord.

Интерфейс

type MetricInterface interface {
    StatCount(namespace, name string, cnt int)
    StatTime(namespace, operation string, dt time.Duration)
    StatErr(namespace, name string, cnt int)
}

Временные метрики

Время выполнения операций (StatTime):

Метрика Описание
select_db Время SELECT запроса
update_db Время UPDATE запроса
delete_db Время DELETE запроса
insertreplace_db Время INSERT/REPLACE запроса
call_proc Время вызова процедуры
select_pack Время упаковки SELECT
select_process Время обработки результата
select_newobj Время создания объектов
insertreplace_pack Время упаковки INSERT
insertreplace_packtuple Время упаковки tuple

Deprecated

Метрика Замена
select_box select_db
update_box update_db
delete_box delete_db
insertreplace_box insertreplace_db

Счётчики операций

Количество операций (StatCount):

Метрика Описание
insert_request Запросы на Insert
insert_success Успешные Insert
insertorreplace_request Запросы на InsertOrReplace
insertorreplace_success Успешные InsertOrReplace
replace_request Запросы на Replace
replace_success Успешные Replace
update_request Запросы на Update
update_success Успешные Update
update_empty Update без изменений
update_repaired Update восстановленных объектов
delete_request Запросы на Delete
delete_success Успешные Delete
select_keys Количество ключей в SELECT
select_tuples_res Количество полученных записей

Bulk операции

Метрика Описание
bulk_update_request Вызовы BulkUpdate
bulk_update_objects Объектов в BulkUpdate
bulk_update_success Обновлённых строк
bulk_update_empty Объектов без изменений
bulk_update_notexists Несуществующих объектов
bulk_update_failed Неудачных BulkUpdate
bulk_insertorreplace_request Вызовы BulkInsertReplace
bulk_insertorreplace_success Вставленных строк

Метрики ошибок

Количество ошибок (StatErr):

Метрика Описание
select_db Ошибки SELECT
update_db Ошибки UPDATE
delete_db Ошибки DELETE
insertreplace_db Ошибки INSERT/REPLACE
insert_exists Конфликт при Insert
replace_notexists Replace несуществующего
update_notexists Update несуществующего
call_proc Ошибки вызова процедуры

Ошибки подготовки

Метрика Описание
select_preparebox Ошибка подготовки SELECT
select_resp Ошибка ответа SELECT
update_preparedb Ошибка подготовки UPDATE
update_resp Ошибка ответа UPDATE
update_packpk Ошибка упаковки PK
delete_preparedb Ошибка подготовки DELETE
delete_resp Ошибка ответа DELETE
delete_pack Ошибка упаковки DELETE
insertreplace_preparedb Ошибка подготовки INSERT
insertreplace_obj Ошибка объекта INSERT
insertreplace_packfield Ошибка упаковки поля
call_proc_preparedb Ошибка подготовки процедуры
compare_packfield Ошибка сравнения полей

Bulk ошибки

Метрика Описание
bulk_insert_gen Ошибка генерации SQL
bulk_insert_preparedb Ошибка подготовки соединения
bulk_insert_db Ошибка выполнения
bulk_insert_scan Ошибка чтения результатов
bulk_insert_match Ошибка сопоставления

Пример реализации

Prometheus

package metrics

import (
    "time"
    "github.com/prometheus/client_golang/prometheus"
)

type PrometheusMetrics struct {
    counts   *prometheus.CounterVec
    times    *prometheus.HistogramVec
    errors   *prometheus.CounterVec
}

func NewPrometheusMetrics() *PrometheusMetrics {
    m := &PrometheusMetrics{
        counts: prometheus.NewCounterVec(
            prometheus.CounterOpts{
                Name: "activerecord_operations_total",
                Help: "Total number of operations",
            },
            []string{"namespace", "operation"},
        ),
        times: prometheus.NewHistogramVec(
            prometheus.HistogramOpts{
                Name:    "activerecord_operation_duration_seconds",
                Help:    "Operation duration in seconds",
                Buckets: prometheus.DefBuckets,
            },
            []string{"namespace", "operation"},
        ),
        errors: prometheus.NewCounterVec(
            prometheus.CounterOpts{
                Name: "activerecord_errors_total",
                Help: "Total number of errors",
            },
            []string{"namespace", "error_type"},
        ),
    }

    prometheus.MustRegister(m.counts, m.times, m.errors)
    return m
}

func (m *PrometheusMetrics) StatCount(namespace, name string, cnt int) {
    m.counts.WithLabelValues(namespace, name).Add(float64(cnt))
}

func (m *PrometheusMetrics) StatTime(namespace, operation string, dt time.Duration) {
    m.times.WithLabelValues(namespace, operation).Observe(dt.Seconds())
}

func (m *PrometheusMetrics) StatErr(namespace, name string, cnt int) {
    m.errors.WithLabelValues(namespace, name).Add(float64(cnt))
}

Регистрация

func main() {
    metrics := NewPrometheusMetrics()
    activerecord.RegisterMetrics(metrics)
}

Namespace

Все метрики включают namespace модели:

activerecord_operations_total{namespace="users", operation="select_db"} 1234
activerecord_operations_total{namespace="orders", operation="insert_success"} 567

Рекомендации

1. Мониторьте ошибки

rate(activerecord_errors_total[5m]) > 0

2. Отслеживайте latency

histogram_quantile(0.99, rate(activerecord_operation_duration_seconds_bucket[5m]))

3. Настройте алерты

- alert: HighSelectLatency
  expr: histogram_quantile(0.99, rate(activerecord_operation_duration_seconds_bucket{operation="select_db"}[5m])) > 0.1
  for: 5m
  labels:
    severity: warning

Следующие шаги