Evgeny Lazin
Akumuli поддерживает похожий протокол, все что передается в БД сразу после установки соединения сначала интерпретируется как словарь, если это не прокатывает, то фолбэк на обычный протокол, если словарь передан, то можно потом отправлять метрики используя id вместо лэйблов, либо указывать лэйблы полностью. Это обратно совместимо с ранними версиями протокола.
Главных минусов два: может быть дорого хранить большой словарь на каждое TCP соединение; непонятно что делать если нужно изменить словарь (либо разрешить передавать его в любое время и усложнить тем самым протокол для всех, либо передавать только в начале, но на клиенте нужно больше логики в некоторых случаях).
Для прома скорее всего можно было бы что-то похожее придумать, только для pull модели это не так просто, кмк.
Не знал, надо посмотреть.
В моём примере с netflow v9 рутеры периодически шлют шаблоны с описанием полей (шаблонов может быть несколько разных, каждому рутер даёт какой-то уникальный id) , а большую часть времени шлют просто data records, которые в себе несут id шаблона, по которому их надо декодировать. И это всё в push модели. Т.е. пока коллектор не получит шаблона он не знает, что делать с data. Всякие опимизации типа кеширования на стороне коллектора и персистентности между рестартами отданы на откуп коллектору.
В pull модели пром сам рулит в каком порядке что получать, так что логика может и не сложнее быть. Но в любом случае получается, что и на стороне прома и на стороне экспортёра надо стейт поддерживать...
Плюс, это работает только если надор лейблов и их значений относительно редко/мало меняются по сравнению с значениями метрик. Иначе весь смысл теряется.