feat(smoke): смоук спрашивает Kafka снаружи — по объявленному адресу
- Зачем:
- деление целей оставило дыру: про Airflow, Superset, Prometheus и Grafana
смоук стучится с машины в отображённый порт, а про Kafka после переезда
check_kafka_from_host знал только «контейнер здоров».
- вердикт этот приходит из healthcheck в compose.yaml, а тот спрашивает
брокер изнутри и по внутреннему слушателю: объявленный наружу адрес может
вести не туда, и Kafka всё равно останется здоровой.
- поломка популярная и показательная: клиент подключается, получает
метаданные и молча виснет на адресе, которого с его стороны нет. Менти
узнаёт, что у брокера два слушателя и зачем нужен advertised.listeners.
Генератор будет писать в Kafka именно с машины.
- Что:
- check_kafka_external_listener в make smoke: запрос списка топиков с машины
через отображённый порт, ответ приходит только если объявленный адрес ведёт
туда же. Комментарий у проверки объясняет, от чего она заведена.
- ожидание ответа ограничено 15 секундами при замеренных 2,6 — впятеро
больше, чем стоит зелёный прогон.
- README и карта проверок: новая проверка названа, доводы записаны, цена
смоука обновлена с 6 до 8 секунд.
- Проверка:
- make config-test, make smoke (20 проверок, 8 с), make check-clickhouse,
make check-services — зелёные.
- краснеет на своей поломке: брокеру объявлен адрес kafka-nowhere:29092 при
целом внутреннем слушателе — проверка состояния контейнера осталась
зелёной, смоук покраснел именно на этой строке. После проверки Kafka
возвращена в исходное состояние, посторонних контейнеров не осталось.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -53,6 +53,30 @@ check_keeper_runtime() {
|
||||
fi
|
||||
}
|
||||
|
||||
# Самая известная поломка Kafka — объявленный адрес не совпадает с тем, по
|
||||
# которому к брокеру стучатся снаружи. Выглядит она издевательски: клиент
|
||||
# подключается, получает метаданные и виснет на адресе, которого с его стороны
|
||||
# не существует. Проверка состояния контейнера этого не увидит — она спрашивает
|
||||
# брокер изнутри и по внутреннему слушателю (compose.yaml, healthcheck kafka).
|
||||
# Здесь запрос идёт с машины через отображённый порт, и списка топиков клиент не
|
||||
# получит, не сходив вторым шагом по объявленному адресу. Отсюда и цена: почти
|
||||
# вся она — старт JVM в разовом контейнере, а не разговор с брокером.
|
||||
check_kafka_external_listener() {
|
||||
local image
|
||||
local port
|
||||
|
||||
image="$(compose config --format json 2>/dev/null | jq -r '.services.kafka.image // empty')"
|
||||
port="$(published_port kafka 29092)"
|
||||
if [[ -n "$image" ]] && [[ -n "$port" ]] && \
|
||||
timeout 15s docker run --rm --network host "$image" \
|
||||
/opt/kafka/bin/kafka-topics.sh \
|
||||
--bootstrap-server "localhost:${port}" --list >/dev/null 2>&1; then
|
||||
pass "Kafka отвечает с машины через localhost:${port}: объявленный адрес ведёт туда же, куда отображён порт"
|
||||
else
|
||||
fail "Kafka не ответила с машины через localhost:${port:-порт не найден}: закрыт внешний слушатель, не отображён порт или объявленный адрес ведёт не туда"
|
||||
fi
|
||||
}
|
||||
|
||||
check_prometheus_targets() {
|
||||
local port
|
||||
local response
|
||||
@@ -206,6 +230,7 @@ if require_host_dependencies; then
|
||||
check_container_health "$service"
|
||||
done
|
||||
check_keeper_runtime
|
||||
check_kafka_external_listener
|
||||
check_prometheus_targets
|
||||
check_grafana_datasource
|
||||
check_airflow
|
||||
|
||||
Reference in New Issue
Block a user