Documentation
¶
Overview ¶
Package authzmetrics — ЕДИНСТВЕННЫЙ коллектор величин кеша положительных вердиктов.
Почему одна реализация на всех ¶
Кеш вердиктов в этом дереве один (`pkg/authz.Cache`), и строит его один носитель контура на все сервисы. Ровно та же причина держит единым и его наблюдение: шесть коллекторов с одинаковыми на вид именами серий — это шесть мест, где полосу можно забыть, переименовать или сложить не с той. Здесь имя семейства собирается из имени сервиса по одному правилу, а словари полос и причин вытеснения закрыты константами.
Имена ОДНОРОДНЫ краю, а не изобретены заново ¶
Край уже выставляет `kacho_api_gateway_authz_cache_total{result="hit"|"miss"}` (`gateway/internal/observability/metrics`). Здесь то же семейство и та же метка исхода, только имя сервиса другое: собиратель, у которого уже есть правило на край, читает сервисы тем же выражением. Расходиться в написании значило бы завести второй контракт с панелями и правилами тревог.
Полоса — потому что кешей в процессе бывает больше одного ¶
У registry их два: окно звена решения (вопрос на вызов) и окно прямого пообъектного опроса страницы. Сложить их в одну серию значило бы сделать невидимым тот из них, который не попадает, — а это ровно тот, ради которого величину и смотрят. Полоса объявляется ВЫЗЫВАЮЩИМ: процесс без второго кеша вторую полосу не объявляет и нулями её не рисует, иначе экспозиция утверждала бы существование окна, которого в этом процессе нет.
Доли попаданий здесь НЕТ ¶
Доля, посчитанная в процессе за всё время жизни, на поверхности сбора бесполезна: её нельзя ни продифференцировать по времени, ни сложить по репликам. Потребитель считает её из попаданий и промахов сам, а второе место об одном предмете разъезжается молча.
Величины читаются ИЗ ПРОЦЕССА ¶
Коллектор не делает ни одного внешнего вызова в момент сбора: он зовёт функцию, которую принёс композиционный корень, а та читает счётчики кеша. Диагностика, которая ходит наружу за своими числами, гаснет ровно тогда, когда нужна.
Index ¶
Constants ¶
const ( // LaneRPC — окно звена решения о доступе: один вопрос на вызов, оба // слушателя. LaneRPC = "rpc" // LaneList — окно, которое держит САМ СЕРВИС перед сужателем на пути страницы. // Сегодня такое есть у registry (`handler.cachedAuthorizer`): страница // контрактно бывает до тысячи элементов, и каждый её элемент — отдельный // вопрос. LaneList = "list" // LaneNarrow — окно ВНУТРИ общего сужателя (`pkg/listnarrow`). // // Третья полоса, а не переиспользованная `LaneList`, и причина не // стилистическая: у registry эти два окна стоят ДРУГ ЗА ДРУГОМ на одном пути // (свой кеш впереди, окно сужателя позади него), поэтому под одной меткой они // сложились бы — а сложить их значит сделать невидимым то из них, которое не // попадает, ровно как сказано абзацем выше про два кеша процесса. Полоса // называет МЕХАНИЗМ, чьё окно она описывает, а не форму вопроса: форма у них // одна, а механизма два. LaneNarrow = "narrow" )
Полосы окна вердиктов — ЗАКРЫТЫЙ словарь. Ни одно значение метки не берётся из данных запроса: число различных серий не растёт с числом обслуженных арендаторов (потолок кардинальности и запрет `security.md` §«Инфра-чувствительные данные» суть один запрет с двух сторон).
Variables ¶
This section is empty.
Functions ¶
func DecisionsMetricName ¶
DecisionsMetricName — семейство решений звена. Имя однородно краю (`kacho_api_gateway_authz_check_decisions_total`).
func EntriesMetricName ¶
func EvictionsMetricName ¶
func MetricName ¶
MetricName / EntriesMetricName / EvictionsMetricName / DecisionsMetricName — имена семейств для названного сервиса.
Отдельные функции, а не литералы по месту: имя серии — контракт с панелями и правилами тревог, и собирать его в шести местах значило бы завести шесть контрактов, которые разъедутся на первом же переименовании.
Types ¶
type Collector ¶
type Collector struct {
// contains filtered or unexported fields
}
Collector — коллектор величин окон вердиктов одного процесса.
func New ¶
func New(service string, lanes map[string]Reader, decisions DecisionReader) *Collector
New собирает коллектор для сервиса `service` (`vpc`, `compute`, `nlb`, `storage`, `registry`, `geo`) поверх читателей ОБЪЯВЛЕННЫХ полос.
Полоса с `nil`-читателем отвечает нулями: провязка наблюдаемости обязана быть nil-безопасной, иначе её заводят «потом». Полоса, которую вызывающий не назвал, не рисуется вовсе — см. разбор в шапке пакета.
func (*Collector) Collect ¶
func (c *Collector) Collect(ch chan<- prometheus.Metric)
Collect отдаёт все объявленные серии, включая нулевые.
func (*Collector) Describe ¶
func (c *Collector) Describe(ch chan<- *prometheus.Desc)
Describe объявляет ВСЕ семейства до первого сбора — серии присутствуют нулями с первой секунды жизни процесса, поэтому «попаданий не было» и «коллектора нет» различимы без единого запроса.
type DecisionReader ¶
DecisionReader — читатель величин ЗВЕНА решения. Одно на процесс: звено у сервиса ровно одно, и оба слушателя проходят через него.
type Source ¶
type Source struct {
// contains filtered or unexported fields
}
Source — приёмник читателя величин, установимый ПОЗЖЕ регистрации.
Нужен потому, что порядок сборки обратен порядку наблюдения: композиционный корень регистрирует коллектор на диагностической поверхности ДО того, как носитель контура соберёт звено решения со своим кешем. Неустановленный источник отвечает нулями, а не исчезает: исчезновение серий на это окно сообщило бы собирателю не «попаданий не было», а ничего.
func (*Source) Cache ¶
func (s *Source) Cache() authz.CacheStats
Cache — величины окна вердиктов этого звена, читатель полосы.
func (*Source) Install ¶
Install ставит читателя. Идемпотентен по последнему вызову.
Тип параметра НЕ именованный намеренно: значение этого метода передаётся как `servicecontract.Spec.AuthzObserve`, а типы функций в Go тождественны только при тождественных параметрах — с `DecisionReader` в подписи присваивание потребовало бы обёртки в каждом из шести корней.