<feed xmlns='http://www.w3.org/2005/Atom'>
<title>ydb/library/cpp/unified_agent_client, branch CLI_2.28.0</title>
<subtitle>Mirror of YDB github repos</subtitle>
<id>https://code.mastervirt.ru/ydb/atom?h=CLI_2.28.0</id>
<link rel='self' href='https://code.mastervirt.ru/ydb/atom?h=CLI_2.28.0'/>
<link rel='alternate' type='text/html' href='https://code.mastervirt.ru/ydb/'/>
<updated>2025-11-29T08:46:09Z</updated>
<entry>
<title>fix: Migrate to YLOG_*_F and eliminate dangerous c_str() patterns</title>
<updated>2025-11-29T08:46:09Z</updated>
<author>
<name>andybg</name>
<email>andybg@yandex-team.com</email>
</author>
<published>2025-11-29T08:28:29Z</published>
<link rel='alternate' type='text/html' href='https://code.mastervirt.ru/ydb/commit/?id=1895c63513ed8b03774d8ae04c4092eccaf128e6'/>
<id>urn:sha1:1895c63513ed8b03774d8ae04c4092eccaf128e6</id>
<content type='text'>
## Summary
Eliminated all dangerous c_str() patterns from unified_agent by migrating to modern YLOG_*_F formatting.

## Changes
- Remove .c_str() on temporaries in YLOG_*_F macros (1 fix)
- Migrate YLOG_*(Sprintf(...)) to modern YLOG_*_F(...) (23 fixes)

## Benefits
- Modern C++20 type-safe formatting with std::format
- Cleaner, more maintainable code (40% less in some cases)
- Better performance (no Sprintf overhead)
commit_hash:ee3f665ccc823d9e2165a90c036e5bd887cd179e
</content>
</entry>
<entry>
<title>- Global Storage Limit Feature</title>
<updated>2025-11-28T01:24:15Z</updated>
<author>
<name>andybg</name>
<email>andybg@yandex-team.com</email>
</author>
<published>2025-11-28T01:11:38Z</published>
<link rel='alternate' type='text/html' href='https://code.mastervirt.ru/ydb/commit/?id=f96cfce288c15ac58e3a7adf174f0000e7ca44ce'/>
<id>urn:sha1:f96cfce288c15ac58e3a7adf174f0000e7ca44ce</id>
<content type='text'>
See full description in separate comment.

The open source part is to add implementation for formatter specialization for TString.
commit_hash:9501df4a7287050b72162b80823d5cbbd1d7464f
</content>
</entry>
<entry>
<title>Create new plugin agent_logs_input</title>
<updated>2025-11-25T06:07:44Z</updated>
<author>
<name>hobbit</name>
<email>hobbit@yandex-team.com</email>
</author>
<published>2025-11-25T05:49:11Z</published>
<link rel='alternate' type='text/html' href='https://code.mastervirt.ru/ydb/commit/?id=c55ff4a40df2a26d9a076d1fcbf5716a55bca4e5'/>
<id>urn:sha1:c55ff4a40df2a26d9a076d1fcbf5716a55bca4e5</id>
<content type='text'>
**Summary**

Реализован новый входной плагин `agent_logs` для отправки логов самого агента в пайплайн unified\_agent. Это решает проблему доступа к логам агента в production окружении, где требовались права System developer для доступа к файлам на дисках.

## **What's Changed** {#whats-changed}

### **New Plugin: `agent_logs_input`** {#new-plugin-agent_logs_input}

Добавлен новый входной плагин, который:

* Перехватывает логи агента через кастомный `TLogBackend`

* Отправляет логи в пайплайн стриммингово (не пулингом)

* Поддерживает фильтрацию по уровню логов (настройка **level**, по умолчанию `NOTICE`)

### **Implementation Details** {#implementation-details}

**Основные компоненты:**

1. **TAgentLogsBackend** - кастомный log backend:

   * Наследуется от `TLogBackend`

   * Перехватывает все логи агента через метод `WriteData()`

   * Фильтрует логи по приоритету

   * Отправляет отфильтрованные логи в `IMessageConsumer`

   * Поддерживает graceful stop

2. **TPlugin** - основной класс плагина:

   * Управляет lifecycle плагина

   * Создает сессию с ID `agent_logs`

   * Передает конфигурацию в session handler

3. **TSessionHandler** - обработчик сессии:

   * Создает и регистрирует `TAgentLogsBackend`

   * Добавляет backend в глобальный logger через `AddLog()`

   * Управляет остановкой backend'а

**Пример конфигурации:**

```
routes:
  - input:
      plugin: agent_logs
      config:
        level: INFO
    channel:
      pipe:
        - filter:
            plugin: format_otel_logs
      output:
        # https://nda.ya.ru/t/YexxO8Qf7NZMzy
        plugin: otel_logs
        config:
          url: "collector.logs.yandex-team.ru:443"
          project: hobbit_test_project
          service: logs
          # https://nda.ya.ru/t/o4MQT5rI7NZMzz
          oauth:
            secret:
              env: TEST_LOGS_OAUTH

agent_log:
  priority: INFO
  rate_limit_bytes: 100000
```
commit_hash:c6f115ab98c30a47845ce9f9f8a58ef89973d422
</content>
</entry>
<entry>
<title>Fix gRPC retry parser initialization race condition</title>
<updated>2025-11-22T22:48:12Z</updated>
<author>
<name>andybg</name>
<email>andybg@yandex-team.com</email>
</author>
<published>2025-11-22T22:30:13Z</published>
<link rel='alternate' type='text/html' href='https://code.mastervirt.ru/ydb/commit/?id=99383234453575439d497e697d4f6b6edbdc384a'/>
<id>urn:sha1:99383234453575439d497e697d4f6b6edbdc384a</id>
<content type='text'>
Проблема:
Сегментация через ~42 секунды после запуска UA в ServiceConfigParser::GetParserIndex("retry").

Причина:
Static Initialization Order Fiasco + Lazy Initialization в gRPC CoreConfiguration.
RetryFilter пытается получить парсер до того, как CoreConfiguration зарегистрировала его.

Решение:
1. Устанавливаем лимиты потоков ДО grpc_init() (статические параметры)
2. Явно вызываем grpc_init() для гарантии выполнения всех статических инициализаторов
3. Принудительно инициализируем CoreConfiguration через CoreConfiguration::Get()

Это гарантирует порядок:
- Настройка лимитов потоков
- Инициализация библиотеки gRPC
- Построение CoreConfiguration с регистрацией всех парсеров
- Только после этого фильтры могут безопасно использовать retry парсер

Изменения:
- library/cpp/unified_agent_client/grpc_io.cpp: Исправлена EnsureGrpcConfigured()
- tests/ut/grpc_init_ut.cpp: Добавлены unit тесты
- tests/grpc_init_check/: Standalone тестовая программа
- tests/ut/ya.make: Интеграция тестов в систему сборки

Все тесты прошли: 640/640 OK
commit_hash:ed4601dfe21f6dfac653dec6e9c3e535e5a0a09c
</content>
</entry>
<entry>
<title>/1: Специализированный Multishard Metrics Store для быстрой отдачи метрик в Multishard Metrics Pull</title>
<updated>2025-10-02T10:53:21Z</updated>
<author>
<name>iofik</name>
<email>iofik@yandex-team.com</email>
</author>
<published>2025-10-02T10:30:11Z</published>
<link rel='alternate' type='text/html' href='https://code.mastervirt.ru/ydb/commit/?id=ea1a91993977153ce5528ce8fef162f9b1b9e366'/>
<id>urn:sha1:ea1a91993977153ce5528ce8fef162f9b1b9e366</id>
<content type='text'>
## С точки зрения пользователя

### 1. Как включать изменения
- Изменения автоматически активируются при использовании `metrics_pull_output_par` параметра
- Количество тредов в тредпуле устанавливается параметром `metrics_pull_output_threads` (по-умолчанию 1)
- Совместимо с существующими конфигурациями метрик

#### Пример конфигурации:
```yaml
experimental:
  metrics_pull_output_par: true
  metrics_pull_output_threads: 16
```

### 2. На что влияют изменения
- **Производительность обработки метрик:** Группировка метрик по шардам теперь происходит один раз в момент записи сообщения в хранилище
- **Масштабируемость:** Параллельная обработка команд на запись и чтение сообщений

## С точки зрения программиста

### 1. Новая архитектура и взаимодействие

#### Архитектура шардирования
```
TMultishardMetricsStoreHandler
    ↓
TShardedMetricsQueue
    ↓
TUAShardedMetricsWriter → IMultiShardEncoder
```

#### Принцип работы
1. **Шардирование:** Метрики группируются по ключу `(project, service, cluster)` из лейблов `__ua_project`, `__ua_service`, `__ua_cluster`
2. **Сортировка:** Внутри каждого сообщения метрики сортируются по ключам шардов
3. **Слияние:** При чтении используется priority queue для объединения шардов из разных сообщений
4. **Вывод:** Данные выводятся последовательно по шардам а внутри шарда в порядке добавления сообщений

### 2. Новые классы

#### `TMultishardMetricsStoreHandler`
- **Назначение:** Основной обработчик команд для шардированных метрик
- **Ключевые методы:**
  - `Handle(TWriteCmd&amp;)` - запись метрик в очередь
  - `Handle(TMultishardReadCmd&amp;)` - чтение из множественных шардов
  - `Handle(TReadCmd&amp;)` - чтение из одного шарда - не поддерживатся
  - Обработчики остальных сообщений адаптированы для работы с `TShardedMetricsQueue`
- **Особенности:** Управляет сессиями и делегирует работу с данными в `TShardedMetricsQueue`

#### `TShardedMetricsQueue`
- **Назначение:** Очередь метрик с поддержкой шардирования
- **Ключевые структуры:**
  ```cpp
  struct TShardedMessage {
      std::unique_ptr&lt;TOutputMessage&gt; Message;
      std::vector&lt;TChunk&gt; Chunks;  // Индексы шардов
  };
  ```
- **Алгоритм:** Сортировка метрик по шардам + priority queue для слияния при чтении

#### `IUAShardedMetricsWriter` + `TUAShardedMetricsWriter`
- **Назначение:** Интерфейс и реализация для записи шардированных метрик
- **Расширение:** Добавляет методы `OnShardBegin/End`, `OnStreamBegin/End` к базовому `IUAMetricsWriter`
- **Интеграция:** Работает с `NSolomon::NMultiShard::IMultiShardEncoder`

### 3. Рефакторинг

#### Изменения в базовых классах
- **`TMetricsStoreHandlerBase`:** Вынесен метод `GetMetricsWriterOptions()` для переиспользования
- **`TUAMetricsWriter`:** Добавлено `virtual` наследование для множественного наследования
!!! - **`TOutputItem`:** Изменена видимость конструктора (убран лишний `private`)

#### Структурные изменения
- **Новый модуль:** `metrics_multishard_pull_output` с собственными классами
- **Тесты:** Добавлены unit-тесты `sharded_metrics_queue_ut.cpp` для проверки логики шардирования, а интеграционные тесты продублированы для проверки работы в параллельном режиме
- **Сборка:** Обновлен `ya.make` для включения новых файлов
commit_hash:44618a480d29307e7131b82b19473d284ea68efa
</content>
</entry>
<entry>
<title>Added std::format include into unified agent logger</title>
<updated>2025-09-17T13:50:55Z</updated>
<author>
<name>kirill-bel</name>
<email>kirill-bel@yandex-team.com</email>
</author>
<published>2025-09-17T13:26:52Z</published>
<link rel='alternate' type='text/html' href='https://code.mastervirt.ru/ydb/commit/?id=86a05729ac464ba14bb42ae6a1d768f3a3bdc415'/>
<id>urn:sha1:86a05729ac464ba14bb42ae6a1d768f3a3bdc415</id>
<content type='text'>
Разломались на вызове YLOG\_DEBUG\_F с ошибкой:

```
/home/kirill-bel/arcadia/logbroker/unified_agent/common/zstd_file_stream.cpp:39:17: error: no member named 'format' in namespace 'std'
39 |                 YLOG_DEBUG_F("TZstdFileStream starting from frame pos = {} frame offset = {}",
   |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
40 |                     lastFramePos, lastFrameOffset);
   |                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```

В YLOG\_DEBUG\_F используется `std::format`, но хедер не включен в `library/cpp/unified_agent_client/logger.h`:

```
#define YLOG_DEBUG_F(fmt, ...) YLOG_DEBUG(std::format(fmt, __VA_ARGS__))
```
commit_hash:0a82f439ec6b8d83e2f4ac1a7d8a8c8cf29b9cc2
</content>
</entry>
<entry>
<title>Added macros for std::format log and changed existing YLOG_&lt;Type&gt;(std::format(...)) to them</title>
<updated>2025-05-28T13:52:59Z</updated>
<author>
<name>deruzh</name>
<email>deruzh@yandex-team.com</email>
</author>
<published>2025-05-28T13:21:58Z</published>
<link rel='alternate' type='text/html' href='https://code.mastervirt.ru/ydb/commit/?id=0e99e7174068641c0a2c1170c796276c47bf553c'/>
<id>urn:sha1:0e99e7174068641c0a2c1170c796276c47bf553c</id>
<content type='text'>
Мы часто используем std::format, готовясь к переходу с TString на std::string, но из-за этого появляется много лишнего кода. Поэтому были добавлены макросы логгера для удобства и существующий код был переведен на них
commit_hash:e564c913e0dc82817152b7a15c543a77812a1dcc
</content>
</entry>
<entry>
<title>Extra copy</title>
<updated>2025-02-25T14:32:49Z</updated>
<author>
<name>nae202</name>
<email>nae202@yandex-team.com</email>
</author>
<published>2025-02-25T14:17:12Z</published>
<link rel='alternate' type='text/html' href='https://code.mastervirt.ru/ydb/commit/?id=cad6bfa9f29ef01967ff7fa877079fc6bfd91673'/>
<id>urn:sha1:cad6bfa9f29ef01967ff7fa877079fc6bfd91673</id>
<content type='text'>
Убираю лишнее копирование. Актуально для REVIEW:7901279
commit_hash:79f0f8873f80375269dd5384e189ac4f3b260017
</content>
</entry>
<entry>
<title>Add UnifiedAgentWriterFactory</title>
<updated>2025-01-20T12:59:28Z</updated>
<author>
<name>lo-r-d</name>
<email>lo-r-d@yandex-team.com</email>
</author>
<published>2025-01-20T12:44:08Z</published>
<link rel='alternate' type='text/html' href='https://code.mastervirt.ru/ydb/commit/?id=13b3cd284513a5d3d21e207821e73f1dd58988b7'/>
<id>urn:sha1:13b3cd284513a5d3d21e207821e73f1dd58988b7</id>
<content type='text'>
commit_hash:af6dedadd4d7fe292bcb7a8b6de366aff4e630b1
</content>
</entry>
<entry>
<title>Limit the number of gRPC threads</title>
<updated>2024-12-10T18:35:28Z</updated>
<author>
<name>andybg</name>
<email>andybg@yandex-team.com</email>
</author>
<published>2024-12-10T17:49:27Z</published>
<link rel='alternate' type='text/html' href='https://code.mastervirt.ru/ydb/commit/?id=ebceebb7b22e971e5eb52b5323bfc1a4de855145'/>
<id>urn:sha1:ebceebb7b22e971e5eb52b5323bfc1a4de855145</id>
<content type='text'>
Add test to verify the threads limit

Try to fix; Limit number of gRPC threads.
commit_hash:d525e94e0ef397bf05d367ec9904d674c17d0d76
</content>
</entry>
</feed>
